Botan 3.8.0
Crypto and TLS for C&
argon2_avx2.cpp
Go to the documentation of this file.
1/**
2* (C) 2023 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/isa_extn.h>
11#include <botan/internal/simd_4x64.h>
12
13namespace Botan {
14
15namespace {
16
17BOTAN_FORCE_INLINE BOTAN_FN_ISA_AVX2 void blamka_G(SIMD_4x64& A, SIMD_4x64& B, SIMD_4x64& C, SIMD_4x64& D) {
18 A += B + SIMD_4x64::mul2_32(A, B);
19 D ^= A;
20 D = D.rotr<32>();
21
22 C += D + SIMD_4x64::mul2_32(C, D);
23 B ^= C;
24 B = B.rotr<24>();
25
26 A += B + SIMD_4x64::mul2_32(A, B);
27 D ^= A;
28 D = D.rotr<16>();
29
30 C += D + SIMD_4x64::mul2_32(C, D);
31 B ^= C;
32 B = B.rotr<63>();
33}
34
35BOTAN_FORCE_INLINE BOTAN_FN_ISA_AVX2 void blamka_R(SIMD_4x64& A, SIMD_4x64& B, SIMD_4x64& C, SIMD_4x64& D) {
36 blamka_G(A, B, C, D);
37
38 SIMD_4x64::twist(B, C, D);
39 blamka_G(A, B, C, D);
40 SIMD_4x64::untwist(B, C, D);
41}
42
43} // namespace
44
45BOTAN_FN_ISA_AVX2 void Argon2::blamka_avx2(uint64_t N[128], uint64_t T[128]) {
46 for(size_t i = 0; i != 8; ++i) {
47 SIMD_4x64 A = SIMD_4x64::load_le(&N[16 * i + 4 * 0]);
48 SIMD_4x64 B = SIMD_4x64::load_le(&N[16 * i + 4 * 1]);
49 SIMD_4x64 C = SIMD_4x64::load_le(&N[16 * i + 4 * 2]);
50 SIMD_4x64 D = SIMD_4x64::load_le(&N[16 * i + 4 * 3]);
51
52 blamka_R(A, B, C, D);
53
54 A.store_le(&T[16 * i + 4 * 0]);
55 B.store_le(&T[16 * i + 4 * 1]);
56 C.store_le(&T[16 * i + 4 * 2]);
57 D.store_le(&T[16 * i + 4 * 3]);
58 }
59
60 for(size_t i = 0; i != 8; ++i) {
61 SIMD_4x64 A = SIMD_4x64::load_le2(&T[2 * i + 32 * 0], &T[2 * i + 32 * 0 + 16]);
62 SIMD_4x64 B = SIMD_4x64::load_le2(&T[2 * i + 32 * 1], &T[2 * i + 32 * 1 + 16]);
63 SIMD_4x64 C = SIMD_4x64::load_le2(&T[2 * i + 32 * 2], &T[2 * i + 32 * 2 + 16]);
64 SIMD_4x64 D = SIMD_4x64::load_le2(&T[2 * i + 32 * 3], &T[2 * i + 32 * 3 + 16]);
65
66 blamka_R(A, B, C, D);
67
68 A.store_le2(&T[2 * i + 32 * 0], &T[2 * i + 32 * 0 + 16]);
69 B.store_le2(&T[2 * i + 32 * 1], &T[2 * i + 32 * 1 + 16]);
70 C.store_le2(&T[2 * i + 32 * 2], &T[2 * i + 32 * 2 + 16]);
71 D.store_le2(&T[2 * i + 32 * 3], &T[2 * i + 32 * 3 + 16]);
72 }
73
74 for(size_t i = 0; i != 128 / 8; ++i) {
75 SIMD_4x64 n0 = SIMD_4x64::load_le(&N[8 * i]);
76 SIMD_4x64 n1 = SIMD_4x64::load_le(&N[8 * i + 4]);
77 SIMD_4x64 t0 = SIMD_4x64::load_le(&T[8 * i]);
78 SIMD_4x64 t1 = SIMD_4x64::load_le(&T[8 * i + 4]);
79
80 n0 ^= t0;
81 n1 ^= t1;
82 n0.store_le(&N[8 * i]);
83 n1.store_le(&N[8 * i + 4]);
84 }
85}
86
87} // namespace Botan
static void twist(SIMD_4x64 &B, SIMD_4x64 &C, SIMD_4x64 &D)
Definition simd_4x64.h:147
static BOTAN_FN_ISA_SIMD_4X64 SIMD_4x64 load_le2(const void *inl, const void *inh)
Definition simd_4x64.h:35
static BOTAN_FN_ISA_SIMD_4X64 SIMD_4x64 load_le(const void *in)
Definition simd_4x64.h:44
static BOTAN_FN_ISA_SIMD_4X64 SIMD_4x64 mul2_32(SIMD_4x64 x, SIMD_4x64 y)
Definition simd_4x64.h:136
static void untwist(SIMD_4x64 &B, SIMD_4x64 &C, SIMD_4x64 &D)
Definition simd_4x64.h:154
#define BOTAN_FORCE_INLINE
Definition compiler.h:85