xref: /aosp_15_r20/external/cronet/third_party/boringssl/src/pki/simple_path_builder_delegate.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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 
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>
14 #include <openssl/pki/signature_verify_cache.h>
15 #include <openssl/rsa.h>
16 
17 #include "cert_error_params.h"
18 #include "cert_errors.h"
19 #include "signature_algorithm.h"
20 #include "verify_signed_data.h"
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 
IsAcceptableCurveForEcdsa(int curve_nid)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 
SimplePathBuilderDelegate(size_t min_rsa_modulus_length_bits,DigestPolicy digest_policy)45 SimplePathBuilderDelegate::SimplePathBuilderDelegate(
46     size_t min_rsa_modulus_length_bits, DigestPolicy digest_policy)
47     : min_rsa_modulus_length_bits_(min_rsa_modulus_length_bits),
48       digest_policy_(digest_policy) {}
49 
CheckPathAfterVerification(const CertPathBuilder & path_builder,CertPathBuilderResultPath * path)50 void SimplePathBuilderDelegate::CheckPathAfterVerification(
51     const CertPathBuilder &path_builder, CertPathBuilderResultPath *path) {
52   // Do nothing - consider all candidate paths valid.
53 }
54 
IsDeadlineExpired()55 bool SimplePathBuilderDelegate::IsDeadlineExpired() { return false; }
56 
IsDebugLogEnabled()57 bool SimplePathBuilderDelegate::IsDebugLogEnabled() { return false; }
58 
AcceptPreCertificates()59 bool SimplePathBuilderDelegate::AcceptPreCertificates() { return false; }
60 
DebugLog(std::string_view msg)61 void SimplePathBuilderDelegate::DebugLog(std::string_view msg) {}
62 
GetVerifyCache()63 SignatureVerifyCache *SimplePathBuilderDelegate::GetVerifyCache() {
64   return nullptr;
65 }
66 
IsSignatureAlgorithmAcceptable(SignatureAlgorithm algorithm,CertErrors * errors)67 bool SimplePathBuilderDelegate::IsSignatureAlgorithmAcceptable(
68     SignatureAlgorithm algorithm, CertErrors *errors) {
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 
IsPublicKeyAcceptable(EVP_PKEY * public_key,CertErrors * errors)88 bool SimplePathBuilderDelegate::IsPublicKeyAcceptable(EVP_PKEY *public_key,
89                                                       CertErrors *errors) {
90   int pkey_id = EVP_PKEY_id(public_key);
91   if (pkey_id == EVP_PKEY_RSA) {
92     // Extract the modulus length from the key.
93     RSA *rsa = EVP_PKEY_get0_RSA(public_key);
94     if (!rsa) {
95       return false;
96     }
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.
112     EC_KEY *ec = EVP_PKEY_get0_EC_KEY(public_key);
113     if (!ec) {
114       return false;  // Unexpected.
115     }
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 
130 }  // namespace bssl
131