Skip to content

Commit 1b0b671

Browse files
Create noise-prologue from server + client FP in fixed order
1 parent b052190 commit 1b0b671

File tree

1 file changed

+29
-33
lines changed

1 file changed

+29
-33
lines changed

transports/webrtc/src/transport.rs

Lines changed: 29 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ use libp2p_core::{
3535
};
3636
use libp2p_noise::{Keypair, NoiseConfig, X25519Spec};
3737
use log::{debug, trace};
38-
use multihash::Multihash;
3938
use tokio_crate::net::UdpSocket;
4039
use webrtc::ice::udp_mux::UDPMux;
4140
use webrtc::peer_connection::certificate::RTCCertificate;
@@ -162,7 +161,7 @@ impl Transport for WebRTCTransport {
162161
trace!("dialing addr={}", remote);
163162

164163
let config = self.config.clone();
165-
let our_fingerprint = self.config.fingerprint_of_first_certificate();
164+
let client_fingerprint = self.config.fingerprint_of_first_certificate();
166165
let id_keys = self.id_keys.clone();
167166

168167
let first_listener = self
@@ -175,14 +174,14 @@ impl Transport for WebRTCTransport {
175174
// [`Transport::dial`] should do no work unless the returned [`Future`] is polled. Thus
176175
// do the `set_remote_description` call within the [`Future`].
177176
Ok(async move {
178-
let remote_fingerprint = fingerprint_from_addr(&addr)
177+
let server_fingerprint = fingerprint_from_addr(&addr)
179178
.ok_or_else(|| Error::InvalidMultiaddr(addr.clone()))?;
180179

181180
let conn = WebRTCConnection::connect(
182181
sock_addr,
183182
config.into_inner(),
184183
udp_mux,
185-
&remote_fingerprint,
184+
&server_fingerprint,
186185
)
187186
.await?;
188187

@@ -193,8 +192,8 @@ impl Transport for WebRTCTransport {
193192
let peer_id = perform_noise_handshake_outbound(
194193
id_keys,
195194
PollDataChannel::new(data_channel.clone()),
196-
our_fingerprint,
197-
remote_fingerprint,
195+
client_fingerprint,
196+
server_fingerprint,
198197
)
199198
.await?;
200199

@@ -500,17 +499,17 @@ fn multiaddr_to_socketaddr(addr: &Multiaddr) -> Option<SocketAddr> {
500499
async fn perform_noise_handshake_outbound<T>(
501500
id_keys: identity::Keypair,
502501
poll_data_channel: T,
503-
our_fingerprint: Fingerprint,
504-
remote_fingerprint: Fingerprint,
502+
client_fingerprint: Fingerprint,
503+
server_fingerprint: Fingerprint,
505504
) -> Result<PeerId, Error>
506505
where
507506
T: AsyncRead + AsyncWrite + Unpin + Send + 'static,
508507
{
509508
let dh_keys = Keypair::<X25519Spec>::new()
510509
.into_authentic(&id_keys)
511510
.unwrap();
512-
let noise =
513-
NoiseConfig::xx(dh_keys).with_prologue(noise_prologue(our_fingerprint, remote_fingerprint));
511+
let noise = NoiseConfig::xx(dh_keys)
512+
.with_prologue(noise_prologue(client_fingerprint, server_fingerprint));
514513
let info = noise.protocol_info().next().unwrap();
515514
let (peer_id, _noise_io) = noise
516515
.into_authenticated()
@@ -529,13 +528,13 @@ async fn upgrade(
529528
) -> Result<(PeerId, Connection), Error> {
530529
trace!("upgrading addr={} (ufrag={})", socket_addr, ufrag);
531530

532-
let our_fingerprint = config.fingerprint_of_first_certificate();
531+
let server_fingerprint = config.fingerprint_of_first_certificate();
533532

534533
let conn = WebRTCConnection::accept(
535534
socket_addr,
536535
config.into_inner(),
537536
udp_mux,
538-
&our_fingerprint,
537+
&server_fingerprint,
539538
&ufrag,
540539
)
541540
.await?;
@@ -548,12 +547,13 @@ async fn upgrade(
548547
socket_addr,
549548
ufrag
550549
);
551-
let remote_fingerprint = conn.get_remote_fingerprint().await;
550+
let client_fingerprint = conn.get_remote_fingerprint().await;
551+
552552
let peer_id = perform_noise_handshake_inbound(
553553
id_keys,
554554
PollDataChannel::new(data_channel.clone()),
555-
our_fingerprint,
556-
remote_fingerprint,
555+
client_fingerprint,
556+
server_fingerprint,
557557
)
558558
.await?;
559559

@@ -574,17 +574,17 @@ async fn upgrade(
574574
async fn perform_noise_handshake_inbound<T>(
575575
id_keys: identity::Keypair,
576576
poll_data_channel: T,
577-
our_fingerprint: Fingerprint,
578-
remote_fingerprint: Fingerprint,
577+
client_fingerprint: Fingerprint,
578+
server_fingerprint: Fingerprint,
579579
) -> Result<PeerId, Error>
580580
where
581581
T: AsyncRead + AsyncWrite + Unpin + Send + 'static,
582582
{
583583
let dh_keys = Keypair::<X25519Spec>::new()
584584
.into_authentic(&id_keys)
585585
.unwrap();
586-
let noise =
587-
NoiseConfig::xx(dh_keys).with_prologue(noise_prologue(our_fingerprint, remote_fingerprint));
586+
let noise = NoiseConfig::xx(dh_keys)
587+
.with_prologue(noise_prologue(client_fingerprint, server_fingerprint));
588588
let info = noise.protocol_info().next().unwrap();
589589
let (peer_id, _noise_io) = noise
590590
.into_authenticated()
@@ -593,18 +593,17 @@ where
593593
Ok(peer_id)
594594
}
595595

596-
fn noise_prologue(our_fingerprint: Fingerprint, remote_fingerprint: Fingerprint) -> Vec<u8> {
597-
let (a, b): (Multihash, Multihash) = (
598-
our_fingerprint.to_multi_hash(),
599-
remote_fingerprint.to_multi_hash(),
600-
);
601-
let (a, b) = (a.to_bytes(), b.to_bytes());
602-
let (first, second) = if a < b { (a, b) } else { (b, a) };
596+
fn noise_prologue(client: Fingerprint, server: Fingerprint) -> Vec<u8> {
597+
let server = server.to_multi_hash().to_bytes();
598+
let client = client.to_multi_hash().to_bytes();
599+
603600
const PREFIX: &[u8] = b"libp2p-webrtc-noise:";
604-
let mut out = Vec::with_capacity(PREFIX.len() + first.len() + second.len());
601+
602+
let mut out = Vec::with_capacity(PREFIX.len() + server.len() + client.len());
605603
out.extend_from_slice(PREFIX);
606-
out.extend_from_slice(&first);
607-
out.extend_from_slice(&second);
604+
out.extend_from_slice(&server);
605+
out.extend_from_slice(&client);
606+
608607
out
609608
}
610609

@@ -633,10 +632,7 @@ mod tests {
633632
let prologue2 = noise_prologue(b, a);
634633

635634
assert_eq!(hex::encode(&prologue1), "6c69627032702d7765627274632d6e6f6973653a122030fc9f469c207419dfdd0aab5f27a86c973c94e40548db9375cca2e915973b9912203e79af40d6059617a0d83b83a52ce73b0c1f37a72c6043ad2969e2351bdca870");
636-
assert_eq!(
637-
prologue1, prologue2,
638-
"order of fingerprints does not matter"
639-
);
635+
assert_eq!(hex::encode(&prologue2), "6c69627032702d7765627274632d6e6f6973653a12203e79af40d6059617a0d83b83a52ce73b0c1f37a72c6043ad2969e2351bdca870122030fc9f469c207419dfdd0aab5f27a86c973c94e40548db9375cca2e915973b99");
640636
}
641637

642638
#[test]

0 commit comments

Comments
 (0)