Coverage Report

Created: 2026-02-14 07:33

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}