X-Git-Url: http://git.bitcoin.ninja/index.cgi?a=blobdiff_plain;f=lightning%2Fsrc%2Futil%2Fchacha20.rs;h=cbf08f46c226a568d1bebc8c368e74d518624433;hb=3791a7b2a55f97872bb1d1fff7c8fea05cf05424;hp=8a8205f8dac593b6b41bd71369f2e749c85261f2;hpb=bae2338b4dc1b8e33ac97b8b867fb68592fdb91b;p=rust-lightning diff --git a/lightning/src/util/chacha20.rs b/lightning/src/util/chacha20.rs index 8a8205f8..cbf08f46 100644 --- a/lightning/src/util/chacha20.rs +++ b/lightning/src/util/chacha20.rs @@ -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. - -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. +// +// This file is licensed under the Apache License, Version 2.0 or the MIT license +// , at your option. +// You may not use this file except in accordance with one or both of these +// licenses. use std::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 for u32x4 { + impl ::core::ops::Shr 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 for u32x4 { + impl ::core::ops::Shl 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, - }; + } // 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, - }; + } // taken from http://tools.ietf.org/html/draft-agl-tls-chacha20poly1305-04 let test_vectors = vec!( TestVector{