2
2
3
3
use ln:: peers:: { chacha, hkdf5869rfc} ;
4
4
use util:: byte_utils;
5
+ use std:: collections:: VecDeque ;
5
6
6
7
pub ( super ) type SymmetricKey = [ u8 ; 32 ] ;
7
8
@@ -38,29 +39,14 @@ pub(super) struct Decryptor {
38
39
39
40
pending_message_length : Option < usize > ,
40
41
read_buffer : Option < Vec < u8 > > ,
41
- poisoned : bool , // signal an error has occurred so None is returned on iteration after failure
42
+ decrypted_payloads : VecDeque < Vec < u8 > > ,
42
43
}
43
44
44
45
impl Iterator for Decryptor {
45
- type Item = Result < Option < Vec < u8 > > , String > ;
46
+ type Item = Vec < u8 > ;
46
47
47
48
fn next ( & mut self ) -> Option < Self :: Item > {
48
- if self . poisoned {
49
- return None ;
50
- }
51
-
52
- match self . decrypt_single_message ( None ) {
53
- Ok ( Some ( result) ) => {
54
- Some ( Ok ( Some ( result) ) )
55
- } ,
56
- Ok ( None ) => {
57
- None
58
- }
59
- Err ( e) => {
60
- self . poisoned = true ;
61
- Some ( Err ( e) )
62
- }
63
- }
49
+ self . decrypted_payloads . pop_front ( )
64
50
}
65
51
}
66
52
@@ -79,7 +65,7 @@ impl Conduit {
79
65
receiving_nonce : 0 ,
80
66
read_buffer : None ,
81
67
pending_message_length : None ,
82
- poisoned : false
68
+ decrypted_payloads : VecDeque :: new ( ) ,
83
69
}
84
70
}
85
71
}
@@ -89,7 +75,7 @@ impl Conduit {
89
75
self . encryptor . encrypt ( buffer)
90
76
}
91
77
92
- pub ( super ) fn read ( & mut self , data : & [ u8 ] ) {
78
+ pub ( super ) fn read ( & mut self , data : & [ u8 ] ) -> Result < ( ) , String > {
93
79
self . decryptor . read ( data)
94
80
}
95
81
@@ -143,9 +129,25 @@ impl Encryptor {
143
129
}
144
130
145
131
impl Decryptor {
146
- pub ( super ) fn read ( & mut self , data : & [ u8 ] ) {
147
- let read_buffer = self . read_buffer . get_or_insert ( Vec :: new ( ) ) ;
148
- read_buffer. extend_from_slice ( data) ;
132
+ pub ( super ) fn read ( & mut self , data : & [ u8 ] ) -> Result < ( ) , String > {
133
+ let mut input_data = Some ( data) ;
134
+
135
+ loop {
136
+ match self . decrypt_single_message ( input_data) {
137
+ Ok ( Some ( result) ) => {
138
+ self . decrypted_payloads . push_back ( result) ;
139
+ } ,
140
+ Ok ( None ) => {
141
+ break ;
142
+ }
143
+ Err ( e) => {
144
+ return Err ( e) ;
145
+ }
146
+ }
147
+ input_data = None ;
148
+ }
149
+
150
+ Ok ( ( ) )
149
151
}
150
152
151
153
/// Decrypt a single message. If data containing more than one message has been received,
@@ -332,7 +334,7 @@ mod tests {
332
334
let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
333
335
334
336
connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
335
- assert_eq ! ( connected_peer. decrypt_single_message ( Some ( & encrypted) ) , Err ( "invalid hmac" . to_string( ) ) ) ;
337
+ assert_eq ! ( connected_peer. read ( & encrypted) , Err ( "invalid hmac" . to_string( ) ) ) ;
336
338
}
337
339
338
340
// Test next()::None
@@ -348,86 +350,9 @@ mod tests {
348
350
fn decryptor_iterator_one_item_valid ( ) {
349
351
let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
350
352
let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
351
- connected_peer. read ( & encrypted) ;
352
-
353
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
354
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
355
- }
356
-
357
- // Test next()::err -> next()::None
358
- #[ test]
359
- fn decryptor_iterator_error ( ) {
360
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
361
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
362
- connected_peer. read ( & encrypted) ;
363
-
364
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
365
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
366
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
367
- }
368
-
369
- // Test next()::Some -> next()::err -> next()::None
370
- #[ test]
371
- fn decryptor_iterator_error_after_success ( ) {
372
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
373
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
374
- connected_peer. read ( & encrypted) ;
375
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
376
- connected_peer. read ( & encrypted) ;
377
-
378
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
379
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
380
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
381
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
382
- }
383
-
384
- // Test that next()::Some -> next()::err -> next()::None
385
- // Error should poison decryptor
386
- #[ test]
387
- fn decryptor_iterator_next_after_error_returns_none ( ) {
388
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
389
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
390
- connected_peer. read ( & encrypted) ;
391
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
392
- connected_peer. read ( & encrypted) ;
393
- let encrypted = remote_peer. encrypt ( & [ 3 ] ) ;
394
- connected_peer. read ( & encrypted) ;
395
-
396
- // Get one valid value
397
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
398
- let valid_receiving_key = connected_peer. decryptor . receiving_key ;
399
-
400
- // Corrupt the receiving key and ensure we get a failure
401
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
402
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
403
-
404
- // Restore the receiving key, do a read and ensure None is returned (poisoned)
405
- connected_peer. decryptor . receiving_key = valid_receiving_key;
406
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
407
- }
408
-
409
- // Test next()::Some -> next()::err -> read() -> next()::None
410
- // Error should poison decryptor even after future reads
411
- #[ test]
412
- fn decryptor_iterator_read_next_after_error_returns_none ( ) {
413
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
414
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
415
- connected_peer. read ( & encrypted) ;
416
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
417
- connected_peer. read ( & encrypted) ;
418
-
419
- // Get one valid value
420
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
421
- let valid_receiving_key = connected_peer. decryptor . receiving_key ;
422
-
423
- // Corrupt the receiving key and ensure we get a failure
424
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
425
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
353
+ connected_peer. read ( & encrypted) . unwrap ( ) ;
426
354
427
- // Restore the receiving key, do a read and ensure None is returned (poisoned)
428
- let encrypted = remote_peer. encrypt ( & [ 3 ] ) ;
429
- connected_peer. read ( & encrypted) ;
430
- connected_peer. decryptor . receiving_key = valid_receiving_key;
355
+ assert_eq ! ( connected_peer. decryptor. next( ) , Some ( vec![ 1 ] ) ) ;
431
356
assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
432
357
}
433
358
0 commit comments