mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 18:57:27 +02:00
fix decryption of EnvelopedData PWRI KEK size
This commit is contained in:
committed by
David Garske
parent
b4d02d6d99
commit
47303ed445
@ -7181,7 +7181,7 @@ static int wc_PKCS7_DecryptPwri(PKCS7* pkcs7, byte* in, word32 inSz,
|
|||||||
|
|
||||||
byte tmpIv[MAX_CONTENT_IV_SIZE];
|
byte tmpIv[MAX_CONTENT_IV_SIZE];
|
||||||
|
|
||||||
int ret = 0, length, saltSz, iterations, blockSz;
|
int ret = 0, length, saltSz, iterations, blockSz, kekKeySz;
|
||||||
int hashOID = WC_SHA; /* default to SHA1 */
|
int hashOID = WC_SHA; /* default to SHA1 */
|
||||||
word32 kdfAlgoId, pwriEncAlgoId, keyEncAlgoId, cekSz;
|
word32 kdfAlgoId, pwriEncAlgoId, keyEncAlgoId, cekSz;
|
||||||
byte* pkiMsg = in;
|
byte* pkiMsg = in;
|
||||||
@ -7262,6 +7262,13 @@ static int wc_PKCS7_DecryptPwri(PKCS7* pkcs7, byte* in, word32 inSz,
|
|||||||
return blockSz;
|
return blockSz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* get content-encryption key size, based on algorithm */
|
||||||
|
kekKeySz = wc_PKCS7_GetOIDKeySize(pwriEncAlgoId);
|
||||||
|
if (kekKeySz < 0) {
|
||||||
|
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
|
return kekKeySz;
|
||||||
|
}
|
||||||
|
|
||||||
/* get block cipher IV, stored in OPTIONAL parameter of AlgoID */
|
/* get block cipher IV, stored in OPTIONAL parameter of AlgoID */
|
||||||
if ( (pkiMsgSz > ((*idx) + 1)) &&
|
if ( (pkiMsgSz > ((*idx) + 1)) &&
|
||||||
(pkiMsg[(*idx)++] != ASN_OCTET_STRING) ) {
|
(pkiMsg[(*idx)++] != ASN_OCTET_STRING) ) {
|
||||||
@ -7304,7 +7311,7 @@ static int wc_PKCS7_DecryptPwri(PKCS7* pkcs7, byte* in, word32 inSz,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* generate KEK */
|
/* generate KEK */
|
||||||
kek = (byte*)XMALLOC(blockSz, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
kek = (byte*)XMALLOC(kekKeySz, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
if (kek == NULL) {
|
if (kek == NULL) {
|
||||||
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
XFREE(cek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(cek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
@ -7313,7 +7320,7 @@ static int wc_PKCS7_DecryptPwri(PKCS7* pkcs7, byte* in, word32 inSz,
|
|||||||
|
|
||||||
ret = wc_PKCS7_GenerateKEK_PWRI(pkcs7, pkcs7->pass, pkcs7->passSz,
|
ret = wc_PKCS7_GenerateKEK_PWRI(pkcs7, pkcs7->pass, pkcs7->passSz,
|
||||||
salt, saltSz, kdfAlgoId, hashOID,
|
salt, saltSz, kdfAlgoId, hashOID,
|
||||||
iterations, kek, blockSz);
|
iterations, kek, kekKeySz);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
@ -7322,9 +7329,10 @@ static int wc_PKCS7_DecryptPwri(PKCS7* pkcs7, byte* in, word32 inSz,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* decrypt CEK with KEK */
|
/* decrypt CEK with KEK */
|
||||||
ret = wc_PKCS7_PwriKek_KeyUnWrap(pkcs7, kek, blockSz, pkiMsg + (*idx),
|
ret = wc_PKCS7_PwriKek_KeyUnWrap(pkcs7, kek, kekKeySz,
|
||||||
length, cek, cekSz, tmpIv,
|
pkiMsg + (*idx), length, cek,
|
||||||
blockSz, pwriEncAlgoId);
|
cekSz, tmpIv, blockSz,
|
||||||
|
pwriEncAlgoId);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(salt, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
XFREE(kek, pkcs7->heap, DYNAMIC_TYPE_PKCS7);
|
||||||
|
Reference in New Issue
Block a user