Actual no_std support
[rust-lightning] / lightning / src / util / chacha20.rs
index c23856b60c8d69fb412e04f2eb3934b8ac29ff35..508ecd635c45d007b6fb6de37b57d816146b3750 100644 (file)
@@ -9,17 +9,17 @@
 // You may not use this file except in accordance with one or both of these
 // licenses.
 
-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;