@@ -803,3 +803,70 @@ fn test_handshake_read_oob_error() {
803803 // This shouldn't panic, but it *should* return an error.
804804 let _ = h_i. read_message ( & buffer_msg[ ..len] , & mut buffer_out) ;
805805}
806+
807+ #[ test]
808+ fn test_stateful_nonce_maxiumum_behavior ( ) {
809+ let params: NoiseParams = "Noise_NN_25519_ChaChaPoly_SHA256" . parse ( ) . unwrap ( ) ;
810+ let mut h_i = Builder :: new ( params. clone ( ) ) . build_initiator ( ) . unwrap ( ) ;
811+ let mut h_r = Builder :: new ( params) . build_responder ( ) . unwrap ( ) ;
812+
813+ let mut buffer_msg = [ 0u8 ; 200 ] ;
814+ let mut buffer_out = [ 0u8 ; 200 ] ;
815+ let len = h_i. write_message ( b"abc" , & mut buffer_msg) . unwrap ( ) ;
816+ h_r. read_message ( & buffer_msg[ ..len] , & mut buffer_out) . unwrap ( ) ;
817+
818+ let len = h_r. write_message ( b"defg" , & mut buffer_msg) . unwrap ( ) ;
819+ h_i. read_message ( & buffer_msg[ ..len] , & mut buffer_out) . unwrap ( ) ;
820+
821+ let h_i = h_i. into_stateless_transport_mode ( ) . unwrap ( ) ;
822+ let mut h_r = h_r. into_transport_mode ( ) . unwrap ( ) ;
823+
824+ let mut sender_nonce = u64:: MAX - 2 ;
825+ let len = h_i. write_message ( sender_nonce, b"xyz" , & mut buffer_msg) . unwrap ( ) ;
826+
827+ h_r. set_receiving_nonce ( sender_nonce) ;
828+ h_r. read_message ( & buffer_msg[ ..len] , & mut buffer_out) . unwrap ( ) ;
829+
830+ // Simulate exhausting the nonce space for the stateful transport.
831+ sender_nonce += 1 ;
832+ let len = h_i. write_message ( sender_nonce, b"abc" , & mut buffer_msg) . unwrap ( ) ;
833+
834+ h_r. set_receiving_nonce ( sender_nonce + 1 ) ; // u64::MAX
835+
836+ // This should fail because we've simulated exhausting the nonce space, as the spec says 2^64-1 is reserved
837+ // and may not be used in the `CipherState` object.
838+ assert ! ( matches!(
839+ dbg!( h_r. read_message( & buffer_msg[ ..len] , & mut buffer_out) ) ,
840+ Err ( snow:: Error :: State ( snow:: error:: StateProblem :: Exhausted ) )
841+ ) ) ;
842+ }
843+
844+ #[ test]
845+ fn test_stateless_nonce_maximum_behavior ( ) {
846+ let params: NoiseParams = "Noise_NN_25519_ChaChaPoly_SHA256" . parse ( ) . unwrap ( ) ;
847+ let mut h_i = Builder :: new ( params. clone ( ) ) . build_initiator ( ) . unwrap ( ) ;
848+ let mut h_r = Builder :: new ( params) . build_responder ( ) . unwrap ( ) ;
849+
850+ let mut buffer_msg = [ 0u8 ; 200 ] ;
851+ let mut buffer_out = [ 0u8 ; 200 ] ;
852+ let len = h_i. write_message ( b"abc" , & mut buffer_msg) . unwrap ( ) ;
853+ h_r. read_message ( & buffer_msg[ ..len] , & mut buffer_out) . unwrap ( ) ;
854+
855+ let len = h_r. write_message ( b"defg" , & mut buffer_msg) . unwrap ( ) ;
856+ h_i. read_message ( & buffer_msg[ ..len] , & mut buffer_out) . unwrap ( ) ;
857+
858+ let h_i = h_i. into_stateless_transport_mode ( ) . unwrap ( ) ;
859+ let h_r = h_r. into_stateless_transport_mode ( ) . unwrap ( ) ;
860+
861+ let max_nonce = u64:: MAX ;
862+
863+ assert ! ( matches!(
864+ h_i. write_message( max_nonce, b"xyz" , & mut buffer_msg) ,
865+ Err ( snow:: Error :: State ( snow:: error:: StateProblem :: Exhausted ) )
866+ ) ) ;
867+
868+ assert ! ( matches!(
869+ h_r. read_message( max_nonce, & buffer_msg, & mut buffer_out) ,
870+ Err ( snow:: Error :: State ( snow:: error:: StateProblem :: Exhausted ) )
871+ ) ) ;
872+ }
0 commit comments