/rust/registry/src/index.crates.io-1949cf8c6b5b557f/sha2-0.11.0-rc.5/src/sha512/soft.rs
Line | Count | Source |
1 | | use crate::consts::K64; |
2 | | |
3 | | #[rustfmt::skip] |
4 | | macro_rules! repeat80 { |
5 | | ($i:ident, $b:block) => { |
6 | | let $i = 0; $b; let $i = 1; $b; let $i = 2; $b; let $i = 3; $b; |
7 | | let $i = 4; $b; let $i = 5; $b; let $i = 6; $b; let $i = 7; $b; |
8 | | let $i = 8; $b; let $i = 9; $b; let $i = 10; $b; let $i = 11; $b; |
9 | | let $i = 12; $b; let $i = 13; $b; let $i = 14; $b; let $i = 15; $b; |
10 | | let $i = 16; $b; let $i = 17; $b; let $i = 18; $b; let $i = 19; $b; |
11 | | let $i = 20; $b; let $i = 21; $b; let $i = 22; $b; let $i = 23; $b; |
12 | | let $i = 24; $b; let $i = 25; $b; let $i = 26; $b; let $i = 27; $b; |
13 | | let $i = 28; $b; let $i = 29; $b; let $i = 30; $b; let $i = 31; $b; |
14 | | let $i = 32; $b; let $i = 33; $b; let $i = 34; $b; let $i = 35; $b; |
15 | | let $i = 36; $b; let $i = 37; $b; let $i = 38; $b; let $i = 39; $b; |
16 | | let $i = 40; $b; let $i = 41; $b; let $i = 42; $b; let $i = 43; $b; |
17 | | let $i = 44; $b; let $i = 45; $b; let $i = 46; $b; let $i = 47; $b; |
18 | | let $i = 48; $b; let $i = 49; $b; let $i = 50; $b; let $i = 51; $b; |
19 | | let $i = 52; $b; let $i = 53; $b; let $i = 54; $b; let $i = 55; $b; |
20 | | let $i = 56; $b; let $i = 57; $b; let $i = 58; $b; let $i = 59; $b; |
21 | | let $i = 60; $b; let $i = 61; $b; let $i = 62; $b; let $i = 63; $b; |
22 | | let $i = 64; $b; let $i = 65; $b; let $i = 66; $b; let $i = 67; $b; |
23 | | let $i = 68; $b; let $i = 69; $b; let $i = 70; $b; let $i = 71; $b; |
24 | | let $i = 72; $b; let $i = 73; $b; let $i = 74; $b; let $i = 75; $b; |
25 | | let $i = 76; $b; let $i = 77; $b; let $i = 78; $b; let $i = 79; $b; |
26 | | }; |
27 | | } |
28 | | |
29 | | /// Read round constant |
30 | 0 | fn rk(i: usize) -> u64 { |
31 | | // `read_volatile` forces the compiler to read round constants from the static |
32 | | // instead of inlining them, which improves codegen and performance |
33 | | unsafe { |
34 | 0 | let p = K64.as_ptr().add(i); |
35 | 0 | core::ptr::read_volatile(p) |
36 | | } |
37 | 0 | } |
38 | | |
39 | | /// Process a block with the SHA-512 algorithm. |
40 | 0 | fn compress_block(state: &mut [u64; 8], block: &[u8; 128]) { |
41 | 0 | let mut block = super::to_u64s(block); |
42 | 0 | let [mut a, mut b, mut c, mut d, mut e, mut f, mut g, mut h] = *state; |
43 | | |
44 | 0 | repeat80!(i, { |
45 | 0 | let w = if i < 16 { |
46 | 0 | block[i] |
47 | | } else { |
48 | 0 | let w15 = block[(i - 15) % 16]; |
49 | 0 | let s0 = (w15.rotate_right(1)) ^ (w15.rotate_right(8)) ^ (w15 >> 7); |
50 | 0 | let w2 = block[(i - 2) % 16]; |
51 | 0 | let s1 = (w2.rotate_right(19)) ^ (w2.rotate_right(61)) ^ (w2 >> 6); |
52 | 0 | block[i % 16] = block[i % 16] |
53 | 0 | .wrapping_add(s0) |
54 | 0 | .wrapping_add(block[(i - 7) % 16]) |
55 | 0 | .wrapping_add(s1); |
56 | 0 | block[i % 16] |
57 | | }; |
58 | | |
59 | 0 | let s1 = e.rotate_right(14) ^ e.rotate_right(18) ^ e.rotate_right(41); |
60 | 0 | let ch = (e & f) ^ ((!e) & g); |
61 | 0 | let t1 = s1 |
62 | 0 | .wrapping_add(ch) |
63 | 0 | .wrapping_add(rk(i)) |
64 | 0 | .wrapping_add(w) |
65 | 0 | .wrapping_add(h); |
66 | 0 | let s0 = a.rotate_right(28) ^ a.rotate_right(34) ^ a.rotate_right(39); |
67 | 0 | let maj = (a & b) ^ (a & c) ^ (b & c); |
68 | 0 | let t2 = s0.wrapping_add(maj); |
69 | | |
70 | 0 | h = g; |
71 | 0 | g = f; |
72 | 0 | f = e; |
73 | 0 | e = d.wrapping_add(t1); |
74 | 0 | d = c; |
75 | 0 | c = b; |
76 | 0 | b = a; |
77 | 0 | a = t1.wrapping_add(t2); |
78 | | }); |
79 | | |
80 | 0 | state[0] = state[0].wrapping_add(a); |
81 | 0 | state[1] = state[1].wrapping_add(b); |
82 | 0 | state[2] = state[2].wrapping_add(c); |
83 | 0 | state[3] = state[3].wrapping_add(d); |
84 | 0 | state[4] = state[4].wrapping_add(e); |
85 | 0 | state[5] = state[5].wrapping_add(f); |
86 | 0 | state[6] = state[6].wrapping_add(g); |
87 | 0 | state[7] = state[7].wrapping_add(h); |
88 | 0 | } |
89 | | |
90 | 0 | pub(super) fn compress(state: &mut [u64; 8], blocks: &[[u8; 128]]) { |
91 | 0 | for block in blocks { |
92 | 0 | compress_block(state, block); |
93 | 0 | } |
94 | 0 | } |