Skip to content

Commit 328f505

Browse files
add pkcs7 test with multiple recipients
1 parent 7a5e97e commit 328f505

6 files changed

Lines changed: 96 additions & 7 deletions

File tree

certs/include.am

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ EXTRA_DIST += \
5353
certs/server-revoked-key.pem \
5454
certs/wolfssl-website-ca.pem \
5555
certs/test-degenerate.p7b \
56+
certs/test-multiple-recipients.p7b \
5657
certs/test-stream-sign.p7b \
5758
certs/test-stream-dec.p7b \
5859
certs/test-ber-exp02-05-2022.p7b \

certs/renewcerts.sh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,11 @@ run_renewcerts(){
888888
openssl cms -encrypt -in ca-cert.pem -recip client-cert.pem -out test-stream-dec.p7b -outform DER -stream
889889
check_result $? ""
890890

891+
echo "Creating test-multiple-recipients.p7b..."
892+
echo ""
893+
openssl smime -encrypt -binary -aes-256-cbc -in ./client-key.pem -out ./test-multiple-recipients.p7b -outform DER ./client-cert.pem ./server-cert.pem
894+
check_result $? ""
895+
891896
echo "End of section"
892897
echo "---------------------------------------------------------------------"
893898

certs/test-multiple-recipients.p7b

6.29 KB
Binary file not shown.

tests/api/test_pkcs7.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2145,6 +2145,83 @@ int test_wc_PKCS7_DecodeEnvelopedData_stream(void)
21452145
#endif
21462146
} /* END test_wc_PKCS7_DecodeEnvelopedData_stream() */
21472147

2148+
2149+
/*
2150+
* Testing wc_PKCS7_DecodeEnvelopedData with streaming
2151+
*/
2152+
int test_wc_PKCS7_DecodeEnvelopedData_multiple_recipients(void)
2153+
{
2154+
#if defined(HAVE_PKCS7)
2155+
EXPECT_DECLS;
2156+
PKCS7* pkcs7 = NULL;
2157+
int ret = 0;
2158+
XFILE f = XBADFILE;
2159+
const char* testFile = "./certs/test-multiple-recipients.p7b";
2160+
byte testDerBuffer[8192]; /* test-multiple-recipients is currently 6433
2161+
bytes */
2162+
size_t testDerBufferSz = 0;
2163+
byte decodedData[8192];
2164+
2165+
ExpectTrue((f = XFOPEN(testFile, "rb")) != XBADFILE);
2166+
testDerBufferSz = XFREAD(testDerBuffer, 1,
2167+
sizeof(testDerBuffer), f);
2168+
ExpectIntNE(testDerBufferSz, 0);
2169+
if (f != XBADFILE) {
2170+
XFCLOSE(f);
2171+
f = XBADFILE;
2172+
}
2173+
2174+
/* test with server cert recipient */
2175+
ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId));
2176+
if (pkcs7) {
2177+
ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)server_cert_der_2048,
2178+
sizeof_server_cert_der_2048), 0);
2179+
2180+
ExpectIntEQ(wc_PKCS7_SetKey(pkcs7, (byte*)server_key_der_2048,
2181+
sizeof_server_key_der_2048), 0);
2182+
2183+
ret = wc_PKCS7_DecodeEnvelopedData(pkcs7, testDerBuffer,
2184+
(word32)testDerBufferSz, decodedData, sizeof(decodedData));
2185+
ExpectIntGT(ret, 0);
2186+
wc_PKCS7_Free(pkcs7);
2187+
}
2188+
2189+
/* test with client cert recipient */
2190+
ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId));
2191+
if (pkcs7) {
2192+
ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)client_cert_der_2048,
2193+
sizeof_client_cert_der_2048), 0);
2194+
2195+
ExpectIntEQ(wc_PKCS7_SetKey(pkcs7, (byte*)client_key_der_2048,
2196+
sizeof_client_key_der_2048), 0);
2197+
2198+
ret = wc_PKCS7_DecodeEnvelopedData(pkcs7, testDerBuffer,
2199+
(word32)testDerBufferSz, decodedData, sizeof(decodedData));
2200+
ExpectIntGT(ret, 0);
2201+
wc_PKCS7_Free(pkcs7);
2202+
}
2203+
2204+
/* test with ca cert recipient (which should fail) */
2205+
ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId));
2206+
if (pkcs7) {
2207+
ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte*)ca_cert_der_2048,
2208+
sizeof_ca_cert_der_2048), 0);
2209+
2210+
ExpectIntEQ(wc_PKCS7_SetKey(pkcs7, (byte*)ca_key_der_2048,
2211+
sizeof_ca_key_der_2048), 0);
2212+
2213+
ret = wc_PKCS7_DecodeEnvelopedData(pkcs7, testDerBuffer,
2214+
(word32)testDerBufferSz, decodedData, sizeof(decodedData));
2215+
ExpectIntLT(ret, 0);
2216+
wc_PKCS7_Free(pkcs7);
2217+
}
2218+
2219+
return EXPECT_RESULT();
2220+
#else
2221+
return TEST_SKIPPED;
2222+
#endif
2223+
} /* END test_wc_PKCS7_DecodeEnvelopedData_multiple_recipients() */
2224+
21482225
/*
21492226
* Testing wc_PKCS7_EncodeEnvelopedData(), wc_PKCS7_DecodeEnvelopedData()
21502227
*/

tests/api/test_pkcs7.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ int test_wc_PKCS7_NoDefaultSignedAttribs(void);
4747
int test_wc_PKCS7_SetOriEncryptCtx(void);
4848
int test_wc_PKCS7_SetOriDecryptCtx(void);
4949
int test_wc_PKCS7_DecodeCompressedData(void);
50+
int test_wc_PKCS7_DecodeEnvelopedData_multiple_recipients(void);
5051

5152

5253
#define TEST_PKCS7_DECLS \
@@ -74,7 +75,8 @@ int test_wc_PKCS7_DecodeCompressedData(void);
7475
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_DecodeSymmetricKeyPackage), \
7576
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_DecodeOneSymmetricKey), \
7677
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_SetOriEncryptCtx), \
77-
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_SetOriDecryptCtx)
78+
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_SetOriDecryptCtx), \
79+
TEST_DECL_GROUP("pkcs7_ed", test_wc_PKCS7_DecodeEnvelopedData_multiple_recipients)
7880

7981
#define TEST_PKCS7_SIGNED_ENCRYPTED_DATA_DECLS \
8082
TEST_DECL_GROUP("pkcs7_sed", test_wc_PKCS7_signed_enveloped)

wolfcrypt/src/pkcs7.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11974,8 +11974,14 @@ static int wc_PKCS7_DecryptRecipientInfos(wc_PKCS7* pkcs7, byte* in,
1197411974
ret = wc_PKCS7_DecryptKtri(pkcs7, in, inSz, idx,
1197511975
decryptedKey, decryptedKeySz,
1197611976
recipFound);
11977-
if (ret != 0)
11978-
return ret;
11977+
if (ret != 0) {
11978+
if (ret != WC_PKCS7_WANT_READ_E && *recipFound == 0) {
11979+
continue; /* try next recipient */
11980+
}
11981+
else {
11982+
return ret; /* found recipient and failed decrypt */
11983+
}
11984+
}
1197911985
#else
1198011986
return NOT_COMPILED_IN;
1198111987
#endif
@@ -12096,8 +12102,8 @@ static int wc_PKCS7_DecryptRecipientInfos(wc_PKCS7* pkcs7, byte* in,
1209612102
recipFound);
1209712103
if (ret != 0)
1209812104
return ret;
12099-
12100-
} else {
12105+
}
12106+
else {
1210112107
/* failed to find RecipientInfo, restore idx and continue */
1210212108
*idx = savedIdx;
1210312109
break;
@@ -12497,8 +12503,6 @@ int wc_PKCS7_DecodeEnvelopedData(wc_PKCS7* pkcs7, byte* in,
1249712503
decryptedKeySz = MAX_ENCRYPTED_KEY_SZ;
1249812504
tmpIdx = idx;
1249912505
#endif
12500-
pkiMsgSz = (pkcs7->stream->length > 0)? pkcs7->stream->length: inSz;
12501-
1250212506
ret = wc_PKCS7_DecryptRecipientInfos(pkcs7, in, inSz, &idx,
1250312507
decryptedKey, &decryptedKeySz,
1250412508
&recipFound);

0 commit comments

Comments
 (0)