Skip to content

Commit 6e3b2ab

Browse files
committed
move and duplicate macro defns in sha2 to make them hygienic
... it would also have been possible to add all of their dependencies, but that would have increased the already-lengthy list of parameters. Also, if we had macros that could expand into macro defns, you could stage it. This seemed like the least painful choice.
1 parent d39cec6 commit 6e3b2ab

File tree

1 file changed

+40
-22
lines changed

1 file changed

+40
-22
lines changed

src/libextra/crypto/sha2.rs

Lines changed: 40 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -14,28 +14,8 @@ use cryptoutil::{write_u64_be, write_u32_be, read_u64v_be, read_u32v_be, add_byt
1414
add_bytes_to_bits_tuple, FixedBuffer, FixedBuffer128, FixedBuffer64, StandardPadding};
1515
use digest::Digest;
1616

17-
18-
// Sha-512 and Sha-256 use basically the same calculations which are implemented by these macros.
19-
// Inlining the calculations seems to result in better generated code.
20-
macro_rules! schedule_round( ($t:expr) => (
21-
W[$t] = sigma1(W[$t - 2]) + W[$t - 7] + sigma0(W[$t - 15]) + W[$t - 16];
22-
)
23-
)
24-
25-
macro_rules! sha2_round(
26-
($A:ident, $B:ident, $C:ident, $D:ident,
27-
$E:ident, $F:ident, $G:ident, $H:ident, $K:ident, $t:expr) => (
28-
{
29-
$H += sum1($E) + ch($E, $F, $G) + $K[$t] + W[$t];
30-
$D += $H;
31-
$H += sum0($A) + maj($A, $B, $C);
32-
}
33-
)
34-
)
35-
36-
37-
// A structure that represents that state of a digest computation for the SHA-2 512 family of digest
38-
// functions
17+
// A structure that represents that state of a digest computation for the SHA-2 512 family
18+
// of digest functions
3919
struct Engine512State {
4020
H0: u64,
4121
H1: u64,
@@ -108,6 +88,25 @@ impl Engine512State {
10888

10989
let mut W = [0u64, ..80];
11090

91+
// Sha-512 and Sha-256 use basically the same calculations which are implemented by
92+
// these macros. Inlining the calculations seems to result in better generated code.
93+
macro_rules! schedule_round( ($t:expr) => (
94+
W[$t] = sigma1(W[$t - 2]) + W[$t - 7] + sigma0(W[$t - 15]) + W[$t - 16];
95+
)
96+
)
97+
98+
macro_rules! sha2_round(
99+
($A:ident, $B:ident, $C:ident, $D:ident,
100+
$E:ident, $F:ident, $G:ident, $H:ident, $K:ident, $t:expr) => (
101+
{
102+
$H += sum1($E) + ch($E, $F, $G) + $K[$t] + W[$t];
103+
$D += $H;
104+
$H += sum0($A) + maj($A, $B, $C);
105+
}
106+
)
107+
)
108+
109+
111110
read_u64v_be(W.mut_slice(0, 16), data);
112111

113112
// Putting the message schedule inside the same loop as the round calculations allows for
@@ -505,6 +504,25 @@ impl Engine256State {
505504

506505
let mut W = [0u32, ..64];
507506

507+
// Sha-512 and Sha-256 use basically the same calculations which are implemented
508+
// by these macros. Inlining the calculations seems to result in better generated code.
509+
macro_rules! schedule_round( ($t:expr) => (
510+
W[$t] = sigma1(W[$t - 2]) + W[$t - 7] + sigma0(W[$t - 15]) + W[$t - 16];
511+
)
512+
)
513+
514+
macro_rules! sha2_round(
515+
($A:ident, $B:ident, $C:ident, $D:ident,
516+
$E:ident, $F:ident, $G:ident, $H:ident, $K:ident, $t:expr) => (
517+
{
518+
$H += sum1($E) + ch($E, $F, $G) + $K[$t] + W[$t];
519+
$D += $H;
520+
$H += sum0($A) + maj($A, $B, $C);
521+
}
522+
)
523+
)
524+
525+
508526
read_u32v_be(W.mut_slice(0, 16), data);
509527

510528
// Putting the message schedule inside the same loop as the round calculations allows for

0 commit comments

Comments
 (0)