static int32 RoundUpForPixelSize (uint32 x, uint32 pixelSize) { switch (pixelSize) { case 1: return RoundUp16 (x); case 2: return RoundUp8 (x); case 4: return RoundUp4 (x); case 8: return RoundUp2 (x); default: return RoundUp16 (x); } }
static int AesAuthDecrypt(Aes* aes, byte* out, const byte* in, word32 inSz, const byte* nonce, word32 nonceSz, const byte* authTag, word32 authTagSz, const byte* authIn, word32 authInSz, int mode) { word32 M, L ; byte *in_a, *in_save ; byte *out_a, *out_save ; byte *authIn_a, *authIn_save ; byte *nonce_a, *nonce_save ; word32 tmpTag[4] ; bool ret ; if(AesAuthArgCheck(aes, out, in, inSz, nonce, nonceSz, authTag, authTagSz, authIn, authInSz, &M, &L) == BAD_FUNC_ARG)return BAD_FUNC_ARG ; /* 16 byte padding */ in_save = NULL ; out_save = NULL ; authIn_save = NULL ; nonce_save = NULL ; if((inSz%16)==0) { in_save = NULL ; in_a = (byte *)in ; out_save = NULL ; out_a = out ; } else { if((in_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) { FREE_ALL; return MEMORY_E; } in_a = in_save ; XMEMSET(in_a, 0, RoundUp16(inSz)) ; XMEMCPY(in_a, in, inSz) ; if((out_save = XMALLOC(RoundUp16(inSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) { FREE_ALL; return MEMORY_E; } out_a = out_save ; } if((authInSz%16)==0) { authIn_save = NULL ; authIn_a = (byte *)authIn ; } else { if((authIn_save = XMALLOC(RoundUp16(authInSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) { FREE_ALL; return MEMORY_E; } authIn_a = authIn_save ; XMEMSET(authIn_a, 0, RoundUp16(authInSz)) ; XMEMCPY(authIn_a, authIn, authInSz) ; } if((nonceSz%16)==0) { nonce_save = NULL ; nonce_a = (byte *)nonce ; } else { if((nonce_save = XMALLOC(RoundUp16(nonceSz), NULL, DYNAMIC_TYPE_TMP_BUFFER)) == NULL) { FREE_ALL; return MEMORY_E; } nonce_a = nonce_save ; XMEMSET(nonce_a, 0, RoundUp16(nonceSz)) ; XMEMCPY(nonce_a, nonce, nonceSz) ; } /* do aes-ccm */ AesAuthSetIv(aes, nonce, nonceSz, L, mode) ; ROM_AESReset(AES_BASE); ROM_AESConfigSet(AES_BASE, (aes->keylen | AES_CFG_DIR_DECRYPT | AES_CFG_CTR_WIDTH_128 | mode | ((mode== AES_CFG_MODE_CCM) ? (L | M) : 0 ))) ; ROM_AESIVSet(AES_BASE, aes->reg); ROM_AESKey1Set(AES_BASE, aes->key, aes->keylen); ret = ROM_AESDataProcessAuth(AES_BASE, (unsigned int*)in_a, (unsigned int *)out_a, inSz, (unsigned int*)authIn_a, authInSz, (unsigned int *)tmpTag); if((ret == false) || (XMEMCMP(authTag, tmpTag, authTagSz) != 0)) { XMEMSET(out, 0, inSz) ; ret = false ; } else { XMEMCPY(out, out_a, inSz) ; } FREE_ALL ; return ret==true ? 0 : 1 ; }