@@ -96,7 +96,7 @@ void ShiftAndXorRb(byte* out, byte* in)
9696int wc_InitCmac_ex (Cmac * cmac , const byte * key , word32 keySz ,
9797 int type , void * unused , void * heap , int devId )
9898{
99- int ret ;
99+ int ret = 0 ;
100100#if defined(WOLFSSL_SE050 ) && defined(WOLFSSL_SE050_CRYPT )
101101 byte useSW = 0 ;
102102#endif
@@ -196,10 +196,12 @@ int wc_CmacUpdate(Cmac* cmac, const byte* in, word32 inSz)
196196 if (ret != CRYPTOCB_UNAVAILABLE )
197197 return ret ;
198198 /* fall-through when unavailable */
199- ret = 0 ; /* reset error code */
200199 }
201200#endif
202201
202+ /* Clear CRYPTOCB_UNAVAILABLE return code */
203+ ret = 0 ;
204+
203205 while (inSz != 0 ) {
204206 word32 add = min (inSz , AES_BLOCK_SIZE - cmac -> bufferSz );
205207 XMEMCPY (& cmac -> buffer [cmac -> bufferSz ], in , add );
@@ -242,7 +244,7 @@ int wc_CmacFree(Cmac* cmac)
242244
243245int wc_CmacFinalNoFree (Cmac * cmac , byte * out , word32 * outSz )
244246{
245- int ret ;
247+ int ret = 0 ;
246248 const byte * subKey ;
247249 word32 remainder ;
248250
@@ -296,7 +298,7 @@ int wc_CmacFinalNoFree(Cmac* cmac, byte* out, word32* outSz)
296298}
297299
298300int wc_CmacFinal (Cmac * cmac , byte * out , word32 * outSz ) {
299- int ret ;
301+ int ret = 0 ;
300302
301303 if (cmac == NULL )
302304 return BAD_FUNC_ARG ;
@@ -305,11 +307,70 @@ int wc_CmacFinal(Cmac* cmac, byte* out, word32* outSz) {
305307 return ret ;
306308}
307309
310+
311+ int wc_AesCmacGenerate_ex (Cmac * cmac ,
312+ byte * out , word32 * outSz ,
313+ const byte * in , word32 inSz ,
314+ const byte * key , word32 keySz ,
315+ void * heap , int devId )
316+ {
317+ int ret = 0 ;
318+
319+ if (cmac == NULL ) {
320+ return BAD_FUNC_ARG ;
321+ }
322+
323+ #ifdef WOLF_CRYPTO_CB
324+ /* Set devId regardless of value (invalid or not) */
325+ cmac -> devId = devId ;
326+ #ifndef WOLF_CRYPTO_CB_FIND
327+ if (devId != INVALID_DEVID )
328+ #endif
329+ {
330+ cmac -> devCtx = NULL ;
331+
332+ ret = wc_CryptoCb_Cmac (cmac , key , keySz , in , inSz , out , outSz ,
333+ WC_CMAC_AES , NULL );
334+ if (ret != CRYPTOCB_UNAVAILABLE )
335+ return ret ;
336+
337+ /* Clear CRYPTOCB_UNAVAILABLE return code */
338+ ret = 0 ;
339+
340+ /* fall-through when unavailable */
341+ }
342+ #endif
343+
344+ if ( ((out == NULL ) && (outSz != NULL ) && (* outSz > 0 ))
345+ || (in == NULL && inSz > 0 )
346+ || (key == NULL && keySz > 0 )) {
347+ return BAD_FUNC_ARG ;
348+ }
349+
350+ /* Init step is optional */
351+ if (key != NULL ) {
352+ ret = wc_InitCmac_ex (cmac , key , keySz , WC_CMAC_AES , NULL , heap , devId );
353+ }
354+ if (ret == 0 ) {
355+ ret = wc_CmacUpdate (cmac , in , inSz );
356+ /* Ensure we are freed and zeroed if not calling wc_CmacFinal */
357+ if (ret != 0 ) {
358+ (void )wc_CmacFree (cmac );
359+ }
360+ }
361+ if (ret == 0 ) {
362+ ret = wc_CmacFinal (cmac , out , outSz );
363+ }
364+
365+ return ret ;
366+ }
367+
368+
308369int wc_AesCmacGenerate (byte * out , word32 * outSz ,
309370 const byte * in , word32 inSz ,
310371 const byte * key , word32 keySz )
311372{
312- int ret ;
373+ int ret = 0 ;
313374#ifdef WOLFSSL_SMALL_STACK
314375 Cmac * cmac ;
315376#else
@@ -326,21 +387,22 @@ int wc_AesCmacGenerate(byte* out, word32* outSz,
326387 return MEMORY_E ;
327388 }
328389#endif
390+
329391#ifdef WOLFSSL_CHECK_MEM_ZERO
330392 XMEMSET (((unsigned char * )cmac ) + sizeof (Aes ), 0xff ,
331393 sizeof (Cmac ) - sizeof (Aes ));
332394 /* Aes part is checked by wc_AesFree. */
333- wc_MemZero_Add ("wc_AesCmacGenerate cmac" ,
395+ wc_MemZero_Add ("wc_AesCmacGenerate_ex cmac" ,
334396 ((unsigned char * )cmac ) + sizeof (Aes ), sizeof (Cmac ) - sizeof (Aes ));
335397#endif
336398
337- ret = wc_InitCmac (cmac , key , keySz , WC_CMAC_AES , NULL );
338- if ( ret == 0 ) {
339- ret = wc_CmacUpdate ( cmac , in , inSz );
340- }
341- if ( ret == 0 ) {
342- ret = wc_CmacFinal ( cmac , out , outSz );
343- }
399+ ret = wc_AesCmacGenerate_ex (cmac ,
400+ out , outSz ,
401+ in , inSz ,
402+ key , keySz ,
403+ NULL ,
404+ INVALID_DEVID );
405+
344406
345407#ifdef WOLFSSL_SMALL_STACK
346408 if (cmac ) {
@@ -354,28 +416,85 @@ int wc_AesCmacGenerate(byte* out, word32* outSz,
354416}
355417
356418
357- int wc_AesCmacVerify (const byte * check , word32 checkSz ,
358- const byte * in , word32 inSz ,
359- const byte * key , word32 keySz )
419+ int wc_AesCmacVerify_ex (Cmac * cmac ,
420+ const byte * check , word32 checkSz ,
421+ const byte * in , word32 inSz ,
422+ const byte * key , word32 keySz ,
423+ void * heap , int devId )
360424{
361- int ret ;
425+ int ret = 0 ;
362426 byte a [AES_BLOCK_SIZE ];
363427 word32 aSz = sizeof (a );
364428 int compareRet ;
365429
366- if (check == NULL || checkSz == 0 || (in == NULL && inSz != 0 ) ||
367- key == NULL || keySz == 0 ) {
430+ if (cmac == NULL || check == NULL || checkSz == 0 || (in == NULL && inSz != 0 )) {
368431 return BAD_FUNC_ARG ;
369432 }
370433
371434 XMEMSET (a , 0 , aSz );
372- ret = wc_AesCmacGenerate (a , & aSz , in , inSz , key , keySz );
373- compareRet = ConstantCompare (check , a , (int )min (checkSz , aSz ));
435+ ret = wc_AesCmacGenerate_ex (cmac ,
436+ a , & aSz ,
437+ in , inSz ,
438+ key , keySz ,
439+ heap ,
440+ devId );
441+ if (ret == 0 ) {
442+ compareRet = ConstantCompare (check , a , (int )min (checkSz , aSz ));
443+ }
374444
375445 if (ret == 0 )
376446 ret = compareRet ? 1 : 0 ;
377447
378448 return ret ;
379449}
380450
451+
452+ int wc_AesCmacVerify (const byte * check , word32 checkSz ,
453+ const byte * in , word32 inSz ,
454+ const byte * key , word32 keySz )
455+ {
456+ int ret = 0 ;
457+ #ifdef WOLFSSL_SMALL_STACK
458+ Cmac * cmac ;
459+ #else
460+ Cmac cmac [1 ];
461+ #endif
462+
463+ if (check == NULL || (in == NULL && inSz > 0 ) || key == NULL || keySz == 0 ) {
464+ return BAD_FUNC_ARG ;
465+ }
466+
467+ #ifdef WOLFSSL_SMALL_STACK
468+ if ((cmac = (Cmac * )XMALLOC (sizeof * cmac , NULL ,
469+ DYNAMIC_TYPE_CMAC )) == NULL ) {
470+ return MEMORY_E ;
471+ }
472+ #endif
473+
474+ #ifdef WOLFSSL_CHECK_MEM_ZERO
475+ XMEMSET (((unsigned char * )cmac ) + sizeof (Aes ), 0xff ,
476+ sizeof (Cmac ) - sizeof (Aes ));
477+ /* Aes part is checked by wc_AesFree. */
478+ wc_MemZero_Add ("wc_AesCmacGenerate_ex cmac" ,
479+ ((unsigned char * )cmac ) + sizeof (Aes ), sizeof (Cmac ) - sizeof (Aes ));
480+ #endif
481+
482+ ret = wc_AesCmacVerify_ex (cmac ,
483+ check , checkSz ,
484+ in , inSz ,
485+ key , keySz ,
486+ NULL ,
487+ INVALID_DEVID );
488+
489+ #ifdef WOLFSSL_SMALL_STACK
490+ if (cmac ) {
491+ XFREE (cmac , NULL , DYNAMIC_TYPE_CMAC );
492+ }
493+ #elif defined(WOLFSSL_CHECK_MEM_ZERO )
494+ wc_MemZero_Check (cmac , sizeof (Cmac ));
495+ #endif
496+
497+ return ret ;
498+ }
499+
381500#endif /* WOLFSSL_CMAC && NO_AES && WOLFSSL_AES_DIRECT */
0 commit comments