@@ -17486,7 +17486,7 @@ static int test_wc_PKCS7_DecodeEnvelopedData_stream(void)
1748617486} /* END test_wc_PKCS7_DecodeEnvelopedData_stream() */
1748717487
1748817488/*
17489- * Testing wc_PKCS7_EncodeEnvelopedData()
17489+ * Testing wc_PKCS7_EncodeEnvelopedData(), wc_PKCS7_DecodeEnvelopedData()
1749017490 */
1749117491static int test_wc_PKCS7_EncodeDecodeEnvelopedData(void)
1749217492{
@@ -18177,6 +18177,178 @@ static int test_wc_PKCS7_EncodeEncryptedData(void)
1817718177 return EXPECT_RESULT();
1817818178} /* END test_wc_PKCS7_EncodeEncryptedData() */
1817918179
18180+
18181+ #if defined(HAVE_PKCS7) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_DES3) && !defined(NO_RSA) && !defined(NO_SHA)
18182+ static void build_test_EncryptedKeyPackage(byte * out, word32 * out_size, byte * in_data, word32 in_size, size_t in_content_type, size_t test_vector)
18183+ {
18184+ /* EncryptedKeyPackage ContentType TLV DER */
18185+ static const byte ekp_oid_tlv[] = {0x06U, 10U,
18186+ 0X60U, 0X86U, 0X48U, 0X01U, 0X65U, 0X02U, 0X01U, 0X02U, 0X4EU, 0X02U};
18187+ if (in_content_type == ENCRYPTED_DATA) {
18188+ /* EncryptedData subtype */
18189+ size_t ekp_content_der_size = 2U + in_size;
18190+ size_t ekp_content_info_size = sizeof(ekp_oid_tlv) + ekp_content_der_size;
18191+ /* EncryptedKeyPackage ContentType */
18192+ out[0] = 0x30U;
18193+ out[1] = ekp_content_info_size & 0x7FU;
18194+ /* EncryptedKeyPackage ContentInfo */
18195+ XMEMCPY(&out[2], ekp_oid_tlv, sizeof(ekp_oid_tlv));
18196+ /* EncryptedKeyPackage content [0] */
18197+ out[14] = 0xA0U;
18198+ out[15] = in_size & 0x7FU;
18199+ XMEMCPY(&out[16], in_data, in_size);
18200+ *out_size = 16U + in_size;
18201+ switch (test_vector)
18202+ {
18203+ case 1: out[0] = 0x20U; break;
18204+ case 2: out[2] = 0x01U; break;
18205+ case 3: out[7] = 0x42U; break;
18206+ case 4: out[14] = 0xA2U; break;
18207+ }
18208+ }
18209+ else if (in_content_type == ENVELOPED_DATA) {
18210+ /* EnvelopedData subtype */
18211+ size_t ekp_choice_der_size = 4U + in_size;
18212+ size_t ekp_content_der_size = 4U + ekp_choice_der_size;
18213+ size_t ekp_content_info_size = sizeof(ekp_oid_tlv) + ekp_content_der_size;
18214+ /* EncryptedKeyPackage ContentType */
18215+ out[0] = 0x30U;
18216+ out[1] = 0x82U;
18217+ out[2] = ekp_content_info_size >> 8U;
18218+ out[3] = ekp_content_info_size & 0xFFU;
18219+ /* EncryptedKeyPackage ContentInfo */
18220+ XMEMCPY(&out[4], ekp_oid_tlv, sizeof(ekp_oid_tlv));
18221+ /* EncryptedKeyPackage content [0] */
18222+ out[16] = 0xA0U;
18223+ out[17] = 0x82U;
18224+ out[18] = ekp_choice_der_size >> 8U;
18225+ out[19] = ekp_choice_der_size & 0xFFU;
18226+ /* EncryptedKeyPackage CHOICE [0] EnvelopedData */
18227+ out[20] = 0xA0U;
18228+ out[21] = 0x82U;
18229+ out[22] = in_size >> 8U;
18230+ out[23] = in_size & 0xFFU;
18231+ XMEMCPY(&out[24], in_data, in_size);
18232+ *out_size = 24U + in_size;
18233+ switch (test_vector)
18234+ {
18235+ case 1: out[0] = 0x20U; break;
18236+ case 2: out[4] = 0x01U; break;
18237+ case 3: out[9] = 0x42U; break;
18238+ case 4: out[16] = 0xA2U; break;
18239+ }
18240+ }
18241+ }
18242+ #endif /* HAVE_PKCS7 && USE_CERT_BUFFERS_2048 && !NO_DES3 && !NO_RSA && !NO_SHA */
18243+
18244+ /*
18245+ * Test wc_PKCS7_DecodeEncryptedKeyPackage().
18246+ */
18247+ static int test_wc_PKCS7_DecodeEncryptedKeyPackage(void)
18248+ {
18249+ EXPECT_DECLS;
18250+ #if defined(HAVE_PKCS7) && defined(USE_CERT_BUFFERS_2048) && !defined(NO_DES3) && !defined(NO_RSA) && !defined(NO_SHA)
18251+ static const struct {
18252+ const char * msg_file_name;
18253+ word32 msg_content_type;
18254+ } test_messages[] = {
18255+ {"./certs/test/ktri-keyid-cms.msg", ENVELOPED_DATA},
18256+ {"./certs/test/encrypteddata.msg", ENCRYPTED_DATA},
18257+ };
18258+ static const int test_vectors[] = {
18259+ 0,
18260+ WC_NO_ERR_TRACE(ASN_PARSE_E),
18261+ WC_NO_ERR_TRACE(ASN_PARSE_E),
18262+ WC_NO_ERR_TRACE(PKCS7_OID_E),
18263+ WC_NO_ERR_TRACE(ASN_PARSE_E),
18264+ };
18265+ static const byte key[] = {
18266+ 0x01U, 0x23U, 0x45U, 0x67U, 0x89U, 0xABU, 0xCDU, 0xEFU,
18267+ 0x00U, 0x11U, 0x22U, 0x33U, 0x44U, 0x55U, 0x66U, 0x77U,
18268+ };
18269+ size_t test_msg = 0U;
18270+ size_t test_vector = 0U;
18271+
18272+ for (test_msg = 0U; test_msg < (sizeof(test_messages)/sizeof(test_messages[0])); test_msg++)
18273+ {
18274+ for (test_vector = 0U; test_vector < (sizeof(test_vectors)/sizeof(test_vectors[0])); test_vector++)
18275+ {
18276+ byte * ekp_cms_der = NULL;
18277+ word32 ekp_cms_der_size = 0U;
18278+ byte * inner_cms_der = NULL;
18279+ word32 inner_cms_der_size = (word32)FOURK_BUF;
18280+ XFILE inner_cms_file = XBADFILE;
18281+ PKCS7 * pkcs7 = NULL;
18282+ byte out[15] = {0};
18283+ int result = 0;
18284+
18285+ ExpectNotNull(ekp_cms_der = (byte *)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER));
18286+ /* Check for possible previous test failure. */
18287+ if (ekp_cms_der == NULL) {
18288+ break;
18289+ }
18290+
18291+ ExpectNotNull(inner_cms_der = (byte *)XMALLOC(FOURK_BUF, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER));
18292+ ExpectTrue((inner_cms_file = XFOPEN(test_messages[test_msg].msg_file_name, "rb")) != XBADFILE);
18293+ ExpectTrue((inner_cms_der_size = (word32)XFREAD(inner_cms_der, 1, inner_cms_der_size, inner_cms_file)) > 0);
18294+ if (inner_cms_file != XBADFILE) {
18295+ XFCLOSE(inner_cms_file);
18296+ }
18297+ if (test_messages[test_msg].msg_content_type == ENVELOPED_DATA) {
18298+ /* Verify that the build_test_EncryptedKeyPackage can format as expected. */
18299+ ExpectIntGT(inner_cms_der_size, 127);
18300+ }
18301+ if (test_messages[test_msg].msg_content_type == ENCRYPTED_DATA) {
18302+ /* Verify that the build_test_EncryptedKeyPackage can format as expected. */
18303+ ExpectIntLT(inner_cms_der_size, 124);
18304+ }
18305+ build_test_EncryptedKeyPackage(ekp_cms_der, &ekp_cms_der_size, inner_cms_der, inner_cms_der_size, test_messages[test_msg].msg_content_type, test_vector);
18306+ XFREE(inner_cms_der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
18307+
18308+ ExpectNotNull(pkcs7 = wc_PKCS7_New(HEAP_HINT, testDevId));
18309+ ExpectIntEQ(wc_PKCS7_InitWithCert(pkcs7, (byte *)client_cert_der_2048, sizeof_client_cert_der_2048), 0);
18310+ if (pkcs7 != NULL) {
18311+ if (test_messages[test_msg].msg_content_type == ENVELOPED_DATA) {
18312+ /* To test EnvelopedData, set private key. */
18313+ pkcs7->privateKey = (byte *)client_key_der_2048;
18314+ pkcs7->privateKeySz = sizeof_client_key_der_2048;
18315+ }
18316+ if (test_messages[test_msg].msg_content_type == ENCRYPTED_DATA) {
18317+ /* To test EncryptedData, set symmetric encryption key. */
18318+ pkcs7->encryptionKey = (byte *)key;
18319+ pkcs7->encryptionKeySz = sizeof(key);
18320+ }
18321+ }
18322+ result = wc_PKCS7_DecodeEncryptedKeyPackage(pkcs7, ekp_cms_der, ekp_cms_der_size, out, sizeof(out));
18323+ if (result == WC_NO_ERR_TRACE(WC_PKCS7_WANT_READ_E)) {
18324+ result = wc_PKCS7_DecodeEncryptedKeyPackage(pkcs7, ekp_cms_der, ekp_cms_der_size, out, sizeof(out));
18325+ }
18326+ if (test_vectors[test_vector] == 0U) {
18327+ if (test_messages[test_msg].msg_content_type == ENVELOPED_DATA) {
18328+ ExpectIntGT(result, 0);
18329+ ExpectIntEQ(XMEMCMP(out, "test", 4), 0);
18330+ }
18331+ if (test_messages[test_msg].msg_content_type == ENCRYPTED_DATA) {
18332+ #ifndef NO_PKCS7_ENCRYPTED_DATA
18333+ ExpectIntGT(result, 0);
18334+ ExpectIntEQ(XMEMCMP(out, "testencrypt", 11), 0);
18335+ #else
18336+ ExpectIntEQ(result, WC_NO_ERR_TRACE(ASN_PARSE_E));
18337+ #endif
18338+ }
18339+ }
18340+ else {
18341+ ExpectIntEQ(result, test_vectors[test_vector]);
18342+ }
18343+ XFREE(ekp_cms_der, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
18344+ wc_PKCS7_Free(pkcs7);
18345+ }
18346+ }
18347+ #endif /* HAVE_PKCS7 && USE_CERT_BUFFERS_2048 && !NO_DES3 && !NO_RSA && !NO_SHA */
18348+ return EXPECT_RESULT();
18349+ } /* END test_wc_PKCS7_DecodeEncryptedKeyPackage() */
18350+
18351+
1818018352/*
1818118353 * Testing wc_PKCS7_Degenerate()
1818218354 */
@@ -67601,6 +67773,7 @@ TEST_CASE testCases[] = {
6760167773 TEST_DECL(test_wc_PKCS7_DecodeEnvelopedData_stream),
6760267774 TEST_DECL(test_wc_PKCS7_EncodeDecodeEnvelopedData),
6760367775 TEST_DECL(test_wc_PKCS7_EncodeEncryptedData),
67776+ TEST_DECL(test_wc_PKCS7_DecodeEncryptedKeyPackage),
6760467777 TEST_DECL(test_wc_PKCS7_Degenerate),
6760567778 TEST_DECL(test_wc_PKCS7_BER),
6760667779 TEST_DECL(test_wc_PKCS7_signed_enveloped),
0 commit comments