@@ -313,9 +313,10 @@ impl Pku2u {
313313 crate :: kerberos:: utils:: generate_mic_token ( self . is_client ( ) , sequence_number, data. to_vec ( ) , key, & aes_size)
314314 }
315315
316- fn verify_mic ( & self , sequence_number : u64 , token : & [ u8 ] , data : & [ u8 ] ) -> Result < ( ) > {
316+ fn verify_mic ( & self , sequence_number : u64 , token : & [ u8 ] , data : & [ u8 ] , enforce_sequence_number : bool ) -> Result < ( ) > {
317317 crate :: kerberos:: utils:: validate_mic_token (
318318 self . is_client ( ) ,
319+ enforce_sequence_number,
319320 sequence_number,
320321 token,
321322 & self . encryption_params ,
@@ -972,7 +973,7 @@ impl Sspi for Pku2u {
972973 acc. extend_from_slice ( buffer. data ( ) ) ;
973974 acc
974975 } ) ;
975- self . verify_mic ( sequence_number. into ( ) , & token, & data) ?;
976+ self . verify_mic ( sequence_number. into ( ) , & token, & data, true ) ?;
976977
977978 Ok ( 0 )
978979 }
@@ -1498,7 +1499,7 @@ impl SspiEx for Pku2u {
14981499 }
14991500
15001501 fn verify_mic_token ( & mut self , token : & [ u8 ] , data : & [ u8 ] , _: crate :: private:: Sealed ) -> Result < ( ) > {
1501- self . verify_mic ( self . remote_gss_seq_number . into ( ) , token, data) ?;
1502+ self . verify_mic ( self . remote_gss_seq_number . into ( ) , token, data, true ) ?;
15021503 self . remote_gss_seq_number = self . remote_gss_seq_number . wrapping_add ( 1 ) ;
15031504 Ok ( ( ) )
15041505 }
@@ -1734,8 +1735,7 @@ xFnLp2UBrhxA9GYrpJ5i0onRmexQnTVSl5DDq07s+3dbr9YAKjrg9IDZYqLbdwP1
17341735 ) ;
17351736 }
17361737
1737- #[ test]
1738- fn stream_buffer_decryption ( ) {
1738+ fn minimal_pku2u_pair ( ) -> ( Pku2u , Pku2u ) {
17391739 let session_key = vec ! [
17401740 137 , 60 , 120 , 245 , 164 , 179 , 76 , 200 , 242 , 96 , 57 , 174 , 111 , 209 , 90 , 76 , 58 , 117 , 55 , 138 , 81 , 75 , 110 ,
17411741 235 , 80 , 228 , 14 , 238 , 76 , 128 , 139 , 81 ,
@@ -1746,13 +1746,12 @@ xFnLp2UBrhxA9GYrpJ5i0onRmexQnTVSl5DDq07s+3dbr9YAKjrg9IDZYqLbdwP1
17461746 ] ;
17471747
17481748 let mut rng = StdRng :: try_from_rng ( & mut SysRng ) . unwrap ( ) ;
1749-
17501749 let ( p2p_certificate, private_key) = test_p2p_identity ( ) ;
17511750
17521751 let mut negoex_random = [ 0 ; RANDOM_ARRAY_SIZE ] ;
17531752 rng. fill_bytes ( & mut negoex_random) ;
17541753
1755- let mut pku2u_server = Pku2u {
1754+ let server = Pku2u {
17561755 mode : Pku2uMode :: Server ,
17571756 config : Pku2uConfig {
17581757 p2p_certificate : p2p_certificate. clone ( ) ,
@@ -1793,14 +1792,14 @@ xFnLp2UBrhxA9GYrpJ5i0onRmexQnTVSl5DDq07s+3dbr9YAKjrg9IDZYqLbdwP1
17931792 let mut negoex_random = [ 0 ; RANDOM_ARRAY_SIZE ] ;
17941793 rng. try_fill_bytes ( & mut negoex_random) . unwrap ( ) ;
17951794
1796- let mut pku2u_client = Pku2u {
1795+ let client = Pku2u {
17971796 mode : Pku2uMode :: Client ,
17981797 config : Pku2uConfig {
17991798 p2p_certificate : p2p_certificate. clone ( ) ,
18001799 private_key : private_key. into ( ) ,
18011800 client_hostname : "hostname" . into ( ) ,
18021801 additional_credentials : Vec :: new ( ) ,
1803- trusted_client_certificates : vec ! [ p2p_certificate. clone ( ) ] ,
1802+ trusted_client_certificates : vec ! [ p2p_certificate] ,
18041803 trusted_server_certificates : Vec :: new ( ) ,
18051804 } ,
18061805 state : Pku2uState :: Final ,
@@ -1831,6 +1830,51 @@ xFnLp2UBrhxA9GYrpJ5i0onRmexQnTVSl5DDq07s+3dbr9YAKjrg9IDZYqLbdwP1
18311830 ticket_encryption_key : None ,
18321831 } ;
18331832
1833+ ( client, server)
1834+ }
1835+
1836+ #[ test]
1837+ fn verify_signature_rejects_invalid_sequence_number ( ) {
1838+ let ( mut client, mut server) = minimal_pku2u_pair ( ) ;
1839+
1840+ let mut signature = vec ! [ 0 ; 64 ] ;
1841+ let mut signed_data = b"signed Pku2u message" . to_vec ( ) ;
1842+ let mut message = [
1843+ SecurityBufferRef :: token_buf ( & mut signature) ,
1844+ SecurityBufferRef :: data_buf ( & mut signed_data) ,
1845+ ] ;
1846+
1847+ server. make_signature ( 0 , & mut message, 42 ) . unwrap ( ) ;
1848+
1849+ assert_eq ! (
1850+ client. verify_signature( & mut message, 7 ) . unwrap_err( ) . error_type,
1851+ ErrorKind :: InvalidToken
1852+ ) ;
1853+ }
1854+
1855+ #[ test]
1856+ fn verify_mic_token_rejects_invalid_sequence_number ( ) {
1857+ let ( mut client, mut server) = minimal_pku2u_pair ( ) ;
1858+ server. gss_seq_number = 7 ;
1859+
1860+ let mic = server
1861+ . generate_mic_token ( b"SPNEGO mech list" , crate :: private:: Sealed )
1862+ . unwrap ( ) ;
1863+
1864+ assert_eq ! (
1865+ client
1866+ . verify_mic_token( & mic, b"SPNEGO mech list" , crate :: private:: Sealed )
1867+ . unwrap_err( )
1868+ . error_type,
1869+ ErrorKind :: InvalidToken
1870+ ) ;
1871+ assert_eq ! ( client. remote_gss_seq_number, 0 ) ;
1872+ }
1873+
1874+ #[ test]
1875+ fn stream_buffer_decryption ( ) {
1876+ let ( mut pku2u_client, mut pku2u_server) = minimal_pku2u_pair ( ) ;
1877+
18341878 assert_eq ! ( PKG_NAME , "pku2u" ) ;
18351879 assert_eq ! ( PACKAGE_INFO . rpc_id, 31 ) ;
18361880 assert_eq ! ( PACKAGE_INFO . max_token_len, 12_000 ) ;
0 commit comments