|
27 | 27 | #include "../test/test_util.h" |
28 | 28 | #include "internal.h" |
29 | 29 |
|
| 30 | +std::string GetTestData(const char *path); |
| 31 | + |
30 | 32 | // kPKCS7NSS contains the certificate chain of mail.google.com, as saved by NSS |
31 | 33 | // using the Chrome UI. |
32 | 34 | static const uint8_t kPKCS7NSS[] = { |
@@ -1699,7 +1701,8 @@ TEST(PKCS7Test, TestEnveloped) { |
1699 | 1701 | // NOTE: we make |buf| larger than |pt_len| in case padding gets added. |
1700 | 1702 | // without the extra room, we sometimes overflow into the next variable on the |
1701 | 1703 | // 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]; |
1703 | 1706 |
|
1704 | 1707 | OPENSSL_cleanse(buf, sizeof(buf)); |
1705 | 1708 | OPENSSL_memset(buf, 'A', pt_len); |
@@ -1828,9 +1831,9 @@ TEST(PKCS7Test, TestEnveloped) { |
1828 | 1831 | // expectation. Ideally we'd find a way to access the padded plaintext and |
1829 | 1832 | // account for this deterministically by checking the random "padding" and |
1830 | 1833 | // 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)); |
1834 | 1837 | ASSERT_LE(decrypted_len, sizeof(decrypted)); |
1835 | 1838 | if (decrypted_len > pt_len) { |
1836 | 1839 | EXPECT_LT(max_decrypt - 4, decrypted_len); |
@@ -2068,3 +2071,158 @@ TEST(PKCS7Test, SetDetached) { |
2068 | 2071 | EXPECT_TRUE(PKCS7_set_detached(p7.get(), 1)); |
2069 | 2072 | EXPECT_FALSE(p7.get()->d.sign->contents->d.data); |
2070 | 2073 | } |
| 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 | +} |
0 commit comments