Coverage Report

Created: 2023-06-07 07:00

/src/botan/src/lib/block/shacal2/shacal2_avx2/shacal2_avx2.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* (C) 2018 Jack Lloyd
3
*
4
* Botan is released under the Simplified BSD License (see license.txt)
5
*/
6
7
#include <botan/internal/shacal2.h>
8
9
#include <botan/internal/simd_avx2.h>
10
11
namespace Botan {
12
13
namespace {
14
15
void BOTAN_FORCE_INLINE BOTAN_AVX2_FN SHACAL2_Fwd(const SIMD_8x32& A,
16
                                                  const SIMD_8x32& B,
17
                                                  const SIMD_8x32& C,
18
                                                  SIMD_8x32& D,
19
                                                  const SIMD_8x32& E,
20
                                                  const SIMD_8x32& F,
21
                                                  const SIMD_8x32& G,
22
                                                  SIMD_8x32& H,
23
0
                                                  uint32_t RK) {
24
0
   H += E.sigma1() + SIMD_8x32::choose(E, F, G) + SIMD_8x32::splat(RK);
25
0
   D += H;
26
0
   H += A.sigma0() + SIMD_8x32::majority(A, B, C);
27
0
}
28
29
void BOTAN_FORCE_INLINE BOTAN_AVX2_FN SHACAL2_Rev(const SIMD_8x32& A,
30
                                                  const SIMD_8x32& B,
31
                                                  const SIMD_8x32& C,
32
                                                  SIMD_8x32& D,
33
                                                  const SIMD_8x32& E,
34
                                                  const SIMD_8x32& F,
35
                                                  const SIMD_8x32& G,
36
                                                  SIMD_8x32& H,
37
0
                                                  uint32_t RK) {
38
0
   H -= A.sigma0() + SIMD_8x32::majority(A, B, C);
39
0
   D -= H;
40
0
   H -= E.sigma1() + SIMD_8x32::choose(E, F, G) + SIMD_8x32::splat(RK);
41
0
}
42
43
}  // namespace
44
45
0
void BOTAN_AVX2_FN SHACAL2::avx2_encrypt_8(const uint8_t in[], uint8_t out[]) const {
46
0
   SIMD_8x32::reset_registers();
47
48
0
   SIMD_8x32 A = SIMD_8x32::load_be(in);
49
0
   SIMD_8x32 B = SIMD_8x32::load_be(in + 32);
50
0
   SIMD_8x32 C = SIMD_8x32::load_be(in + 64);
51
0
   SIMD_8x32 D = SIMD_8x32::load_be(in + 96);
52
53
0
   SIMD_8x32 E = SIMD_8x32::load_be(in + 128);
54
0
   SIMD_8x32 F = SIMD_8x32::load_be(in + 160);
55
0
   SIMD_8x32 G = SIMD_8x32::load_be(in + 192);
56
0
   SIMD_8x32 H = SIMD_8x32::load_be(in + 224);
57
58
0
   SIMD_8x32::transpose(A, B, C, D, E, F, G, H);
59
60
0
   for(size_t r = 0; r != 64; r += 8) {
61
0
      SHACAL2_Fwd(A, B, C, D, E, F, G, H, m_RK[r + 0]);
62
0
      SHACAL2_Fwd(H, A, B, C, D, E, F, G, m_RK[r + 1]);
63
0
      SHACAL2_Fwd(G, H, A, B, C, D, E, F, m_RK[r + 2]);
64
0
      SHACAL2_Fwd(F, G, H, A, B, C, D, E, m_RK[r + 3]);
65
0
      SHACAL2_Fwd(E, F, G, H, A, B, C, D, m_RK[r + 4]);
66
0
      SHACAL2_Fwd(D, E, F, G, H, A, B, C, m_RK[r + 5]);
67
0
      SHACAL2_Fwd(C, D, E, F, G, H, A, B, m_RK[r + 6]);
68
0
      SHACAL2_Fwd(B, C, D, E, F, G, H, A, m_RK[r + 7]);
69
0
   }
70
71
0
   SIMD_8x32::transpose(A, B, C, D, E, F, G, H);
72
73
0
   A.store_be(out);
74
0
   B.store_be(out + 32);
75
0
   C.store_be(out + 64);
76
0
   D.store_be(out + 96);
77
78
0
   E.store_be(out + 128);
79
0
   F.store_be(out + 160);
80
0
   G.store_be(out + 192);
81
0
   H.store_be(out + 224);
82
83
0
   SIMD_8x32::zero_registers();
84
0
}
85
86
0
BOTAN_AVX2_FN void SHACAL2::avx2_decrypt_8(const uint8_t in[], uint8_t out[]) const {
87
0
   SIMD_8x32::reset_registers();
88
89
0
   SIMD_8x32 A = SIMD_8x32::load_be(in);
90
0
   SIMD_8x32 B = SIMD_8x32::load_be(in + 32);
91
0
   SIMD_8x32 C = SIMD_8x32::load_be(in + 64);
92
0
   SIMD_8x32 D = SIMD_8x32::load_be(in + 96);
93
94
0
   SIMD_8x32 E = SIMD_8x32::load_be(in + 128);
95
0
   SIMD_8x32 F = SIMD_8x32::load_be(in + 160);
96
0
   SIMD_8x32 G = SIMD_8x32::load_be(in + 192);
97
0
   SIMD_8x32 H = SIMD_8x32::load_be(in + 224);
98
99
0
   SIMD_8x32::transpose(A, B, C, D, E, F, G, H);
100
101
0
   for(size_t r = 0; r != 64; r += 8) {
102
0
      SHACAL2_Rev(B, C, D, E, F, G, H, A, m_RK[63 - r]);
103
0
      SHACAL2_Rev(C, D, E, F, G, H, A, B, m_RK[62 - r]);
104
0
      SHACAL2_Rev(D, E, F, G, H, A, B, C, m_RK[61 - r]);
105
0
      SHACAL2_Rev(E, F, G, H, A, B, C, D, m_RK[60 - r]);
106
0
      SHACAL2_Rev(F, G, H, A, B, C, D, E, m_RK[59 - r]);
107
0
      SHACAL2_Rev(G, H, A, B, C, D, E, F, m_RK[58 - r]);
108
0
      SHACAL2_Rev(H, A, B, C, D, E, F, G, m_RK[57 - r]);
109
0
      SHACAL2_Rev(A, B, C, D, E, F, G, H, m_RK[56 - r]);
110
0
   }
111
112
0
   SIMD_8x32::transpose(A, B, C, D, E, F, G, H);
113
114
0
   A.store_be(out);
115
0
   B.store_be(out + 32);
116
0
   C.store_be(out + 64);
117
0
   D.store_be(out + 96);
118
119
0
   E.store_be(out + 128);
120
0
   F.store_be(out + 160);
121
0
   G.store_be(out + 192);
122
0
   H.store_be(out + 224);
123
124
0
   SIMD_8x32::zero_registers();
125
0
}
126
127
}  // namespace Botan