11use std:: {
22 fmt,
3- mem:: size_of,
43 net:: { IpAddr , SocketAddr } ,
54} ;
65
@@ -236,8 +235,7 @@ impl Token {
236235 }
237236
238237 // Encrypt
239- let aead_key = key. aead_from_hkdf ( & self . nonce . to_le_bytes ( ) ) ;
240- aead_key. seal ( & mut buf, & [ ] ) . unwrap ( ) ;
238+ key. seal ( self . nonce , & mut buf) . unwrap ( ) ;
241239 buf. extend ( & self . nonce . to_le_bytes ( ) ) ;
242240
243241 buf
@@ -247,30 +245,27 @@ impl Token {
247245 fn decode ( key : & dyn HandshakeTokenKey , raw_token_bytes : & [ u8 ] ) -> Option < Self > {
248246 // Decrypt
249247
250- let nonce_slice_start = raw_token_bytes. len ( ) . checked_sub ( size_of :: < u128 > ( ) ) ?;
251- let ( sealed_token, nonce_bytes) = raw_token_bytes. split_at_checked ( nonce_slice_start) ?;
248+ let ( sealed_token, nonce_bytes) = raw_token_bytes. split_last_chunk ( ) ?;
252249
253- let nonce = u128:: from_le_bytes ( nonce_bytes. try_into ( ) . unwrap ( ) ) ;
250+ let nonce = u128:: from_le_bytes ( * nonce_bytes) ;
254251
255- let aead_key = key. aead_from_hkdf ( nonce_bytes) ;
256252 let mut sealed_token = sealed_token. to_vec ( ) ;
257- let data = aead_key . open ( & mut sealed_token, & [ ] ) . ok ( ) ?;
253+ let mut data = key . open ( nonce , & mut sealed_token) . ok ( ) ?;
258254
259255 // Decode payload
260- let mut reader = & data[ ..] ;
261- let payload = match TokenType :: from_byte ( ( & mut reader) . get :: < u8 > ( ) . ok ( ) ?) ? {
256+ let payload = match TokenType :: from_byte ( ( & mut data) . get :: < u8 > ( ) . ok ( ) ?) ? {
262257 TokenType :: Retry => TokenPayload :: Retry {
263- address : decode_addr ( & mut reader ) ?,
264- orig_dst_cid : ConnectionId :: decode_long ( & mut reader ) ?,
265- issued : decode_unix_secs ( & mut reader ) ?,
258+ address : decode_addr ( & mut data ) ?,
259+ orig_dst_cid : ConnectionId :: decode_long ( & mut data ) ?,
260+ issued : decode_unix_secs ( & mut data ) ?,
266261 } ,
267262 TokenType :: Validation => TokenPayload :: Validation {
268- ip : decode_ip ( & mut reader ) ?,
269- issued : decode_unix_secs ( & mut reader ) ?,
263+ ip : decode_ip ( & mut data ) ?,
264+ issued : decode_unix_secs ( & mut data ) ?,
270265 } ,
271266 } ;
272267
273- if !reader . is_empty ( ) {
268+ if !data . is_empty ( ) {
274269 // Consider extra bytes a decoding error (it may be from an incompatible endpoint)
275270 return None ;
276271 }
@@ -408,21 +403,17 @@ impl fmt::Display for ResetToken {
408403
409404#[ cfg( all( test, any( feature = "aws-lc-rs" , feature = "ring" ) ) ) ]
410405mod test {
406+ use crate :: crypto:: ring_like:: RetryTokenKey ;
407+
411408 use super :: * ;
412- #[ cfg( all( feature = "aws-lc-rs" , not( feature = "ring" ) ) ) ]
413- use aws_lc_rs:: hkdf;
414409 use rand:: prelude:: * ;
415- #[ cfg( feature = "ring" ) ]
416- use ring:: hkdf;
417410
418411 fn token_round_trip ( payload : TokenPayload ) -> TokenPayload {
419412 let rng = & mut rand:: rng ( ) ;
420413 let token = Token :: new ( payload, rng) ;
421- let mut master_key = [ 0 ; 64 ] ;
422- rng. fill_bytes ( & mut master_key) ;
423- let prk = hkdf:: Salt :: new ( hkdf:: HKDF_SHA256 , & [ ] ) . extract ( & master_key) ;
424- let encoded = token. encode ( & prk) ;
425- let decoded = Token :: decode ( & prk, & encoded) . expect ( "token didn't decrypt / decode" ) ;
414+ let master_key = RetryTokenKey :: new ( rng) ;
415+ let encoded = token. encode ( & master_key) ;
416+ let decoded = Token :: decode ( & master_key, & encoded) . expect ( "token didn't decrypt / decode" ) ;
426417 assert_eq ! ( token. nonce, decoded. nonce) ;
427418 decoded. payload
428419 }
@@ -485,14 +476,8 @@ mod test {
485476 #[ test]
486477 fn invalid_token_returns_err ( ) {
487478 use super :: * ;
488- use rand:: RngCore ;
489-
490- let rng = & mut rand:: rng ( ) ;
491-
492- let mut master_key = [ 0 ; 64 ] ;
493- rng. fill_bytes ( & mut master_key) ;
494479
495- let prk = hkdf :: Salt :: new ( hkdf :: HKDF_SHA256 , & [ ] ) . extract ( & master_key ) ;
480+ let master_key = RetryTokenKey :: new ( & mut rand :: rng ( ) ) ;
496481
497482 let mut invalid_token = Vec :: new ( ) ;
498483
@@ -501,6 +486,6 @@ mod test {
501486 invalid_token. put_slice ( & random_data) ;
502487
503488 // Assert: garbage sealed data returns err
504- assert ! ( Token :: decode( & prk , & invalid_token) . is_none( ) ) ;
489+ assert ! ( Token :: decode( & master_key , & invalid_token) . is_none( ) ) ;
505490 }
506491}
0 commit comments