@@ -709,62 +709,71 @@ pub async fn handshake<S: AsyncRead + AsyncWrite + Unpin>(
709
709
role : Role ,
710
710
max_read_ahead_factor : usize ,
711
711
max_write_buffer_size : usize ,
712
+ timeout : std:: time:: Duration ,
712
713
) -> Result < ( NoiseSocket < S > , PeerId ) , NegotiationError > {
713
- tracing:: debug!( target: LOG_TARGET , ?role, "start noise handshake" ) ;
714
-
715
- let mut noise = NoiseContext :: new ( keypair, role) ?;
716
- let payload = match role {
717
- Role :: Dialer => {
718
- // write initial message
719
- let first_message = noise. first_message ( Role :: Dialer ) ?;
720
- let _ = io. write ( & first_message) . await ?;
721
- io. flush ( ) . await ?;
722
-
723
- // read back response which contains the remote peer id
724
- let message = noise. read_handshake_message ( & mut io) . await ?;
725
- // Decode the remote identity message.
726
- let payload = handshake_schema:: NoiseHandshakePayload :: decode ( message)
714
+ let handle_handshake = async move {
715
+ tracing:: debug!( target: LOG_TARGET , ?role, "start noise handshake" ) ;
716
+
717
+ let mut noise = NoiseContext :: new ( keypair, role) ?;
718
+ let payload = match role {
719
+ Role :: Dialer => {
720
+ // write initial message
721
+ let first_message = noise. first_message ( Role :: Dialer ) ?;
722
+ let _ = io. write ( & first_message) . await ?;
723
+ io. flush ( ) . await ?;
724
+
725
+ // read back response which contains the remote peer id
726
+ let message = noise. read_handshake_message ( & mut io) . await ?;
727
+ // Decode the remote identity message.
728
+ let payload = handshake_schema:: NoiseHandshakePayload :: decode ( message)
727
729
. map_err ( ParseError :: from)
728
730
. map_err ( |err| {
729
731
tracing:: error!( target: LOG_TARGET , ?err, "failed to decode remote identity message" ) ;
730
732
err
731
733
} ) ?;
732
734
733
- // send the final message which contains local peer id
734
- let second_message = noise. second_message ( ) ?;
735
- let _ = io. write ( & second_message) . await ?;
736
- io. flush ( ) . await ?;
735
+ // send the final message which contains local peer id
736
+ let second_message = noise. second_message ( ) ?;
737
+ let _ = io. write ( & second_message) . await ?;
738
+ io. flush ( ) . await ?;
737
739
738
- payload
739
- }
740
- Role :: Listener => {
741
- // read remote's first message
742
- let _ = noise. read_handshake_message ( & mut io) . await ?;
743
-
744
- // send local peer id.
745
- let second_message = noise. second_message ( ) ?;
746
- let _ = io. write ( & second_message) . await ?;
747
- io. flush ( ) . await ?;
748
-
749
- // read remote's second message which contains their peer id
750
- let message = noise. read_handshake_message ( & mut io) . await ?;
751
- // Decode the remote identity message.
752
- handshake_schema:: NoiseHandshakePayload :: decode ( message) . map_err ( ParseError :: from) ?
753
- }
754
- } ;
740
+ payload
741
+ }
742
+ Role :: Listener => {
743
+ // read remote's first message
744
+ let _ = noise. read_handshake_message ( & mut io) . await ?;
745
+
746
+ // send local peer id.
747
+ let second_message = noise. second_message ( ) ?;
748
+ let _ = io. write ( & second_message) . await ?;
749
+ io. flush ( ) . await ?;
750
+
751
+ // read remote's second message which contains their peer id
752
+ let message = noise. read_handshake_message ( & mut io) . await ?;
753
+ // Decode the remote identity message.
754
+ handshake_schema:: NoiseHandshakePayload :: decode ( message)
755
+ . map_err ( ParseError :: from) ?
756
+ }
757
+ } ;
755
758
756
- let dh_remote_pubkey = noise. get_handshake_dh_remote_pubkey ( ) ?;
757
- let peer = parse_and_verify_peer_id ( payload, dh_remote_pubkey) ?;
759
+ let dh_remote_pubkey = noise. get_handshake_dh_remote_pubkey ( ) ?;
760
+ let peer = parse_and_verify_peer_id ( payload, dh_remote_pubkey) ?;
758
761
759
- Ok ( (
760
- NoiseSocket :: new (
761
- io,
762
- noise. into_transport ( ) ?,
763
- max_read_ahead_factor,
764
- max_write_buffer_size,
765
- ) ,
766
- peer,
767
- ) )
762
+ Ok ( (
763
+ NoiseSocket :: new (
764
+ io,
765
+ noise. into_transport ( ) ?,
766
+ max_read_ahead_factor,
767
+ max_write_buffer_size,
768
+ ) ,
769
+ peer,
770
+ ) )
771
+ } ;
772
+
773
+ match tokio:: time:: timeout ( timeout, handle_handshake) . await {
774
+ Err ( _) => Err ( NegotiationError :: Timeout ) ,
775
+ Ok ( result) => result,
776
+ }
768
777
}
769
778
770
779
// TODO: https://github.com/paritytech/litep2p/issues/125 add more tests
@@ -808,14 +817,16 @@ mod tests {
808
817
& keypair1,
809
818
Role :: Dialer ,
810
819
MAX_READ_AHEAD_FACTOR ,
811
- MAX_WRITE_BUFFER_SIZE
820
+ MAX_WRITE_BUFFER_SIZE ,
821
+ std:: time:: Duration :: from_secs( 10 ) ,
812
822
) ,
813
823
handshake(
814
824
io2,
815
825
& keypair2,
816
826
Role :: Listener ,
817
827
MAX_READ_AHEAD_FACTOR ,
818
- MAX_WRITE_BUFFER_SIZE
828
+ MAX_WRITE_BUFFER_SIZE ,
829
+ std:: time:: Duration :: from_secs( 10 ) ,
819
830
)
820
831
) ;
821
832
let ( mut res1, mut res2) = ( res1. unwrap ( ) , res2. unwrap ( ) ) ;
0 commit comments