@@ -9520,6 +9520,7 @@ static int wc_PKCS7_PwriKek_KeyUnWrap(wc_PKCS7* pkcs7, const byte* kek,
95209520 byte* tmpIv = NULL;
95219521 byte* lastBlock = NULL;
95229522 byte* outTmp = NULL;
9523+ byte fail = 0;
95239524
95249525 if (pkcs7 == NULL || kek == NULL || in == NULL ||
95259526 out == NULL || iv == NULL) {
@@ -9581,25 +9582,18 @@ static int wc_PKCS7_PwriKek_KeyUnWrap(wc_PKCS7* pkcs7, const byte* kek,
95819582 cekLen = outTmp[0];
95829583
95839584 /* verify length */
9584- if ((word32)cekLen > inSz) {
9585- ForceZero(outTmp, inSz);
9586- XFREE(outTmp, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
9587- return BAD_FUNC_ARG;
9588- }
9589-
9585+ fail |= ctMaskGT(cekLen, (int)inSz);
95909586 /* verify check bytes */
9591- if ((outTmp[1] ^ outTmp[4]) != 0xFF ||
9592- (outTmp[2] ^ outTmp[5]) != 0xFF ||
9593- (outTmp[3] ^ outTmp[6]) != 0xFF) {
9594- ForceZero(outTmp, inSz);
9595- XFREE(outTmp, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
9596- return BAD_FUNC_ARG;
9597- }
9587+ fail |= ctMaskNotEq((int)(outTmp[1] ^ outTmp[4]), 0xFF);
9588+ fail |= ctMaskNotEq((int)(outTmp[2] ^ outTmp[5]), 0xFF);
9589+ fail |= ctMaskNotEq((int)(outTmp[3] ^ outTmp[6]), 0xFF);
9590+ /* verify length */
9591+ fail |= ctMaskGT(cekLen, (int)outSz);
95989592
9599- if (outSz < (word32)cekLen ) {
9593+ if (fail ) {
96009594 ForceZero(outTmp, inSz);
96019595 XFREE(outTmp, pkcs7->heap, DYNAMIC_TYPE_TMP_BUFFER);
9602- return BUFFER_E ;
9596+ return BAD_FUNC_ARG ;
96039597 }
96049598
96059599 XMEMCPY(out, outTmp + 4, outTmp[0]);
0 commit comments