Skip to content

Commit c5db873

Browse files
committed
fix definition link, simplify record parsing
1 parent 9ec20a4 commit c5db873

File tree

3 files changed

+31
-40
lines changed

3 files changed

+31
-40
lines changed

core/src/peer_record.rs

+21-33
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use libp2p_identity::{Keypair, PeerId, PublicKey, SigningError};
1+
use libp2p_identity::{Keypair, PeerId, SigningError};
22
use quick_protobuf::{BytesReader, Writer};
33
use web_time::SystemTime;
44

@@ -30,7 +30,26 @@ impl PeerRecord {
3030
/// If this function succeeds, the [`SignedEnvelope`] contained a peer record with a valid
3131
/// signature and can hence be considered authenticated.
3232
pub fn from_signed_envelope(envelope: SignedEnvelope) -> Result<Self, FromEnvelopeError> {
33-
let (_, peer_id, seq, addresses) = Self::try_deserialize_signed_envelope(&envelope)?;
33+
use quick_protobuf::MessageRead;
34+
35+
let (payload, signing_key) =
36+
envelope.payload_and_signing_key(String::from(DOMAIN_SEP), PAYLOAD_TYPE.as_bytes())?;
37+
let mut reader = BytesReader::from_bytes(payload);
38+
let record = proto::PeerRecord::from_reader(&mut reader, payload).map_err(DecodeError)?;
39+
40+
let peer_id = PeerId::from_bytes(&record.peer_id)?;
41+
42+
if peer_id != signing_key.to_peer_id() {
43+
return Err(FromEnvelopeError::MismatchedSignature);
44+
}
45+
46+
let seq = record.seq;
47+
let addresses = record
48+
.addresses
49+
.into_iter()
50+
.map(|a| a.multiaddr.to_vec().try_into())
51+
.collect::<Result<Vec<_>, _>>()?;
52+
3453
Ok(Self {
3554
peer_id,
3655
seq,
@@ -107,37 +126,6 @@ impl PeerRecord {
107126
pub fn addresses(&self) -> &[Multiaddr] {
108127
self.addresses.as_slice()
109128
}
110-
111-
/// Utility method for deserializing an [`SignedEnvelope`] using
112-
/// [`PeerRecord`]-specific [domain separation](https://github.com/libp2p/specs/blob/master/RFC/0003-routing-records.md#signed-envelope-domain)
113-
/// and [payload type](https://github.com/libp2p/specs/blob/master/RFC/0003-routing-records.md#signed-envelope-payload-type).
114-
/// Useful for extracting the address only.
115-
/// Returns `Ok((envelope_public_key, envelope_signer_id, sequence_number, signed_addresses))`
116-
/// when the envelope is valid.
117-
/// Will fail when the source of the addresses doesn't match signer of the envelope.
118-
pub fn try_deserialize_signed_envelope(
119-
envelope: &SignedEnvelope,
120-
) -> Result<(&PublicKey, PeerId, u64, Vec<Multiaddr>), FromEnvelopeError> {
121-
use quick_protobuf::MessageRead;
122-
123-
let (payload, signing_key) =
124-
envelope.payload_and_signing_key(String::from(DOMAIN_SEP), PAYLOAD_TYPE.as_bytes())?;
125-
let mut reader = BytesReader::from_bytes(payload);
126-
let record = proto::PeerRecord::from_reader(&mut reader, payload).map_err(DecodeError)?;
127-
128-
let peer_id = PeerId::from_bytes(&record.peer_id)?;
129-
130-
if peer_id != signing_key.to_peer_id() {
131-
return Err(FromEnvelopeError::MismatchedSignature);
132-
}
133-
134-
let addresses = record
135-
.addresses
136-
.into_iter()
137-
.map(|a| a.multiaddr.to_vec().try_into())
138-
.collect::<Result<Vec<_>, _>>()?;
139-
Ok((signing_key, peer_id, record.seq, addresses))
140-
}
141129
}
142130

143131
#[derive(thiserror::Error, Debug)]

protocols/identify/src/generated/structs.proto

+3-2
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ message Identify {
2828
// signedPeerRecord contains a serialized SignedEnvelope containing a PeerRecord,
2929
// signed by the sending node. It contains the same addresses as the listenAddrs field, but
3030
// in a form that lets us share authenticated addrs with other peers.
31-
// see github.com/libp2p/go-libp2p/core/record/pb/envelope.proto and
32-
// github.com/libp2p/go-libp2p/core/peer/pb/peer_record.proto for message definitions.
31+
// see https://github.com/libp2p/rust-libp2p/blob/8ac5b5aac5f5c25a85f1065e292deeaf58290189/core/src/generated/envelope.proto#L12
32+
// and https://github.com/libp2p/rust-libp2p/blob/8ac5b5aac5f5c25a85f1065e292deeaf58290189/core/src/generated/peer_record.proto#L11
33+
// for message definitions.
3334
optional bytes signedPeerRecord = 8;
3435
}

protocols/identify/src/protocol.rs

+7-5
Original file line numberDiff line numberDiff line change
@@ -230,15 +230,17 @@ impl TryFrom<proto::Identify> for Info {
230230
// When signedPeerRecord contains valid addresses, ignore addresses in listenAddrs.
231231
// When signedPeerRecord is invalid or signed by others, ignore the signedPeerRecord(set to
232232
// `None`).
233-
let (signed_envelope, listen_addrs) = msg
233+
let (listen_addrs, signed_envelope) = msg
234234
.signedPeerRecord
235235
.and_then(|b| {
236236
let envelope = SignedEnvelope::from_protobuf_encoding(b.as_ref()).ok()?;
237-
let (envelope_public_key, _, _, addresses) =
238-
PeerRecord::try_deserialize_signed_envelope(&envelope).ok()?;
239-
(*envelope_public_key == identify_public_key).then_some((Some(envelope), addresses))
237+
let peer_record = PeerRecord::from_signed_envelope(envelope).ok()?;
238+
(peer_record.peer_id() == identify_public_key.to_peer_id()).then_some((
239+
peer_record.addresses().to_vec(),
240+
Some(peer_record.into_signed_envelope()),
241+
))
240242
})
241-
.unwrap_or_else(|| (None, parse_listen_addrs(msg.listenAddrs)));
243+
.unwrap_or_else(|| (parse_listen_addrs(msg.listenAddrs), None));
242244

243245
let info = Info {
244246
public_key: identify_public_key,

0 commit comments

Comments
 (0)