1
1
use crate :: crypto:: chacha20:: ChaCha20 ;
2
2
use crate :: crypto:: chacha20poly1305rfc:: ChaCha20Poly1305RFC ;
3
3
4
- use crate :: ln:: msgs:: DecodeError ;
5
- use crate :: util:: ser:: { FixedLengthReader , LengthRead , LengthReadableArgs , Readable , Writeable , Writer } ;
6
4
use crate :: io:: { self , Read , Write } ;
5
+ use crate :: ln:: msgs:: DecodeError ;
6
+ use crate :: util:: ser:: {
7
+ FixedLengthReader , LengthRead , LengthReadableArgs , Readable , Writeable , Writer ,
8
+ } ;
7
9
8
10
pub ( crate ) struct ChaChaReader < ' a , R : io:: Read > {
9
11
pub chacha : & ' a mut ChaCha20 ,
@@ -58,7 +60,9 @@ impl<T: Readable> LengthReadableArgs<[u8; 32]> for ChaChaPolyReadAdapter<T> {
58
60
// LengthRead must be used instead of std::io::Read because we need the total length to separate
59
61
// out the tag at the end.
60
62
fn read < R : LengthRead > ( r : & mut R , secret : [ u8 ; 32 ] ) -> Result < Self , DecodeError > {
61
- if r. total_bytes ( ) < 16 { return Err ( DecodeError :: InvalidValue ) }
63
+ if r. total_bytes ( ) < 16 {
64
+ return Err ( DecodeError :: InvalidValue ) ;
65
+ }
62
66
63
67
let mut chacha = ChaCha20Poly1305RFC :: new ( & secret, & [ 0 ; 12 ] , & [ ] ) ;
64
68
let decrypted_len = r. total_bytes ( ) - 16 ;
@@ -70,14 +74,13 @@ impl<T: Readable> LengthReadableArgs<[u8; 32]> for ChaChaPolyReadAdapter<T> {
70
74
let mut tag = [ 0 as u8 ; 16 ] ;
71
75
r. read_exact ( & mut tag) ?;
72
76
if !chacha. finish_and_check_tag ( & tag) {
73
- return Err ( DecodeError :: InvalidValue )
77
+ return Err ( DecodeError :: InvalidValue ) ;
74
78
}
75
79
76
80
Ok ( Self { readable } )
77
81
}
78
82
}
79
83
80
-
81
84
/// Enables simultaneously reading and decrypting a ChaCha20Poly1305RFC stream from a std::io::Read.
82
85
struct ChaChaPolyReader < ' a , R : Read > {
83
86
pub chacha : & ' a mut ChaCha20Poly1305RFC ,
@@ -111,7 +114,9 @@ impl<'a, W: Writer> Writer for ChaChaPolyWriter<'a, W> {
111
114
let mut src_idx = 0 ;
112
115
while src_idx < src. len ( ) {
113
116
let mut write_buffer = [ 0 ; 8192 ] ;
114
- let bytes_written = ( & mut write_buffer[ ..] ) . write ( & src[ src_idx..] ) . expect ( "In-memory writes can't fail" ) ;
117
+ let bytes_written = ( & mut write_buffer[ ..] )
118
+ . write ( & src[ src_idx..] )
119
+ . expect ( "In-memory writes can't fail" ) ;
115
120
self . chacha . encrypt_in_place ( & mut write_buffer[ ..bytes_written] ) ;
116
121
self . write . write_all ( & write_buffer[ ..bytes_written] ) ?;
117
122
src_idx += bytes_written;
@@ -120,11 +125,10 @@ impl<'a, W: Writer> Writer for ChaChaPolyWriter<'a, W> {
120
125
}
121
126
}
122
127
123
-
124
128
#[ cfg( test) ]
125
129
mod tests {
126
- use crate :: ln:: msgs:: DecodeError ;
127
130
use super :: { ChaChaPolyReadAdapter , ChaChaPolyWriteAdapter } ;
131
+ use crate :: ln:: msgs:: DecodeError ;
128
132
use crate :: util:: ser:: { self , FixedLengthReader , LengthReadableArgs , Writeable } ;
129
133
130
134
// Used for for testing various lengths of serialization.
@@ -155,34 +159,26 @@ mod tests {
155
159
156
160
// Now deserialize the object back and make sure it matches the original.
157
161
let mut rd = FixedLengthReader :: new( encrypted_writeable, writeable_len) ;
158
- let read_adapter = <ChaChaPolyReadAdapter <TestWriteable >>:: read( & mut rd, rho) . unwrap( ) ;
162
+ let read_adapter =
163
+ <ChaChaPolyReadAdapter <TestWriteable >>:: read( & mut rd, rho) . unwrap( ) ;
159
164
assert_eq!( $obj, read_adapter. readable) ;
160
165
} ;
161
166
}
162
167
163
168
// Try a big object that will require multiple write buffers.
164
- let big_writeable = TestWriteable {
165
- field1 : vec ! [ 43 ] ,
166
- field2 : vec ! [ 44 ; 4192 ] ,
167
- field3 : vec ! [ 45 ; 4192 + 1 ] ,
168
- } ;
169
+ let big_writeable =
170
+ TestWriteable { field1 : vec ! [ 43 ] , field2 : vec ! [ 44 ; 4192 ] , field3 : vec ! [ 45 ; 4192 + 1 ] } ;
169
171
check_object_read_write ! ( big_writeable) ;
170
172
171
173
// Try a small object that fits into one write buffer.
172
- let small_writeable = TestWriteable {
173
- field1 : vec ! [ 43 ] ,
174
- field2 : vec ! [ 44 ] ,
175
- field3 : vec ! [ 45 ] ,
176
- } ;
174
+ let small_writeable =
175
+ TestWriteable { field1 : vec ! [ 43 ] , field2 : vec ! [ 44 ] , field3 : vec ! [ 45 ] } ;
177
176
check_object_read_write ! ( small_writeable) ;
178
177
}
179
178
180
179
fn do_chacha_stream_adapters_ser_macros ( ) -> Result < ( ) , DecodeError > {
181
- let writeable = TestWriteable {
182
- field1 : vec ! [ 43 ] ,
183
- field2 : vec ! [ 44 ; 4192 ] ,
184
- field3 : vec ! [ 45 ; 4192 + 1 ] ,
185
- } ;
180
+ let writeable =
181
+ TestWriteable { field1 : vec ! [ 43 ] , field2 : vec ! [ 44 ; 4192 ] , field3 : vec ! [ 45 ; 4192 + 1 ] } ;
186
182
187
183
// First, serialize the object into a TLV stream, encrypted with ChaCha20Poly1305.
188
184
let rho = [ 42 ; 32 ] ;
0 commit comments