/src/botan/src/lib/pbkdf/argon2/argon2_ssse3/argon2_ssse3.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | /** |
2 | | * (C) 2022 Jack Lloyd |
3 | | * |
4 | | * Botan is released under the Simplified BSD License (see license.txt) |
5 | | */ |
6 | | |
7 | | #include <botan/argon2.h> |
8 | | |
9 | | #include <botan/compiler.h> |
10 | | #include <botan/internal/simd_2x64.h> |
11 | | |
12 | | namespace Botan { |
13 | | |
14 | | namespace { |
15 | | |
16 | | BOTAN_FORCE_INLINE void blamka_G(SIMD_2x64& A0, |
17 | | SIMD_2x64& A1, |
18 | | SIMD_2x64& B0, |
19 | | SIMD_2x64& B1, |
20 | | SIMD_2x64& C0, |
21 | | SIMD_2x64& C1, |
22 | | SIMD_2x64& D0, |
23 | 0 | SIMD_2x64& D1) { |
24 | 0 | A0 += B0 + SIMD_2x64::mul2_32(A0, B0); |
25 | 0 | A1 += B1 + SIMD_2x64::mul2_32(A1, B1); |
26 | 0 | D0 ^= A0; |
27 | 0 | D1 ^= A1; |
28 | 0 | D0 = D0.rotr<32>(); |
29 | 0 | D1 = D1.rotr<32>(); |
30 | |
|
31 | 0 | C0 += D0 + SIMD_2x64::mul2_32(C0, D0); |
32 | 0 | C1 += D1 + SIMD_2x64::mul2_32(C1, D1); |
33 | 0 | B0 ^= C0; |
34 | 0 | B1 ^= C1; |
35 | 0 | B0 = B0.rotr<24>(); |
36 | 0 | B1 = B1.rotr<24>(); |
37 | |
|
38 | 0 | A0 += B0 + SIMD_2x64::mul2_32(A0, B0); |
39 | 0 | A1 += B1 + SIMD_2x64::mul2_32(A1, B1); |
40 | 0 | D0 ^= A0; |
41 | 0 | D1 ^= A1; |
42 | 0 | D0 = D0.rotr<16>(); |
43 | 0 | D1 = D1.rotr<16>(); |
44 | |
|
45 | 0 | C0 += D0 + SIMD_2x64::mul2_32(C0, D0); |
46 | 0 | C1 += D1 + SIMD_2x64::mul2_32(C1, D1); |
47 | 0 | B0 ^= C0; |
48 | 0 | B1 ^= C1; |
49 | 0 | B0 = B0.rotr<63>(); |
50 | 0 | B1 = B1.rotr<63>(); |
51 | 0 | } |
52 | | |
53 | | BOTAN_FORCE_INLINE void blamka_R(SIMD_2x64& A0, |
54 | | SIMD_2x64& A1, |
55 | | SIMD_2x64& B0, |
56 | | SIMD_2x64& B1, |
57 | | SIMD_2x64& C0, |
58 | | SIMD_2x64& C1, |
59 | | SIMD_2x64& D0, |
60 | 0 | SIMD_2x64& D1) { |
61 | 0 | blamka_G(A0, A1, B0, B1, C0, C1, D0, D1); |
62 | |
|
63 | 0 | SIMD_2x64::twist(B0, B1, C0, C1, D0, D1); |
64 | 0 | blamka_G(A0, A1, B0, B1, C0, C1, D0, D1); |
65 | 0 | SIMD_2x64::untwist(B0, B1, C0, C1, D0, D1); |
66 | 0 | } |
67 | | |
68 | | } // namespace |
69 | | |
70 | 0 | void Argon2::blamka_ssse3(uint64_t N[128], uint64_t T[128]) { |
71 | 0 | for(size_t i = 0; i != 8; ++i) { |
72 | 0 | SIMD_2x64 Tv[8]; |
73 | 0 | for(size_t j = 0; j != 4; ++j) { |
74 | 0 | Tv[2 * j] = SIMD_2x64::load_le(&N[16 * i + 4 * j]); |
75 | 0 | Tv[2 * j + 1] = SIMD_2x64::load_le(&N[16 * i + 4 * j + 2]); |
76 | 0 | } |
77 | |
|
78 | 0 | blamka_R(Tv[0], Tv[1], Tv[2], Tv[3], Tv[4], Tv[5], Tv[6], Tv[7]); |
79 | |
|
80 | 0 | for(size_t j = 0; j != 4; ++j) { |
81 | 0 | Tv[2 * j].store_le(&T[16 * i + 4 * j]); |
82 | 0 | Tv[2 * j + 1].store_le(&T[16 * i + 4 * j + 2]); |
83 | 0 | } |
84 | 0 | } |
85 | |
|
86 | 0 | for(size_t i = 0; i != 8; ++i) { |
87 | 0 | SIMD_2x64 Tv[8]; |
88 | 0 | for(size_t j = 0; j != 4; ++j) { |
89 | 0 | Tv[2 * j] = SIMD_2x64::load_le(&T[2 * i + 32 * j]); |
90 | 0 | Tv[2 * j + 1] = SIMD_2x64::load_le(&T[2 * i + 32 * j + 16]); |
91 | 0 | } |
92 | |
|
93 | 0 | blamka_R(Tv[0], Tv[1], Tv[2], Tv[3], Tv[4], Tv[5], Tv[6], Tv[7]); |
94 | |
|
95 | 0 | for(size_t j = 0; j != 4; ++j) { |
96 | 0 | Tv[2 * j].store_le(&T[2 * i + 32 * j]); |
97 | 0 | Tv[2 * j + 1].store_le(&T[2 * i + 32 * j + 16]); |
98 | 0 | } |
99 | 0 | } |
100 | |
|
101 | 0 | for(size_t i = 0; i != 128 / 4; ++i) { |
102 | 0 | SIMD_2x64 n0 = SIMD_2x64::load_le(&N[4 * i]); |
103 | 0 | SIMD_2x64 n1 = SIMD_2x64::load_le(&N[4 * i + 2]); |
104 | 0 | SIMD_2x64 t0 = SIMD_2x64::load_le(&T[4 * i]); |
105 | 0 | SIMD_2x64 t1 = SIMD_2x64::load_le(&T[4 * i + 2]); |
106 | |
|
107 | 0 | n0 ^= t0; |
108 | 0 | n1 ^= t1; |
109 | 0 | n0.store_le(&N[4 * i]); |
110 | 0 | n1.store_le(&N[4 * i + 2]); |
111 | 0 | } |
112 | 0 | } |
113 | | |
114 | | } // namespace Botan |