32
32
*/
33
33
int ccm_memory (int cipher ,
34
34
const unsigned char * key , unsigned long keylen ,
35
- symmetric_key * uskey ,
35
+ symmetric_ECB * uskey ,
36
36
const unsigned char * nonce , unsigned long noncelen ,
37
37
const unsigned char * header , unsigned long headerlen ,
38
38
unsigned char * pt , unsigned long ptlen ,
@@ -42,7 +42,7 @@ int ccm_memory(int cipher,
42
42
{
43
43
unsigned char PAD [16 ], ctr [16 ], CTRPAD [16 ], ptTag [16 ], b , * pt_real ;
44
44
unsigned char * pt_work = NULL ;
45
- symmetric_key * skey ;
45
+ symmetric_ECB * skey ;
46
46
int err ;
47
47
unsigned long len , L , x , y , z , CTRlen ;
48
48
@@ -78,12 +78,15 @@ int ccm_memory(int cipher,
78
78
if (* taglen < 4 || * taglen > 16 || (* taglen % 2 ) == 1 || headerlen > 0x7fffffffu ) {
79
79
return CRYPT_INVALID_ARG ;
80
80
}
81
+ if (noncelen < 7 ) {
82
+ return CRYPT_INVALID_ARG ;
83
+ }
81
84
82
85
/* is there an accelerator? */
83
86
if (cipher_descriptor [cipher ].accel_ccm_memory != NULL ) {
84
87
return cipher_descriptor [cipher ].accel_ccm_memory (
85
88
key , keylen ,
86
- uskey ,
89
+ & uskey -> key ,
87
90
nonce , noncelen ,
88
91
header , headerlen ,
89
92
pt , ptlen ,
@@ -120,7 +123,7 @@ int ccm_memory(int cipher,
120
123
}
121
124
122
125
/* 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 ) {
124
127
XFREE (skey );
125
128
return err ;
126
129
}
@@ -144,7 +147,7 @@ int ccm_memory(int cipher,
144
147
(L - 1 ));
145
148
146
149
/* nonce */
147
- for (y = 0 ; y < 15 - L ; y ++ ) {
150
+ for (y = 0 ; y < noncelen ; y ++ ) {
148
151
PAD [x ++ ] = nonce [y ];
149
152
}
150
153
@@ -170,7 +173,7 @@ int ccm_memory(int cipher,
170
173
}
171
174
172
175
/* 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 ) {
174
177
goto error ;
175
178
}
176
179
@@ -195,7 +198,7 @@ int ccm_memory(int cipher,
195
198
for (y = 0 ; y < headerlen ; y ++ ) {
196
199
if (x == 16 ) {
197
200
/* 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 ) {
199
202
goto error ;
200
203
}
201
204
x = 0 ;
@@ -204,7 +207,7 @@ int ccm_memory(int cipher,
204
207
}
205
208
206
209
/* 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 ) {
208
211
goto error ;
209
212
}
210
213
}
@@ -239,7 +242,7 @@ int ccm_memory(int cipher,
239
242
ctr [z ] = (ctr [z ] + 1 ) & 255 ;
240
243
if (ctr [z ]) break ;
241
244
}
242
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (ctr , CTRPAD , skey )) != CRYPT_OK ) {
245
+ if ((err = ecb_encrypt_block (ctr , CTRPAD , skey )) != CRYPT_OK ) {
243
246
goto error ;
244
247
}
245
248
@@ -248,7 +251,7 @@ int ccm_memory(int cipher,
248
251
* (LTC_FAST_TYPE_PTR_CAST (& PAD [z ])) ^= * (LTC_FAST_TYPE_PTR_CAST (& pt [y + z ]));
249
252
* (LTC_FAST_TYPE_PTR_CAST (& ct [y + z ])) = * (LTC_FAST_TYPE_PTR_CAST (& pt [y + z ])) ^ * (LTC_FAST_TYPE_PTR_CAST (& CTRPAD [z ]));
250
253
}
251
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (PAD , PAD , skey )) != CRYPT_OK ) {
254
+ if ((err = ecb_encrypt_block (PAD , PAD , skey )) != CRYPT_OK ) {
252
255
goto error ;
253
256
}
254
257
}
@@ -259,7 +262,7 @@ int ccm_memory(int cipher,
259
262
ctr [z ] = (ctr [z ] + 1 ) & 255 ;
260
263
if (ctr [z ]) break ;
261
264
}
262
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (ctr , CTRPAD , skey )) != CRYPT_OK ) {
265
+ if ((err = ecb_encrypt_block (ctr , CTRPAD , skey )) != CRYPT_OK ) {
263
266
goto error ;
264
267
}
265
268
@@ -268,7 +271,7 @@ int ccm_memory(int cipher,
268
271
* (LTC_FAST_TYPE_PTR_CAST (& pt [y + z ])) = * (LTC_FAST_TYPE_PTR_CAST (& ct [y + z ])) ^ * (LTC_FAST_TYPE_PTR_CAST (& CTRPAD [z ]));
269
272
* (LTC_FAST_TYPE_PTR_CAST (& PAD [z ])) ^= * (LTC_FAST_TYPE_PTR_CAST (& pt [y + z ]));
270
273
}
271
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (PAD , PAD , skey )) != CRYPT_OK ) {
274
+ if ((err = ecb_encrypt_block (PAD , PAD , skey )) != CRYPT_OK ) {
272
275
goto error ;
273
276
}
274
277
}
@@ -283,7 +286,7 @@ int ccm_memory(int cipher,
283
286
ctr [z ] = (ctr [z ] + 1 ) & 255 ;
284
287
if (ctr [z ]) break ;
285
288
}
286
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (ctr , CTRPAD , skey )) != CRYPT_OK ) {
289
+ if ((err = ecb_encrypt_block (ctr , CTRPAD , skey )) != CRYPT_OK ) {
287
290
goto error ;
288
291
}
289
292
CTRlen = 0 ;
@@ -299,7 +302,7 @@ int ccm_memory(int cipher,
299
302
}
300
303
301
304
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 ) {
303
306
goto error ;
304
307
}
305
308
x = 0 ;
@@ -308,7 +311,7 @@ int ccm_memory(int cipher,
308
311
}
309
312
310
313
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 ) {
312
315
goto error ;
313
316
}
314
317
}
@@ -318,12 +321,12 @@ int ccm_memory(int cipher,
318
321
for (y = 15 ; y > 15 - L ; y -- ) {
319
322
ctr [y ] = 0x00 ;
320
323
}
321
- if ((err = cipher_descriptor [ cipher ]. ecb_encrypt (ctr , CTRPAD , skey )) != CRYPT_OK ) {
324
+ if ((err = ecb_encrypt_block (ctr , CTRPAD , skey )) != CRYPT_OK ) {
322
325
goto error ;
323
326
}
324
327
325
328
if (skey != uskey ) {
326
- cipher_descriptor [ cipher ]. done (skey );
329
+ ecb_done (skey );
327
330
#ifdef LTC_CLEAN_STACK
328
331
zeromem (skey , sizeof (* skey ));
329
332
#endif
0 commit comments