@@ -149,21 +149,22 @@ impl NoiseState {
149149 . map ( |( ) | self . hash . 0 = hash. into ( ) )
150150 }
151151
152- pub fn encrypt < const NONCE : u64 > ( & mut self , data : & mut [ u8 ] ) -> [ u8 ; 16 ] {
152+ pub fn encrypt < const NONCE : u64 > ( & mut self , data : & mut [ u8 ] ) -> Result < [ u8 ; 16 ] , NoiseError > {
153153 let mut nonce = GenericArray :: default ( ) ;
154154 nonce[ 4 ..] . clone_from_slice ( & NONCE . to_le_bytes ( ) ) ;
155155
156156 let tag = ChaCha20Poly1305 :: new ( GenericArray :: from_slice ( & self . aead_key . 0 ) )
157157 . encrypt_in_place_detached ( & nonce, & self . hash . 0 , data)
158- . expect ( "data length must be sufficiently small" ) ;
158+ . map_err ( |_| NoiseError :: Encryption ) ?;
159+
159160 let hash = Sha256 :: default ( )
160161 . chain ( self . hash . 0 )
161162 . chain ( & * data)
162163 . chain ( tag)
163164 . finalize_fixed ( ) ;
164165 self . hash . 0 = hash. into ( ) ;
165166
166- tag. into ( )
167+ Ok ( tag. into ( ) )
167168 }
168169
169170 pub fn finish ( & self ) -> ( DataSized < 32 > , DataSized < 32 > ) {
@@ -196,6 +197,8 @@ pub enum NoiseError {
196197 SelfConnection ,
197198 #[ error( "remote peer id doesn't match expected peer id" ) ]
198199 RemotePeerIdMismatch ,
200+ #[ error( "failed to encrypt data" ) ]
201+ Encryption ,
199202}
200203
201204pub struct ResponderOutput {
@@ -205,7 +208,7 @@ pub struct ResponderOutput {
205208}
206209
207210impl P2pNetworkNoiseStateInitiator {
208- pub fn generate ( & mut self , data : & [ u8 ] ) -> Option < ( Vec < u8 > , ( DataSized < 32 > , DataSized < 32 > ) ) > {
211+ pub fn generate ( & mut self , data : & [ u8 ] ) -> Result < Option < ( Vec < u8 > , ( DataSized < 32 > , DataSized < 32 > ) ) > , NoiseError > {
209212 let Self {
210213 i_spk,
211214 i_ssk,
@@ -215,10 +218,13 @@ impl P2pNetworkNoiseStateInitiator {
215218 ..
216219 } = self ;
217220
218- let r_epk = r_epk. as_ref ( ) ?;
221+ let r_epk = match r_epk. as_ref ( ) {
222+ Some ( r_epk) => r_epk,
223+ None => return Ok ( None )
224+ } ;
219225
220226 let mut i_spk_bytes = i_spk. 0 . to_bytes ( ) ;
221- let tag = noise. encrypt :: < 1 > ( & mut i_spk_bytes) ;
227+ let tag = noise. encrypt :: < 1 > ( & mut i_spk_bytes) ? ;
222228 noise. mix_secret ( & * i_ssk * r_epk) ;
223229 let mut payload = payload. 0 . to_vec ( ) ;
224230 // if handshake is optimized by early mux negotiation
@@ -227,7 +233,7 @@ impl P2pNetworkNoiseStateInitiator {
227233 payload. push ( data. len ( ) as u8 ) ;
228234 payload. extend_from_slice ( data) ;
229235 }
230- let payload_tag = noise. encrypt :: < 0 > ( & mut payload) ;
236+ let payload_tag = noise. encrypt :: < 0 > ( & mut payload) ? ;
231237
232238 let mut chunk = vec ! [ 0 ; 2 ] ;
233239 chunk. extend_from_slice ( & i_spk_bytes) ;
@@ -237,7 +243,7 @@ impl P2pNetworkNoiseStateInitiator {
237243 let l = ( chunk. len ( ) - 2 ) as u16 ;
238244 chunk[ ..2 ] . clone_from_slice ( & l. to_be_bytes ( ) ) ;
239245
240- Some ( ( chunk, noise. finish ( ) ) )
246+ Ok ( Some ( ( chunk, noise. finish ( ) ) ) )
241247 }
242248
243249 pub fn consume < ' a > (
@@ -258,9 +264,9 @@ impl P2pNetworkNoiseStateInitiator {
258264 if len < 200 {
259265 return Err ( ChunkTooShort ) ;
260266 }
261- let r_epk = Pk :: from_bytes ( msg[ ..32 ] . try_into ( ) . expect ( "cannot fail" ) ) ;
262- let mut r_spk_bytes =
263- < [ u8 ; 32 ] > :: try_from ( & msg [ 32 .. 64 ] ) . expect ( "cannot fail, checked above" ) ;
267+ let r_epk = Pk :: from_bytes ( msg[ ..32 ] . try_into ( ) . map_err ( |_| ChunkTooShort ) ? ) ;
268+ let mut r_spk_bytes = < [ u8 ; 32 ] > :: try_from ( & msg [ 32 .. 64 ] ) . map_err ( |_| ChunkTooShort ) ? ;
269+
264270 let tag = & msg[ 64 ..80 ] ;
265271
266272 noise. mix_hash ( r_epk. 0 . as_bytes ( ) ) ;
@@ -324,7 +330,7 @@ impl P2pNetworkNoiseStateResponder {
324330 payload. push ( data. len ( ) as u8 ) ;
325331 payload. extend_from_slice ( data) ;
326332 }
327- let payload_tag = noise. encrypt :: < 0 > ( & mut payload) ;
333+ let payload_tag = noise. encrypt :: < 0 > ( & mut payload) . ok ( ) ? ;
328334
329335 buffer. extend_from_slice ( & payload) ;
330336 buffer. extend_from_slice ( & payload_tag) ;
@@ -360,7 +366,7 @@ impl P2pNetworkNoiseStateResponder {
360366 if len < 32 {
361367 return Err ( ChunkTooShort ) ;
362368 }
363- let i_epk = Pk :: from_bytes ( msg[ ..32 ] . try_into ( ) . expect ( "cannot fail" ) ) ;
369+ let i_epk = Pk :: from_bytes ( msg[ ..32 ] . try_into ( ) . map_err ( |_| ChunkTooShort ) ? ) ;
364370
365371 let r_epk = r_esk. pk ( ) ;
366372
@@ -370,7 +376,7 @@ impl P2pNetworkNoiseStateResponder {
370376 noise. mix_hash ( b"" ) ;
371377 noise. mix_hash ( r_epk. 0 . as_bytes ( ) ) ;
372378 noise. mix_secret ( & * r_esk * & i_epk) ;
373- let tag = noise. encrypt :: < 0 > ( & mut r_spk_bytes) ;
379+ let tag = noise. encrypt :: < 0 > ( & mut r_spk_bytes) ? ;
374380 noise. mix_secret ( & * r_ssk * & i_epk) ;
375381 r_ssk. zeroize ( ) ;
376382
@@ -389,7 +395,8 @@ impl P2pNetworkNoiseStateResponder {
389395 }
390396
391397 // TODO: refactor obscure arithmetics
392- let mut i_spk_bytes = <[ u8 ; 32 ] >:: try_from ( & msg[ ..32 ] ) . expect ( "cannot fail" ) ;
398+ let mut i_spk_bytes =
399+ <[ u8 ; 32 ] >:: try_from ( & msg[ ..32 ] ) . map_err ( |_| ChunkTooShort ) ?;
393400 let ( tag, msg) = msg[ 32 ..] . split_at_mut ( 16 ) ;
394401 let len = msg. len ( ) ;
395402 let ( remote_payload, payload_tag) = msg. split_at_mut ( len - 16 ) ;
0 commit comments