xref: /aosp_15_r20/external/boringssl/src/ssl/ssl_privkey.cc (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1 /* Copyright (C) 1995-1998 Eric Young ([email protected])
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young ([email protected]).
6  * The implementation was written so as to conform with Netscapes SSL.
7  *
8  * This library is free for commercial and non-commercial use as long as
9  * the following conditions are aheared to.  The following conditions
10  * apply to all code found in this distribution, be it the RC4, RSA,
11  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
12  * included with this distribution is covered by the same copyright terms
13  * except that the holder is Tim Hudson ([email protected]).
14  *
15  * Copyright remains Eric Young's, and as such any Copyright notices in
16  * the code are not to be removed.
17  * If this package is used in a product, Eric Young should be given attribution
18  * as the author of the parts of the library used.
19  * This can be in the form of a textual message at program startup or
20  * in documentation (online or textual) provided with the package.
21  *
22  * Redistribution and use in source and binary forms, with or without
23  * modification, are permitted provided that the following conditions
24  * are met:
25  * 1. Redistributions of source code must retain the copyright
26  *    notice, this list of conditions and the following disclaimer.
27  * 2. Redistributions in binary form must reproduce the above copyright
28  *    notice, this list of conditions and the following disclaimer in the
29  *    documentation and/or other materials provided with the distribution.
30  * 3. All advertising materials mentioning features or use of this software
31  *    must display the following acknowledgement:
32  *    "This product includes cryptographic software written by
33  *     Eric Young ([email protected])"
34  *    The word 'cryptographic' can be left out if the rouines from the library
35  *    being used are not cryptographic related :-).
36  * 4. If you include any Windows specific code (or a derivative thereof) from
37  *    the apps directory (application code) you must include an acknowledgement:
38  *    "This product includes software written by Tim Hudson ([email protected])"
39  *
40  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50  * SUCH DAMAGE.
51  *
52  * The licence and distribution terms for any publically available version or
53  * derivative of this code cannot be changed.  i.e. this code cannot simply be
54  * copied and put under another distribution licence
55  * [including the GNU Public Licence.] */
56 
57 #include <openssl/ssl.h>
58 
59 #include <assert.h>
60 #include <limits.h>
61 
62 #include <algorithm>
63 
64 #include <openssl/ec.h>
65 #include <openssl/ec_key.h>
66 #include <openssl/err.h>
67 #include <openssl/evp.h>
68 #include <openssl/mem.h>
69 #include <openssl/span.h>
70 
71 #include "internal.h"
72 #include "../crypto/internal.h"
73 
74 
75 BSSL_NAMESPACE_BEGIN
76 
ssl_is_key_type_supported(int key_type)77 bool ssl_is_key_type_supported(int key_type) {
78   return key_type == EVP_PKEY_RSA || key_type == EVP_PKEY_EC ||
79          key_type == EVP_PKEY_ED25519;
80 }
81 
82 typedef struct {
83   uint16_t sigalg;
84   int pkey_type;
85   int curve;
86   const EVP_MD *(*digest_func)(void);
87   bool is_rsa_pss;
88   bool tls12_ok;
89   bool tls13_ok;
90   bool client_only;
91 } SSL_SIGNATURE_ALGORITHM;
92 
93 static const SSL_SIGNATURE_ALGORITHM kSignatureAlgorithms[] = {
94     // PKCS#1 v1.5 code points are only allowed in TLS 1.2.
95     {SSL_SIGN_RSA_PKCS1_MD5_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_md5_sha1,
96      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
97      /*client_only=*/false},
98     {SSL_SIGN_RSA_PKCS1_SHA1, EVP_PKEY_RSA, NID_undef, &EVP_sha1,
99      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
100      /*client_only=*/false},
101     {SSL_SIGN_RSA_PKCS1_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256,
102      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
103      /*client_only=*/false},
104     {SSL_SIGN_RSA_PKCS1_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384,
105      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
106      /*client_only=*/false},
107     {SSL_SIGN_RSA_PKCS1_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512,
108      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
109      /*client_only=*/false},
110 
111     // Legacy PKCS#1 v1.5 code points are only allowed in TLS 1.3 and
112     // client-only. See draft-ietf-tls-tls13-pkcs1-00.
113     {SSL_SIGN_RSA_PKCS1_SHA256_LEGACY, EVP_PKEY_RSA, NID_undef, &EVP_sha256,
114      /*is_rsa_pss=*/false, /*tls12_ok=*/false, /*tls13_ok=*/true,
115      /*client_only=*/true},
116 
117     {SSL_SIGN_RSA_PSS_RSAE_SHA256, EVP_PKEY_RSA, NID_undef, &EVP_sha256,
118      /*is_rsa_pss=*/true, /*tls12_ok=*/true, /*tls13_ok=*/true,
119      /*client_only=*/false},
120     {SSL_SIGN_RSA_PSS_RSAE_SHA384, EVP_PKEY_RSA, NID_undef, &EVP_sha384,
121      /*is_rsa_pss=*/true, /*tls12_ok=*/true, /*tls13_ok=*/true,
122      /*client_only=*/false},
123     {SSL_SIGN_RSA_PSS_RSAE_SHA512, EVP_PKEY_RSA, NID_undef, &EVP_sha512,
124      /*is_rsa_pss=*/true, /*tls12_ok=*/true, /*tls13_ok=*/true,
125      /*client_only=*/false},
126 
127     {SSL_SIGN_ECDSA_SHA1, EVP_PKEY_EC, NID_undef, &EVP_sha1,
128      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/false,
129      /*client_only=*/false},
130     {SSL_SIGN_ECDSA_SECP256R1_SHA256, EVP_PKEY_EC, NID_X9_62_prime256v1,
131      &EVP_sha256, /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/true,
132      /*client_only=*/false},
133     {SSL_SIGN_ECDSA_SECP384R1_SHA384, EVP_PKEY_EC, NID_secp384r1, &EVP_sha384,
134      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/true,
135      /*client_only=*/false},
136     {SSL_SIGN_ECDSA_SECP521R1_SHA512, EVP_PKEY_EC, NID_secp521r1, &EVP_sha512,
137      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/true,
138      /*client_only=*/false},
139 
140     {SSL_SIGN_ED25519, EVP_PKEY_ED25519, NID_undef, nullptr,
141      /*is_rsa_pss=*/false, /*tls12_ok=*/true, /*tls13_ok=*/true,
142      /*client_only=*/false},
143 };
144 
get_signature_algorithm(uint16_t sigalg)145 static const SSL_SIGNATURE_ALGORITHM *get_signature_algorithm(uint16_t sigalg) {
146   for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(kSignatureAlgorithms); i++) {
147     if (kSignatureAlgorithms[i].sigalg == sigalg) {
148       return &kSignatureAlgorithms[i];
149     }
150   }
151   return NULL;
152 }
153 
ssl_pkey_supports_algorithm(const SSL * ssl,EVP_PKEY * pkey,uint16_t sigalg,bool is_verify)154 bool ssl_pkey_supports_algorithm(const SSL *ssl, EVP_PKEY *pkey,
155                                  uint16_t sigalg, bool is_verify) {
156   const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
157   if (alg == NULL || EVP_PKEY_id(pkey) != alg->pkey_type) {
158     return false;
159   }
160 
161   // Ensure the RSA key is large enough for the hash. RSASSA-PSS requires that
162   // emLen be at least hLen + sLen + 2. Both hLen and sLen are the size of the
163   // hash in TLS. Reasonable RSA key sizes are large enough for the largest
164   // defined RSASSA-PSS algorithm, but 1024-bit RSA is slightly too small for
165   // SHA-512. 1024-bit RSA is sometimes used for test credentials, so check the
166   // size so that we can fall back to another algorithm in that case.
167   if (alg->is_rsa_pss &&
168       (size_t)EVP_PKEY_size(pkey) < 2 * EVP_MD_size(alg->digest_func()) + 2) {
169     return false;
170   }
171 
172   if (ssl_protocol_version(ssl) < TLS1_2_VERSION) {
173     // TLS 1.0 and 1.1 do not negotiate algorithms and always sign one of two
174     // hardcoded algorithms.
175     return sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1 ||
176            sigalg == SSL_SIGN_ECDSA_SHA1;
177   }
178 
179   // |SSL_SIGN_RSA_PKCS1_MD5_SHA1| is not a real SignatureScheme for TLS 1.2 and
180   // higher. It is an internal value we use to represent TLS 1.0/1.1's MD5/SHA1
181   // concatenation.
182   if (sigalg == SSL_SIGN_RSA_PKCS1_MD5_SHA1) {
183     return false;
184   }
185 
186   if (ssl_protocol_version(ssl) >= TLS1_3_VERSION) {
187     if (!alg->tls13_ok) {
188       return false;
189     }
190 
191     bool is_client_sign = ssl->server == is_verify;
192     if (alg->client_only && !is_client_sign) {
193       return false;
194     }
195 
196     // EC keys have a curve requirement.
197     if (alg->pkey_type == EVP_PKEY_EC &&
198         (alg->curve == NID_undef ||
199          EC_GROUP_get_curve_name(
200              EC_KEY_get0_group(EVP_PKEY_get0_EC_KEY(pkey))) != alg->curve)) {
201       return false;
202     }
203   } else if (!alg->tls12_ok) {
204     return false;
205   }
206 
207   return true;
208 }
209 
setup_ctx(SSL * ssl,EVP_MD_CTX * ctx,EVP_PKEY * pkey,uint16_t sigalg,bool is_verify)210 static bool setup_ctx(SSL *ssl, EVP_MD_CTX *ctx, EVP_PKEY *pkey,
211                       uint16_t sigalg, bool is_verify) {
212   if (!ssl_pkey_supports_algorithm(ssl, pkey, sigalg, is_verify)) {
213     OPENSSL_PUT_ERROR(SSL, SSL_R_WRONG_SIGNATURE_TYPE);
214     return false;
215   }
216 
217   const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
218   const EVP_MD *digest = alg->digest_func != NULL ? alg->digest_func() : NULL;
219   EVP_PKEY_CTX *pctx;
220   if (is_verify) {
221     if (!EVP_DigestVerifyInit(ctx, &pctx, digest, NULL, pkey)) {
222       return false;
223     }
224   } else if (!EVP_DigestSignInit(ctx, &pctx, digest, NULL, pkey)) {
225     return false;
226   }
227 
228   if (alg->is_rsa_pss) {
229     if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING) ||
230         !EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1 /* salt len = hash len */)) {
231       return false;
232     }
233   }
234 
235   return true;
236 }
237 
ssl_private_key_sign(SSL_HANDSHAKE * hs,uint8_t * out,size_t * out_len,size_t max_out,uint16_t sigalg,Span<const uint8_t> in)238 enum ssl_private_key_result_t ssl_private_key_sign(
239     SSL_HANDSHAKE *hs, uint8_t *out, size_t *out_len, size_t max_out,
240     uint16_t sigalg, Span<const uint8_t> in) {
241   SSL *const ssl = hs->ssl;
242   const SSL_CREDENTIAL *const cred = hs->credential.get();
243   SSL_HANDSHAKE_HINTS *const hints = hs->hints.get();
244   Array<uint8_t> spki;
245   if (hints) {
246     ScopedCBB spki_cbb;
247     if (!CBB_init(spki_cbb.get(), 64) ||
248         !EVP_marshal_public_key(spki_cbb.get(), cred->pubkey.get()) ||
249         !CBBFinishArray(spki_cbb.get(), &spki)) {
250       ssl_send_alert(ssl, SSL3_AL_FATAL, SSL_AD_INTERNAL_ERROR);
251       return ssl_private_key_failure;
252     }
253   }
254 
255   // Replay the signature from handshake hints if available.
256   if (hints && !hs->hints_requested &&         //
257       sigalg == hints->signature_algorithm &&  //
258       in == hints->signature_input &&
259       MakeConstSpan(spki) == hints->signature_spki &&
260       !hints->signature.empty() &&  //
261       hints->signature.size() <= max_out) {
262     // Signature algorithm and input both match. Reuse the signature from hints.
263     *out_len = hints->signature.size();
264     OPENSSL_memcpy(out, hints->signature.data(), hints->signature.size());
265     return ssl_private_key_success;
266   }
267 
268   const SSL_PRIVATE_KEY_METHOD *key_method = cred->key_method;
269   EVP_PKEY *privkey = cred->privkey.get();
270   assert(!hs->can_release_private_key);
271 
272   if (key_method != NULL) {
273     enum ssl_private_key_result_t ret;
274     if (hs->pending_private_key_op) {
275       ret = key_method->complete(ssl, out, out_len, max_out);
276     } else {
277       ret = key_method->sign(ssl, out, out_len, max_out, sigalg, in.data(),
278                              in.size());
279     }
280     if (ret == ssl_private_key_failure) {
281       OPENSSL_PUT_ERROR(SSL, SSL_R_PRIVATE_KEY_OPERATION_FAILED);
282     }
283     hs->pending_private_key_op = ret == ssl_private_key_retry;
284     if (ret != ssl_private_key_success) {
285       return ret;
286     }
287   } else {
288     *out_len = max_out;
289     ScopedEVP_MD_CTX ctx;
290     if (!setup_ctx(ssl, ctx.get(), privkey, sigalg, false /* sign */) ||
291         !EVP_DigestSign(ctx.get(), out, out_len, in.data(), in.size())) {
292       return ssl_private_key_failure;
293     }
294   }
295 
296   // Save the hint if applicable.
297   if (hints && hs->hints_requested) {
298     hints->signature_algorithm = sigalg;
299     hints->signature_spki = std::move(spki);
300     if (!hints->signature_input.CopyFrom(in) ||
301         !hints->signature.CopyFrom(MakeConstSpan(out, *out_len))) {
302       return ssl_private_key_failure;
303     }
304   }
305   return ssl_private_key_success;
306 }
307 
ssl_public_key_verify(SSL * ssl,Span<const uint8_t> signature,uint16_t sigalg,EVP_PKEY * pkey,Span<const uint8_t> in)308 bool ssl_public_key_verify(SSL *ssl, Span<const uint8_t> signature,
309                            uint16_t sigalg, EVP_PKEY *pkey,
310                            Span<const uint8_t> in) {
311   ScopedEVP_MD_CTX ctx;
312   if (!setup_ctx(ssl, ctx.get(), pkey, sigalg, true /* verify */)) {
313     return false;
314   }
315   bool ok = EVP_DigestVerify(ctx.get(), signature.data(), signature.size(),
316                              in.data(), in.size());
317 #if defined(BORINGSSL_UNSAFE_FUZZER_MODE)
318   ok = true;
319   ERR_clear_error();
320 #endif
321   return ok;
322 }
323 
ssl_private_key_decrypt(SSL_HANDSHAKE * hs,uint8_t * out,size_t * out_len,size_t max_out,Span<const uint8_t> in)324 enum ssl_private_key_result_t ssl_private_key_decrypt(SSL_HANDSHAKE *hs,
325                                                       uint8_t *out,
326                                                       size_t *out_len,
327                                                       size_t max_out,
328                                                       Span<const uint8_t> in) {
329   SSL *const ssl = hs->ssl;
330   const SSL_CREDENTIAL *const cred = hs->credential.get();
331   assert(!hs->can_release_private_key);
332   if (cred->key_method != NULL) {
333     enum ssl_private_key_result_t ret;
334     if (hs->pending_private_key_op) {
335       ret = cred->key_method->complete(ssl, out, out_len, max_out);
336     } else {
337       ret = cred->key_method->decrypt(ssl, out, out_len, max_out, in.data(),
338                                       in.size());
339     }
340     if (ret == ssl_private_key_failure) {
341       OPENSSL_PUT_ERROR(SSL, SSL_R_PRIVATE_KEY_OPERATION_FAILED);
342     }
343     hs->pending_private_key_op = ret == ssl_private_key_retry;
344     return ret;
345   }
346 
347   RSA *rsa = EVP_PKEY_get0_RSA(cred->privkey.get());
348   if (rsa == NULL) {
349     // Decrypt operations are only supported for RSA keys.
350     OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR);
351     return ssl_private_key_failure;
352   }
353 
354   // Decrypt with no padding. PKCS#1 padding will be removed as part of the
355   // timing-sensitive code by the caller.
356   if (!RSA_decrypt(rsa, out_len, out, max_out, in.data(), in.size(),
357                    RSA_NO_PADDING)) {
358     return ssl_private_key_failure;
359   }
360   return ssl_private_key_success;
361 }
362 
363 BSSL_NAMESPACE_END
364 
365 using namespace bssl;
366 
SSL_use_RSAPrivateKey(SSL * ssl,RSA * rsa)367 int SSL_use_RSAPrivateKey(SSL *ssl, RSA *rsa) {
368   if (rsa == NULL || ssl->config == NULL) {
369     OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
370     return 0;
371   }
372 
373   UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
374   if (!pkey ||
375       !EVP_PKEY_set1_RSA(pkey.get(), rsa)) {
376     OPENSSL_PUT_ERROR(SSL, ERR_R_EVP_LIB);
377     return 0;
378   }
379 
380   return SSL_use_PrivateKey(ssl, pkey.get());
381 }
382 
SSL_use_RSAPrivateKey_ASN1(SSL * ssl,const uint8_t * der,size_t der_len)383 int SSL_use_RSAPrivateKey_ASN1(SSL *ssl, const uint8_t *der, size_t der_len) {
384   UniquePtr<RSA> rsa(RSA_private_key_from_bytes(der, der_len));
385   if (!rsa) {
386     OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB);
387     return 0;
388   }
389 
390   return SSL_use_RSAPrivateKey(ssl, rsa.get());
391 }
392 
SSL_use_PrivateKey(SSL * ssl,EVP_PKEY * pkey)393 int SSL_use_PrivateKey(SSL *ssl, EVP_PKEY *pkey) {
394   if (pkey == NULL || ssl->config == NULL) {
395     OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
396     return 0;
397   }
398 
399   return SSL_CREDENTIAL_set1_private_key(
400       ssl->config->cert->default_credential.get(), pkey);
401 }
402 
SSL_use_PrivateKey_ASN1(int type,SSL * ssl,const uint8_t * der,size_t der_len)403 int SSL_use_PrivateKey_ASN1(int type, SSL *ssl, const uint8_t *der,
404                             size_t der_len) {
405   if (der_len > LONG_MAX) {
406     OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
407     return 0;
408   }
409 
410   const uint8_t *p = der;
411   UniquePtr<EVP_PKEY> pkey(d2i_PrivateKey(type, NULL, &p, (long)der_len));
412   if (!pkey || p != der + der_len) {
413     OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB);
414     return 0;
415   }
416 
417   return SSL_use_PrivateKey(ssl, pkey.get());
418 }
419 
SSL_CTX_use_RSAPrivateKey(SSL_CTX * ctx,RSA * rsa)420 int SSL_CTX_use_RSAPrivateKey(SSL_CTX *ctx, RSA *rsa) {
421   if (rsa == NULL) {
422     OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
423     return 0;
424   }
425 
426   UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
427   if (!pkey ||
428       !EVP_PKEY_set1_RSA(pkey.get(), rsa)) {
429     OPENSSL_PUT_ERROR(SSL, ERR_R_EVP_LIB);
430     return 0;
431   }
432 
433   return SSL_CTX_use_PrivateKey(ctx, pkey.get());
434 }
435 
SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX * ctx,const uint8_t * der,size_t der_len)436 int SSL_CTX_use_RSAPrivateKey_ASN1(SSL_CTX *ctx, const uint8_t *der,
437                                    size_t der_len) {
438   UniquePtr<RSA> rsa(RSA_private_key_from_bytes(der, der_len));
439   if (!rsa) {
440     OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB);
441     return 0;
442   }
443 
444   return SSL_CTX_use_RSAPrivateKey(ctx, rsa.get());
445 }
446 
SSL_CTX_use_PrivateKey(SSL_CTX * ctx,EVP_PKEY * pkey)447 int SSL_CTX_use_PrivateKey(SSL_CTX *ctx, EVP_PKEY *pkey) {
448   if (pkey == NULL) {
449     OPENSSL_PUT_ERROR(SSL, ERR_R_PASSED_NULL_PARAMETER);
450     return 0;
451   }
452 
453   return SSL_CREDENTIAL_set1_private_key(ctx->cert->default_credential.get(),
454                                          pkey);
455 }
456 
SSL_CTX_use_PrivateKey_ASN1(int type,SSL_CTX * ctx,const uint8_t * der,size_t der_len)457 int SSL_CTX_use_PrivateKey_ASN1(int type, SSL_CTX *ctx, const uint8_t *der,
458                                 size_t der_len) {
459   if (der_len > LONG_MAX) {
460     OPENSSL_PUT_ERROR(SSL, ERR_R_OVERFLOW);
461     return 0;
462   }
463 
464   const uint8_t *p = der;
465   UniquePtr<EVP_PKEY> pkey(d2i_PrivateKey(type, NULL, &p, (long)der_len));
466   if (!pkey || p != der + der_len) {
467     OPENSSL_PUT_ERROR(SSL, ERR_R_ASN1_LIB);
468     return 0;
469   }
470 
471   return SSL_CTX_use_PrivateKey(ctx, pkey.get());
472 }
473 
SSL_set_private_key_method(SSL * ssl,const SSL_PRIVATE_KEY_METHOD * key_method)474 void SSL_set_private_key_method(SSL *ssl,
475                                 const SSL_PRIVATE_KEY_METHOD *key_method) {
476   if (!ssl->config) {
477     return;
478   }
479   BSSL_CHECK(SSL_CREDENTIAL_set_private_key_method(
480       ssl->config->cert->default_credential.get(), key_method));
481 }
482 
SSL_CTX_set_private_key_method(SSL_CTX * ctx,const SSL_PRIVATE_KEY_METHOD * key_method)483 void SSL_CTX_set_private_key_method(SSL_CTX *ctx,
484                                     const SSL_PRIVATE_KEY_METHOD *key_method) {
485   BSSL_CHECK(SSL_CREDENTIAL_set_private_key_method(
486       ctx->cert->default_credential.get(), key_method));
487 }
488 
489 static constexpr size_t kMaxSignatureAlgorithmNameLen = 24;
490 
491 struct SignatureAlgorithmName {
492   uint16_t signature_algorithm;
493   const char name[kMaxSignatureAlgorithmNameLen];
494 };
495 
496 // This was "constexpr" rather than "const", but that triggered a bug in MSVC
497 // where it didn't pad the strings to the correct length.
498 static const SignatureAlgorithmName kSignatureAlgorithmNames[] = {
499     {SSL_SIGN_RSA_PKCS1_MD5_SHA1, "rsa_pkcs1_md5_sha1"},
500     {SSL_SIGN_RSA_PKCS1_SHA1, "rsa_pkcs1_sha1"},
501     {SSL_SIGN_RSA_PKCS1_SHA256, "rsa_pkcs1_sha256"},
502     {SSL_SIGN_RSA_PKCS1_SHA256_LEGACY, "rsa_pkcs1_sha256_legacy"},
503     {SSL_SIGN_RSA_PKCS1_SHA384, "rsa_pkcs1_sha384"},
504     {SSL_SIGN_RSA_PKCS1_SHA512, "rsa_pkcs1_sha512"},
505     {SSL_SIGN_ECDSA_SHA1, "ecdsa_sha1"},
506     {SSL_SIGN_ECDSA_SECP256R1_SHA256, "ecdsa_secp256r1_sha256"},
507     {SSL_SIGN_ECDSA_SECP384R1_SHA384, "ecdsa_secp384r1_sha384"},
508     {SSL_SIGN_ECDSA_SECP521R1_SHA512, "ecdsa_secp521r1_sha512"},
509     {SSL_SIGN_RSA_PSS_RSAE_SHA256, "rsa_pss_rsae_sha256"},
510     {SSL_SIGN_RSA_PSS_RSAE_SHA384, "rsa_pss_rsae_sha384"},
511     {SSL_SIGN_RSA_PSS_RSAE_SHA512, "rsa_pss_rsae_sha512"},
512     {SSL_SIGN_ED25519, "ed25519"},
513 };
514 
SSL_get_signature_algorithm_name(uint16_t sigalg,int include_curve)515 const char *SSL_get_signature_algorithm_name(uint16_t sigalg,
516                                              int include_curve) {
517   if (!include_curve) {
518     switch (sigalg) {
519       case SSL_SIGN_ECDSA_SECP256R1_SHA256:
520         return "ecdsa_sha256";
521       case SSL_SIGN_ECDSA_SECP384R1_SHA384:
522         return "ecdsa_sha384";
523       case SSL_SIGN_ECDSA_SECP521R1_SHA512:
524         return "ecdsa_sha512";
525         // If adding more here, also update
526         // |SSL_get_all_signature_algorithm_names|.
527     }
528   }
529 
530   for (const auto &candidate : kSignatureAlgorithmNames) {
531     if (candidate.signature_algorithm == sigalg) {
532       return candidate.name;
533     }
534   }
535 
536   return NULL;
537 }
538 
SSL_get_all_signature_algorithm_names(const char ** out,size_t max_out)539 size_t SSL_get_all_signature_algorithm_names(const char **out, size_t max_out) {
540   const char *kPredefinedNames[] = {"ecdsa_sha256", "ecdsa_sha384",
541                                     "ecdsa_sha512"};
542   return GetAllNames(out, max_out, MakeConstSpan(kPredefinedNames),
543                      &SignatureAlgorithmName::name,
544                      MakeConstSpan(kSignatureAlgorithmNames));
545 }
546 
SSL_get_signature_algorithm_key_type(uint16_t sigalg)547 int SSL_get_signature_algorithm_key_type(uint16_t sigalg) {
548   const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
549   return alg != nullptr ? alg->pkey_type : EVP_PKEY_NONE;
550 }
551 
SSL_get_signature_algorithm_digest(uint16_t sigalg)552 const EVP_MD *SSL_get_signature_algorithm_digest(uint16_t sigalg) {
553   const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
554   if (alg == nullptr || alg->digest_func == nullptr) {
555     return nullptr;
556   }
557   return alg->digest_func();
558 }
559 
SSL_is_signature_algorithm_rsa_pss(uint16_t sigalg)560 int SSL_is_signature_algorithm_rsa_pss(uint16_t sigalg) {
561   const SSL_SIGNATURE_ALGORITHM *alg = get_signature_algorithm(sigalg);
562   return alg != nullptr && alg->is_rsa_pss;
563 }
564 
compare_uint16_t(const void * p1,const void * p2)565 static int compare_uint16_t(const void *p1, const void *p2) {
566   uint16_t u1 = *((const uint16_t *)p1);
567   uint16_t u2 = *((const uint16_t *)p2);
568   if (u1 < u2) {
569     return -1;
570   } else if (u1 > u2) {
571     return 1;
572   } else {
573     return 0;
574   }
575 }
576 
sigalgs_unique(Span<const uint16_t> in_sigalgs)577 static bool sigalgs_unique(Span<const uint16_t> in_sigalgs) {
578   if (in_sigalgs.size() < 2) {
579     return true;
580   }
581 
582   Array<uint16_t> sigalgs;
583   if (!sigalgs.CopyFrom(in_sigalgs)) {
584     return false;
585   }
586 
587   qsort(sigalgs.data(), sigalgs.size(), sizeof(uint16_t), compare_uint16_t);
588 
589   for (size_t i = 1; i < sigalgs.size(); i++) {
590     if (sigalgs[i - 1] == sigalgs[i]) {
591       OPENSSL_PUT_ERROR(SSL, SSL_R_DUPLICATE_SIGNATURE_ALGORITHM);
592       return false;
593     }
594   }
595 
596   return true;
597 }
598 
set_sigalg_prefs(Array<uint16_t> * out,Span<const uint16_t> prefs)599 static bool set_sigalg_prefs(Array<uint16_t> *out, Span<const uint16_t> prefs) {
600   if (!sigalgs_unique(prefs)) {
601     return false;
602   }
603 
604   // Check for invalid algorithms, and filter out |SSL_SIGN_RSA_PKCS1_MD5_SHA1|.
605   Array<uint16_t> filtered;
606   if (!filtered.Init(prefs.size())) {
607     return false;
608   }
609   size_t added = 0;
610   for (uint16_t pref : prefs) {
611     if (pref == SSL_SIGN_RSA_PKCS1_MD5_SHA1) {
612       // Though not intended to be used with this API, we treat
613       // |SSL_SIGN_RSA_PKCS1_MD5_SHA1| as a real signature algorithm in
614       // |SSL_PRIVATE_KEY_METHOD|. Not accepting it here makes for a confusing
615       // abstraction.
616       continue;
617     }
618     if (get_signature_algorithm(pref) == nullptr) {
619       OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
620       return false;
621     }
622     filtered[added] = pref;
623     added++;
624   }
625   filtered.Shrink(added);
626 
627   // This can happen if |prefs| contained only |SSL_SIGN_RSA_PKCS1_MD5_SHA1|.
628   // Leaving it empty would revert to the default, so treat this as an error
629   // condition.
630   if (!prefs.empty() && filtered.empty()) {
631     OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
632     return false;
633   }
634 
635   *out = std::move(filtered);
636   return true;
637 }
638 
SSL_CREDENTIAL_set1_signing_algorithm_prefs(SSL_CREDENTIAL * cred,const uint16_t * prefs,size_t num_prefs)639 int SSL_CREDENTIAL_set1_signing_algorithm_prefs(SSL_CREDENTIAL *cred,
640                                                 const uint16_t *prefs,
641                                                 size_t num_prefs) {
642   if (!cred->UsesPrivateKey()) {
643     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
644     return 0;
645   }
646 
647   // Delegated credentials are constrained to a single algorithm, so there is no
648   // need to configure this.
649   if (cred->type == SSLCredentialType::kDelegated) {
650     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
651     return 0;
652   }
653 
654   return set_sigalg_prefs(&cred->sigalgs, MakeConstSpan(prefs, num_prefs));
655 }
656 
SSL_CTX_set_signing_algorithm_prefs(SSL_CTX * ctx,const uint16_t * prefs,size_t num_prefs)657 int SSL_CTX_set_signing_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
658                                         size_t num_prefs) {
659   return SSL_CREDENTIAL_set1_signing_algorithm_prefs(
660       ctx->cert->default_credential.get(), prefs, num_prefs);
661 }
662 
SSL_set_signing_algorithm_prefs(SSL * ssl,const uint16_t * prefs,size_t num_prefs)663 int SSL_set_signing_algorithm_prefs(SSL *ssl, const uint16_t *prefs,
664                                     size_t num_prefs) {
665   if (!ssl->config) {
666     return 0;
667   }
668   return SSL_CREDENTIAL_set1_signing_algorithm_prefs(
669       ssl->config->cert->default_credential.get(), prefs, num_prefs);
670 }
671 
672 static constexpr struct {
673   int pkey_type;
674   int hash_nid;
675   uint16_t signature_algorithm;
676 } kSignatureAlgorithmsMapping[] = {
677     {EVP_PKEY_RSA, NID_sha1, SSL_SIGN_RSA_PKCS1_SHA1},
678     {EVP_PKEY_RSA, NID_sha256, SSL_SIGN_RSA_PKCS1_SHA256},
679     {EVP_PKEY_RSA, NID_sha384, SSL_SIGN_RSA_PKCS1_SHA384},
680     {EVP_PKEY_RSA, NID_sha512, SSL_SIGN_RSA_PKCS1_SHA512},
681     {EVP_PKEY_RSA_PSS, NID_sha256, SSL_SIGN_RSA_PSS_RSAE_SHA256},
682     {EVP_PKEY_RSA_PSS, NID_sha384, SSL_SIGN_RSA_PSS_RSAE_SHA384},
683     {EVP_PKEY_RSA_PSS, NID_sha512, SSL_SIGN_RSA_PSS_RSAE_SHA512},
684     {EVP_PKEY_EC, NID_sha1, SSL_SIGN_ECDSA_SHA1},
685     {EVP_PKEY_EC, NID_sha256, SSL_SIGN_ECDSA_SECP256R1_SHA256},
686     {EVP_PKEY_EC, NID_sha384, SSL_SIGN_ECDSA_SECP384R1_SHA384},
687     {EVP_PKEY_EC, NID_sha512, SSL_SIGN_ECDSA_SECP521R1_SHA512},
688     {EVP_PKEY_ED25519, NID_undef, SSL_SIGN_ED25519},
689 };
690 
parse_sigalg_pairs(Array<uint16_t> * out,const int * values,size_t num_values)691 static bool parse_sigalg_pairs(Array<uint16_t> *out, const int *values,
692                                size_t num_values) {
693   if ((num_values & 1) == 1) {
694     return false;
695   }
696 
697   const size_t num_pairs = num_values / 2;
698   if (!out->Init(num_pairs)) {
699     return false;
700   }
701 
702   for (size_t i = 0; i < num_values; i += 2) {
703     const int hash_nid = values[i];
704     const int pkey_type = values[i+1];
705 
706     bool found = false;
707     for (const auto &candidate : kSignatureAlgorithmsMapping) {
708       if (candidate.pkey_type == pkey_type && candidate.hash_nid == hash_nid) {
709         (*out)[i / 2] = candidate.signature_algorithm;
710         found = true;
711         break;
712       }
713     }
714 
715     if (!found) {
716       OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
717       ERR_add_error_dataf("unknown hash:%d pkey:%d", hash_nid, pkey_type);
718       return false;
719     }
720   }
721 
722   return true;
723 }
724 
SSL_CTX_set1_sigalgs(SSL_CTX * ctx,const int * values,size_t num_values)725 int SSL_CTX_set1_sigalgs(SSL_CTX *ctx, const int *values, size_t num_values) {
726   Array<uint16_t> sigalgs;
727   if (!parse_sigalg_pairs(&sigalgs, values, num_values)) {
728     return 0;
729   }
730 
731   if (!SSL_CTX_set_signing_algorithm_prefs(ctx, sigalgs.data(),
732                                            sigalgs.size()) ||
733       !SSL_CTX_set_verify_algorithm_prefs(ctx, sigalgs.data(),
734                                           sigalgs.size())) {
735     return 0;
736   }
737 
738   return 1;
739 }
740 
SSL_set1_sigalgs(SSL * ssl,const int * values,size_t num_values)741 int SSL_set1_sigalgs(SSL *ssl, const int *values, size_t num_values) {
742   if (!ssl->config) {
743     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
744     return 0;
745   }
746 
747   Array<uint16_t> sigalgs;
748   if (!parse_sigalg_pairs(&sigalgs, values, num_values)) {
749     return 0;
750   }
751 
752   if (!SSL_set_signing_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size()) ||
753       !SSL_set_verify_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size())) {
754     return 0;
755   }
756 
757   return 1;
758 }
759 
parse_sigalgs_list(Array<uint16_t> * out,const char * str)760 static bool parse_sigalgs_list(Array<uint16_t> *out, const char *str) {
761   // str looks like "RSA+SHA1:ECDSA+SHA256:ecdsa_secp256r1_sha256".
762 
763   // Count colons to give the number of output elements from any successful
764   // parse.
765   size_t num_elements = 1;
766   size_t len = 0;
767   for (const char *p = str; *p; p++) {
768     len++;
769     if (*p == ':') {
770       num_elements++;
771     }
772   }
773 
774   if (!out->Init(num_elements)) {
775     return false;
776   }
777   size_t out_i = 0;
778 
779   enum {
780     pkey_or_name,
781     hash_name,
782   } state = pkey_or_name;
783 
784   char buf[kMaxSignatureAlgorithmNameLen];
785   // buf_used is always < sizeof(buf). I.e. it's always safe to write
786   // buf[buf_used] = 0.
787   size_t buf_used = 0;
788 
789   int pkey_type = 0, hash_nid = 0;
790 
791   // Note that the loop runs to len+1, i.e. it'll process the terminating NUL.
792   for (size_t offset = 0; offset < len+1; offset++) {
793     const unsigned char c = str[offset];
794 
795     switch (c) {
796       case '+':
797         if (state == hash_name) {
798           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
799           ERR_add_error_dataf("+ found in hash name at offset %zu", offset);
800           return false;
801         }
802         if (buf_used == 0) {
803           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
804           ERR_add_error_dataf("empty public key type at offset %zu", offset);
805           return false;
806         }
807         buf[buf_used] = 0;
808 
809         if (strcmp(buf, "RSA") == 0) {
810           pkey_type = EVP_PKEY_RSA;
811         } else if (strcmp(buf, "RSA-PSS") == 0 ||
812                    strcmp(buf, "PSS") == 0) {
813           pkey_type = EVP_PKEY_RSA_PSS;
814         } else if (strcmp(buf, "ECDSA") == 0) {
815           pkey_type = EVP_PKEY_EC;
816         } else {
817           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
818           ERR_add_error_dataf("unknown public key type '%s'", buf);
819           return false;
820         }
821 
822         state = hash_name;
823         buf_used = 0;
824         break;
825 
826       case ':':
827         OPENSSL_FALLTHROUGH;
828       case 0:
829         if (buf_used == 0) {
830           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
831           ERR_add_error_dataf("empty element at offset %zu", offset);
832           return false;
833         }
834 
835         buf[buf_used] = 0;
836 
837         if (state == pkey_or_name) {
838           // No '+' was seen thus this is a TLS 1.3-style name.
839           bool found = false;
840           for (const auto &candidate : kSignatureAlgorithmNames) {
841             if (strcmp(candidate.name, buf) == 0) {
842               assert(out_i < num_elements);
843               (*out)[out_i++] = candidate.signature_algorithm;
844               found = true;
845               break;
846             }
847           }
848 
849           if (!found) {
850             OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
851             ERR_add_error_dataf("unknown signature algorithm '%s'", buf);
852             return false;
853           }
854         } else {
855           if (strcmp(buf, "SHA1") == 0) {
856             hash_nid = NID_sha1;
857           } else if (strcmp(buf, "SHA256") == 0) {
858             hash_nid = NID_sha256;
859           } else if (strcmp(buf, "SHA384") == 0) {
860             hash_nid = NID_sha384;
861           } else if (strcmp(buf, "SHA512") == 0) {
862             hash_nid = NID_sha512;
863           } else {
864             OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
865             ERR_add_error_dataf("unknown hash function '%s'", buf);
866             return false;
867           }
868 
869           bool found = false;
870           for (const auto &candidate : kSignatureAlgorithmsMapping) {
871             if (candidate.pkey_type == pkey_type &&
872                 candidate.hash_nid == hash_nid) {
873               assert(out_i < num_elements);
874               (*out)[out_i++] = candidate.signature_algorithm;
875               found = true;
876               break;
877             }
878           }
879 
880           if (!found) {
881             OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
882             ERR_add_error_dataf("unknown pkey:%d hash:%s", pkey_type, buf);
883             return false;
884           }
885         }
886 
887         state = pkey_or_name;
888         buf_used = 0;
889         break;
890 
891       default:
892         if (buf_used == sizeof(buf) - 1) {
893           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
894           ERR_add_error_dataf("substring too long at offset %zu", offset);
895           return false;
896         }
897 
898         if (OPENSSL_isalnum(c) || c == '-' || c == '_') {
899           buf[buf_used++] = c;
900         } else {
901           OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_SIGNATURE_ALGORITHM);
902           ERR_add_error_dataf("invalid character 0x%02x at offest %zu", c,
903                               offset);
904           return false;
905         }
906     }
907   }
908 
909   assert(out_i == out->size());
910   return true;
911 }
912 
SSL_CTX_set1_sigalgs_list(SSL_CTX * ctx,const char * str)913 int SSL_CTX_set1_sigalgs_list(SSL_CTX *ctx, const char *str) {
914   Array<uint16_t> sigalgs;
915   if (!parse_sigalgs_list(&sigalgs, str)) {
916     return 0;
917   }
918 
919   if (!SSL_CTX_set_signing_algorithm_prefs(ctx, sigalgs.data(),
920                                            sigalgs.size()) ||
921       !SSL_CTX_set_verify_algorithm_prefs(ctx, sigalgs.data(),
922                                           sigalgs.size())) {
923     return 0;
924   }
925 
926   return 1;
927 }
928 
SSL_set1_sigalgs_list(SSL * ssl,const char * str)929 int SSL_set1_sigalgs_list(SSL *ssl, const char *str) {
930   if (!ssl->config) {
931     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
932     return 0;
933   }
934 
935   Array<uint16_t> sigalgs;
936   if (!parse_sigalgs_list(&sigalgs, str)) {
937     return 0;
938   }
939 
940   if (!SSL_set_signing_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size()) ||
941       !SSL_set_verify_algorithm_prefs(ssl, sigalgs.data(), sigalgs.size())) {
942     return 0;
943   }
944 
945   return 1;
946 }
947 
SSL_CTX_set_verify_algorithm_prefs(SSL_CTX * ctx,const uint16_t * prefs,size_t num_prefs)948 int SSL_CTX_set_verify_algorithm_prefs(SSL_CTX *ctx, const uint16_t *prefs,
949                                        size_t num_prefs) {
950   return set_sigalg_prefs(&ctx->verify_sigalgs,
951                           MakeConstSpan(prefs, num_prefs));
952 }
953 
SSL_set_verify_algorithm_prefs(SSL * ssl,const uint16_t * prefs,size_t num_prefs)954 int SSL_set_verify_algorithm_prefs(SSL *ssl, const uint16_t *prefs,
955                                    size_t num_prefs) {
956   if (!ssl->config) {
957     OPENSSL_PUT_ERROR(SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
958     return 0;
959   }
960 
961   return set_sigalg_prefs(&ssl->config->verify_sigalgs,
962                           MakeConstSpan(prefs, num_prefs));
963 }
964