Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 1 | // Copyright 2017 The Chromium Authors |
| 2 | // Use of this source code is governed by a BSD-style license that can be |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #include "simple_path_builder_delegate.h" |
| 6 | |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 7 | #include <openssl/bn.h> |
| 8 | #include <openssl/bytestring.h> |
| 9 | #include <openssl/digest.h> |
| 10 | #include <openssl/ec.h> |
| 11 | #include <openssl/ec_key.h> |
| 12 | #include <openssl/evp.h> |
| 13 | #include <openssl/nid.h> |
Bob Beck | 48b8146 | 2023-12-12 18:49:49 +0000 | [diff] [blame] | 14 | #include <openssl/pki/signature_verify_cache.h> |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 15 | #include <openssl/rsa.h> |
Bob Beck | 48b8146 | 2023-12-12 18:49:49 +0000 | [diff] [blame] | 16 | |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 17 | #include "cert_error_params.h" |
| 18 | #include "cert_errors.h" |
| 19 | #include "signature_algorithm.h" |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 20 | #include "verify_signed_data.h" |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 21 | |
| 22 | namespace bssl { |
| 23 | |
| 24 | DEFINE_CERT_ERROR_ID(SimplePathBuilderDelegate::kRsaModulusTooSmall, |
| 25 | "RSA modulus too small"); |
| 26 | |
| 27 | namespace { |
| 28 | |
| 29 | DEFINE_CERT_ERROR_ID(kUnacceptableCurveForEcdsa, |
| 30 | "Only P-256, P-384, P-521 are supported for ECDSA"); |
| 31 | |
| 32 | bool IsAcceptableCurveForEcdsa(int curve_nid) { |
| 33 | switch (curve_nid) { |
| 34 | case NID_X9_62_prime256v1: |
| 35 | case NID_secp384r1: |
| 36 | case NID_secp521r1: |
| 37 | return true; |
| 38 | } |
| 39 | |
| 40 | return false; |
| 41 | } |
| 42 | |
| 43 | } // namespace |
| 44 | |
| 45 | SimplePathBuilderDelegate::SimplePathBuilderDelegate( |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 46 | size_t min_rsa_modulus_length_bits, DigestPolicy digest_policy) |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 47 | : min_rsa_modulus_length_bits_(min_rsa_modulus_length_bits), |
| 48 | digest_policy_(digest_policy) {} |
| 49 | |
| 50 | void SimplePathBuilderDelegate::CheckPathAfterVerification( |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 51 | const CertPathBuilder &path_builder, CertPathBuilderResultPath *path) { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 52 | // Do nothing - consider all candidate paths valid. |
| 53 | } |
| 54 | |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 55 | bool SimplePathBuilderDelegate::IsDeadlineExpired() { return false; } |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 56 | |
Bob Beck | 1fa9cc2 | 2023-11-21 13:58:30 -0700 | [diff] [blame] | 57 | bool SimplePathBuilderDelegate::IsDebugLogEnabled() { return false; } |
| 58 | |
Bob Beck | 324db64 | 2024-01-25 21:37:37 +0000 | [diff] [blame] | 59 | bool SimplePathBuilderDelegate::AcceptPreCertificates() { return false; } |
| 60 | |
Bob Beck | 1fa9cc2 | 2023-11-21 13:58:30 -0700 | [diff] [blame] | 61 | void SimplePathBuilderDelegate::DebugLog(std::string_view msg) {} |
| 62 | |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 63 | SignatureVerifyCache *SimplePathBuilderDelegate::GetVerifyCache() { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 64 | return nullptr; |
| 65 | } |
| 66 | |
| 67 | bool SimplePathBuilderDelegate::IsSignatureAlgorithmAcceptable( |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 68 | SignatureAlgorithm algorithm, CertErrors *errors) { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 69 | switch (algorithm) { |
| 70 | case SignatureAlgorithm::kRsaPkcs1Sha1: |
| 71 | case SignatureAlgorithm::kEcdsaSha1: |
| 72 | return digest_policy_ == DigestPolicy::kWeakAllowSha1; |
| 73 | |
| 74 | case SignatureAlgorithm::kRsaPkcs1Sha256: |
| 75 | case SignatureAlgorithm::kRsaPkcs1Sha384: |
| 76 | case SignatureAlgorithm::kRsaPkcs1Sha512: |
| 77 | case SignatureAlgorithm::kEcdsaSha256: |
| 78 | case SignatureAlgorithm::kEcdsaSha384: |
| 79 | case SignatureAlgorithm::kEcdsaSha512: |
| 80 | case SignatureAlgorithm::kRsaPssSha256: |
| 81 | case SignatureAlgorithm::kRsaPssSha384: |
| 82 | case SignatureAlgorithm::kRsaPssSha512: |
| 83 | return true; |
| 84 | } |
| 85 | return false; |
| 86 | } |
| 87 | |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 88 | bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY *public_key, |
| 89 | CertErrors *errors) { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 90 | int pkey_id = EVP_PKEY_id(public_key); |
| 91 | if (pkey_id == EVP_PKEY_RSA) { |
| 92 | // Extract the modulus length from the key. |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 93 | RSA *rsa = EVP_PKEY_get0_RSA(public_key); |
Bob Beck | 6beabf3 | 2023-11-21 09:43:52 -0700 | [diff] [blame] | 94 | if (!rsa) { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 95 | return false; |
Bob Beck | 6beabf3 | 2023-11-21 09:43:52 -0700 | [diff] [blame] | 96 | } |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 97 | unsigned int modulus_length_bits = RSA_bits(rsa); |
| 98 | |
| 99 | if (modulus_length_bits < min_rsa_modulus_length_bits_) { |
| 100 | errors->AddError( |
| 101 | kRsaModulusTooSmall, |
| 102 | CreateCertErrorParams2SizeT("actual", modulus_length_bits, "minimum", |
| 103 | min_rsa_modulus_length_bits_)); |
| 104 | return false; |
| 105 | } |
| 106 | |
| 107 | return true; |
| 108 | } |
| 109 | |
| 110 | if (pkey_id == EVP_PKEY_EC) { |
| 111 | // Extract the curve name. |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 112 | EC_KEY *ec = EVP_PKEY_get0_EC_KEY(public_key); |
Bob Beck | 6beabf3 | 2023-11-21 09:43:52 -0700 | [diff] [blame] | 113 | if (!ec) { |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 114 | return false; // Unexpected. |
Bob Beck | 6beabf3 | 2023-11-21 09:43:52 -0700 | [diff] [blame] | 115 | } |
Bob Beck | bc97b7a | 2023-04-18 08:35:15 -0600 | [diff] [blame] | 116 | int curve_nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec)); |
| 117 | |
| 118 | if (!IsAcceptableCurveForEcdsa(curve_nid)) { |
| 119 | errors->AddError(kUnacceptableCurveForEcdsa); |
| 120 | return false; |
| 121 | } |
| 122 | |
| 123 | return true; |
| 124 | } |
| 125 | |
| 126 | // Unexpected key type. |
| 127 | return false; |
| 128 | } |
| 129 | |
Bob Beck | 5c7a2a0 | 2023-11-20 17:28:21 -0700 | [diff] [blame] | 130 | } // namespace bssl |