Index: net/cert/internal/verify_signed_data_unittest.cc |
diff --git a/net/cert/internal/verify_signed_data_unittest.cc b/net/cert/internal/verify_signed_data_unittest.cc |
index 879bca05599f10374b96aafe466587995d62a700..bf7c1727bd3803598d82e8aa06532e3c03bd25c7 100644 |
--- a/net/cert/internal/verify_signed_data_unittest.cc |
+++ b/net/cert/internal/verify_signed_data_unittest.cc |
@@ -10,12 +10,17 @@ |
#include "base/files/file_util.h" |
#include "base/path_service.h" |
#include "net/cert/internal/signature_algorithm.h" |
+#include "net/cert/internal/signature_policy.h" |
#include "net/cert/pem_tokenizer.h" |
#include "net/der/input.h" |
#include "net/der/parse_values.h" |
#include "net/der/parser.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#if defined(USE_OPENSSL) |
+#include <openssl/obj.h> |
+#endif |
+ |
namespace net { |
namespace { |
@@ -104,14 +109,17 @@ enum VerifyResult { |
FAILURE, |
}; |
-// Reads test data from |file_name| and runs VerifySignedData() over its inputs. |
+// Reads test data from |file_name| and runs VerifySignedData() over its |
+// inputs, using |policy|. |
// |
// If expected_result was SUCCESS then the test will only succeed if |
// VerifySignedData() returns true. |
// |
// If expected_result was FAILURE then the test will only succeed if |
// VerifySignedData() returns false. |
-void RunTestCase(VerifyResult expected_result, const char* file_name) { |
+void RunTestCaseUsingPolicy(VerifyResult expected_result, |
+ const char* file_name, |
+ const SignaturePolicy* policy) { |
#if !defined(USE_OPENSSL) |
LOG(INFO) << "Skipping test, only implemented for BoringSSL"; |
return; |
@@ -142,10 +150,19 @@ void RunTestCase(VerifyResult expected_result, const char* file_name) { |
bool expected_result_bool = expected_result == SUCCESS; |
- EXPECT_EQ(expected_result_bool, |
- VerifySignedData( |
- *signature_algorithm, InputFromString(&signed_data), |
- signature_value_bit_string, InputFromString(&public_key))); |
+ EXPECT_EQ( |
+ expected_result_bool, |
+ VerifySignedData(*signature_algorithm, InputFromString(&signed_data), |
+ signature_value_bit_string, InputFromString(&public_key), |
+ policy)); |
+} |
+ |
+// RunTestCase() is the same as RunTestCaseUsingPolicy(), only it uses a |
+// default policy. This policy will accept a basic profile of signature |
+// algorithms (including ANY sized RSA key >= 1024). |
+void RunTestCase(VerifyResult expected_result, const char* file_name) { |
+ SimpleSignaturePolicy policy(1024); |
+ return RunTestCaseUsingPolicy(expected_result, file_name, &policy); |
} |
// Read the descriptions in the test files themselves for details on what is |
@@ -159,6 +176,10 @@ TEST(VerifySignedDataTest, RsaPkcs1Sha256) { |
RunTestCase(SUCCESS, "rsa-pkcs1-sha256.pem"); |
} |
+TEST(VerifySignedDataTest, Rsa2048Pkcs1Sha512) { |
+ RunTestCase(SUCCESS, "rsa2048-pkcs1-sha512.pem"); |
+} |
+ |
TEST(VerifySignedDataTest, RsaPkcs1Sha256KeyEncodedBer) { |
// TODO(eroman): This should fail! (SPKI should be DER-encoded). |
RunTestCase(SUCCESS, "rsa-pkcs1-sha256-key-encoded-ber.pem"); |
@@ -282,6 +303,88 @@ TEST(VerifySignedDataTest, EcdsaPrime256v1Sha512UnusedBitsSignature) { |
RunTestCase(FAILURE, "ecdsa-prime256v1-sha512-unused-bits-signature.pem"); |
} |
+// This policy rejects specifically secp384r1 curves. |
+class RejectSecp384r1Policy : public SignaturePolicy { |
+ public: |
+ bool IsAcceptableCurveForEcdsa(int curve_nid) const override { |
+#if defined(USE_OPENSSL) |
+ if (curve_nid == NID_secp384r1) |
+ return false; |
+#endif |
+ return true; |
+ } |
+}; |
+ |
+TEST(VerifySignedDataTest, PolicyIsAcceptableCurveForEcdsa) { |
+ // Using the regular policy both secp384r1 and secp256r1 should be accepted. |
+ RunTestCase(SUCCESS, "ecdsa-secp384r1-sha256.pem"); |
+ RunTestCase(SUCCESS, "ecdsa-prime256v1-sha512.pem"); |
+ |
+ // However when using a policy that specifically rejects secp384r1, only |
+ // prime256v1 should be accepted. |
+ RejectSecp384r1Policy policy; |
+ RunTestCaseUsingPolicy(FAILURE, "ecdsa-secp384r1-sha256.pem", &policy); |
+ RunTestCaseUsingPolicy(SUCCESS, "ecdsa-prime256v1-sha512.pem", &policy); |
+} |
+ |
+TEST(VerifySignedDataTest, PolicyIsAcceptableModulusLengthForRsa) { |
+ // Using the regular policy both 1024-bit and 2048-bit RSA keys should be |
+ // accepted. |
+ SimpleSignaturePolicy policy_1024(1024); |
+ RunTestCaseUsingPolicy(SUCCESS, "rsa-pkcs1-sha256.pem", &policy_1024); |
+ RunTestCaseUsingPolicy(SUCCESS, "rsa2048-pkcs1-sha512.pem", &policy_1024); |
+ |
+ // However when using a policy that rejects any keys less than 2048-bits, only |
+ // one of the tests will pass. |
+ SimpleSignaturePolicy policy_2048(2048); |
+ RunTestCaseUsingPolicy(FAILURE, "rsa-pkcs1-sha256.pem", &policy_2048); |
+ RunTestCaseUsingPolicy(SUCCESS, "rsa2048-pkcs1-sha512.pem", &policy_2048); |
+} |
+ |
+// This policy rejects the use of SHA-512. |
+class RejectSha512 : public SignaturePolicy { |
+ public: |
+ RejectSha512() : SignaturePolicy() {} |
+ |
+ bool IsAcceptableSignatureAlgorithm( |
+ const SignatureAlgorithm& algorithm) const override { |
+ if (algorithm.algorithm() == SignatureAlgorithmId::RsaPss && |
+ algorithm.ParamsForRsaPss()->mgf1_hash() == DigestAlgorithm::Sha512) { |
+ return false; |
+ } |
+ |
+ return algorithm.digest() != DigestAlgorithm::Sha512; |
+ } |
+ |
+ bool IsAcceptableModulusLengthForRsa( |
+ size_t modulus_length_bits) const override { |
+ return true; |
+ } |
+}; |
+ |
+TEST(VerifySignedDataTest, PolicyIsAcceptableDigestAlgorithm) { |
+ // Using the regular policy use of either SHA256 or SHA512 should work |
+ // (whether as the main digest, or the MGF1 for RSASSA-PSS) |
+ RunTestCase(SUCCESS, "rsa2048-pkcs1-sha512.pem"); |
+ RunTestCase(SUCCESS, "ecdsa-prime256v1-sha512.pem"); |
+ RunTestCase(SUCCESS, "ecdsa-secp384r1-sha256.pem"); |
+ RunTestCase(SUCCESS, "rsa-pkcs1-sha256.pem"); |
+ RunTestCase(SUCCESS, "rsa-pss-sha256-salt10.pem"); |
+ // This one uses both SHA256 and SHA512 |
+ RunTestCase(SUCCESS, "rsa-pss-sha256-mgf1-sha512-salt33.pem"); |
+ |
+ // The tests using SHA512 should fail when using a policy that rejects SHA512. |
+ // Everything else should pass. |
+ RejectSha512 policy; |
+ RunTestCaseUsingPolicy(FAILURE, "rsa2048-pkcs1-sha512.pem", &policy); |
+ RunTestCaseUsingPolicy(FAILURE, "ecdsa-prime256v1-sha512.pem", &policy); |
+ RunTestCaseUsingPolicy(SUCCESS, "ecdsa-secp384r1-sha256.pem", &policy); |
+ RunTestCaseUsingPolicy(SUCCESS, "rsa-pkcs1-sha256.pem", &policy); |
+ RunTestCaseUsingPolicy(SUCCESS, "rsa-pss-sha256-salt10.pem", &policy); |
+ RunTestCaseUsingPolicy(FAILURE, "rsa-pss-sha256-mgf1-sha512-salt33.pem", |
+ &policy); |
+} |
+ |
} // namespace |
} // namespace net |