11
11
12
12
use ln:: peers:: { chacha, hkdf5869rfc} ;
13
13
use util:: byte_utils;
14
+ use std:: collections:: VecDeque ;
14
15
15
16
pub ( super ) type SymmetricKey = [ u8 ; 32 ] ;
16
17
@@ -47,29 +48,14 @@ pub(super) struct Decryptor {
47
48
48
49
pending_message_length : Option < usize > ,
49
50
read_buffer : Option < Vec < u8 > > ,
50
- poisoned : bool , // signal an error has occurred so None is returned on iteration after failure
51
+ decrypted_payloads : VecDeque < Vec < u8 > > ,
51
52
}
52
53
53
54
impl Iterator for Decryptor {
54
- type Item = Result < Option < Vec < u8 > > , String > ;
55
+ type Item = Vec < u8 > ;
55
56
56
57
fn next ( & mut self ) -> Option < Self :: Item > {
57
- if self . poisoned {
58
- return None ;
59
- }
60
-
61
- match self . decrypt_single_message ( None ) {
62
- Ok ( Some ( result) ) => {
63
- Some ( Ok ( Some ( result) ) )
64
- } ,
65
- Ok ( None ) => {
66
- None
67
- }
68
- Err ( e) => {
69
- self . poisoned = true ;
70
- Some ( Err ( e) )
71
- }
72
- }
58
+ self . decrypted_payloads . pop_front ( )
73
59
}
74
60
}
75
61
@@ -88,7 +74,7 @@ impl Conduit {
88
74
receiving_nonce : 0 ,
89
75
read_buffer : None ,
90
76
pending_message_length : None ,
91
- poisoned : false
77
+ decrypted_payloads : VecDeque :: new ( ) ,
92
78
}
93
79
}
94
80
}
@@ -98,7 +84,7 @@ impl Conduit {
98
84
self . encryptor . encrypt ( buffer)
99
85
}
100
86
101
- pub ( super ) fn read ( & mut self , data : & [ u8 ] ) {
87
+ pub ( super ) fn read ( & mut self , data : & [ u8 ] ) -> Result < ( ) , String > {
102
88
self . decryptor . read ( data)
103
89
}
104
90
@@ -152,9 +138,25 @@ impl Encryptor {
152
138
}
153
139
154
140
impl Decryptor {
155
- pub ( super ) fn read ( & mut self , data : & [ u8 ] ) {
156
- let read_buffer = self . read_buffer . get_or_insert ( Vec :: new ( ) ) ;
157
- read_buffer. extend_from_slice ( data) ;
141
+ pub ( super ) fn read ( & mut self , data : & [ u8 ] ) -> Result < ( ) , String > {
142
+ let mut input_data = Some ( data) ;
143
+
144
+ loop {
145
+ match self . decrypt_single_message ( input_data) {
146
+ Ok ( Some ( result) ) => {
147
+ self . decrypted_payloads . push_back ( result) ;
148
+ } ,
149
+ Ok ( None ) => {
150
+ break ;
151
+ }
152
+ Err ( e) => {
153
+ return Err ( e) ;
154
+ }
155
+ }
156
+ input_data = None ;
157
+ }
158
+
159
+ Ok ( ( ) )
158
160
}
159
161
160
162
/// Decrypt a single message. If data containing more than one message has been received,
@@ -341,7 +343,7 @@ mod tests {
341
343
let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
342
344
343
345
connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
344
- assert_eq ! ( connected_peer. decrypt_single_message ( Some ( & encrypted) ) , Err ( "invalid hmac" . to_string( ) ) ) ;
346
+ assert_eq ! ( connected_peer. read ( & encrypted) , Err ( "invalid hmac" . to_string( ) ) ) ;
345
347
}
346
348
347
349
// Test next()::None
@@ -357,86 +359,9 @@ mod tests {
357
359
fn decryptor_iterator_one_item_valid ( ) {
358
360
let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
359
361
let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
360
- connected_peer. read ( & encrypted) ;
361
-
362
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
363
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
364
- }
365
-
366
- // Test next()::err -> next()::None
367
- #[ test]
368
- fn decryptor_iterator_error ( ) {
369
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
370
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
371
- connected_peer. read ( & encrypted) ;
372
-
373
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
374
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
375
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
376
- }
377
-
378
- // Test next()::Some -> next()::err -> next()::None
379
- #[ test]
380
- fn decryptor_iterator_error_after_success ( ) {
381
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
382
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
383
- connected_peer. read ( & encrypted) ;
384
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
385
- connected_peer. read ( & encrypted) ;
386
-
387
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
388
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
389
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
390
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
391
- }
392
-
393
- // Test that next()::Some -> next()::err -> next()::None
394
- // Error should poison decryptor
395
- #[ test]
396
- fn decryptor_iterator_next_after_error_returns_none ( ) {
397
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
398
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
399
- connected_peer. read ( & encrypted) ;
400
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
401
- connected_peer. read ( & encrypted) ;
402
- let encrypted = remote_peer. encrypt ( & [ 3 ] ) ;
403
- connected_peer. read ( & encrypted) ;
404
-
405
- // Get one valid value
406
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
407
- let valid_receiving_key = connected_peer. decryptor . receiving_key ;
408
-
409
- // Corrupt the receiving key and ensure we get a failure
410
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
411
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
412
-
413
- // Restore the receiving key, do a read and ensure None is returned (poisoned)
414
- connected_peer. decryptor . receiving_key = valid_receiving_key;
415
- assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
416
- }
417
-
418
- // Test next()::Some -> next()::err -> read() -> next()::None
419
- // Error should poison decryptor even after future reads
420
- #[ test]
421
- fn decryptor_iterator_read_next_after_error_returns_none ( ) {
422
- let ( mut connected_peer, mut remote_peer) = setup_peers ( ) ;
423
- let encrypted = remote_peer. encrypt ( & [ 1 ] ) ;
424
- connected_peer. read ( & encrypted) ;
425
- let encrypted = remote_peer. encrypt ( & [ 2 ] ) ;
426
- connected_peer. read ( & encrypted) ;
427
-
428
- // Get one valid value
429
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Ok ( Some ( vec![ 1 ] ) ) ) ) ;
430
- let valid_receiving_key = connected_peer. decryptor . receiving_key ;
431
-
432
- // Corrupt the receiving key and ensure we get a failure
433
- connected_peer. decryptor . receiving_key = [ 0 ; 32 ] ;
434
- assert_eq ! ( connected_peer. decryptor. next( ) , Some ( Err ( "invalid hmac" . to_string( ) ) ) ) ;
362
+ connected_peer. read ( & encrypted) . unwrap ( ) ;
435
363
436
- // Restore the receiving key, do a read and ensure None is returned (poisoned)
437
- let encrypted = remote_peer. encrypt ( & [ 3 ] ) ;
438
- connected_peer. read ( & encrypted) ;
439
- connected_peer. decryptor . receiving_key = valid_receiving_key;
364
+ assert_eq ! ( connected_peer. decryptor. next( ) , Some ( vec![ 1 ] ) ) ;
440
365
assert_eq ! ( connected_peer. decryptor. next( ) , None ) ;
441
366
}
442
367
0 commit comments