@@ -258,7 +258,7 @@ impl CryptoKeyPair for KeyPair {
258
258
KeyType :: Private ( k) => {
259
259
let signing_key = SigningKey :: from ( k) ;
260
260
let sig: Signature = signing_key. sign ( msg) ;
261
- let bytes = sig. to_bytes ( ) . to_vec ( ) ;
261
+ let bytes = sig. to_bytes ( ) ;
262
262
let len = bytes. len ( ) ;
263
263
signature[ ..len] . copy_from_slice ( & bytes) ;
264
264
Ok ( len)
@@ -308,13 +308,10 @@ pub fn encrypt_in_place(
308
308
let key = GenericArray :: from_slice ( key) ;
309
309
let nonce = GenericArray :: from_slice ( nonce) ;
310
310
let cipher = AesCcm :: new ( key) ;
311
- // This is probably incorrect
312
- let mut buffer = data[ 0 ..data_len] . to_vec ( ) ;
313
- cipher. encrypt_in_place ( nonce, ad, & mut buffer) ?;
314
- let len = buffer. len ( ) ;
315
- data. clone_from_slice ( & buffer[ ..] ) ;
316
311
317
- Ok ( len)
312
+ let mut buffer = SliceBuffer :: new ( data, data_len) ;
313
+ cipher. encrypt_in_place ( nonce, ad, & mut buffer) ?;
314
+ Ok ( buffer. len ( ) )
318
315
}
319
316
320
317
pub fn decrypt_in_place (
@@ -328,11 +325,48 @@ pub fn decrypt_in_place(
328
325
let key = GenericArray :: from_slice ( key) ;
329
326
let nonce = GenericArray :: from_slice ( nonce) ;
330
327
let cipher = AesCcm :: new ( key) ;
331
- // This is probably incorrect
332
- let mut buffer = data. to_vec ( ) ;
328
+
329
+ let mut buffer = SliceBuffer :: new ( data, data . len ( ) ) ;
333
330
cipher. decrypt_in_place ( nonce, ad, & mut buffer) ?;
334
- let len = buffer. len ( ) ;
335
- data[ ..len] . copy_from_slice ( & buffer[ ..] ) ;
331
+ Ok ( buffer. len ( ) )
332
+ }
333
+
334
+ #[ derive( Debug ) ]
335
+ struct SliceBuffer < ' a > {
336
+ slice : & ' a mut [ u8 ] ,
337
+ len : usize ,
338
+ }
339
+
340
+ impl < ' a > SliceBuffer < ' a > {
341
+ fn new ( slice : & ' a mut [ u8 ] , len : usize ) -> Self {
342
+ Self { slice, len }
343
+ }
344
+
345
+ fn len ( & self ) -> usize {
346
+ self . len
347
+ }
348
+ }
336
349
337
- Ok ( len)
350
+ impl < ' a > AsMut < [ u8 ] > for SliceBuffer < ' a > {
351
+ fn as_mut ( & mut self ) -> & mut [ u8 ] {
352
+ & mut self . slice [ ..self . len ]
353
+ }
354
+ }
355
+
356
+ impl < ' a > AsRef < [ u8 ] > for SliceBuffer < ' a > {
357
+ fn as_ref ( & self ) -> & [ u8 ] {
358
+ & self . slice [ ..self . len ]
359
+ }
360
+ }
361
+
362
+ impl < ' a > ccm:: aead:: Buffer for SliceBuffer < ' a > {
363
+ fn extend_from_slice ( & mut self , other : & [ u8 ] ) -> ccm:: aead:: Result < ( ) > {
364
+ self . slice [ self . len ..] [ ..other. len ( ) ] . copy_from_slice ( other) ;
365
+ self . len += other. len ( ) ;
366
+ Ok ( ( ) )
367
+ }
368
+
369
+ fn truncate ( & mut self , len : usize ) {
370
+ self . len = len;
371
+ }
338
372
}
0 commit comments