3232*/
3333int 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
0 commit comments