• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 25457312714

06 May 2026 07:43PM UTC coverage: 89.331% (-2.3%) from 91.667%
25457312714

push

github

randombit
In TLS 1.3 verification of client certs, check the correct extension for OCSP

This was checking if the client asked us (the server) for OCSP, instead of
checking if we asked the client for OCSP when we sent the CertificateRequest.

107574 of 120422 relevant lines covered (89.33%)

11482758.98 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.22
/src/lib/block/aria/aria.cpp
1
/*
2
* ARIA
3
* Adapted for Botan by Jeffrey Walton, public domain
4
*
5
* Further changes
6
* (C) 2017,2020 Jack Lloyd
7
*
8
* Botan is released under the Simplified BSD License (see license.txt)
9
*
10
* This ARIA implementation is based on the 32-bit implementation by Aaram Yun from the
11
* National Security Research Institute, KOREA. Aaram Yun's implementation is based on
12
* the 8-bit implementation by Jin Hong. The source files are available in ARIA.zip from
13
* the Korea Internet & Security Agency website.
14
* <A HREF="https://tools.ietf.org/html/rfc5794">RFC 5794, A Description of the ARIA Encryption Algorithm</A>,
15
* <A HREF="http://seed.kisa.or.kr/iwt/ko/bbs/EgovReferenceList.do?bbsId=BBSMSTR_000000000002">Korea
16
* Internet & Security Agency homepage</A>
17
*/
18

19
#include <botan/internal/aria.h>
20

21
#include <botan/internal/bswap.h>
22
#include <botan/internal/loadstor.h>
23
#include <botan/internal/prefetch.h>
24
#include <botan/internal/rotate.h>
25

26
#if defined(BOTAN_HAS_CPUID)
27
   #include <botan/internal/cpuid.h>
28
#endif
29

30
namespace Botan {
31

32
namespace {
33

34
namespace ARIA_F {
35

36
alignas(256) const uint8_t S1[256] = {
37
   0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9,
38
   0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F,
39
   0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07,
40
   0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3,
41
   0x29, 0xE3, 0x2F, 0x84, 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58,
42
   0xCF, 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, 0x51, 0xA3,
43
   0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, 0xCD, 0x0C, 0x13, 0xEC, 0x5F,
44
   0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
45
   0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC,
46
   0x62, 0x91, 0x95, 0xE4, 0x79, 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A,
47
   0xAE, 0x08, 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, 0x70,
48
   0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, 0xE1, 0xF8, 0x98, 0x11,
49
   0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42,
50
   0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16};
51

52
alignas(256) const uint8_t S2[256] = {
53
   0xE2, 0x4E, 0x54, 0xFC, 0x94, 0xC2, 0x4A, 0xCC, 0x62, 0x0D, 0x6A, 0x46, 0x3C, 0x4D, 0x8B, 0xD1, 0x5E, 0xFA, 0x64,
54
   0xCB, 0xB4, 0x97, 0xBE, 0x2B, 0xBC, 0x77, 0x2E, 0x03, 0xD3, 0x19, 0x59, 0xC1, 0x1D, 0x06, 0x41, 0x6B, 0x55, 0xF0,
55
   0x99, 0x69, 0xEA, 0x9C, 0x18, 0xAE, 0x63, 0xDF, 0xE7, 0xBB, 0x00, 0x73, 0x66, 0xFB, 0x96, 0x4C, 0x85, 0xE4, 0x3A,
56
   0x09, 0x45, 0xAA, 0x0F, 0xEE, 0x10, 0xEB, 0x2D, 0x7F, 0xF4, 0x29, 0xAC, 0xCF, 0xAD, 0x91, 0x8D, 0x78, 0xC8, 0x95,
57
   0xF9, 0x2F, 0xCE, 0xCD, 0x08, 0x7A, 0x88, 0x38, 0x5C, 0x83, 0x2A, 0x28, 0x47, 0xDB, 0xB8, 0xC7, 0x93, 0xA4, 0x12,
58
   0x53, 0xFF, 0x87, 0x0E, 0x31, 0x36, 0x21, 0x58, 0x48, 0x01, 0x8E, 0x37, 0x74, 0x32, 0xCA, 0xE9, 0xB1, 0xB7, 0xAB,
59
   0x0C, 0xD7, 0xC4, 0x56, 0x42, 0x26, 0x07, 0x98, 0x60, 0xD9, 0xB6, 0xB9, 0x11, 0x40, 0xEC, 0x20, 0x8C, 0xBD, 0xA0,
60
   0xC9, 0x84, 0x04, 0x49, 0x23, 0xF1, 0x4F, 0x50, 0x1F, 0x13, 0xDC, 0xD8, 0xC0, 0x9E, 0x57, 0xE3, 0xC3, 0x7B, 0x65,
61
   0x3B, 0x02, 0x8F, 0x3E, 0xE8, 0x25, 0x92, 0xE5, 0x15, 0xDD, 0xFD, 0x17, 0xA9, 0xBF, 0xD4, 0x9A, 0x7E, 0xC5, 0x39,
62
   0x67, 0xFE, 0x76, 0x9D, 0x43, 0xA7, 0xE1, 0xD0, 0xF5, 0x68, 0xF2, 0x1B, 0x34, 0x70, 0x05, 0xA3, 0x8A, 0xD5, 0x79,
63
   0x86, 0xA8, 0x30, 0xC6, 0x51, 0x4B, 0x1E, 0xA6, 0x27, 0xF6, 0x35, 0xD2, 0x6E, 0x24, 0x16, 0x82, 0x5F, 0xDA, 0xE6,
64
   0x75, 0xA2, 0xEF, 0x2C, 0xB2, 0x1C, 0x9F, 0x5D, 0x6F, 0x80, 0x0A, 0x72, 0x44, 0x9B, 0x6C, 0x90, 0x0B, 0x5B, 0x33,
65
   0x7D, 0x5A, 0x52, 0xF3, 0x61, 0xA1, 0xF7, 0xB0, 0xD6, 0x3F, 0x7C, 0x6D, 0xED, 0x14, 0xE0, 0xA5, 0x3D, 0x22, 0xB3,
66
   0xF8, 0x89, 0xDE, 0x71, 0x1A, 0xAF, 0xBA, 0xB5, 0x81};
67

68
alignas(256) const uint8_t X1[256] = {
69
   0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, 0x7C, 0xE3, 0x39,
70
   0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2,
71
   0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76,
72
   0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC,
73
   0x5D, 0x65, 0xB6, 0x92, 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D,
74
   0x84, 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, 0xD0, 0x2C,
75
   0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, 0x3A, 0x91, 0x11, 0x41, 0x4F,
76
   0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
77
   0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62,
78
   0x0E, 0xAA, 0x18, 0xBE, 0x1B, 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD,
79
   0x5A, 0xF4, 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, 0x60,
80
   0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, 0xA0, 0xE0, 0x3B, 0x4D,
81
   0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6,
82
   0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D};
83

84
alignas(256) const uint8_t X2[256] = {
85
   0x30, 0x68, 0x99, 0x1B, 0x87, 0xB9, 0x21, 0x78, 0x50, 0x39, 0xDB, 0xE1, 0x72, 0x09, 0x62, 0x3C, 0x3E, 0x7E, 0x5E,
86
   0x8E, 0xF1, 0xA0, 0xCC, 0xA3, 0x2A, 0x1D, 0xFB, 0xB6, 0xD6, 0x20, 0xC4, 0x8D, 0x81, 0x65, 0xF5, 0x89, 0xCB, 0x9D,
87
   0x77, 0xC6, 0x57, 0x43, 0x56, 0x17, 0xD4, 0x40, 0x1A, 0x4D, 0xC0, 0x63, 0x6C, 0xE3, 0xB7, 0xC8, 0x64, 0x6A, 0x53,
88
   0xAA, 0x38, 0x98, 0x0C, 0xF4, 0x9B, 0xED, 0x7F, 0x22, 0x76, 0xAF, 0xDD, 0x3A, 0x0B, 0x58, 0x67, 0x88, 0x06, 0xC3,
89
   0x35, 0x0D, 0x01, 0x8B, 0x8C, 0xC2, 0xE6, 0x5F, 0x02, 0x24, 0x75, 0x93, 0x66, 0x1E, 0xE5, 0xE2, 0x54, 0xD8, 0x10,
90
   0xCE, 0x7A, 0xE8, 0x08, 0x2C, 0x12, 0x97, 0x32, 0xAB, 0xB4, 0x27, 0x0A, 0x23, 0xDF, 0xEF, 0xCA, 0xD9, 0xB8, 0xFA,
91
   0xDC, 0x31, 0x6B, 0xD1, 0xAD, 0x19, 0x49, 0xBD, 0x51, 0x96, 0xEE, 0xE4, 0xA8, 0x41, 0xDA, 0xFF, 0xCD, 0x55, 0x86,
92
   0x36, 0xBE, 0x61, 0x52, 0xF8, 0xBB, 0x0E, 0x82, 0x48, 0x69, 0x9A, 0xE0, 0x47, 0x9E, 0x5C, 0x04, 0x4B, 0x34, 0x15,
93
   0x79, 0x26, 0xA7, 0xDE, 0x29, 0xAE, 0x92, 0xD7, 0x84, 0xE9, 0xD2, 0xBA, 0x5D, 0xF3, 0xC5, 0xB0, 0xBF, 0xA4, 0x3B,
94
   0x71, 0x44, 0x46, 0x2B, 0xFC, 0xEB, 0x6F, 0xD5, 0xF6, 0x14, 0xFE, 0x7C, 0x70, 0x5A, 0x7D, 0xFD, 0x2F, 0x18, 0x83,
95
   0x16, 0xA5, 0x91, 0x1F, 0x05, 0x95, 0x74, 0xA9, 0xC1, 0x5B, 0x4A, 0x85, 0x6D, 0x13, 0x07, 0x4F, 0x4E, 0x45, 0xB2,
96
   0x0F, 0xC9, 0x1C, 0xA6, 0xBC, 0xEC, 0x73, 0x90, 0x7B, 0xCF, 0x59, 0x8F, 0xA1, 0xF9, 0x2D, 0xF2, 0xB1, 0x00, 0x94,
97
   0x37, 0x9F, 0xD0, 0x2E, 0x9C, 0x6E, 0x28, 0x3F, 0x80, 0xF0, 0x3D, 0xD3, 0x25, 0x8A, 0xB5, 0xE7, 0x42, 0xB3, 0xC7,
98
   0xEA, 0xF7, 0x4C, 0x11, 0x33, 0x03, 0xA2, 0xAC, 0x60};
99

100
inline uint32_t ARIA_F1(uint32_t X) {
213,340✔
101
   const uint32_t M1 = 0x00010101;
213,340✔
102
   const uint32_t M2 = 0x01000101;
213,340✔
103
   const uint32_t M3 = 0x01010001;
213,340✔
104
   const uint32_t M4 = 0x01010100;
213,340✔
105

106
   return (S1[get_byte<0>(X)] * M1) ^ (S2[get_byte<1>(X)] * M2) ^ (X1[get_byte<2>(X)] * M3) ^ (X2[get_byte<3>(X)] * M4);
213,340✔
107
}
108

109
inline uint32_t ARIA_F2(uint32_t X) {
182,480✔
110
   const uint32_t M1 = 0x00010101;
182,480✔
111
   const uint32_t M2 = 0x01000101;
182,480✔
112
   const uint32_t M3 = 0x01010001;
182,480✔
113
   const uint32_t M4 = 0x01010100;
182,480✔
114

115
   return (X1[get_byte<0>(X)] * M3) ^ (X2[get_byte<1>(X)] * M4) ^ (S1[get_byte<2>(X)] * M1) ^ (S2[get_byte<3>(X)] * M2);
182,480✔
116
}
117

118
inline void ARIA_FO(uint32_t& T0, uint32_t& T1, uint32_t& T2, uint32_t& T3) {
53,335✔
119
   T0 = ARIA_F1(T0);
53,335✔
120
   T1 = ARIA_F1(T1);
53,335✔
121
   T2 = ARIA_F1(T2);
53,335✔
122
   T3 = ARIA_F1(T3);
53,335✔
123

124
   T1 ^= T2;
53,335✔
125
   T2 ^= T3;
53,335✔
126
   T0 ^= T1;
53,335✔
127
   T3 ^= T1;
53,335✔
128
   T2 ^= T0;
53,335✔
129
   T1 ^= T2;
53,335✔
130

131
   T1 = ((T1 << 8) & 0xFF00FF00) | ((T1 >> 8) & 0x00FF00FF);
53,335✔
132
   T2 = rotr<16>(T2);
53,335✔
133
   T3 = reverse_bytes(T3);
53,335✔
134

135
   T1 ^= T2;
53,335✔
136
   T2 ^= T3;
53,335✔
137
   T0 ^= T1;
53,335✔
138
   T3 ^= T1;
53,335✔
139
   T2 ^= T0;
53,335✔
140
   T1 ^= T2;
53,335✔
141
}
53,335✔
142

143
inline void ARIA_FE(uint32_t& T0, uint32_t& T1, uint32_t& T2, uint32_t& T3) {
45,620✔
144
   T0 = ARIA_F2(T0);
45,620✔
145
   T1 = ARIA_F2(T1);
45,620✔
146
   T2 = ARIA_F2(T2);
45,620✔
147
   T3 = ARIA_F2(T3);
45,620✔
148

149
   T1 ^= T2;
45,620✔
150
   T2 ^= T3;
45,620✔
151
   T0 ^= T1;
45,620✔
152
   T3 ^= T1;
45,620✔
153
   T2 ^= T0;
45,620✔
154
   T1 ^= T2;
45,620✔
155

156
   T3 = ((T3 << 8) & 0xFF00FF00) | ((T3 >> 8) & 0x00FF00FF);
45,620✔
157
   T0 = rotr<16>(T0);
45,620✔
158
   T1 = reverse_bytes(T1);
45,620✔
159

160
   T1 ^= T2;
45,620✔
161
   T2 ^= T3;
45,620✔
162
   T0 ^= T1;
45,620✔
163
   T3 ^= T1;
45,620✔
164
   T2 ^= T0;
45,620✔
165
   T1 ^= T2;
45,620✔
166
}
45,620✔
167

168
/*
169
* ARIA encryption and decryption
170
*/
171
void transform(const uint8_t in[], uint8_t out[], size_t blocks, const secure_vector<uint32_t>& KS) {
1,704✔
172
   prefetch_arrays(S1, S2, X1, X2);
1,704✔
173

174
   const size_t ROUNDS = (KS.size() / 4) - 1;
1,704✔
175

176
   for(size_t i = 0; i != blocks; ++i) {
9,285✔
177
      uint32_t t0 = 0;
7,581✔
178
      uint32_t t1 = 0;
7,581✔
179
      uint32_t t2 = 0;
7,581✔
180
      uint32_t t3 = 0;
7,581✔
181
      load_be(in + 16 * i, t0, t1, t2, t3);
7,581✔
182

183
      for(size_t r = 0; r < ROUNDS; r += 2) {
60,648✔
184
         t0 ^= KS[4 * r];
53,067✔
185
         t1 ^= KS[4 * r + 1];
53,067✔
186
         t2 ^= KS[4 * r + 2];
53,067✔
187
         t3 ^= KS[4 * r + 3];
53,067✔
188
         ARIA_FO(t0, t1, t2, t3);
53,067✔
189

190
         t0 ^= KS[4 * r + 4];
53,067✔
191
         t1 ^= KS[4 * r + 5];
53,067✔
192
         t2 ^= KS[4 * r + 6];
53,067✔
193
         t3 ^= KS[4 * r + 7];
53,067✔
194

195
         if(r != ROUNDS - 2) {
53,067✔
196
            ARIA_FE(t0, t1, t2, t3);
45,486✔
197
         }
198
      }
199

200
      out[16 * i + 0] = X1[get_byte<0>(t0)] ^ get_byte<0>(KS[4 * ROUNDS]);
7,581✔
201
      out[16 * i + 1] = X2[get_byte<1>(t0)] ^ get_byte<1>(KS[4 * ROUNDS]);
7,581✔
202
      out[16 * i + 2] = S1[get_byte<2>(t0)] ^ get_byte<2>(KS[4 * ROUNDS]);
7,581✔
203
      out[16 * i + 3] = S2[get_byte<3>(t0)] ^ get_byte<3>(KS[4 * ROUNDS]);
7,581✔
204
      out[16 * i + 4] = X1[get_byte<0>(t1)] ^ get_byte<0>(KS[4 * ROUNDS + 1]);
7,581✔
205
      out[16 * i + 5] = X2[get_byte<1>(t1)] ^ get_byte<1>(KS[4 * ROUNDS + 1]);
7,581✔
206
      out[16 * i + 6] = S1[get_byte<2>(t1)] ^ get_byte<2>(KS[4 * ROUNDS + 1]);
7,581✔
207
      out[16 * i + 7] = S2[get_byte<3>(t1)] ^ get_byte<3>(KS[4 * ROUNDS + 1]);
7,581✔
208
      out[16 * i + 8] = X1[get_byte<0>(t2)] ^ get_byte<0>(KS[4 * ROUNDS + 2]);
7,581✔
209
      out[16 * i + 9] = X2[get_byte<1>(t2)] ^ get_byte<1>(KS[4 * ROUNDS + 2]);
7,581✔
210
      out[16 * i + 10] = S1[get_byte<2>(t2)] ^ get_byte<2>(KS[4 * ROUNDS + 2]);
7,581✔
211
      out[16 * i + 11] = S2[get_byte<3>(t2)] ^ get_byte<3>(KS[4 * ROUNDS + 2]);
7,581✔
212
      out[16 * i + 12] = X1[get_byte<0>(t3)] ^ get_byte<0>(KS[4 * ROUNDS + 3]);
7,581✔
213
      out[16 * i + 13] = X2[get_byte<1>(t3)] ^ get_byte<1>(KS[4 * ROUNDS + 3]);
7,581✔
214
      out[16 * i + 14] = S1[get_byte<2>(t3)] ^ get_byte<2>(KS[4 * ROUNDS + 3]);
7,581✔
215
      out[16 * i + 15] = S2[get_byte<3>(t3)] ^ get_byte<3>(KS[4 * ROUNDS + 3]);
7,581✔
216
   }
217
}
1,704✔
218

219
// n-bit right shift of Y XORed to X
220
template <size_t N>
221
inline void ARIA_ROL128(const uint32_t X[4], const uint32_t Y[4], uint32_t KS[4]) {
1,978✔
222
   // MSVC is not generating a "rotate immediate". Constify to help it along.
223
   static const size_t Q = 4 - (N / 32);
224
   static const size_t R = N % 32;
225
   static_assert(R > 0 && R < 32, "Rotation in range for type");
226
   KS[0] = (X[0]) ^ ((Y[(Q) % 4]) >> R) ^ ((Y[(Q + 3) % 4]) << (32 - R));
1,978✔
227
   KS[1] = (X[1]) ^ ((Y[(Q + 1) % 4]) >> R) ^ ((Y[(Q) % 4]) << (32 - R));
1,978✔
228
   KS[2] = (X[2]) ^ ((Y[(Q + 2) % 4]) >> R) ^ ((Y[(Q + 1) % 4]) << (32 - R));
1,978✔
229
   KS[3] = (X[3]) ^ ((Y[(Q + 3) % 4]) >> R) ^ ((Y[(Q + 2) % 4]) << (32 - R));
1,978✔
230
}
1,978✔
231

232
void aria_ks_dk_transform(uint32_t& K0, uint32_t& K1, uint32_t& K2, uint32_t& K3) {
1,710✔
233
   K0 = rotr<8>(K0) ^ rotr<16>(K0) ^ rotr<24>(K0);
1,710✔
234
   K1 = rotr<8>(K1) ^ rotr<16>(K1) ^ rotr<24>(K1);
1,710✔
235
   K2 = rotr<8>(K2) ^ rotr<16>(K2) ^ rotr<24>(K2);
1,710✔
236
   K3 = rotr<8>(K3) ^ rotr<16>(K3) ^ rotr<24>(K3);
1,710✔
237

238
   K1 ^= K2;
1,710✔
239
   K2 ^= K3;
1,710✔
240
   K0 ^= K1;
1,710✔
241
   K3 ^= K1;
1,710✔
242
   K2 ^= K0;
1,710✔
243
   K1 ^= K2;
1,710✔
244

245
   K1 = ((K1 << 8) & 0xFF00FF00) | ((K1 >> 8) & 0x00FF00FF);
1,710✔
246
   K2 = rotr<16>(K2);
1,710✔
247
   K3 = reverse_bytes(K3);
1,710✔
248

249
   K1 ^= K2;
1,710✔
250
   K2 ^= K3;
1,710✔
251
   K0 ^= K1;
1,710✔
252
   K3 ^= K1;
1,710✔
253
   K2 ^= K0;
1,710✔
254
   K1 ^= K2;
1,710✔
255
}
1,710✔
256

257
/*
258
* ARIA Key Schedule
259
*/
260
void key_schedule(secure_vector<uint32_t>& ERK, secure_vector<uint32_t>& DRK, std::span<const uint8_t> key) {
134✔
261
   const uint32_t KRK[3][4] = {{0x517cc1b7, 0x27220a94, 0xfe13abe8, 0xfa9a6ee0},
134✔
262
                               {0x6db14acc, 0x9e21c820, 0xff28b1d5, 0xef5de2b0},
263
                               {0xdb92371d, 0x2126e970, 0x03249775, 0x04e8c90e}};
264

265
   const size_t CK0 = (key.size() / 8) - 2;
134✔
266
   const size_t CK1 = (CK0 + 1) % 3;
134✔
267
   const size_t CK2 = (CK1 + 1) % 3;
134✔
268

269
   uint32_t w0[4];
134✔
270
   uint32_t w1[4];
134✔
271
   uint32_t w2[4];
134✔
272
   uint32_t w3[4];
134✔
273

274
   w0[0] = load_be<uint32_t>(key.data(), 0);
134✔
275
   w0[1] = load_be<uint32_t>(key.data(), 1);
134✔
276
   w0[2] = load_be<uint32_t>(key.data(), 2);
134✔
277
   w0[3] = load_be<uint32_t>(key.data(), 3);
134✔
278

279
   w1[0] = w0[0] ^ KRK[CK0][0];
134✔
280
   w1[1] = w0[1] ^ KRK[CK0][1];
134✔
281
   w1[2] = w0[2] ^ KRK[CK0][2];
134✔
282
   w1[3] = w0[3] ^ KRK[CK0][3];
134✔
283

284
   ARIA_FO(w1[0], w1[1], w1[2], w1[3]);
134✔
285

286
   if(key.size() == 24 || key.size() == 32) {
134✔
287
      w1[0] ^= load_be<uint32_t>(key.data(), 4);
73✔
288
      w1[1] ^= load_be<uint32_t>(key.data(), 5);
73✔
289
   }
290
   if(key.size() == 32) {
134✔
291
      w1[2] ^= load_be<uint32_t>(key.data(), 6);
45✔
292
      w1[3] ^= load_be<uint32_t>(key.data(), 7);
45✔
293
   }
294

295
   w2[0] = w1[0] ^ KRK[CK1][0];
134✔
296
   w2[1] = w1[1] ^ KRK[CK1][1];
134✔
297
   w2[2] = w1[2] ^ KRK[CK1][2];
134✔
298
   w2[3] = w1[3] ^ KRK[CK1][3];
134✔
299

300
   ARIA_FE(w2[0], w2[1], w2[2], w2[3]);
134✔
301

302
   w2[0] ^= w0[0];
134✔
303
   w2[1] ^= w0[1];
134✔
304
   w2[2] ^= w0[2];
134✔
305
   w2[3] ^= w0[3];
134✔
306

307
   w3[0] = w2[0] ^ KRK[CK2][0];
134✔
308
   w3[1] = w2[1] ^ KRK[CK2][1];
134✔
309
   w3[2] = w2[2] ^ KRK[CK2][2];
134✔
310
   w3[3] = w2[3] ^ KRK[CK2][3];
134✔
311

312
   ARIA_FO(w3[0], w3[1], w3[2], w3[3]);
134✔
313

314
   w3[0] ^= w1[0];
134✔
315
   w3[1] ^= w1[1];
134✔
316
   w3[2] ^= w1[2];
134✔
317
   w3[3] ^= w1[3];
134✔
318

319
   if(key.size() == 16) {
134✔
320
      ERK.resize(4 * 13);
61✔
321
   } else if(key.size() == 24) {
73✔
322
      ERK.resize(4 * 15);
28✔
323
   } else if(key.size() == 32) {
45✔
324
      ERK.resize(4 * 17);
45✔
325
   }
326

327
   ARIA_ROL128<19>(w0, w1, &ERK[0]);  // NOLINT(*-container-data-pointer)
134✔
328
   ARIA_ROL128<19>(w1, w2, &ERK[4]);
134✔
329
   ARIA_ROL128<19>(w2, w3, &ERK[8]);
134✔
330
   ARIA_ROL128<19>(w3, w0, &ERK[12]);
134✔
331
   ARIA_ROL128<31>(w0, w1, &ERK[16]);
134✔
332
   ARIA_ROL128<31>(w1, w2, &ERK[20]);
134✔
333
   ARIA_ROL128<31>(w2, w3, &ERK[24]);
134✔
334
   ARIA_ROL128<31>(w3, w0, &ERK[28]);
134✔
335
   ARIA_ROL128<67>(w0, w1, &ERK[32]);
134✔
336
   ARIA_ROL128<67>(w1, w2, &ERK[36]);
134✔
337
   ARIA_ROL128<67>(w2, w3, &ERK[40]);
134✔
338
   ARIA_ROL128<67>(w3, w0, &ERK[44]);
134✔
339
   ARIA_ROL128<97>(w0, w1, &ERK[48]);
134✔
340

341
   if(key.size() == 24 || key.size() == 32) {
134✔
342
      ARIA_ROL128<97>(w1, w2, &ERK[52]);
73✔
343
      ARIA_ROL128<97>(w2, w3, &ERK[56]);
73✔
344

345
      if(key.size() == 32) {
73✔
346
         ARIA_ROL128<97>(w3, w0, &ERK[60]);
45✔
347
         ARIA_ROL128<109>(w0, w1, &ERK[64]);
45✔
348
      }
349
   }
350

351
   // Now create the decryption key schedule
352
   DRK.resize(ERK.size());
134✔
353

354
   for(size_t i = 0; i != DRK.size(); i += 4) {
2,112✔
355
      DRK[i] = ERK[ERK.size() - 4 - i];
1,978✔
356
      DRK[i + 1] = ERK[ERK.size() - 3 - i];
1,978✔
357
      DRK[i + 2] = ERK[ERK.size() - 2 - i];
1,978✔
358
      DRK[i + 3] = ERK[ERK.size() - 1 - i];
1,978✔
359
   }
360

361
   for(size_t i = 4; i != DRK.size() - 4; i += 4) {
1,844✔
362
      aria_ks_dk_transform(DRK[i + 0], DRK[i + 1], DRK[i + 2], DRK[i + 3]);
1,710✔
363
   }
364
}
134✔
365

366
}  // namespace ARIA_F
367

368
}  // namespace
369

370
void ARIA_128::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
1,210✔
371
   assert_key_material_set();
1,210✔
372

373
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
374
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
1,195✔
375
      return aria_avx512_gfni_encrypt(in, out, blocks);
×
376
   }
377
#endif
378

379
#if defined(BOTAN_HAS_ARIA_HWAES)
380
   if(CPUID::has(CPUID::Feature::HW_AES)) {
1,195✔
381
      return aria_hwaes_encrypt(in, out, blocks);
598✔
382
   }
383
#endif
384

385
   ARIA_F::transform(in, out, blocks, m_ERK);
597✔
386
}
387

388
void ARIA_192::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
580✔
389
   assert_key_material_set();
580✔
390

391
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
392
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
568✔
393
      return aria_avx512_gfni_encrypt(in, out, blocks);
×
394
   }
395
#endif
396

397
#if defined(BOTAN_HAS_ARIA_HWAES)
398
   if(CPUID::has(CPUID::Feature::HW_AES)) {
568✔
399
      return aria_hwaes_encrypt(in, out, blocks);
76✔
400
   }
401
#endif
402

403
   ARIA_F::transform(in, out, blocks, m_ERK);
492✔
404
}
405

406
void ARIA_256::encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
1,035✔
407
   assert_key_material_set();
1,035✔
408

409
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
410
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
1,023✔
411
      return aria_avx512_gfni_encrypt(in, out, blocks);
×
412
   }
413
#endif
414

415
#if defined(BOTAN_HAS_ARIA_HWAES)
416
   if(CPUID::has(CPUID::Feature::HW_AES)) {
1,023✔
417
      return aria_hwaes_encrypt(in, out, blocks);
426✔
418
   }
419
#endif
420

421
   ARIA_F::transform(in, out, blocks, m_ERK);
597✔
422
}
423

424
void ARIA_128::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
280✔
425
   assert_key_material_set();
280✔
426

427
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
428
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
268✔
429
      return aria_avx512_gfni_decrypt(in, out, blocks);
×
430
   }
431
#endif
432

433
#if defined(BOTAN_HAS_ARIA_HWAES)
434
   if(CPUID::has(CPUID::Feature::HW_AES)) {
268✔
435
      return aria_hwaes_decrypt(in, out, blocks);
262✔
436
   }
437
#endif
438

439
   ARIA_F::transform(in, out, blocks, m_DRK);
6✔
440
}
441

442
void ARIA_192::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
24✔
443
   assert_key_material_set();
24✔
444

445
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
446
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
12✔
447
      return aria_avx512_gfni_decrypt(in, out, blocks);
×
448
   }
449
#endif
450

451
#if defined(BOTAN_HAS_ARIA_HWAES)
452
   if(CPUID::has(CPUID::Feature::HW_AES)) {
12✔
453
      return aria_hwaes_decrypt(in, out, blocks);
6✔
454
   }
455
#endif
456

457
   ARIA_F::transform(in, out, blocks, m_DRK);
6✔
458
}
459

460
void ARIA_256::decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const {
300✔
461
   assert_key_material_set();
300✔
462

463
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
464
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
288✔
465
      return aria_avx512_gfni_decrypt(in, out, blocks);
×
466
   }
467
#endif
468

469
#if defined(BOTAN_HAS_ARIA_HWAES)
470
   if(CPUID::has(CPUID::Feature::HW_AES)) {
288✔
471
      return aria_hwaes_decrypt(in, out, blocks);
282✔
472
   }
473
#endif
474

475
   ARIA_F::transform(in, out, blocks, m_DRK);
6✔
476
}
477

478
bool ARIA_128::has_keying_material() const {
11,739✔
479
   return !m_ERK.empty();
11,739✔
480
}
481

482
bool ARIA_192::has_keying_material() const {
9,048✔
483
   return !m_ERK.empty();
9,048✔
484
}
485

486
bool ARIA_256::has_keying_material() const {
11,293✔
487
   return !m_ERK.empty();
11,293✔
488
}
489

490
namespace {
491

492
size_t aria_parallelism() {
276✔
493
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
494
   if(CPUID::has(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
276✔
495
      return 16;
496
   }
497
#endif
498

499
#if defined(BOTAN_HAS_ARIA_HWAES)
500
   if(CPUID::has(CPUID::Feature::HW_AES)) {
276✔
501
      return 4;
129✔
502
   }
503
#endif
504

505
   return 1;
506
}
507

508
std::string aria_provider() {
18✔
509
#if defined(BOTAN_HAS_ARIA_AVX512_GFNI)
510
   if(auto feat = CPUID::check(CPUID::Feature::AVX512, CPUID::Feature::GFNI)) {
18✔
511
      return *feat;
×
512
   }
×
513
#endif
514

515
#if defined(BOTAN_HAS_ARIA_HWAES)
516
   if(auto feat = CPUID::check(CPUID::Feature::HW_AES)) {
18✔
517
      return *feat;
18✔
518
   }
9✔
519
#endif
520

521
   return "base";
9✔
522
}
523

524
}  // namespace
525

526
size_t ARIA_128::parallelism() const {
123✔
527
   return aria_parallelism();
123✔
528
}
529

530
std::string ARIA_128::provider() const {
6✔
531
   return aria_provider();
6✔
532
}
533

534
size_t ARIA_192::parallelism() const {
54✔
535
   return aria_parallelism();
54✔
536
}
537

538
std::string ARIA_192::provider() const {
6✔
539
   return aria_provider();
6✔
540
}
541

542
size_t ARIA_256::parallelism() const {
99✔
543
   return aria_parallelism();
99✔
544
}
545

546
std::string ARIA_256::provider() const {
6✔
547
   return aria_provider();
6✔
548
}
549

550
void ARIA_128::key_schedule(std::span<const uint8_t> key) {
61✔
551
   ARIA_F::key_schedule(m_ERK, m_DRK, key);
61✔
552
}
61✔
553

554
void ARIA_192::key_schedule(std::span<const uint8_t> key) {
28✔
555
   ARIA_F::key_schedule(m_ERK, m_DRK, key);
28✔
556
}
28✔
557

558
void ARIA_256::key_schedule(std::span<const uint8_t> key) {
45✔
559
   ARIA_F::key_schedule(m_ERK, m_DRK, key);
45✔
560
}
45✔
561

562
void ARIA_128::clear() {
36✔
563
   zap(m_ERK);
36✔
564
   zap(m_DRK);
36✔
565
}
36✔
566

567
void ARIA_192::clear() {
20✔
568
   zap(m_ERK);
20✔
569
   zap(m_DRK);
20✔
570
}
20✔
571

572
void ARIA_256::clear() {
30✔
573
   zap(m_ERK);
30✔
574
   zap(m_DRK);
30✔
575
}
30✔
576

577
}  // namespace Botan
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc