@@ -803,3 +803,70 @@ fn test_handshake_read_oob_error() {
803
803
// This shouldn't panic, but it *should* return an error.
804
804
let _ = h_i. read_message ( & buffer_msg[ ..len] , & mut buffer_out) ;
805
805
}
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