Coverage Report

Created: 2025-04-11 06:34

/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