initial checkin
[rust-lightning] / src / ln / peer_channel_encryptor.rs
1 use ln::msgs::HandleError;
2 use ln::msgs;
3
4 use secp256k1::Secp256k1;
5 use secp256k1::key::{PublicKey,SecretKey};
6 use secp256k1::ecdh::SharedSecret;
7
8 use rand::{thread_rng,Rng};
9
10 use crypto::digest::Digest;
11 use crypto::hkdf::{hkdf_extract,hkdf_expand};
12 use crypto::sha2::Sha256;
13
14 use crypto::aead::{AeadEncryptor, AeadDecryptor};
15
16 use util::chacha20poly1305rfc::ChaCha20Poly1305RFC;
17 use util::byte_utils;
18
19 // Sha256("Noise_XK_secp256k1_ChaChaPoly_SHA256")
20 const NOISE_CK: [u8; 32] = [0x26, 0x40, 0xf5, 0x2e, 0xeb, 0xcd, 0x9e, 0x88, 0x29, 0x58, 0x95, 0x1c, 0x79, 0x42, 0x50, 0xee, 0xdb, 0x28, 0x00, 0x2c, 0x05, 0xd7, 0xdc, 0x2e, 0xa0, 0xf1, 0x95, 0x40, 0x60, 0x42, 0xca, 0xf1];
21 // Sha256(NOISE_CK || "lightning")
22 const NOISE_H: [u8; 32] = [0xd1, 0xfb, 0xf6, 0xde, 0xe4, 0xf6, 0x86, 0xf1, 0x32, 0xfd, 0x70, 0x2c, 0x4a, 0xbf, 0x8f, 0xba, 0x4b, 0xb4, 0x20, 0xd8, 0x9d, 0x2a, 0x04, 0x8a, 0x3c, 0x4f, 0x4c, 0x09, 0x2e, 0x37, 0xb6, 0x76];
23
24 pub enum NextNoiseStep {
25         ActOne,
26         ActTwo,
27         ActThree,
28         NoiseComplete,
29 }
30
31 #[derive(PartialEq)]
32 enum NoiseStep {
33         PreActOne,
34         PostActOne,
35         PostActTwo,
36         // When done swap noise_state for NoiseState::Finished
37 }
38
39 struct BidirectionalNoiseState {
40         h: [u8; 32],
41         ck: [u8; 32],
42 }
43 enum DirectionalNoiseState {
44         Outbound {
45                 ie: SecretKey,
46         },
47         Inbound {
48                 ie: Option<PublicKey>, // filled in if state >= PostActOne
49                 re: Option<SecretKey>, // filled in if state >= PostActTwo
50                 temp_k2: Option<[u8; 32]>, // filled in if state >= PostActTwo
51         }
52 }
53 enum NoiseState {
54         InProgress {
55                 state: NoiseStep,
56                 directional_state: DirectionalNoiseState,
57                 bidirectional_state: BidirectionalNoiseState,
58         },
59         Finished {
60                 sk: [u8; 32],
61                 sn: u64,
62                 sck: [u8; 32],
63                 rk: [u8; 32],
64                 rn: u64,
65                 rck: [u8; 32],
66         }
67 }
68
69 pub struct PeerChannelEncryptor {
70         secp_ctx: Secp256k1,
71         their_node_id: Option<PublicKey>, // filled in for outbound, or inbound after noise_state is Finished
72
73         noise_state: NoiseState,
74 }
75
76 impl PeerChannelEncryptor {
77         pub fn new_outbound(their_node_id: PublicKey) -> PeerChannelEncryptor {
78                 let mut rng = thread_rng();
79                 let mut key = [0u8; 32];
80                 rng.fill_bytes(&mut key);
81
82                 let secp_ctx = Secp256k1::new();
83                 let sec_key = SecretKey::from_slice(&secp_ctx, &key).unwrap(); //TODO: nicer rng-is-bad error message
84
85                 let mut sha = Sha256::new();
86                 sha.input(&NOISE_H);
87                 sha.input(&their_node_id.serialize()[..]);
88                 let mut h = [0; 32];
89                 sha.result(&mut h);
90
91                 PeerChannelEncryptor {
92                         their_node_id: Some(their_node_id),
93                         secp_ctx: secp_ctx,
94                         noise_state: NoiseState::InProgress {
95                                 state: NoiseStep::PreActOne,
96                                 directional_state: DirectionalNoiseState::Outbound {
97                                         ie: sec_key,
98                                 },
99                                 bidirectional_state: BidirectionalNoiseState {
100                                         h: h,
101                                         ck: NOISE_CK,
102                                 },
103                         }
104                 }
105         }
106
107         pub fn new_inbound(our_node_secret: &SecretKey) -> PeerChannelEncryptor {
108                 let secp_ctx = Secp256k1::new();
109
110                 let mut sha = Sha256::new();
111                 sha.input(&NOISE_H);
112                 let our_node_id = PublicKey::from_secret_key(&secp_ctx, our_node_secret).unwrap(); //TODO: nicer bad-node_secret error message
113                 sha.input(&our_node_id.serialize()[..]);
114                 let mut h = [0; 32];
115                 sha.result(&mut h);
116
117                 PeerChannelEncryptor {
118                         their_node_id: None,
119                         secp_ctx: secp_ctx,
120                         noise_state: NoiseState::InProgress {
121                                 state: NoiseStep::PreActOne,
122                                 directional_state: DirectionalNoiseState::Inbound {
123                                         ie: None,
124                                         re: None,
125                                         temp_k2: None,
126                                 },
127                                 bidirectional_state: BidirectionalNoiseState {
128                                         h: h,
129                                         ck: NOISE_CK,
130                                 },
131                         }
132                 }
133         }
134
135         #[inline]
136         fn encrypt_with_ad(res: &mut[u8], n: u64, key: &[u8; 32], h: &[u8], plaintext: &[u8]) {
137                 let mut nonce = [0; 12];
138                 nonce[4..].copy_from_slice(&byte_utils::le64_to_array(n));
139
140                 let mut chacha = ChaCha20Poly1305RFC::new(key, &nonce, h);
141                 let mut tag = [0; 16];
142                 chacha.encrypt(plaintext, &mut res[0..plaintext.len()], &mut tag);
143                 res[plaintext.len()..].copy_from_slice(&tag);
144         }
145
146         #[inline]
147         fn decrypt_with_ad(res: &mut[u8], n: u64, key: &[u8; 32], h: &[u8], cyphertext: &[u8]) -> Result<(), HandleError> {
148                 let mut nonce = [0; 12];
149                 nonce[4..].copy_from_slice(&byte_utils::le64_to_array(n));
150
151                 let mut chacha = ChaCha20Poly1305RFC::new(key, &nonce, h);
152                 if !chacha.decrypt(&cyphertext[0..cyphertext.len() - 16], res, &cyphertext[cyphertext.len() - 16..]) {
153                         return Err(HandleError{err: "Bad MAC", msg: Some(msgs::ErrorMessage::DisconnectPeer{})});
154                 }
155                 Ok(())
156         }
157
158         #[inline]
159         fn hkdf(state: &mut BidirectionalNoiseState, ss: SharedSecret) -> [u8; 32] {
160                 let sha = Sha256::new();
161                 let mut hkdf = [0; 64];
162                 {
163                         let mut prk = [0; 32];
164                         hkdf_extract(sha, &state.ck, &ss[..], &mut prk);
165                         hkdf_expand(sha, &prk, &[0;0], &mut hkdf);
166                 }
167                 state.ck.copy_from_slice(&hkdf[0..32]);
168                 let mut res = [0; 32];
169                 res.copy_from_slice(&hkdf[32..]);
170                 res
171         }
172
173         #[inline]
174         fn outbound_noise_act(secp_ctx: &Secp256k1, state: &mut BidirectionalNoiseState, our_key: &SecretKey, their_key: &PublicKey) -> ([u8; 50], [u8; 32]) {
175                 let our_pub = PublicKey::from_secret_key(secp_ctx, &our_key).unwrap(); //TODO: nicer rng-is-bad error message
176
177                 let mut sha = Sha256::new();
178                 sha.input(&state.h);
179                 sha.input(&our_pub.serialize()[..]);
180                 sha.result(&mut state.h);
181
182                 let ss = SharedSecret::new(secp_ctx, &their_key, &our_key);
183                 let temp_k = PeerChannelEncryptor::hkdf(state, ss);
184
185                 let mut res = [0; 50];
186                 res[1..34].copy_from_slice(&our_pub.serialize()[..]);
187                 PeerChannelEncryptor::encrypt_with_ad(&mut res[34..], 0, &temp_k, &state.h, &[0; 0]);
188
189                 sha.reset();
190                 sha.input(&state.h);
191                 sha.input(&res[34..]);
192                 sha.result(&mut state.h);
193
194                 (res, temp_k)
195         }
196
197         #[inline]
198         fn inbound_noise_act(secp_ctx: &Secp256k1, state: &mut BidirectionalNoiseState, act: &[u8], our_key: &SecretKey) -> Result<(PublicKey, [u8; 32]), HandleError> {
199                 assert_eq!(act.len(), 50);
200
201                 if act[0] != 0 {
202                         return Err(HandleError{err: "Unknown handshake version number", msg: Some(msgs::ErrorMessage::DisconnectPeer{})});
203                 }
204
205                 let their_pub = match PublicKey::from_slice(secp_ctx, &act[1..34]) {
206                         Err(_) => return Err(HandleError{err: "Invalid public key", msg: Some(msgs::ErrorMessage::DisconnectPeer{})}),
207                         Ok(key) => key,
208                 };
209
210                 let mut sha = Sha256::new();
211                 sha.input(&state.h);
212                 sha.input(&their_pub.serialize()[..]);
213                 sha.result(&mut state.h);
214
215                 let ss = SharedSecret::new(secp_ctx, &their_pub, &our_key);
216                 let temp_k = PeerChannelEncryptor::hkdf(state, ss);
217
218                 let mut dec = [0; 0];
219                 try!(PeerChannelEncryptor::decrypt_with_ad(&mut dec, 0, &temp_k, &state.h, &act[34..]));
220
221                 sha.reset();
222                 sha.input(&state.h);
223                 sha.input(&act[34..]);
224                 sha.result(&mut state.h);
225
226                 Ok((their_pub, temp_k))
227         }
228
229         pub fn get_act_one(&mut self) -> [u8; 50] {
230                 match self.noise_state {
231                         NoiseState::InProgress { ref mut state, ref directional_state, ref mut bidirectional_state } =>
232                                 match directional_state {
233                                         &DirectionalNoiseState::Outbound { ref ie } => {
234                                                 if *state != NoiseStep::PreActOne {
235                                                         panic!("Requested act at wrong step");
236                                                 }
237
238                                                 let (res, _) = PeerChannelEncryptor::outbound_noise_act(&self.secp_ctx, bidirectional_state, &ie, &self.their_node_id.unwrap());
239                                                 *state = NoiseStep::PostActOne;
240                                                 res
241                                         },
242                                         _ => panic!("Wrong direction for act"),
243                                 },
244                         _ => panic!("Cannot get act one after noise handshake completes"),
245                 }
246         }
247
248         // Separated for testing:
249         fn process_act_one_with_ephemeral_key(&mut self, act_one: &[u8], our_node_secret: &SecretKey, our_ephemeral: SecretKey) -> Result<[u8; 50], HandleError> {
250                 assert_eq!(act_one.len(), 50);
251
252                 match self.noise_state {
253                         NoiseState::InProgress { ref mut state, ref mut directional_state, ref mut bidirectional_state } =>
254                                 match directional_state {
255                                         &mut DirectionalNoiseState::Inbound { ref mut ie, ref mut re, ref mut temp_k2 } => {
256                                                 if *state != NoiseStep::PreActOne {
257                                                         panic!("Requested act at wrong step");
258                                                 }
259
260                                                 let (their_pub, _) = try!(PeerChannelEncryptor::inbound_noise_act(&self.secp_ctx, bidirectional_state, act_one, &our_node_secret));
261                                                 ie.get_or_insert(their_pub);
262
263                                                 re.get_or_insert(our_ephemeral);
264
265                                                 let (res, temp_k) = PeerChannelEncryptor::outbound_noise_act(&self.secp_ctx, bidirectional_state, &re.unwrap(), &ie.unwrap());
266                                                 *temp_k2 = Some(temp_k);
267                                                 *state = NoiseStep::PostActTwo;
268                                                 Ok(res)
269                                         },
270                                         _ => panic!("Wrong direction for act"),
271                                 },
272                         _ => panic!("Cannot get act one after noise handshake completes"),
273                 }
274         }
275
276         pub fn process_act_one_with_key(&mut self, act_one: &[u8], our_node_secret: &SecretKey) -> Result<[u8; 50], HandleError> {
277                 assert_eq!(act_one.len(), 50);
278
279                 let mut rng = thread_rng();
280                 let mut key = [0u8; 32];
281                 rng.fill_bytes(&mut key);
282                 let our_ephemeral_key = SecretKey::from_slice(&self.secp_ctx, &key).unwrap(); //TODO: nicer rng-is-bad error message
283                 self.process_act_one_with_ephemeral_key(act_one, our_node_secret, our_ephemeral_key)
284         }
285
286         pub fn process_act_two(&mut self, act_two: &[u8], our_node_secret: &SecretKey) -> Result<[u8; 66], HandleError> {
287                 assert_eq!(act_two.len(), 50);
288
289                 let mut final_hkdf = [0; 64];
290                 let ck;
291                 let res: [u8; 66] = match self.noise_state {
292                         NoiseState::InProgress { ref state, ref directional_state, ref mut bidirectional_state } =>
293                                 match directional_state {
294                                         &DirectionalNoiseState::Outbound { ref ie } => {
295                                                 if *state != NoiseStep::PostActOne {
296                                                         panic!("Requested act at wrong step");
297                                                 }
298
299                                                 let (re, temp_k2) = try!(PeerChannelEncryptor::inbound_noise_act(&self.secp_ctx, bidirectional_state, act_two, &ie));
300
301                                                 let mut res = [0; 66];
302                                                 let our_node_id = PublicKey::from_secret_key(&self.secp_ctx, &our_node_secret).unwrap(); //TODO: nicer rng-is-bad error message
303
304                                                 PeerChannelEncryptor::encrypt_with_ad(&mut res[1..50], 1, &temp_k2, &bidirectional_state.h, &our_node_id.serialize()[..]);
305
306                                                 let mut sha = Sha256::new();
307                                                 sha.input(&bidirectional_state.h);
308                                                 sha.input(&res[1..50]);
309                                                 sha.result(&mut bidirectional_state.h);
310
311                                                 let ss = SharedSecret::new(&self.secp_ctx, &re, our_node_secret);
312                                                 let temp_k = PeerChannelEncryptor::hkdf(bidirectional_state, ss);
313
314                                                 PeerChannelEncryptor::encrypt_with_ad(&mut res[50..], 0, &temp_k, &bidirectional_state.h, &[0; 0]);
315
316                                                 sha.reset();
317                                                 let mut prk = [0; 32];
318                                                 hkdf_extract(sha, &bidirectional_state.ck, &[0; 0], &mut prk);
319                                                 hkdf_expand(sha, &prk, &[0;0], &mut final_hkdf);
320                                                 ck = bidirectional_state.ck.clone();
321                                                 res
322                                         },
323                                         _ => panic!("Wrong direction for act"),
324                                 },
325                         _ => panic!("Cannot get act one after noise handshake completes"),
326                 };
327
328                 let mut sk = [0; 32];
329                 let mut rk = [0; 32];
330                 sk.copy_from_slice(&final_hkdf[0..32]);
331                 rk.copy_from_slice(&final_hkdf[32..]);
332
333                 self.noise_state = NoiseState::Finished {
334                         sk: sk,
335                         sn: 0,
336                         sck: ck.clone(),
337                         rk: rk,
338                         rn: 0,
339                         rck: ck,
340                 };
341
342                 Ok(res)
343         }
344
345         pub fn process_act_three(&mut self, act_three: &[u8]) -> Result<PublicKey, HandleError> {
346                 assert_eq!(act_three.len(), 66);
347
348                 let mut final_hkdf = [0; 64];
349                 let ck;
350                 match self.noise_state {
351                         NoiseState::InProgress { ref state, ref directional_state, ref mut bidirectional_state } =>
352                                 match directional_state {
353                                         &DirectionalNoiseState::Inbound { ie: _, ref re, ref temp_k2 } => {
354                                                 if *state != NoiseStep::PostActTwo {
355                                                         panic!("Requested act at wrong step");
356                                                 }
357                                                 if act_three[0] != 0 {
358                                                         return Err(HandleError{err: "Unknown handshake version number", msg: Some(msgs::ErrorMessage::DisconnectPeer{})});
359                                                 }
360
361                                                 let mut their_node_id = [0; 33];
362                                                 try!(PeerChannelEncryptor::decrypt_with_ad(&mut their_node_id, 1, &temp_k2.unwrap(), &bidirectional_state.h, &act_three[1..50]));
363                                                 self.their_node_id = Some(match PublicKey::from_slice(&self.secp_ctx, &their_node_id) {
364                                                         Ok(key) => key,
365                                                         Err(_) => return Err(HandleError{err: "Bad node_id from peer", msg: Some(msgs::ErrorMessage::DisconnectPeer{})}),
366                                                 });
367
368                                                 let mut sha = Sha256::new();
369                                                 sha.input(&bidirectional_state.h);
370                                                 sha.input(&act_three[1..50]);
371                                                 sha.result(&mut bidirectional_state.h);
372
373                                                 let ss = SharedSecret::new(&self.secp_ctx, &self.their_node_id.unwrap(), &re.unwrap());
374                                                 let temp_k = PeerChannelEncryptor::hkdf(bidirectional_state, ss);
375
376                                                 try!(PeerChannelEncryptor::decrypt_with_ad(&mut [0; 0], 0, &temp_k, &bidirectional_state.h, &act_three[50..]));
377
378                                                 sha.reset();
379                                                 let mut prk = [0; 32];
380                                                 hkdf_extract(sha, &bidirectional_state.ck, &[0; 0], &mut prk);
381                                                 hkdf_expand(sha, &prk, &[0;0], &mut final_hkdf);
382                                                 ck = bidirectional_state.ck.clone();
383                                         },
384                                         _ => panic!("Wrong direction for act"),
385                                 },
386                         _ => panic!("Cannot get act one after noise handshake completes"),
387                 }
388
389                 let mut rk = [0; 32];
390                 let mut sk = [0; 32];
391                 rk.copy_from_slice(&final_hkdf[0..32]);
392                 sk.copy_from_slice(&final_hkdf[32..]);
393
394                 self.noise_state = NoiseState::Finished {
395                         sk: sk,
396                         sn: 0,
397                         sck: ck.clone(),
398                         rk: rk,
399                         rn: 0,
400                         rck: ck,
401                 };
402
403                 Ok(self.their_node_id.unwrap().clone())
404         }
405
406         /// Encrypts the given message, returning the encrypted version
407         /// panics if msg.len() > 65535 or Noise handshake has not finished.
408         pub fn encrypt_message(&mut self, msg: &[u8]) -> Vec<u8> {
409                 if msg.len() > 65535 {
410                         panic!("Attempted to encrypt message longer than 65535 bytes!");
411                 }
412
413                 let mut res = Vec::with_capacity(msg.len() + 16*2 + 2);
414                 res.resize(msg.len() + 16*2 + 2, 0);
415
416                 match self.noise_state {
417                         NoiseState::Finished { ref mut sk, ref mut sn, ref mut sck, rk: _, rn: _, rck: _ } => {
418                                 if *sn >= 1000 {
419                                         let mut sha = Sha256::new();
420                                         let mut prk = [0; 32];
421                                         hkdf_extract(sha, sck, sk, &mut prk);
422                                         let mut hkdf = [0; 64];
423                                         hkdf_expand(sha, &prk, &[0;0], &mut hkdf);
424
425                                         sck[..].copy_from_slice(&hkdf[0..32]);
426                                         sk[..].copy_from_slice(&hkdf[32..]);
427                                         *sn = 0;
428                                 }
429
430                                 Self::encrypt_with_ad(&mut res[0..16+2], *sn, sk, &[0; 0], &byte_utils::be16_to_array(msg.len() as u16));
431                                 *sn += 1;
432
433                                 Self::encrypt_with_ad(&mut res[16+2..], *sn, sk, &[0; 0], msg);
434                                 *sn += 1;
435                         },
436                         _ => panic!("Tried to encrypt a message prior to noise handshake completion"),
437                 }
438
439                 res
440         }
441
442         /// Decrypts a message length header from the remote peer.
443         /// panics if noise handshake has not yet finished or msg.len() != 18
444         pub fn decrypt_length_header(&mut self, msg: &[u8]) -> Result<u16, HandleError> {
445                 assert_eq!(msg.len(), 16+2);
446
447                 match self.noise_state {
448                         NoiseState::Finished { sk: _, sn: _, sck: _, ref mut rk, ref mut rn, ref mut rck } => {
449                                 if *rn >= 1000 {
450                                         let mut sha = Sha256::new();
451                                         let mut prk = [0; 32];
452                                         hkdf_extract(sha, rck, rk, &mut prk);
453                                         let mut hkdf = [0; 64];
454                                         hkdf_expand(sha, &prk, &[0;0], &mut hkdf);
455
456                                         rck[..].copy_from_slice(&hkdf[0..32]);
457                                         rk[..].copy_from_slice(&hkdf[32..]);
458                                         *rn = 0;
459                                 }
460
461                                 let mut res = [0; 2];
462                                 try!(Self::decrypt_with_ad(&mut res, *rn, rk, &[0; 0], msg));
463                                 *rn += 1;
464                                 Ok(byte_utils::slice_to_be16(&res))
465                         },
466                         _ => panic!("Tried to encrypt a message prior to noise handshake completion"),
467                 }
468         }
469
470         /// Decrypts the given message.
471         /// panics if msg.len() > 65535 + 16
472         pub fn decrypt_message(&mut self, msg: &[u8]) -> Result<Vec<u8>, HandleError> {
473                 if msg.len() > 65535 + 16 {
474                         panic!("Attempted to encrypt message longer than 65535 bytes!");
475                 }
476
477                 match self.noise_state {
478                         NoiseState::Finished { sk: _, sn: _, sck: _, ref rk, ref mut rn, rck: _ } => {
479                                 let mut res = Vec::with_capacity(msg.len() - 16);
480                                 res.resize(msg.len() - 16, 0);
481                                 try!(Self::decrypt_with_ad(&mut res[..], *rn, rk, &[0; 0], msg));
482                                 *rn += 1;
483
484                                 Ok(res)
485                         },
486                         _ => panic!("Tried to encrypt a message prior to noise handshake completion"),
487                 }
488         }
489
490         pub fn get_noise_step(&self) -> NextNoiseStep {
491                 match self.noise_state {
492                         NoiseState::InProgress {ref state, ..} => {
493                                 match state {
494                                         &NoiseStep::PreActOne => NextNoiseStep::ActOne,
495                                         &NoiseStep::PostActOne => NextNoiseStep::ActTwo,
496                                         &NoiseStep::PostActTwo => NextNoiseStep::ActThree,
497                                 }
498                         },
499                         NoiseState::Finished {..} => NextNoiseStep::NoiseComplete,
500                 }
501         }
502
503         pub fn is_ready_for_encryption(&self) -> bool {
504                 match self.noise_state {
505                         NoiseState::InProgress {..} => { false },
506                         NoiseState::Finished {..} => { true }
507                 }
508         }
509 }
510
511 #[cfg(test)]
512 mod tests {
513         use secp256k1::Secp256k1;
514         use secp256k1::key::{PublicKey,SecretKey};
515
516         use bitcoin::util::misc::hex_bytes;
517
518         use ln::peer_channel_encryptor::{PeerChannelEncryptor,NoiseState,DirectionalNoiseState};
519
520         fn get_outbound_peer_for_initiator_test_vectors() -> PeerChannelEncryptor {
521                 let secp_ctx = Secp256k1::new();
522                 let their_node_id = PublicKey::from_slice(&secp_ctx, &hex_bytes("028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7").unwrap()[..]).unwrap();
523
524                 let mut outbound_peer = PeerChannelEncryptor::new_outbound(their_node_id);
525                 match outbound_peer.noise_state {
526                         NoiseState::InProgress { state: _, ref mut directional_state, bidirectional_state: _ } => {
527                                 *directional_state = DirectionalNoiseState::Outbound { // overwrite ie...
528                                         ie: SecretKey::from_slice(&secp_ctx, &hex_bytes("1212121212121212121212121212121212121212121212121212121212121212").unwrap()[..]).unwrap(),
529                                 };
530                         },
531                         _ => panic!()
532                 }
533
534                 assert_eq!(outbound_peer.get_act_one()[..], hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap()[..]);
535                 outbound_peer
536         }
537
538         #[test]
539         fn noise_initiator_test_vectors() {
540                 let secp_ctx = Secp256k1::new();
541                 let our_node_id = SecretKey::from_slice(&secp_ctx, &hex_bytes("1111111111111111111111111111111111111111111111111111111111111111").unwrap()[..]).unwrap();
542
543                 {
544                         // transport-initiator successful handshake
545                         let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
546
547                         let act_two = hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
548                         assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
549
550                         match outbound_peer.noise_state {
551                                 NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
552                                         assert_eq!(sk, hex_bytes("969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9").unwrap()[..]);
553                                         assert_eq!(sn, 0);
554                                         assert_eq!(sck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
555                                         assert_eq!(rk, hex_bytes("bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442").unwrap()[..]);
556                                         assert_eq!(rn, 0);
557                                         assert_eq!(rck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
558                                 },
559                                 _ => panic!()
560                         }
561                 }
562                 {
563                         // transport-initiator act2 short read test
564                         // Can't actually test this cause process_act_two requires you pass the right length!
565                 }
566                 {
567                         // transport-initiator act2 bad version test
568                         let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
569
570                         let act_two = hex_bytes("0102466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
571                         assert!(outbound_peer.process_act_two(&act_two[..], &our_node_id).is_err());
572                 }
573
574                 {
575                         // transport-initiator act2 bad key serialization test
576                         let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
577
578                         let act_two = hex_bytes("0004466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
579                         assert!(outbound_peer.process_act_two(&act_two[..], &our_node_id).is_err());
580                 }
581
582                 {
583                         // transport-initiator act2 bad MAC test
584                         let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
585
586                         let act_two = hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730af").unwrap().to_vec();
587                         assert!(outbound_peer.process_act_two(&act_two[..], &our_node_id).is_err());
588                 }
589         }
590
591         #[test]
592         fn noise_responder_test_vectors() {
593                 let secp_ctx = Secp256k1::new();
594                 let our_node_id = SecretKey::from_slice(&secp_ctx, &hex_bytes("2121212121212121212121212121212121212121212121212121212121212121").unwrap()[..]).unwrap();
595                 let our_ephemeral = SecretKey::from_slice(&secp_ctx, &hex_bytes("2222222222222222222222222222222222222222222222222222222222222222").unwrap()[..]).unwrap();
596
597                 {
598                         // transport-responder successful handshake
599                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
600
601                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
602                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
603
604                         let act_three = hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap().to_vec();
605                         // test vector doesn't specify the initiator static key, but its the same as the one
606                         // from trasport-initiator successful handshake
607                         assert_eq!(inbound_peer.process_act_three(&act_three[..]).unwrap().serialize()[..], hex_bytes("034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa").unwrap()[..]);
608
609                         match inbound_peer.noise_state {
610                                 NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
611                                         assert_eq!(sk, hex_bytes("bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442").unwrap()[..]);
612                                         assert_eq!(sn, 0);
613                                         assert_eq!(sck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
614                                         assert_eq!(rk, hex_bytes("969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9").unwrap()[..]);
615                                         assert_eq!(rn, 0);
616                                         assert_eq!(rck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
617                                 },
618                                 _ => panic!()
619                         }
620                 }
621                 {
622                         // transport-responder act1 short read test
623                         // Can't actually test this cause process_act_one requires you pass the right length!
624                 }
625                 {
626                         // transport-responder act1 bad version test
627                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
628
629                         let act_one = hex_bytes("01036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
630                         assert!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).is_err());
631                 }
632                 {
633                         // transport-responder act1 bad key serialization test
634                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
635
636                         let act_one =hex_bytes("00046360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
637                         assert!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).is_err());
638                 }
639                 {
640                         // transport-responder act1 bad MAC test
641                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
642
643                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6b").unwrap().to_vec();
644                         assert!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).is_err());
645                 }
646                 {
647                         // transport-responder act3 bad version test
648                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
649
650                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
651                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
652
653                         let act_three = hex_bytes("01b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap().to_vec();
654                         assert!(inbound_peer.process_act_three(&act_three[..]).is_err());
655                 }
656                 {
657                         // transport-responder act3 short read test
658                         // Can't actually test this cause process_act_three requires you pass the right length!
659                 }
660                 {
661                         // transport-responder act3 bad MAC for ciphertext test
662                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
663
664                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
665                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
666
667                         let act_three = hex_bytes("00c9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap().to_vec();
668                         assert!(inbound_peer.process_act_three(&act_three[..]).is_err());
669                 }
670                 {
671                         // transport-responder act3 bad rs test
672                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
673
674                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
675                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
676
677                         let act_three = hex_bytes("00bfe3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa2235536ad09a8ee351870c2bb7f78b754a26c6cef79a98d25139c856d7efd252c2ae73c").unwrap().to_vec();
678                         assert!(inbound_peer.process_act_three(&act_three[..]).is_err());
679                 }
680                 {
681                         // transport-responder act3 bad MAC test
682                         let mut inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
683
684                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
685                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
686
687                         let act_three = hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139bb").unwrap().to_vec();
688                         assert!(inbound_peer.process_act_three(&act_three[..]).is_err());
689                 }
690         }
691
692
693         #[test]
694         fn message_encryption_decryption_test_vectors() {
695                 let secp_ctx = Secp256k1::new();
696
697                 // We use the same keys as the initiator and responder test vectors, so we copy those tests
698                 // here and use them to encrypt.
699                 let mut outbound_peer = get_outbound_peer_for_initiator_test_vectors();
700
701                 {
702                         let our_node_id = SecretKey::from_slice(&secp_ctx, &hex_bytes("1111111111111111111111111111111111111111111111111111111111111111").unwrap()[..]).unwrap();
703
704                         let act_two = hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap().to_vec();
705                         assert_eq!(outbound_peer.process_act_two(&act_two[..], &our_node_id).unwrap()[..], hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap()[..]);
706
707                         match outbound_peer.noise_state {
708                                 NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
709                                         assert_eq!(sk, hex_bytes("969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9").unwrap()[..]);
710                                         assert_eq!(sn, 0);
711                                         assert_eq!(sck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
712                                         assert_eq!(rk, hex_bytes("bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442").unwrap()[..]);
713                                         assert_eq!(rn, 0);
714                                         assert_eq!(rck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
715                                 },
716                                 _ => panic!()
717                         }
718                 }
719
720                 let mut inbound_peer;
721
722                 {
723                         // transport-responder successful handshake
724                         let our_node_id = SecretKey::from_slice(&secp_ctx, &hex_bytes("2121212121212121212121212121212121212121212121212121212121212121").unwrap()[..]).unwrap();
725                         let our_ephemeral = SecretKey::from_slice(&secp_ctx, &hex_bytes("2222222222222222222222222222222222222222222222222222222222222222").unwrap()[..]).unwrap();
726
727                         inbound_peer = PeerChannelEncryptor::new_inbound(&our_node_id);
728
729                         let act_one = hex_bytes("00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a").unwrap().to_vec();
730                         assert_eq!(inbound_peer.process_act_one_with_ephemeral_key(&act_one[..], &our_node_id, our_ephemeral.clone()).unwrap()[..], hex_bytes("0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae").unwrap()[..]);
731
732                         let act_three = hex_bytes("00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba").unwrap().to_vec();
733                         // test vector doesn't specify the initiator static key, but its the same as the one
734                         // from trasport-initiator successful handshake
735                         assert_eq!(inbound_peer.process_act_three(&act_three[..]).unwrap().serialize()[..], hex_bytes("034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa").unwrap()[..]);
736
737                         match inbound_peer.noise_state {
738                                 NoiseState::Finished { sk, sn, sck, rk, rn, rck } => {
739                                         assert_eq!(sk, hex_bytes("bb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442").unwrap()[..]);
740                                         assert_eq!(sn, 0);
741                                         assert_eq!(sck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
742                                         assert_eq!(rk, hex_bytes("969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9").unwrap()[..]);
743                                         assert_eq!(rn, 0);
744                                         assert_eq!(rck, hex_bytes("919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01").unwrap()[..]);
745                                 },
746                                 _ => panic!()
747                         }
748                 }
749
750                 for i in 0..1005 {
751                         let msg = [0x68, 0x65, 0x6c, 0x6c, 0x6f];
752                         let res = outbound_peer.encrypt_message(&msg);
753                         assert_eq!(res.len(), 5 + 2*16 + 2);
754
755                         let mut len_header = res[0..2+16].to_vec();
756                         assert_eq!(inbound_peer.decrypt_length_header(&len_header[..]).unwrap() as usize, msg.len());
757                         assert_eq!(inbound_peer.decrypt_message(&res[2+16..]).unwrap()[..], msg[..]);
758
759                         if i == 0 {
760                                 assert_eq!(res, hex_bytes("cf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95").unwrap());
761                         } else if i == 1 {
762                                 assert_eq!(res, hex_bytes("72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1").unwrap());
763                         } else if i == 500 {
764                                 assert_eq!(res, hex_bytes("178cb9d7387190fa34db9c2d50027d21793c9bc2d40b1e14dcf30ebeeeb220f48364f7a4c68bf8").unwrap());
765                         } else if i == 501 {
766                                 assert_eq!(res, hex_bytes("1b186c57d44eb6de4c057c49940d79bb838a145cb528d6e8fd26dbe50a60ca2c104b56b60e45bd").unwrap());
767                         } else if i == 1000 {
768                                 assert_eq!(res, hex_bytes("4a2f3cc3b5e78ddb83dcb426d9863d9d9a723b0337c89dd0b005d89f8d3c05c52b76b29b740f09").unwrap());
769                         } else if i == 1001 {
770                                 assert_eq!(res, hex_bytes("2ecd8c8a5629d0d02ab457a0fdd0f7b90a192cd46be5ecb6ca570bfc5e268338b1a16cf4ef2d36").unwrap());
771                         }
772                 }
773         }
774 }