Skip to content

Commit 0e0497d

Browse files
committed
⚡️ Add AES-GCM
1 parent 67f4579 commit 0e0497d

46 files changed

Lines changed: 2803 additions & 295 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

inc/aes.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -400,8 +400,20 @@ aes_status_t aes_ctr_dec(byte_t *out, size_t o_sz, const iv_t nonce, const byte
400400
//
401401
////////////////////////////////////
402402

403-
aes_status_t aes_gcm_enc(aes_gcm_counter_t *out, const iv_t nonce, const byte_t *restrict aad, const byte_t *restrict in, size_t i_sz, const aes_ctx_t *ctx);
404-
aes_status_t aes_gcm_dec(aes_gcm_counter_t *out, const iv_t nonce, const byte_t *restrict aad, const byte_t *restrict in, size_t i_sz, const aes_ctx_t *ctx);
403+
aes_status_t aes_gcm_enc(aes_gcm_counter_t *out, const iv_t nonce, const byte_t *restrict aad, size_t aad_len, const byte_t *restrict in, size_t i_sz, const aes_ctx_t *ctx);
404+
aes_status_t aes_gcm_dec(aes_gcm_counter_t *out, const iv_t nonce, const byte_t *restrict aad, size_t aad_len, const byte_t *restrict in, size_t i_sz, const aes_ctx_t *ctx);
405+
406+
407+
/////////////////////////////////////
408+
//
409+
//
410+
// UTILS
411+
//
412+
//
413+
////////////////////////////////////
414+
415+
__m128i aes_block_enc(__m128i data, const aes_key_t *k, const aes_key_size_t nr);
416+
__m128i aes_block_dec(__m128i data, const aes_key_t *k, const aes_key_size_t nr);
405417

406418
/////////////////////////////////////
407419
//

inc/gf.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,6 @@ uint16_t gf8_mul(uint8_t a, uint8_t b);
3838

3939
__m128i gf128_mul(__m128i a, __m128i b);
4040

41+
void gfmul(const uint8_t a[0x10], const uint8_t b[0x10], uint8_t r[0x10]);
42+
4143
#endif

meson.build

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,10 @@ SRCS_PKCS = ['src/pkcs/pkcs.c']
3434
SRCS_EXPANSION = ['src/expansion/aes_128_expansion.c', 'src/expansion/aes_192_expansion.c', 'src/expansion/aes_256_expansion.c']
3535
SRCS_RANDOM = ['src/random/rdrnd.c', 'src/random/urandom.c']
3636
SRCS_AES = ['src/ecb/aes_ecb.c', 'src/cbc/aes_cbc.c', 'src/cfb/aes_cfb.c', 'src/ofb/aes_ofb.c', 'src/ctr/aes_ctr.c', 'src/gcm/aes_gcm.c']
37-
SRCS_GF = ['src/gf/gf8_mul.c', 'src/gf/gf128_mul.c']
37+
SRCS_GF = ['src/gf/gf8_mul.c', 'src/gf/gf128_mul.c', 'src/gcm/gfmul.c']
38+
SRCS_UTILS = ['src/utils/aes_block.c']
3839

39-
SRCS = [SRCS_PKCS, SRCS_RC, SRCS_EXPANSION, SRCS_RANDOM, SRCS_AES, SRCS_GF]
40+
SRCS = [SRCS_PKCS, SRCS_RC, SRCS_EXPANSION, SRCS_RANDOM, SRCS_AES, SRCS_GF, SRCS_UTILS]
4041
SRCS_FILES = files(SRCS)
4142

4243
#############################

src/cbc/aes_cbc.c

Lines changed: 7 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -116,29 +116,7 @@ aes_status_t aes_cbc_enc(byte_t *out, size_t o_sz, iv_t iv, const byte_t *restri
116116

117117
feedback = _mm_xor_si128(state, feedback);
118118

119-
// Xor State with first round Key (This XOR is equal to first AddRounKey Transformation)
120-
feedback = AddRoundKey(feedback, ctx->key.sched[0]);
121-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[1]);
122-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[2]);
123-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[3]);
124-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[4]);
125-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[5]);
126-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[6]);
127-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[7]);
128-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[8]);
129-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[9]);
130-
131-
if (NR >= AES_192_NR) {
132-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[10]);
133-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[11]);
134-
135-
if (NR == AES_256_NR) {
136-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[12]);
137-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[13]);
138-
}
139-
}
140-
141-
feedback = _mm_aesenclast_si128(feedback, ctx->key.sched[NR]);
119+
feedback = aes_block_enc(feedback, &ctx->key, NR);
142120

143121
_mm_storeu_si128(&((__m128i*)out)[i], feedback);
144122
}
@@ -173,8 +151,9 @@ aes_status_t aes_cbc_dec(byte_t *out, size_t o_sz, iv_t iv, const byte_t *restri
173151
for (i = 0; i < blocks; i++) {
174152

175153
last_in = _mm_loadu_si128( &((__m128i*)in)[i]);
154+
state = last_in;
176155

177-
state = AddRoundKey(last_in, ctx->key.sched[NR]);
156+
/*state = AddRoundKey(last_in, ctx->key.sched[NR]);
178157
179158
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 1]));
180159
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 2]));
@@ -196,7 +175,10 @@ aes_status_t aes_cbc_dec(byte_t *out, size_t o_sz, iv_t iv, const byte_t *restri
196175
}
197176
}
198177
199-
state = _mm_aesdeclast_si128(state, ctx->key.sched[0]);
178+
state = _mm_aesdeclast_si128(state, ctx->key.sched[0]);*/
179+
180+
state = aes_block_dec(state, &ctx->key, NR);
181+
200182
state = _mm_xor_si128(state, feedback);
201183

202184
_mm_storeu_si128(&((__m128i*)out)[i], state);

src/cfb/aes_cfb.c

Lines changed: 2 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -114,29 +114,7 @@ aes_status_t aes_cfb_enc(byte_t *out, size_t o_sz, iv_t iv, const byte_t *restri
114114
// Load State
115115
state = _mm_loadu_si128( &((__m128i*)in)[i]);
116116

117-
// Xor State with first round Key (This XOR is equal to first AddRounKey Transformation)
118-
feedback = AddRoundKey(feedback, ctx->key.sched[0]);
119-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[1]);
120-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[2]);
121-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[3]);
122-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[4]);
123-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[5]);
124-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[6]);
125-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[7]);
126-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[8]);
127-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[9]);
128-
129-
if (NR >= AES_192_NR) {
130-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[10]);
131-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[11]);
132-
133-
if (NR == AES_256_NR) {
134-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[12]);
135-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[13]);
136-
}
137-
}
138-
139-
feedback = _mm_aesenclast_si128(feedback, ctx->key.sched[NR]);
117+
feedback = aes_block_enc(feedback, &ctx->key, NR);
140118

141119
state = _mm_xor_si128(state, feedback);
142120
feedback = state;
@@ -176,29 +154,7 @@ aes_status_t aes_cfb_dec(byte_t *out, size_t o_sz, iv_t iv, const byte_t *restri
176154
// Load State
177155
state = _mm_loadu_si128( &((__m128i*)in)[i]);
178156

179-
// Xor State with first round Key (This XOR is equal to first AddRounKey Transformation)
180-
feedback = AddRoundKey(feedback, ctx->key.sched[0]);
181-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[1]);
182-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[2]);
183-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[3]);
184-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[4]);
185-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[5]);
186-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[6]);
187-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[7]);
188-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[8]);
189-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[9]);
190-
191-
if (NR >= AES_192_NR) {
192-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[10]);
193-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[11]);
194-
195-
if (NR == AES_256_NR) {
196-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[12]);
197-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[13]);
198-
}
199-
}
200-
201-
feedback = _mm_aesenclast_si128(feedback, ctx->key.sched[NR]);
157+
feedback = aes_block_enc(feedback, &ctx->key, NR);
202158

203159
cipher = state;
204160
state = _mm_xor_si128(state, feedback);

src/ctr/aes_ctr.c

Lines changed: 1 addition & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -146,30 +146,7 @@ aes_status_t aes_ctr_enc(byte_t *out, size_t o_sz, const iv_t nonce, const byte_
146146

147147
feedback = _mm_loadu_si128((__m128i*)nonce);
148148

149-
// Xor State with first round Key (This XOR is equal to first AddRounKey Transformation)
150-
feedback = AddRoundKey(feedback, ctx->key.sched[0x0]);
151-
152-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x1]);
153-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x2]);
154-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x3]);
155-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x4]);
156-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x5]);
157-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x6]);
158-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x7]);
159-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x8]);
160-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0x9]);
161-
162-
if (NR >= AES_192_NR) {
163-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0xa]);
164-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0xb]);
165-
166-
if (NR == AES_256_NR) {
167-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0xc]);
168-
feedback = _mm_aesenc_si128(feedback, ctx->key.sched[0xe]);
169-
}
170-
}
171-
172-
feedback = _mm_aesenclast_si128(feedback, ctx->key.sched[NR]);
149+
feedback = aes_block_enc(feedback, &ctx->key, NR);
173150

174151
state = _mm_xor_si128(feedback, state);
175152

src/ecb/aes_ecb.c

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -105,36 +105,9 @@ aes_status_t aes_ecb_enc(byte_t *out, size_t o_sz, const byte_t *restrict in, si
105105

106106
for (i = 0; i < blocks; i++) {
107107

108-
// Load State
109108
state = _mm_loadu_si128( &((__m128i*)in)[i]);
110109

111-
// Xor State with first round Key (This XOR is equal to first AddRounKey Transformation)
112-
state = AddRoundKey(state, ctx->key.sched[0]);
113-
114-
state = _mm_aesenc_si128(state, ctx->key.sched[1]);
115-
state = _mm_aesenc_si128(state, ctx->key.sched[2]);
116-
state = _mm_aesenc_si128(state, ctx->key.sched[3]);
117-
state = _mm_aesenc_si128(state, ctx->key.sched[4]);
118-
state = _mm_aesenc_si128(state, ctx->key.sched[5]);
119-
state = _mm_aesenc_si128(state, ctx->key.sched[6]);
120-
state = _mm_aesenc_si128(state, ctx->key.sched[7]);
121-
state = _mm_aesenc_si128(state, ctx->key.sched[8]);
122-
state = _mm_aesenc_si128(state, ctx->key.sched[9]);
123-
124-
if (NR >= AES_192_NR) {
125-
state = _mm_aesenc_si128(state, ctx->key.sched[10]);
126-
state = _mm_aesenc_si128(state, ctx->key.sched[11]);
127-
128-
if (NR == AES_256_NR) {
129-
state = _mm_aesenc_si128(state, ctx->key.sched[12]);
130-
state = _mm_aesenc_si128(state, ctx->key.sched[13]);
131-
}
132-
}
133-
134-
// a[127:0] := ShiftRows(a[127:0])
135-
// a[127:0] := SubBytes(a[127:0])
136-
// dst[127:0] := a[127:0] (AddRoundKey) XOR RoundKey[127:0]
137-
state = _mm_aesenclast_si128(state, ctx->key.sched[NR]);
110+
state = aes_block_enc(state, &ctx->key, NR);
138111

139112
_mm_storeu_si128(&((__m128i*)out)[i], state);
140113
}
@@ -162,28 +135,8 @@ aes_status_t aes_ecb_dec(byte_t *out, size_t o_sz, const byte_t *restrict in, si
162135
for (i = 0; i < blocks; i++) {
163136
state = _mm_loadu_si128( &((__m128i*)in)[i]);
164137

165-
state = AddRoundKey(state, ctx->key.sched[NR]);
166-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 1]));
167-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 2]));
168-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 3]));
169-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 4]));
170-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 5]));
171-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 6]));
172-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 7]));
173-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 8]));
174-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 9]));
175-
176-
if (NR >= AES_192_NR) {
177-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 10]));
178-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 11]));
179-
180-
if (NR == AES_256_NR) {
181-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 12]));
182-
state = _mm_aesdec_si128(state, _mm_aesimc_si128(ctx->key.sched[NR - 13]));
183-
}
184-
}
185-
186-
state = _mm_aesdeclast_si128(state, ctx->key.sched[0]);
138+
state = aes_block_dec(state, &ctx->key, NR);
139+
187140
_mm_storeu_si128(&((__m128i*)out)[i], state);
188141
}
189142

0 commit comments

Comments
 (0)