Merge pull request #1004 from TheBlueMatt/2021-07-forward-event
[rust-lightning] / lightning / src / util / chacha20.rs
index 8a8205f8dac593b6b41bd71369f2e749c85261f2..508ecd635c45d007b6fb6de37b57d816146b3750 100644 (file)
@@ -2,24 +2,24 @@
 // Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
 // file at the top-level directory of this distribution and at
 // http://rust-lang.org/COPYRIGHT.
+//
+// This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
+// or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
+// You may not use this file except in accordance with one or both of these
+// licenses.
 
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use std::io;
+use io;
 
 #[cfg(not(feature = "fuzztarget"))]
 mod real_chacha {
-       use std::cmp;
-       use util::byte_utils::{slice_to_le32, le32_to_array};
+       use core::cmp;
+       use core::convert::TryInto;
 
        #[derive(Clone, Copy, PartialEq, Eq)]
        #[allow(non_camel_case_types)]
        struct u32x4(pub u32, pub u32, pub u32, pub u32);
-       impl ::std::ops::Add for u32x4 {
+       impl ::core::ops::Add for u32x4 {
                type Output = u32x4;
                fn add(self, rhs: u32x4) -> u32x4 {
                        u32x4(self.0.wrapping_add(rhs.0),
@@ -28,7 +28,7 @@ mod real_chacha {
                              self.3.wrapping_add(rhs.3))
                }
        }
-       impl ::std::ops::Sub for u32x4 {
+       impl ::core::ops::Sub for u32x4 {
                type Output = u32x4;
                fn sub(self, rhs: u32x4) -> u32x4 {
                        u32x4(self.0.wrapping_sub(rhs.0),
@@ -37,24 +37,35 @@ mod real_chacha {
                              self.3.wrapping_sub(rhs.3))
                }
        }
-       impl ::std::ops::BitXor for u32x4 {
+       impl ::core::ops::BitXor for u32x4 {
                type Output = u32x4;
                fn bitxor(self, rhs: u32x4) -> u32x4 {
                        u32x4(self.0 ^ rhs.0, self.1 ^ rhs.1, self.2 ^ rhs.2, self.3 ^ rhs.3)
                }
        }
-       impl ::std::ops::Shr<u32x4> for u32x4 {
+       impl ::core::ops::Shr<u32x4> for u32x4 {
                type Output = u32x4;
                fn shr(self, rhs: u32x4) -> u32x4 {
                        u32x4(self.0 >> rhs.0, self.1 >> rhs.1, self.2 >> rhs.2, self.3 >> rhs.3)
                }
        }
-       impl ::std::ops::Shl<u32x4> for u32x4 {
+       impl ::core::ops::Shl<u32x4> for u32x4 {
                type Output = u32x4;
                fn shl(self, rhs: u32x4) -> u32x4 {
                        u32x4(self.0 << rhs.0, self.1 << rhs.1, self.2 << rhs.2, self.3 << rhs.3)
                }
        }
+       impl u32x4 {
+               fn from_bytes(bytes: &[u8]) -> Self {
+                       assert_eq!(bytes.len(), 4*4);
+                       Self (
+                               u32::from_le_bytes(bytes[0*4..1*4].try_into().expect("len is 4")),
+                               u32::from_le_bytes(bytes[1*4..2*4].try_into().expect("len is 4")),
+                               u32::from_le_bytes(bytes[2*4..3*4].try_into().expect("len is 4")),
+                               u32::from_le_bytes(bytes[3*4..4*4].try_into().expect("len is 4")),
+                       )
+               }
+       }
 
        const BLOCK_SIZE: usize = 64;
 
@@ -99,7 +110,7 @@ mod real_chacha {
                                d1,d2,d3,d4
                        ];
                        for i in 0..lens.len() {
-                               $output[i*4..(i+1)*4].copy_from_slice(&le32_to_array(lens[i]));
+                               $output[i*4..(i+1)*4].copy_from_slice(&lens[i].to_le_bytes());
                        }
                }}
        }
@@ -147,54 +158,23 @@ mod real_chacha {
                                _  => unreachable!(),
                        };
                        ChaChaState {
-                               a: u32x4(
-                                       slice_to_le32(&constant[0..4]),
-                                       slice_to_le32(&constant[4..8]),
-                                       slice_to_le32(&constant[8..12]),
-                                       slice_to_le32(&constant[12..16])
-                               ),
-                               b: u32x4(
-                                       slice_to_le32(&key[0..4]),
-                                       slice_to_le32(&key[4..8]),
-                                       slice_to_le32(&key[8..12]),
-                                       slice_to_le32(&key[12..16])
-                               ),
+                               a: u32x4::from_bytes(&constant[0..16]),
+                               b: u32x4::from_bytes(&key[0..16]),
                                c: if key.len() == 16 {
-                                       u32x4(
-                                               slice_to_le32(&key[0..4]),
-                                               slice_to_le32(&key[4..8]),
-                                               slice_to_le32(&key[8..12]),
-                                               slice_to_le32(&key[12..16])
-                                       )
+                                       u32x4::from_bytes(&key[0..16])
                                } else {
-                                       u32x4(
-                                               slice_to_le32(&key[16..20]),
-                                               slice_to_le32(&key[20..24]),
-                                               slice_to_le32(&key[24..28]),
-                                               slice_to_le32(&key[28..32])
-                                       )
+                                       u32x4::from_bytes(&key[16..32])
                                },
                                d: if nonce.len() == 16 {
-                                       u32x4(
-                                               slice_to_le32(&nonce[0..4]),
-                                               slice_to_le32(&nonce[4..8]),
-                                               slice_to_le32(&nonce[8..12]),
-                                               slice_to_le32(&nonce[12..16])
-                                       )
+                                       u32x4::from_bytes(&nonce[0..16])
                                } else if nonce.len() == 12 {
-                                       u32x4(
-                                               0,
-                                               slice_to_le32(&nonce[0..4]),
-                                               slice_to_le32(&nonce[4..8]),
-                                               slice_to_le32(&nonce[8..12])
-                                       )
+                                       let mut nonce4 = [0; 4*4];
+                                       nonce4[4..].copy_from_slice(nonce);
+                                       u32x4::from_bytes(&nonce4)
                                } else {
-                                       u32x4(
-                                               0,
-                                               0,
-                                               slice_to_le32(&nonce[0..4]),
-                                               slice_to_le32(&nonce[4..8])
-                                       )
+                                       let mut nonce4 = [0; 4*4];
+                                       nonce4[8..].copy_from_slice(nonce);
+                                       u32x4::from_bytes(&nonce4)
                                }
                        }
                }
@@ -318,7 +298,8 @@ impl<'a, R: io::Read> io::Read for ChaChaReader<'a, R> {
 
 #[cfg(test)]
 mod test {
-       use std::iter::repeat;
+       use prelude::*;
+       use core::iter::repeat;
 
        use super::ChaCha20;
 
@@ -328,7 +309,7 @@ mod test {
                        key:   [u8; 32],
                        nonce: [u8; 8],
                        keystream: Vec<u8>,
-               };
+               }
                // taken from http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04
                let test_vectors = vec!(
                        TestVector{
@@ -463,7 +444,7 @@ mod test {
                        key:   [u8; 32],
                        nonce: [u8; 12],
                        keystream: Vec<u8>,
-               };
+               }
                // taken from http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04
                let test_vectors = vec!(
                        TestVector{