|
1 |
| -use libp2p_identity::{Keypair, PeerId, PublicKey, SigningError}; |
| 1 | +use libp2p_identity::{Keypair, PeerId, SigningError}; |
2 | 2 | use quick_protobuf::{BytesReader, Writer};
|
3 | 3 | use web_time::SystemTime;
|
4 | 4 |
|
@@ -30,7 +30,26 @@ impl PeerRecord {
|
30 | 30 | /// If this function succeeds, the [`SignedEnvelope`] contained a peer record with a valid
|
31 | 31 | /// signature and can hence be considered authenticated.
|
32 | 32 | 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 | + |
34 | 53 | Ok(Self {
|
35 | 54 | peer_id,
|
36 | 55 | seq,
|
@@ -107,37 +126,6 @@ impl PeerRecord {
|
107 | 126 | pub fn addresses(&self) -> &[Multiaddr] {
|
108 | 127 | self.addresses.as_slice()
|
109 | 128 | }
|
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 |
| - } |
141 | 129 | }
|
142 | 130 |
|
143 | 131 | #[derive(thiserror::Error, Debug)]
|
|
0 commit comments