68namespace detail::aes {
71static constexpr uint8_t SBOX[256] = {
72 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
73 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
74 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
75 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
76 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
77 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
78 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
79 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
80 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
81 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
82 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
83 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
84 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
85 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
86 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
87 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
88 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
89 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
90 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
91 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
92 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
93 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
94 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
95 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
96 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
97 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
98 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
99 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
100 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
101 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
102 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
103 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
107static constexpr uint8_t INV_SBOX[256] = {
108 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38,
109 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
110 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87,
111 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
112 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d,
113 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
114 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2,
115 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
116 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16,
117 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
118 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda,
119 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
120 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a,
121 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
122 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02,
123 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
124 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea,
125 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
126 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85,
127 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
128 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89,
129 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
130 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20,
131 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
132 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31,
133 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
134 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d,
135 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
136 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0,
137 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
138 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26,
139 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
146static constexpr uint8_t RCON[10] = {
147 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36
158inline constexpr uint8_t
xtime(uint8_t a) {
159 return static_cast<uint8_t
>((a << 1) ^ ((a & 0x80) ? 0x1b : 0x00));
165inline constexpr uint8_t
gf_mul(uint8_t a, uint8_t b) {
167 for (
int i = 0; i < 8; ++i) {
168 result ^= a & (
static_cast<uint8_t
>(0) - (b & 1));
170 a =
static_cast<uint8_t
>(a << 1) ^ (0x1b & (static_cast<uint8_t>(0) - hi));
182 word[0] = SBOX[word[0]];
183 word[1] = SBOX[word[1]];
184 word[2] = SBOX[word[2]];
185 word[3] = SBOX[word[3]];
190 uint8_t tmp = word[0];
204 if (len == 0)
return;
205 volatile unsigned char* p =
static_cast<volatile unsigned char*
>(ptr);
206 for (
size_t i = 0; i < len; ++i) p[i] = 0;
207#if defined(__GNUC__) || defined(__clang__)
208 __asm__ __volatile__(
"" :::
"memory");
209#elif defined(_MSC_VER)
218#if defined(SIGNET_HAS_AESNI_DETECT)
220 #if defined(__GNUC__) || defined(__clang__)
221 unsigned int eax = 0, ebx = 0, ecx = 0, edx = 0;
222 if (__get_cpuid(1, &eax, &ebx, &ecx, &edx)) {
223 return (ecx >> 25) & 1;
225 #elif defined(_MSC_VER)
228 return (cpuInfo[2] >> 25) & 1;
231#elif defined(SIGNET_HAS_ARM_AES)