Skip to content

Commit ea052e5

Browse files
Add support for verifying PKCS7 signed attributes (#2264)
I discovered this while trying to fix our PKCS7 implementation to use indefinite encoding. The PKCS7 file that Ruby's PKCS7 tests uses signed attributes, but `PKCS7_verify` bails out whenever it encounters files that have signed attributes. There are still other issues with the Ruby PKCS7 test that we'll have to fix (indefinite length ASN1), but I believe we should fix the missing support for verifying signed attributes first. AWS-LC turns on `PKCS7_NOATTR` by default in `PKCS7_sign`, so our existing `PKCS7_verify` implementation can do a successful sign/verify round trip against itself. However, OpenSSL does not turn on `PKCS7_NOATTR` by default and signed attributes are added automatically to the PKCS7 file if no flags are set. This means that the current state of AWS-LC's `PKCS7_verify` would fail against files generated by the default of OpenSSL's `PKCS7_sign`. This PR adds support for verifying PKCS7 signed attributes to fix the misalignment. ### Testing: 1. Test file from Ruby. The intention is to build upon the test to fix the ASN1 indefinite length issues later on. 2. Test file generated by OpenSSL. Our `PKCS7_sign` does not support signed attributes, so we can only test against generated files by OpenSSL. By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license and the ISC license.
1 parent c80720c commit ea052e5

5 files changed

Lines changed: 252 additions & 24 deletions

File tree

crypto/pkcs7/internal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE)
3131
DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST)
3232
DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE)
3333

34+
DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY)
35+
3436
DEFINE_STACK_OF(PKCS7)
3537

3638
// ASN.1 defined here https://datatracker.ietf.org/doc/html/rfc2315#section-10.1

crypto/pkcs7/pkcs7.c

Lines changed: 83 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -446,13 +446,9 @@ int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i) {
446446
return 1;
447447
}
448448

449-
ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid) {
450-
if (si == NULL) {
451-
OPENSSL_PUT_ERROR(PKCS7, ERR_R_PASSED_NULL_PARAMETER);
452-
return NULL;
453-
}
454-
for (size_t i = 0; i < sk_X509_ATTRIBUTE_num(si->auth_attr); i++) {
455-
X509_ATTRIBUTE *attr = sk_X509_ATTRIBUTE_value(si->auth_attr, i);
449+
static ASN1_TYPE *get_attribute(STACK_OF(X509_ATTRIBUTE) *sk, int nid) {
450+
for (size_t i = 0; i < sk_X509_ATTRIBUTE_num(sk); i++) {
451+
X509_ATTRIBUTE *attr = sk_X509_ATTRIBUTE_value(sk, i);
456452
ASN1_OBJECT *obj = X509_ATTRIBUTE_get0_object(attr);
457453
if (OBJ_obj2nid(obj) == nid) {
458454
return X509_ATTRIBUTE_get0_type(attr, 0);
@@ -461,6 +457,27 @@ ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid) {
461457
return NULL;
462458
}
463459

460+
ASN1_TYPE *PKCS7_get_signed_attribute(const PKCS7_SIGNER_INFO *si, int nid) {
461+
if (si == NULL) {
462+
OPENSSL_PUT_ERROR(PKCS7, ERR_R_PASSED_NULL_PARAMETER);
463+
return NULL;
464+
}
465+
return get_attribute(si->auth_attr, nid);
466+
}
467+
468+
static ASN1_OCTET_STRING *PKCS7_digest_from_attributes(
469+
STACK_OF(X509_ATTRIBUTE) *sk) {
470+
if (sk == NULL) {
471+
OPENSSL_PUT_ERROR(PKCS7, ERR_R_PASSED_NULL_PARAMETER);
472+
return NULL;
473+
}
474+
ASN1_TYPE *astype = get_attribute(sk, NID_pkcs9_messageDigest);
475+
if (astype == NULL) {
476+
return NULL;
477+
}
478+
return astype->value.octet_string;
479+
}
480+
464481
STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7) {
465482
if (p7 == NULL || p7->d.ptr == NULL) {
466483
OPENSSL_PUT_ERROR(PKCS7, ERR_R_PASSED_NULL_PARAMETER);
@@ -866,9 +883,7 @@ int PKCS7_set_detached(PKCS7 *p7, int detach) {
866883
}
867884
}
868885

869-
int PKCS7_get_detached(PKCS7 *p7) {
870-
return PKCS7_is_detached(p7);
871-
}
886+
int PKCS7_get_detached(PKCS7 *p7) { return PKCS7_is_detached(p7); }
872887

873888

874889
static BIO *pkcs7_find_digest(EVP_MD_CTX **pmd, BIO *bio, int nid) {
@@ -1399,7 +1414,8 @@ PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509) {
13991414
return ri;
14001415
}
14011416

1402-
int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data, int _flags) {
1417+
int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert, BIO *data,
1418+
int _flags) {
14031419
GUARD_PTR(p7);
14041420
GUARD_PTR(pkey);
14051421
GUARD_PTR(data);
@@ -1528,7 +1544,18 @@ static int pkcs7_signature_verify(BIO *in_bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si,
15281544
GUARD_PTR(signer);
15291545
int ret = 0;
15301546

1547+
// Create a new |EVP_MD_CTX| to be consumed, so that the original |EVP_MD_CTX|
1548+
// is still in a usable state.
1549+
EVP_MD_CTX *mdc_tmp = EVP_MD_CTX_new();
1550+
if (mdc_tmp == NULL) {
1551+
OPENSSL_PUT_ERROR(PKCS7, ERR_R_MALLOC_FAILURE);
1552+
goto out;
1553+
}
1554+
15311555
const int md_type = OBJ_obj2nid(si->digest_alg->algorithm);
1556+
if (md_type == NID_undef) {
1557+
goto out;
1558+
}
15321559
EVP_MD_CTX *mdc = NULL;
15331560
BIO *bio = in_bio;
15341561
// There may be multiple MD-type BIOs in the chain, so iterate until we find
@@ -1548,26 +1575,65 @@ static int pkcs7_signature_verify(BIO *in_bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si,
15481575
bio = BIO_next(bio);
15491576
}
15501577

1551-
// We don't currently support signed attributes. See |PKCS7_NOATTR|.
1552-
if (si->auth_attr && sk_X509_ATTRIBUTE_num(si->auth_attr) != 0) {
1553-
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_INVALID_SIGNED_DATA_TYPE);
1578+
// mdc is the digest ctx that we want, unless there are attributes, in
1579+
// which case the digest is the signed attributes.
1580+
if (!EVP_MD_CTX_copy_ex(mdc_tmp, mdc)) {
15541581
goto out;
15551582
}
15561583

1557-
EVP_PKEY *pkey;
1558-
if ((pkey = X509_get0_pubkey(signer)) == NULL) {
1584+
if (si->auth_attr != NULL && sk_X509_ATTRIBUTE_num(si->auth_attr) != 0) {
1585+
unsigned char md_data[EVP_MAX_MD_SIZE], *abuf = NULL;
1586+
unsigned int md_len;
1587+
1588+
if (!EVP_DigestFinal_ex(mdc_tmp, md_data, &md_len)) {
1589+
goto out;
1590+
}
1591+
ASN1_OCTET_STRING *message_digest =
1592+
PKCS7_digest_from_attributes(si->auth_attr);
1593+
if (message_digest == NULL) {
1594+
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST);
1595+
goto out;
1596+
}
1597+
if (message_digest->length != (int)md_len ||
1598+
OPENSSL_memcmp(message_digest->data, md_data, md_len) != 0) {
1599+
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_DIGEST_FAILURE);
1600+
goto out;
1601+
}
1602+
1603+
const EVP_MD *md = EVP_get_digestbynid(md_type);
1604+
if (md == NULL || !EVP_VerifyInit_ex(mdc_tmp, md, NULL)) {
1605+
goto out;
1606+
}
1607+
1608+
int alen = ASN1_item_i2d((ASN1_VALUE *)si->auth_attr, &abuf,
1609+
ASN1_ITEM_rptr(PKCS7_ATTR_VERIFY));
1610+
if (alen <= 0 || abuf == NULL) {
1611+
OPENSSL_PUT_ERROR(PKCS7, ERR_R_ASN1_LIB);
1612+
ret = -1;
1613+
goto out;
1614+
}
1615+
if (!EVP_VerifyUpdate(mdc_tmp, abuf, alen)) {
1616+
OPENSSL_free(abuf);
1617+
goto out;
1618+
}
1619+
OPENSSL_free(abuf);
1620+
}
1621+
1622+
EVP_PKEY *pkey = X509_get0_pubkey(signer);
1623+
if (pkey == NULL) {
15591624
goto out;
15601625
}
15611626

15621627
ASN1_OCTET_STRING *data_body = si->enc_digest;
1563-
if (!EVP_VerifyFinal(mdc, data_body->data, data_body->length, pkey)) {
1628+
if (!EVP_VerifyFinal(mdc_tmp, data_body->data, data_body->length, pkey)) {
15641629
OPENSSL_PUT_ERROR(PKCS7, PKCS7_R_SIGNATURE_FAILURE);
15651630
goto out;
15661631
}
15671632

15681633
ret = 1;
15691634

15701635
out:
1636+
EVP_MD_CTX_free(mdc_tmp);
15711637
return ret;
15721638
}
15731639

crypto/pkcs7/pkcs7_asn1.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,11 @@ ASN1_SEQUENCE(PKCS7_ENVELOPE) = {
187187

188188
IMPLEMENT_ASN1_FUNCTIONS(PKCS7_ENVELOPE)
189189

190+
ASN1_ITEM_TEMPLATE(PKCS7_ATTR_VERIFY) = ASN1_EX_TEMPLATE_TYPE(
191+
ASN1_TFLG_SEQUENCE_OF | ASN1_TFLG_IMPTAG | ASN1_TFLG_UNIVERSAL, V_ASN1_SET,
192+
PKCS7_ATTRIBUTES, X509_ATTRIBUTE)
193+
ASN1_ITEM_TEMPLATE_END(PKCS7_ATTR_VERIFY)
194+
190195
int PKCS7_print_ctx(BIO *bio, PKCS7 *pkcs7, int indent, const ASN1_PCTX *pctx) {
191196
GUARD_PTR(bio);
192197
GUARD_PTR(pkcs7);

crypto/pkcs7/pkcs7_test.cc

Lines changed: 162 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
#include "../test/test_util.h"
2828
#include "internal.h"
2929

30+
std::string GetTestData(const char *path);
31+
3032
// kPKCS7NSS contains the certificate chain of mail.google.com, as saved by NSS
3133
// using the Chrome UI.
3234
static const uint8_t kPKCS7NSS[] = {
@@ -1699,7 +1701,8 @@ TEST(PKCS7Test, TestEnveloped) {
16991701
// NOTE: we make |buf| larger than |pt_len| in case padding gets added.
17001702
// without the extra room, we sometimes overflow into the next variable on the
17011703
// stack.
1702-
uint8_t buf[pt_len + EVP_MAX_BLOCK_LENGTH], decrypted[pt_len + EVP_MAX_BLOCK_LENGTH];
1704+
uint8_t buf[pt_len + EVP_MAX_BLOCK_LENGTH];
1705+
uint8_t decrypted[pt_len + EVP_MAX_BLOCK_LENGTH];
17031706

17041707
OPENSSL_cleanse(buf, sizeof(buf));
17051708
OPENSSL_memset(buf, 'A', pt_len);
@@ -1828,9 +1831,9 @@ TEST(PKCS7Test, TestEnveloped) {
18281831
// expectation. Ideally we'd find a way to access the padded plaintext and
18291832
// account for this deterministically by checking the random "padding" and
18301833
// adusting accordingly.
1831-
const size_t max_decrypt =
1832-
pt_len + EVP_CIPHER_block_size(EVP_aes_128_cbc());
1833-
const size_t decrypted_len = (size_t)BIO_read(bio.get(), decrypted, sizeof(decrypted));
1834+
const size_t max_decrypt = pt_len + EVP_CIPHER_block_size(EVP_aes_128_cbc());
1835+
const size_t decrypted_len =
1836+
(size_t)BIO_read(bio.get(), decrypted, sizeof(decrypted));
18341837
ASSERT_LE(decrypted_len, sizeof(decrypted));
18351838
if (decrypted_len > pt_len) {
18361839
EXPECT_LT(max_decrypt - 4, decrypted_len);
@@ -2068,3 +2071,158 @@ TEST(PKCS7Test, SetDetached) {
20682071
EXPECT_TRUE(PKCS7_set_detached(p7.get(), 1));
20692072
EXPECT_FALSE(p7.get()->d.sign->contents->d.data);
20702073
}
2074+
2075+
TEST(PKCS7Test, PKCS7SignedAttributes) {
2076+
// This file was generated with the following command:
2077+
// openssl smime -sign -in input.txt -signer crypto/ocsp/aws/ca_cert.pem
2078+
// -inkey crypto/ocsp/aws/ca_key.pem -out signed.p7s -outform PEM
2079+
// -nodetach -md sha512
2080+
//
2081+
// Files with signed attributes aren't generatable with AWS-LC for now, as
2082+
// |PKCS7_NOATTR| is always assumed with |PKCS7_sign|. See |PKCS7_sign|
2083+
// for more details.
2084+
static const char kPKCS7SignedAttributes[] = R"(
2085+
-----BEGIN PKCS7-----
2086+
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
2134+
-----END PKCS7-----
2135+
)";
2136+
2137+
// Timestamp for March 11, 2025.
2138+
static const int64_t kReferencePKCS7Time = 1741824000;
2139+
2140+
const bssl::UniquePtr<BIO> bio(
2141+
BIO_new_mem_buf(kPKCS7SignedAttributes, strlen(kPKCS7SignedAttributes)));
2142+
ASSERT_TRUE(bio);
2143+
bssl::UniquePtr<PKCS7> pkcs7(
2144+
PEM_read_bio_PKCS7(bio.get(), nullptr, nullptr, nullptr));
2145+
ASSERT_TRUE(pkcs7);
2146+
ASSERT_TRUE(PKCS7_type_is_signed(pkcs7.get()));
2147+
2148+
// Set up trust store for verification.
2149+
bssl::UniquePtr<X509_STORE> store(X509_STORE_new());
2150+
bssl::UniquePtr<X509> ca_cert(CertFromPEM(
2151+
GetTestData(std::string("crypto/ocsp/test/aws/ca_cert.pem").c_str())
2152+
.c_str()));
2153+
ASSERT_TRUE(X509_STORE_add_cert(store.get(), ca_cert.get()));
2154+
2155+
// Set a valid time to avoid time bomb in tests.
2156+
X509_VERIFY_PARAM *param = X509_STORE_get0_param(store.get());
2157+
X509_VERIFY_PARAM_set_time_posix(param, kReferencePKCS7Time);
2158+
2159+
bssl::UniquePtr<BIO> out(BIO_new(BIO_s_mem()));
2160+
EXPECT_TRUE(PKCS7_verify(pkcs7.get(), nullptr, store.get(), nullptr,
2161+
out.get(), /*flags*/ 0));
2162+
2163+
// Run |PKCS7_verify| again to check that we're consuming a copy of the
2164+
// underlying |EVP_MD_CTX|.
2165+
EXPECT_TRUE(PKCS7_verify(pkcs7.get(), nullptr, store.get(), nullptr,
2166+
out.get(), /*flags*/ 0));
2167+
}
2168+
2169+
TEST(PKCS7Test, PKCS7SignedAttributesRuby) {
2170+
// The following test file was taken from ruby/openssl's pkcs7 tests.
2171+
static const char kPKCS7Ruby[] = R"(
2172+
-----BEGIN PKCS7-----
2173+
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
2212+
-----END PKCS7-----
2213+
)";
2214+
2215+
const bssl::UniquePtr<BIO> bio(
2216+
BIO_new_mem_buf(kPKCS7Ruby, strlen(kPKCS7Ruby)));
2217+
ASSERT_TRUE(bio);
2218+
bssl::UniquePtr<PKCS7> pkcs7(
2219+
PEM_read_bio_PKCS7(bio.get(), nullptr, nullptr, nullptr));
2220+
ASSERT_TRUE(pkcs7);
2221+
ASSERT_TRUE(PKCS7_type_is_signed(pkcs7.get()));
2222+
2223+
// Verify the file how Ruby's tests do it.
2224+
bssl::UniquePtr<X509_STORE> store(X509_STORE_new());
2225+
bssl::UniquePtr<BIO> out(BIO_new(BIO_s_mem()));
2226+
EXPECT_TRUE(PKCS7_verify(pkcs7.get(), nullptr, store.get(), nullptr,
2227+
out.get(), /*flags*/ PKCS7_NOVERIFY));
2228+
}

include/openssl/pkcs7.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,9 +449,6 @@ OPENSSL_EXPORT OPENSSL_DEPRECATED PKCS7 *PKCS7_sign(X509 *sign_cert,
449449
// written to |out| and 1 is returned. On error or verification failure, 0 is
450450
// returned.
451451
//
452-
// We don't currently support authenticated attributes, so if any of |p7|'s
453-
// signer infos have authenticated attributes, PKCS7_verify will fail.
454-
//
455452
// Flags: If |PKCS7_NOVERIFY| is specified, trust chain validation is skipped.
456453
// This function also enforces the behavior of OpenSSL's |PKCS7_NO_DUAL_CONTENT|
457454
// meaning that |indata| may not be specified if |p7|'s signed data is attached.

0 commit comments

Comments
 (0)