Steal rust-crypto's ChaCha20 implementation wholesale
[rust-lightning] / src / util / byte_utils.rs
1 #[inline]
2 pub fn slice_to_be16(v: &[u8]) -> u16 {
3         ((v[0] as u16) << 8*1) |
4         ((v[1] as u16) << 8*0)
5 }
6 #[inline]
7 pub fn slice_to_be32(v: &[u8]) -> u32 {
8         ((v[0] as u32) << 8*3) |
9         ((v[1] as u32) << 8*2) |
10         ((v[2] as u32) << 8*1) |
11         ((v[3] as u32) << 8*0)
12 }
13 #[inline]
14 pub fn slice_to_le32(v: &[u8]) -> u32 {
15         ((v[0] as u32) << 8*0) |
16         ((v[1] as u32) << 8*1) |
17         ((v[2] as u32) << 8*2) |
18         ((v[3] as u32) << 8*3)
19 }
20 #[inline]
21 pub fn slice_to_be48(v: &[u8]) -> u64 {
22         ((v[0] as u64) << 8*5) |
23         ((v[1] as u64) << 8*4) |
24         ((v[2] as u64) << 8*3) |
25         ((v[3] as u64) << 8*2) |
26         ((v[4] as u64) << 8*1) |
27         ((v[5] as u64) << 8*0)
28 }
29 #[inline]
30 pub fn slice_to_be64(v: &[u8]) -> u64 {
31         ((v[0] as u64) << 8*7) |
32         ((v[1] as u64) << 8*6) |
33         ((v[2] as u64) << 8*5) |
34         ((v[3] as u64) << 8*4) |
35         ((v[4] as u64) << 8*3) |
36         ((v[5] as u64) << 8*2) |
37         ((v[6] as u64) << 8*1) |
38         ((v[7] as u64) << 8*0)
39 }
40
41 #[inline]
42 pub fn be16_to_array(u: u16) -> [u8; 2] {
43         let mut v = [0; 2];
44         v[0] = ((u >> 8*1) & 0xff) as u8;
45         v[1] = ((u >> 8*0) & 0xff) as u8;
46         v
47 }
48 #[inline]
49 pub fn be32_to_array(u: u32) -> [u8; 4] {
50         let mut v = [0; 4];
51         v[0] = ((u >> 8*3) & 0xff) as u8;
52         v[1] = ((u >> 8*2) & 0xff) as u8;
53         v[2] = ((u >> 8*1) & 0xff) as u8;
54         v[3] = ((u >> 8*0) & 0xff) as u8;
55         v
56 }
57 #[inline]
58 pub fn le32_to_array(u: u32) -> [u8; 4] {
59         let mut v = [0; 4];
60         v[0] = ((u >> 8*0) & 0xff) as u8;
61         v[1] = ((u >> 8*1) & 0xff) as u8;
62         v[2] = ((u >> 8*2) & 0xff) as u8;
63         v[3] = ((u >> 8*3) & 0xff) as u8;
64         v
65 }
66 #[inline]
67 pub fn be48_to_array(u: u64) -> [u8; 6] {
68         assert!(u & 0xffff_0000_0000_0000 == 0);
69         let mut v = [0; 6];
70         v[0] = ((u >> 8*5) & 0xff) as u8;
71         v[1] = ((u >> 8*4) & 0xff) as u8;
72         v[2] = ((u >> 8*3) & 0xff) as u8;
73         v[3] = ((u >> 8*2) & 0xff) as u8;
74         v[4] = ((u >> 8*1) & 0xff) as u8;
75         v[5] = ((u >> 8*0) & 0xff) as u8;
76         v
77 }
78 #[inline]
79 pub fn be64_to_array(u: u64) -> [u8; 8] {
80         let mut v = [0; 8];
81         v[0] = ((u >> 8*7) & 0xff) as u8;
82         v[1] = ((u >> 8*6) & 0xff) as u8;
83         v[2] = ((u >> 8*5) & 0xff) as u8;
84         v[3] = ((u >> 8*4) & 0xff) as u8;
85         v[4] = ((u >> 8*3) & 0xff) as u8;
86         v[5] = ((u >> 8*2) & 0xff) as u8;
87         v[6] = ((u >> 8*1) & 0xff) as u8;
88         v[7] = ((u >> 8*0) & 0xff) as u8;
89         v
90 }
91
92 #[inline]
93 pub fn le64_to_array(u: u64) -> [u8; 8] {
94         let mut v = [0; 8];
95         v[0] = ((u >> 8*0) & 0xff) as u8;
96         v[1] = ((u >> 8*1) & 0xff) as u8;
97         v[2] = ((u >> 8*2) & 0xff) as u8;
98         v[3] = ((u >> 8*3) & 0xff) as u8;
99         v[4] = ((u >> 8*4) & 0xff) as u8;
100         v[5] = ((u >> 8*5) & 0xff) as u8;
101         v[6] = ((u >> 8*6) & 0xff) as u8;
102         v[7] = ((u >> 8*7) & 0xff) as u8;
103         v
104 }