Skip to content

Commit 563f0fb

Browse files
authored
Merge pull request #524 from libtom/modes-use-ecb
Make all modes use the ECB mode API
2 parents 2380362 + cd18fed commit 563f0fb

Some content is hidden

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

83 files changed

+377
-518
lines changed

demos/timing.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1163,7 +1163,7 @@ static void time_encmacs_(unsigned long MAC_SIZE)
11631163
ulong64 t1, t2;
11641164
unsigned long x, z;
11651165
int err, cipher_idx;
1166-
symmetric_key skey;
1166+
symmetric_ECB skey;
11671167

11681168
fprintf(stderr, "\nENC+MAC Timings (zero byte AAD, 16 byte IV, cycles/byte on %luKB blocks):\n", MAC_SIZE);
11691169

@@ -1242,7 +1242,7 @@ static void time_encmacs_(unsigned long MAC_SIZE)
12421242
}
12431243
fprintf(stderr, "CCM (no-precomp) \t%9"PRI64"u\n", t2/(ulong64)(MAC_SIZE*1024));
12441244

1245-
cipher_descriptor[cipher_idx].setup(key, 16, 0, &skey);
1245+
ecb_start(cipher_idx, key, 16, 0, &skey);
12461246
t2 = -1;
12471247
for (x = 0; x < 10000; x++) {
12481248
t_start();
@@ -1256,7 +1256,7 @@ static void time_encmacs_(unsigned long MAC_SIZE)
12561256
if (t1 < t2) t2 = t1;
12571257
}
12581258
fprintf(stderr, "CCM (precomp) \t\t%9"PRI64"u\n", t2/(ulong64)(MAC_SIZE*1024));
1259-
cipher_descriptor[cipher_idx].done(&skey);
1259+
ecb_done(&skey);
12601260
#endif
12611261

12621262
#ifdef LTC_GCM_MODE

src/encauth/ccm/ccm_add_aad.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ int ccm_add_aad(ccm_state *ccm,
2929
for (y = 0; y < adatalen; y++) {
3030
if (ccm->x == 16) {
3131
/* full block so let's encrypt it */
32-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
32+
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
3333
return err;
3434
}
3535
ccm->x = 0;
@@ -40,7 +40,7 @@ int ccm_add_aad(ccm_state *ccm,
4040
/* remainder? */
4141
if (ccm->aadlen == ccm->current_aadlen) {
4242
if (ccm->x != 0) {
43-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
43+
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
4444
return err;
4545
}
4646
}

src/encauth/ccm/ccm_add_nonce.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int ccm_add_nonce(ccm_state *ccm,
6666
}
6767

6868
/* encrypt PAD */
69-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
69+
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
7070
return err;
7171
}
7272

src/encauth/ccm/ccm_done.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ int ccm_done(ccm_state *ccm,
2828
LTC_ARGCHK(taglen != NULL);
2929

3030
if (ccm->x != 0) {
31-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
31+
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
3232
return err;
3333
}
3434
}
@@ -37,11 +37,11 @@ int ccm_done(ccm_state *ccm,
3737
for (y = 15; y > 15 - ccm->L; y--) {
3838
ccm->ctr[y] = 0x00;
3939
}
40-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
40+
if ((err = ecb_encrypt_block(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
4141
return err;
4242
}
4343

44-
cipher_descriptor[ccm->cipher].done(&ccm->K);
44+
ecb_done(&ccm->K);
4545

4646
/* store the TAG */
4747
for (x = 0; x < 16 && x < *taglen; x++) {

src/encauth/ccm/ccm_init.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,9 @@ int ccm_init(ccm_state *ccm, int cipher,
4141
ccm->taglen = taglen;
4242

4343
/* schedule key */
44-
if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, &ccm->K)) != CRYPT_OK) {
44+
if ((err = ecb_start(cipher, key, keylen, 0, &ccm->K)) != CRYPT_OK) {
4545
return err;
4646
}
47-
ccm->cipher = cipher;
4847

4948
/* let's get the L value */
5049
ccm->ptlen = ptlen;

src/encauth/ccm/ccm_memory.c

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
*/
3333
int ccm_memory(int cipher,
3434
const unsigned char *key, unsigned long keylen,
35-
symmetric_key *uskey,
35+
symmetric_ECB *uskey,
3636
const unsigned char *nonce, unsigned long noncelen,
3737
const unsigned char *header, unsigned long headerlen,
3838
unsigned char *pt, unsigned long ptlen,
@@ -42,7 +42,7 @@ int ccm_memory(int cipher,
4242
{
4343
unsigned char PAD[16], ctr[16], CTRPAD[16], ptTag[16], b, *pt_real;
4444
unsigned char *pt_work = NULL;
45-
symmetric_key *skey;
45+
symmetric_ECB *skey;
4646
int err;
4747
unsigned long len, L, x, y, z, CTRlen;
4848

@@ -78,12 +78,15 @@ int ccm_memory(int cipher,
7878
if (*taglen < 4 || *taglen > 16 || (*taglen % 2) == 1 || headerlen > 0x7fffffffu) {
7979
return CRYPT_INVALID_ARG;
8080
}
81+
if (noncelen < 7) {
82+
return CRYPT_INVALID_ARG;
83+
}
8184

8285
/* is there an accelerator? */
8386
if (cipher_descriptor[cipher].accel_ccm_memory != NULL) {
8487
return cipher_descriptor[cipher].accel_ccm_memory(
8588
key, keylen,
86-
uskey,
89+
&uskey->key,
8790
nonce, noncelen,
8891
header, headerlen,
8992
pt, ptlen,
@@ -120,7 +123,7 @@ int ccm_memory(int cipher,
120123
}
121124

122125
/* initialize the cipher */
123-
if ((err = cipher_descriptor[cipher].setup(key, keylen, 0, skey)) != CRYPT_OK) {
126+
if ((err = ecb_start(cipher, key, keylen, 0, skey)) != CRYPT_OK) {
124127
XFREE(skey);
125128
return err;
126129
}
@@ -144,7 +147,7 @@ int ccm_memory(int cipher,
144147
(L-1));
145148

146149
/* nonce */
147-
for (y = 0; y < 15 - L; y++) {
150+
for (y = 0; y < noncelen; y++) {
148151
PAD[x++] = nonce[y];
149152
}
150153

@@ -170,7 +173,7 @@ int ccm_memory(int cipher,
170173
}
171174

172175
/* encrypt PAD */
173-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
176+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
174177
goto error;
175178
}
176179

@@ -195,7 +198,7 @@ int ccm_memory(int cipher,
195198
for (y = 0; y < headerlen; y++) {
196199
if (x == 16) {
197200
/* full block so let's encrypt it */
198-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
201+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
199202
goto error;
200203
}
201204
x = 0;
@@ -204,7 +207,7 @@ int ccm_memory(int cipher,
204207
}
205208

206209
/* remainder */
207-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
210+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
208211
goto error;
209212
}
210213
}
@@ -239,7 +242,7 @@ int ccm_memory(int cipher,
239242
ctr[z] = (ctr[z] + 1) & 255;
240243
if (ctr[z]) break;
241244
}
242-
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
245+
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
243246
goto error;
244247
}
245248

@@ -248,7 +251,7 @@ int ccm_memory(int cipher,
248251
*(LTC_FAST_TYPE_PTR_CAST(&PAD[z])) ^= *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z]));
249252
*(LTC_FAST_TYPE_PTR_CAST(&ct[y+z])) = *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z])) ^ *(LTC_FAST_TYPE_PTR_CAST(&CTRPAD[z]));
250253
}
251-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
254+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
252255
goto error;
253256
}
254257
}
@@ -259,7 +262,7 @@ int ccm_memory(int cipher,
259262
ctr[z] = (ctr[z] + 1) & 255;
260263
if (ctr[z]) break;
261264
}
262-
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
265+
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
263266
goto error;
264267
}
265268

@@ -268,7 +271,7 @@ int ccm_memory(int cipher,
268271
*(LTC_FAST_TYPE_PTR_CAST(&pt[y+z])) = *(LTC_FAST_TYPE_PTR_CAST(&ct[y+z])) ^ *(LTC_FAST_TYPE_PTR_CAST(&CTRPAD[z]));
269272
*(LTC_FAST_TYPE_PTR_CAST(&PAD[z])) ^= *(LTC_FAST_TYPE_PTR_CAST(&pt[y+z]));
270273
}
271-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
274+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
272275
goto error;
273276
}
274277
}
@@ -283,7 +286,7 @@ int ccm_memory(int cipher,
283286
ctr[z] = (ctr[z] + 1) & 255;
284287
if (ctr[z]) break;
285288
}
286-
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
289+
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
287290
goto error;
288291
}
289292
CTRlen = 0;
@@ -299,7 +302,7 @@ int ccm_memory(int cipher,
299302
}
300303

301304
if (x == 16) {
302-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
305+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
303306
goto error;
304307
}
305308
x = 0;
@@ -308,7 +311,7 @@ int ccm_memory(int cipher,
308311
}
309312

310313
if (x != 0) {
311-
if ((err = cipher_descriptor[cipher].ecb_encrypt(PAD, PAD, skey)) != CRYPT_OK) {
314+
if ((err = ecb_encrypt_block(PAD, PAD, skey)) != CRYPT_OK) {
312315
goto error;
313316
}
314317
}
@@ -318,12 +321,12 @@ int ccm_memory(int cipher,
318321
for (y = 15; y > 15 - L; y--) {
319322
ctr[y] = 0x00;
320323
}
321-
if ((err = cipher_descriptor[cipher].ecb_encrypt(ctr, CTRPAD, skey)) != CRYPT_OK) {
324+
if ((err = ecb_encrypt_block(ctr, CTRPAD, skey)) != CRYPT_OK) {
322325
goto error;
323326
}
324327

325328
if (skey != uskey) {
326-
cipher_descriptor[cipher].done(skey);
329+
ecb_done(skey);
327330
#ifdef LTC_CLEAN_STACK
328331
zeromem(skey, sizeof(*skey));
329332
#endif

src/encauth/ccm/ccm_process.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ int ccm_process(ccm_state *ccm,
4747
ccm->ctr[z] = (ccm->ctr[z] + 1) & 255;
4848
if (ccm->ctr[z]) break;
4949
}
50-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
50+
if ((err = ecb_encrypt_block(ccm->ctr, ccm->CTRPAD, &ccm->K)) != CRYPT_OK) {
5151
return err;
5252
}
5353
ccm->CTRlen = 0;
@@ -63,7 +63,7 @@ int ccm_process(ccm_state *ccm,
6363
}
6464

6565
if (ccm->x == 16) {
66-
if ((err = cipher_descriptor[ccm->cipher].ecb_encrypt(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
66+
if ((err = ecb_encrypt_block(ccm->PAD, ccm->PAD, &ccm->K)) != CRYPT_OK) {
6767
return err;
6868
}
6969
ccm->x = 0;

src/encauth/ccm/ccm_test.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ int ccm_test(void)
108108
unsigned long taglen, x, y;
109109
unsigned char buf[64], buf2[64], tag[16], tag2[16], tag3[16], zero[64];
110110
int err, idx;
111-
symmetric_key skey;
111+
symmetric_ECB skey;
112112
ccm_state ccm;
113113

114114
zeromem(zero, 64);
@@ -125,7 +125,7 @@ int ccm_test(void)
125125
for (y = 0; y < 2; y++) {
126126
taglen = tests[x].taglen;
127127
if (y == 0) {
128-
if ((err = cipher_descriptor[idx].setup(tests[x].key, 16, 0, &skey)) != CRYPT_OK) {
128+
if ((err = ecb_start(idx, tests[x].key, 16, 0, &skey)) != CRYPT_OK) {
129129
return err;
130130
}
131131

@@ -235,7 +235,7 @@ int ccm_test(void)
235235
}
236236

237237
if (y == 0) {
238-
cipher_descriptor[idx].done(&skey);
238+
ecb_done(&skey);
239239
}
240240
}
241241
}

src/encauth/gcm/gcm_add_aad.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ int gcm_add_aad(gcm_state *gcm,
2020
const unsigned char *adata, unsigned long adatalen)
2121
{
2222
unsigned long x;
23-
int err;
2423
#ifdef LTC_FAST
2524
unsigned long y;
2625
#endif
@@ -34,10 +33,6 @@ int gcm_add_aad(gcm_state *gcm,
3433
return CRYPT_INVALID_ARG;
3534
}
3635

37-
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
38-
return err;
39-
}
40-
4136
/* in IV mode? */
4237
if (gcm->mode == LTC_GCM_MODE_IV) {
4338
/* IV length must be > 0 */

src/encauth/gcm/gcm_add_iv.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ int gcm_add_iv(gcm_state *gcm,
2020
const unsigned char *IV, unsigned long IVlen)
2121
{
2222
unsigned long x, y;
23-
int err;
2423

2524
LTC_ARGCHK(gcm != NULL);
2625
if (IVlen > 0) {
@@ -36,11 +35,6 @@ int gcm_add_iv(gcm_state *gcm,
3635
return CRYPT_INVALID_ARG;
3736
}
3837

39-
if ((err = cipher_is_valid(gcm->cipher)) != CRYPT_OK) {
40-
return err;
41-
}
42-
43-
4438
/* trip the ivmode flag */
4539
if (IVlen + gcm->buflen > 12) {
4640
gcm->ivmode |= 1;

0 commit comments

Comments
 (0)