@@ -173,6 +173,16 @@ mod real_chacha {
173173			} 
174174		} 
175175
176+ 		/// Same as `encrypt_single_block` only operates on a fixed-size input in-place. 
177+  		pub  fn  encrypt_single_block_in_place ( 
178+ 			key :  & [ u8 ;  32 ] ,  nonce :  & [ u8 ;  16 ] ,  bytes :  & mut  [ u8 ;  32 ] 
179+ 		)  { 
180+ 			let  block = ChaCha20 :: get_single_block ( key,  nonce) ; 
181+ 			for  i in  0 ..bytes. len ( )  { 
182+ 				bytes[ i]  = block[ i]  ^ bytes[ i] ; 
183+ 			} 
184+ 		} 
185+ 
176186		fn  expand ( key :  & [ u8 ] ,  nonce :  & [ u8 ] )  -> ChaChaState  { 
177187			let  constant = match  key. len ( )  { 
178188				16  => b"expand 16-byte k" , 
@@ -311,6 +321,10 @@ mod fuzzy_chacha {
311321			debug_assert ! ( dest. len( )  <= 32 ) ; 
312322		} 
313323
324+ 		pub  fn  encrypt_single_block_in_place ( 
325+ 			_key :  & [ u8 ;  32 ] ,  _nonce :  & [ u8 ;  16 ] ,  _bytes :  & mut  [ u8 ;  32 ] 
326+ 		)  { } 
327+ 
314328		pub  fn  process ( & mut  self ,  input :  & [ u8 ] ,  output :  & mut  [ u8 ] )  { 
315329			output. copy_from_slice ( input) ; 
316330		} 
@@ -662,4 +676,26 @@ mod test {
662676
663677		assert_eq ! ( bytes,  decrypted_bytes) ; 
664678	} 
679+ 
680+ 	#[ test]  
681+ 	fn  encrypt_single_block_in_place ( )  { 
682+ 		let  key = [ 
683+ 			0x00 ,  0x01 ,  0x02 ,  0x03 ,  0x04 ,  0x05 ,  0x06 ,  0x07 , 
684+ 			0x08 ,  0x09 ,  0x0a ,  0x0b ,  0x0c ,  0x0d ,  0x0e ,  0x0f , 
685+ 			0x10 ,  0x11 ,  0x12 ,  0x13 ,  0x14 ,  0x15 ,  0x16 ,  0x17 , 
686+ 			0x18 ,  0x19 ,  0x1a ,  0x1b ,  0x1c ,  0x1d ,  0x1e ,  0x1f , 
687+ 		] ; 
688+ 		let  nonce = [ 
689+ 			0x00 ,  0x01 ,  0x02 ,  0x03 ,  0x04 ,  0x05 ,  0x06 ,  0x07 ,  0x08 , 
690+ 			0x09 ,  0x0a ,  0x0b ,  0x0c ,  0x0d ,  0x0e ,  0x0f , 
691+ 		] ; 
692+ 		let  unencrypted_bytes = [ 1 ;  32 ] ; 
693+ 		let  mut  bytes = unencrypted_bytes; 
694+ 
695+ 		ChaCha20 :: encrypt_single_block_in_place ( & key,  & nonce,  & mut  bytes) ; 
696+ 		assert_ne ! ( bytes,  unencrypted_bytes) ; 
697+ 
698+ 		ChaCha20 :: encrypt_single_block_in_place ( & key,  & nonce,  & mut  bytes) ; 
699+ 		assert_eq ! ( bytes,  unencrypted_bytes) ; 
700+ 	} 
665701} 
0 commit comments