@@ -173,6 +173,16 @@ mod real_chacha {
173
173
}
174
174
}
175
175
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
+
176
186
fn expand ( key : & [ u8 ] , nonce : & [ u8 ] ) -> ChaChaState {
177
187
let constant = match key. len ( ) {
178
188
16 => b"expand 16-byte k" ,
@@ -308,6 +318,10 @@ mod fuzzy_chacha {
308
318
_key : & [ u8 ; 32 ] , _nonce : & [ u8 ; 16 ] , _dest : & mut [ u8 ] , _src : & [ u8 ]
309
319
) { }
310
320
321
+ pub fn encrypt_single_block_in_place (
322
+ _key : & [ u8 ; 32 ] , _nonce : & [ u8 ; 16 ] , _bytes : & mut [ u8 ; 32 ]
323
+ ) { }
324
+
311
325
pub fn process ( & mut self , input : & [ u8 ] , output : & mut [ u8 ] ) {
312
326
output. copy_from_slice ( input) ;
313
327
}
@@ -659,4 +673,26 @@ mod test {
659
673
660
674
assert_eq ! ( bytes, decrypted_bytes) ;
661
675
}
676
+
677
+ #[ test]
678
+ fn encrypt_single_block_in_place ( ) {
679
+ let key = [
680
+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 ,
681
+ 0x08 , 0x09 , 0x0a , 0x0b , 0x0c , 0x0d , 0x0e , 0x0f ,
682
+ 0x10 , 0x11 , 0x12 , 0x13 , 0x14 , 0x15 , 0x16 , 0x17 ,
683
+ 0x18 , 0x19 , 0x1a , 0x1b , 0x1c , 0x1d , 0x1e , 0x1f ,
684
+ ] ;
685
+ let nonce = [
686
+ 0x00 , 0x01 , 0x02 , 0x03 , 0x04 , 0x05 , 0x06 , 0x07 , 0x08 ,
687
+ 0x09 , 0x0a , 0x0b , 0x0c , 0x0d , 0x0e , 0x0f ,
688
+ ] ;
689
+ let unencrypted_bytes = [ 1 ; 32 ] ;
690
+ let mut bytes = unencrypted_bytes;
691
+
692
+ ChaCha20 :: encrypt_single_block_in_place ( & key, & nonce, & mut bytes) ;
693
+ assert_ne ! ( bytes, unencrypted_bytes) ;
694
+
695
+ ChaCha20 :: encrypt_single_block_in_place ( & key, & nonce, & mut bytes) ;
696
+ assert_eq ! ( bytes, unencrypted_bytes) ;
697
+ }
662
698
}
0 commit comments