Go to the documentation of this file.
20 #include "../../internal.h"
22 #if defined(OPENSSL_SSE2)
23 #include <emmintrin.h>
62 #if defined(OPENSSL_SSE2)
66 #define AES_NOHW_WORD_SIZE 16
67 #define AES_NOHW_BATCH_SIZE 8
68 #define AES_NOHW_ROW0_MASK \
69 _mm_set_epi32(0x000000ff, 0x000000ff, 0x000000ff, 0x000000ff)
70 #define AES_NOHW_ROW1_MASK \
71 _mm_set_epi32(0x0000ff00, 0x0000ff00, 0x0000ff00, 0x0000ff00)
72 #define AES_NOHW_ROW2_MASK \
73 _mm_set_epi32(0x00ff0000, 0x00ff0000, 0x00ff0000, 0x00ff0000)
74 #define AES_NOHW_ROW3_MASK \
75 _mm_set_epi32(0xff000000, 0xff000000, 0xff000000, 0xff000000)
76 #define AES_NOHW_COL01_MASK \
77 _mm_set_epi32(0x00000000, 0x00000000, 0xffffffff, 0xffffffff)
78 #define AES_NOHW_COL2_MASK \
79 _mm_set_epi32(0x00000000, 0xffffffff, 0x00000000, 0x00000000)
80 #define AES_NOHW_COL3_MASK \
81 _mm_set_epi32(0xffffffff, 0x00000000, 0x00000000, 0x00000000)
84 return _mm_and_si128(
a,
b);
88 return _mm_or_si128(
a,
b);
92 return _mm_xor_si128(
a,
b);
97 a, _mm_set_epi32(0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff));
102 #define aes_nohw_shift_left( a, i) \
103 _mm_slli_si128((a), (i))
104 #define aes_nohw_shift_right( a, i) \
105 _mm_srli_si128((a), (i))
106 #else // !OPENSSL_SSE2
107 #if defined(OPENSSL_64_BIT)
109 #define AES_NOHW_WORD_SIZE 8
110 #define AES_NOHW_BATCH_SIZE 4
111 #define AES_NOHW_ROW0_MASK UINT64_C(0x000f000f000f000f)
112 #define AES_NOHW_ROW1_MASK UINT64_C(0x00f000f000f000f0)
113 #define AES_NOHW_ROW2_MASK UINT64_C(0x0f000f000f000f00)
114 #define AES_NOHW_ROW3_MASK UINT64_C(0xf000f000f000f000)
115 #define AES_NOHW_COL01_MASK UINT64_C(0x00000000ffffffff)
116 #define AES_NOHW_COL2_MASK UINT64_C(0x0000ffff00000000)
117 #define AES_NOHW_COL3_MASK UINT64_C(0xffff000000000000)
118 #else // !OPENSSL_64_BIT
120 #define AES_NOHW_WORD_SIZE 4
121 #define AES_NOHW_BATCH_SIZE 2
122 #define AES_NOHW_ROW0_MASK 0x03030303
123 #define AES_NOHW_ROW1_MASK 0x0c0c0c0c
124 #define AES_NOHW_ROW2_MASK 0x30303030
125 #define AES_NOHW_ROW3_MASK 0xc0c0c0c0
126 #define AES_NOHW_COL01_MASK 0x0000ffff
127 #define AES_NOHW_COL2_MASK 0x00ff0000
128 #define AES_NOHW_COL3_MASK 0xff000000
129 #endif // OPENSSL_64_BIT
152 #endif // OPENSSL_SSE2
155 "batch size does not match word size");
157 "AES_NOHW_WORD_SIZE is incorrect");
210 #define AES_NOHW_BLOCK_WORDS (16 / sizeof(aes_word_t))
239 #if defined(OPENSSL_SSE2)
241 #elif defined(OPENSSL_64_BIT)
258 #if defined(OPENSSL_SSE2)
260 #elif defined(OPENSSL_64_BIT)
271 #if !defined(OPENSSL_SSE2)
279 return a ^
b ^ (
b << shift);
289 #if defined(OPENSSL_64_BIT)
314 #else // !OPENSSL_64_BIT
342 #endif // OPENSSL_64_BIT
343 #endif // !OPENSSL_SSE2
348 #if defined(OPENSSL_SSE2)
350 #elif defined(OPENSSL_64_BIT)
374 #if defined(OPENSSL_SSE2)
376 #elif defined(OPENSSL_64_BIT)
416 #if defined(OPENSSL_SSE2)
419 #define aes_nohw_swap_bits( a, b, \
423 _mm_and_si128(_mm_xor_si128(_mm_srli_epi32(*(a), (shift)), *(b)), \
424 _mm_set_epi32((mask), (mask), (mask), (mask))); \
425 *(a) = _mm_xor_si128(*(a), _mm_slli_epi32(swap, (shift))); \
426 *(b) = _mm_xor_si128(*(b), swap); \
432 #if defined(OPENSSL_64_BIT)
442 #endif // OPENSSL_SSE2
454 #if AES_NOHW_BATCH_SIZE >= 4
462 #if AES_NOHW_BATCH_SIZE >= 8
478 for (
size_t i = 0;
i < num_blocks;
i++) {
495 for (
size_t i = 0;
i < num_blocks;
i++) {
507 for (
size_t i = 0;
i < 8;
i++) {
706 #define aes_nohw_rotate_cols_right( v, n) \
707 (aes_nohw_or(aes_nohw_shift_right((v), (n)*4), \
708 aes_nohw_shift_left((v), 16 - (n)*4)))
711 for (
size_t i = 0;
i < 8;
i++) {
724 for (
size_t i = 0;
i < 8;
i++) {
739 #if defined(OPENSSL_SSE2)
740 return _mm_or_si128(_mm_srli_epi32(
v, 8), _mm_slli_epi32(
v, 24));
741 #elif defined(OPENSSL_64_BIT)
742 return ((
v >> 4) &
UINT64_C(0x0fff0fff0fff0fff)) |
743 ((
v << 12) &
UINT64_C(0xf000f000f000f000));
745 return ((
v >> 2) & 0x3f3f3f3f) | ((
v << 6) & 0xc0c0c0c0);
752 #if defined(OPENSSL_SSE2)
753 return _mm_or_si128(_mm_srli_epi32(
v, 16), _mm_slli_epi32(
v, 16));
754 #elif defined(OPENSSL_64_BIT)
755 return ((
v >> 8) &
UINT64_C(0x00ff00ff00ff00ff)) |
756 ((
v << 8) &
UINT64_C(0xff00ff00ff00ff00));
758 return ((
v >> 4) & 0x0f0f0f0f) | ((
v << 4) & 0xf0f0f0f0);
873 for (
size_t i = 1;
i < num_rounds;
i++) {
889 for (
size_t i = num_rounds - 1;
i > 0;
i--) {
903 for (
size_t i = 0;
i <=
key->rounds;
i++) {
915 0x20, 0x40, 0x80, 0x1b, 0x36};
921 #if defined(OPENSSL_SSE2)
922 return _mm_set_epi32(0, 0, 0, rcon);
946 for (
size_t i = 1;
i <= 10;
i++) {
971 aes_word_t *block1 = storage1, *block2 = storage2;
988 for (
size_t i = 0;
i < 4;
i++) {
1029 memcpy(
key->rd_key + 4 * (3 *
i + 1), block2, 16);
1030 memcpy(
key->rd_key + 4 * (3 *
i + 2), block1, 16);
1064 memcpy(
key->rd_key + 4 * (3 *
i + 3), block2, 16);
1084 for (
size_t i = 2;
i <= 14;
i += 2) {
1116 memcpy(
key->rd_key + 4 * (
i + 1), block2, 16);
1189 memcpy(ivs.u8 + 16 *
i, ivec, 16);
1205 for (
size_t i = 0;
i <
todo;
i++) {
1222 assert(
len % 16 == 0);
1223 size_t blocks =
len / 16;
1235 while (blocks > 0) {
1265 for (
size_t i = 1;
i <
todo;
i++) {
OPENSSL_STATIC_ASSERT(AES_NOHW_BATCH_SIZE *128==8 *8 *sizeof(aes_word_t), "batch size does not match word size")
static aes_word_t aes_nohw_and(aes_word_t a, aes_word_t b)
static void aes_nohw_add_round_key(AES_NOHW_BATCH *batch, const AES_NOHW_BATCH *key)
return memset(p, 0, total)
#define AES_NOHW_WORD_SIZE
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
static aes_word_t aes_nohw_shift_left(aes_word_t a, aes_word_t i)
#define AES_NOHW_ROW1_MASK
static void aes_nohw_from_batch(uint8_t *out, size_t num_blocks, const AES_NOHW_BATCH *batch)
#define AES_NOHW_BLOCK_WORDS
static void aes_nohw_transpose(AES_NOHW_BATCH *batch)
#define AES_NOHW_COL3_MASK
static void aes_nohw_setup_key_128(AES_KEY *key, const uint8_t in[16])
static aes_word_t aes_nohw_shift_right(aes_word_t a, aes_word_t i)
static aes_word_t aes_nohw_or(aes_word_t a, aes_word_t b)
static void aes_nohw_setup_key_192(AES_KEY *key, const uint8_t in[24])
static void aes_nohw_setup_key_256(AES_KEY *key, const uint8_t in[32])
#define AES_NOHW_ROW0_MASK
static aes_word_t aes_nohw_rotate_rows_down(aes_word_t v)
#define aes_nohw_rotate_cols_right(v, n)
static void aes_nohw_swap_bits(aes_word_t *a, aes_word_t *b, uint32_t mask, aes_word_t shift)
static const uint8_t aes_nohw_rcon[10]
memcpy(mem, inblock.get(), min(CONTAINING_RECORD(inblock.get(), MEMBLOCK, data) ->size, size))
static uint32_t CRYPTO_bswap4(uint32_t x)
void aes_nohw_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
unsigned __int64 uint64_t
OPENSSL_EXPORT ASN1_BIT_STRING * bits
static void aes_nohw_batch_get(const AES_NOHW_BATCH *batch, aes_word_t out[AES_NOHW_BLOCK_WORDS], size_t i)
static aes_word_t aes_nohw_rcon_slice(uint8_t rcon, size_t i)
static void aes_nohw_mix_columns(AES_NOHW_BATCH *batch)
grpc_transport_stream_op_batch * batch
static void aes_nohw_expand_round_keys(AES_NOHW_SCHEDULE *out, const AES_KEY *key)
static void aes_nohw_encrypt_batch(const AES_NOHW_SCHEDULE *key, size_t num_rounds, AES_NOHW_BATCH *batch)
#define AES_NOHW_ROW2_MASK
static void aes_nohw_to_batch(AES_NOHW_BATCH *out, const uint8_t *in, size_t num_blocks)
static uint32_t aes_nohw_uncompact_word(uint32_t a)
static void aes_nohw_inv_mix_columns(AES_NOHW_BATCH *batch)
static uint32_t aes_nohw_compact_word(uint32_t a)
#define AES_NOHW_COL2_MASK
static void aes_nohw_inv_sub_bytes(AES_NOHW_BATCH *batch)
static void aes_nohw_xor_block(uint8_t out[16], const uint8_t a[16], const uint8_t b[16])
void aes_nohw_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len, const AES_KEY *key, uint8_t *ivec, const int enc)
static void aes_nohw_uncompact_block(uint8_t out[16], const aes_word_t in[AES_NOHW_BLOCK_WORDS])
static void aes_nohw_compact_block(aes_word_t out[AES_NOHW_BLOCK_WORDS], const uint8_t in[16])
static aes_word_t aes_nohw_rotate_rows_twice(aes_word_t v)
#define AES_NOHW_COL01_MASK
static void aes_nohw_sub_bytes(AES_NOHW_BATCH *batch)
int aes_nohw_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey)
void aes_nohw_ctr32_encrypt_blocks(const uint8_t *in, uint8_t *out, size_t blocks, const AES_KEY *key, const uint8_t ivec[16])
static uint32_t aes_nohw_word_from_bytes(uint8_t a0, uint8_t a1, uint8_t a2, uint8_t a3)
static aes_word_t aes_nohw_delta_swap(aes_word_t a, aes_word_t mask, aes_word_t shift)
static void aes_nohw_inv_shift_rows(AES_NOHW_BATCH *batch)
int aes_nohw_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey)
static aes_word_t aes_nohw_xor(aes_word_t a, aes_word_t b)
#define AES_NOHW_ROW3_MASK
static void aes_nohw_batch_set(AES_NOHW_BATCH *batch, const aes_word_t in[AES_NOHW_BLOCK_WORDS], size_t i)
static void aes_nohw_decrypt_batch(const AES_NOHW_SCHEDULE *key, size_t num_rounds, AES_NOHW_BATCH *batch)
static void aes_nohw_shift_rows(AES_NOHW_BATCH *batch)
static void aes_nohw_sub_bytes_inv_affine(AES_NOHW_BATCH *batch)
static aes_word_t aes_nohw_not(aes_word_t a)
#define AES_NOHW_BATCH_SIZE
void aes_nohw_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key)
static void aes_nohw_sub_block(aes_word_t out[AES_NOHW_BLOCK_WORDS], const aes_word_t in[AES_NOHW_BLOCK_WORDS])
grpc
Author(s):
autogenerated on Fri May 16 2025 02:57:40