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