ssl_cipher.cc
Go to the documentation of this file.
1 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2  * All rights reserved.
3  *
4  * This package is an SSL implementation written
5  * by Eric Young (eay@cryptsoft.com).
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 (tjh@cryptsoft.com).
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 (eay@cryptsoft.com)"
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 (tjh@cryptsoft.com)"
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 /* ====================================================================
58  * Copyright (c) 1998-2007 The OpenSSL Project. All rights reserved.
59  *
60  * Redistribution and use in source and binary forms, with or without
61  * modification, are permitted provided that the following conditions
62  * are met:
63  *
64  * 1. Redistributions of source code must retain the above copyright
65  * notice, this list of conditions and the following disclaimer.
66  *
67  * 2. Redistributions in binary form must reproduce the above copyright
68  * notice, this list of conditions and the following disclaimer in
69  * the documentation and/or other materials provided with the
70  * distribution.
71  *
72  * 3. All advertising materials mentioning features or use of this
73  * software must display the following acknowledgment:
74  * "This product includes software developed by the OpenSSL Project
75  * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
76  *
77  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
78  * endorse or promote products derived from this software without
79  * prior written permission. For written permission, please contact
80  * openssl-core@openssl.org.
81  *
82  * 5. Products derived from this software may not be called "OpenSSL"
83  * nor may "OpenSSL" appear in their names without prior written
84  * permission of the OpenSSL Project.
85  *
86  * 6. Redistributions of any form whatsoever must retain the following
87  * acknowledgment:
88  * "This product includes software developed by the OpenSSL Project
89  * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
90  *
91  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
92  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
93  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
94  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
95  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
96  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
97  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
98  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
99  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
100  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
101  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
102  * OF THE POSSIBILITY OF SUCH DAMAGE.
103  * ====================================================================
104  *
105  * This product includes cryptographic software written by Eric Young
106  * (eay@cryptsoft.com). This product includes software written by Tim
107  * Hudson (tjh@cryptsoft.com).
108  *
109  */
110 /* ====================================================================
111  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
112  * ECC cipher suite support in OpenSSL originally developed by
113  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
114  */
115 /* ====================================================================
116  * Copyright 2005 Nokia. All rights reserved.
117  *
118  * The portions of the attached software ("Contribution") is developed by
119  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
120  * license.
121  *
122  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
123  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
124  * support (see RFC 4279) to OpenSSL.
125  *
126  * No patent licenses or other rights except those expressly stated in
127  * the OpenSSL open source license shall be deemed granted or received
128  * expressly, by implication, estoppel, or otherwise.
129  *
130  * No assurances are provided by Nokia that the Contribution does not
131  * infringe the patent or other intellectual property rights of any third
132  * party or that the license provides you with all the necessary rights
133  * to make use of the Contribution.
134  *
135  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
136  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
137  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
138  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
139  * OTHERWISE. */
140 
141 #include <openssl/ssl.h>
142 
143 #include <assert.h>
144 #include <string.h>
145 
146 #include <openssl/err.h>
147 #include <openssl/md5.h>
148 #include <openssl/mem.h>
149 #include <openssl/sha.h>
150 #include <openssl/stack.h>
151 
152 #include "internal.h"
153 #include "../crypto/internal.h"
154 
155 
157 
158 static constexpr SSL_CIPHER kCiphers[] = {
159  // The RSA ciphers
160  // Cipher 02
161  {
163  "TLS_RSA_WITH_NULL_SHA",
165  SSL_kRSA,
166  SSL_aRSA,
167  SSL_eNULL,
168  SSL_SHA1,
170  },
171 
172  // Cipher 0A
173  {
175  "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
177  SSL_kRSA,
178  SSL_aRSA,
179  SSL_3DES,
180  SSL_SHA1,
182  },
183 
184 
185  // New AES ciphersuites
186 
187  // Cipher 2F
188  {
190  "TLS_RSA_WITH_AES_128_CBC_SHA",
192  SSL_kRSA,
193  SSL_aRSA,
194  SSL_AES128,
195  SSL_SHA1,
197  },
198 
199  // Cipher 35
200  {
202  "TLS_RSA_WITH_AES_256_CBC_SHA",
204  SSL_kRSA,
205  SSL_aRSA,
206  SSL_AES256,
207  SSL_SHA1,
209  },
210 
211  // PSK cipher suites.
212 
213  // Cipher 8C
214  {
216  "TLS_PSK_WITH_AES_128_CBC_SHA",
218  SSL_kPSK,
219  SSL_aPSK,
220  SSL_AES128,
221  SSL_SHA1,
223  },
224 
225  // Cipher 8D
226  {
228  "TLS_PSK_WITH_AES_256_CBC_SHA",
230  SSL_kPSK,
231  SSL_aPSK,
232  SSL_AES256,
233  SSL_SHA1,
235  },
236 
237  // GCM ciphersuites from RFC 5288
238 
239  // Cipher 9C
240  {
242  "TLS_RSA_WITH_AES_128_GCM_SHA256",
244  SSL_kRSA,
245  SSL_aRSA,
247  SSL_AEAD,
249  },
250 
251  // Cipher 9D
252  {
254  "TLS_RSA_WITH_AES_256_GCM_SHA384",
256  SSL_kRSA,
257  SSL_aRSA,
259  SSL_AEAD,
261  },
262 
263  // TLS 1.3 suites.
264 
265  // Cipher 1301
266  {
268  "TLS_AES_128_GCM_SHA256",
270  SSL_kGENERIC,
271  SSL_aGENERIC,
273  SSL_AEAD,
275  },
276 
277  // Cipher 1302
278  {
280  "TLS_AES_256_GCM_SHA384",
282  SSL_kGENERIC,
283  SSL_aGENERIC,
285  SSL_AEAD,
287  },
288 
289  // Cipher 1303
290  {
292  "TLS_CHACHA20_POLY1305_SHA256",
294  SSL_kGENERIC,
295  SSL_aGENERIC,
297  SSL_AEAD,
299  },
300 
301  // Cipher C009
302  {
304  "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
306  SSL_kECDHE,
307  SSL_aECDSA,
308  SSL_AES128,
309  SSL_SHA1,
311  },
312 
313  // Cipher C00A
314  {
316  "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
318  SSL_kECDHE,
319  SSL_aECDSA,
320  SSL_AES256,
321  SSL_SHA1,
323  },
324 
325  // Cipher C013
326  {
328  "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
330  SSL_kECDHE,
331  SSL_aRSA,
332  SSL_AES128,
333  SSL_SHA1,
335  },
336 
337  // Cipher C014
338  {
340  "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
342  SSL_kECDHE,
343  SSL_aRSA,
344  SSL_AES256,
345  SSL_SHA1,
347  },
348 
349  // GCM based TLS v1.2 ciphersuites from RFC 5289
350 
351  // Cipher C02B
352  {
354  "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
356  SSL_kECDHE,
357  SSL_aECDSA,
359  SSL_AEAD,
361  },
362 
363  // Cipher C02C
364  {
366  "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
368  SSL_kECDHE,
369  SSL_aECDSA,
371  SSL_AEAD,
373  },
374 
375  // Cipher C02F
376  {
378  "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
380  SSL_kECDHE,
381  SSL_aRSA,
383  SSL_AEAD,
385  },
386 
387  // Cipher C030
388  {
390  "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
392  SSL_kECDHE,
393  SSL_aRSA,
395  SSL_AEAD,
397  },
398 
399  // ECDHE-PSK cipher suites.
400 
401  // Cipher C035
402  {
404  "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
406  SSL_kECDHE,
407  SSL_aPSK,
408  SSL_AES128,
409  SSL_SHA1,
411  },
412 
413  // Cipher C036
414  {
416  "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
418  SSL_kECDHE,
419  SSL_aPSK,
420  SSL_AES256,
421  SSL_SHA1,
423  },
424 
425  // ChaCha20-Poly1305 cipher suites.
426 
427  // Cipher CCA8
428  {
430  "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
432  SSL_kECDHE,
433  SSL_aRSA,
435  SSL_AEAD,
437  },
438 
439  // Cipher CCA9
440  {
442  "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
444  SSL_kECDHE,
445  SSL_aECDSA,
447  SSL_AEAD,
449  },
450 
451  // Cipher CCAB
452  {
454  "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",
456  SSL_kECDHE,
457  SSL_aPSK,
459  SSL_AEAD,
461  },
462 
463 };
464 
467 }
468 
469 #define CIPHER_ADD 1
470 #define CIPHER_KILL 2
471 #define CIPHER_DEL 3
472 #define CIPHER_ORD 4
473 #define CIPHER_SPECIAL 5
474 
475 typedef struct cipher_order_st {
477  bool active;
478  bool in_group;
480 } CIPHER_ORDER;
481 
482 typedef struct cipher_alias_st {
483  // name is the name of the cipher alias.
484  const char *name;
485 
486  // The following fields are bitmasks for the corresponding fields on
487  // |SSL_CIPHER|. A cipher matches a cipher alias iff, for each bitmask, the
488  // bit corresponding to the cipher's value is set to 1. If any bitmask is
489  // all zeroes, the alias matches nothing. Use |~0u| for the default value.
494 
495  // min_version, if non-zero, matches all ciphers which were added in that
496  // particular protocol version.
498 } CIPHER_ALIAS;
499 
500 static const CIPHER_ALIAS kCipherAliases[] = {
501  // "ALL" doesn't include eNULL. It must be explicitly enabled.
502  {"ALL", ~0u, ~0u, ~0u, ~0u, 0},
503 
504  // The "COMPLEMENTOFDEFAULT" rule is omitted. It matches nothing.
505 
506  // key exchange aliases
507  // (some of those using only a single bit here combine
508  // multiple key exchange algs according to the RFCs.
509  {"kRSA", SSL_kRSA, ~0u, ~0u, ~0u, 0},
510 
511  {"kECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
512  {"kEECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
513  {"ECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
514 
515  {"kPSK", SSL_kPSK, ~0u, ~0u, ~0u, 0},
516 
517  // server authentication aliases
518  {"aRSA", ~0u, SSL_aRSA, ~0u, ~0u, 0},
519  {"aECDSA", ~0u, SSL_aECDSA, ~0u, ~0u, 0},
520  {"ECDSA", ~0u, SSL_aECDSA, ~0u, ~0u, 0},
521  {"aPSK", ~0u, SSL_aPSK, ~0u, ~0u, 0},
522 
523  // aliases combining key exchange and server authentication
524  {"ECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
525  {"EECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0},
526  {"RSA", SSL_kRSA, SSL_aRSA, ~0u, ~0u, 0},
527  {"PSK", SSL_kPSK, SSL_aPSK, ~0u, ~0u, 0},
528 
529  // symmetric encryption aliases
530  {"3DES", ~0u, ~0u, SSL_3DES, ~0u, 0},
531  {"AES128", ~0u, ~0u, SSL_AES128 | SSL_AES128GCM, ~0u, 0},
532  {"AES256", ~0u, ~0u, SSL_AES256 | SSL_AES256GCM, ~0u, 0},
533  {"AES", ~0u, ~0u, SSL_AES, ~0u, 0},
534  {"AESGCM", ~0u, ~0u, SSL_AES128GCM | SSL_AES256GCM, ~0u, 0},
535  {"CHACHA20", ~0u, ~0u, SSL_CHACHA20POLY1305, ~0u, 0},
536 
537  // MAC aliases
538  {"SHA1", ~0u, ~0u, ~0u, SSL_SHA1, 0},
539  {"SHA", ~0u, ~0u, ~0u, SSL_SHA1, 0},
540 
541  // Legacy protocol minimum version aliases. "TLSv1" is intentionally the
542  // same as "SSLv3".
543  {"SSLv3", ~0u, ~0u, ~0u, ~0u, SSL3_VERSION},
544  {"TLSv1", ~0u, ~0u, ~0u, ~0u, SSL3_VERSION},
545  {"TLSv1.2", ~0u, ~0u, ~0u, ~0u, TLS1_2_VERSION},
546 
547  // Legacy strength classes.
548  {"HIGH", ~0u, ~0u, ~0u, ~0u, 0},
549  {"FIPS", ~0u, ~0u, ~0u, ~0u, 0},
550 
551  // Temporary no-op aliases corresponding to removed SHA-2 legacy CBC
552  // ciphers. These should be removed after 2018-05-14.
553  {"SHA256", 0, 0, 0, 0, 0},
554  {"SHA384", 0, 0, 0, 0, 0},
555 };
556 
558 
559 bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead,
560  size_t *out_mac_secret_len,
561  size_t *out_fixed_iv_len, const SSL_CIPHER *cipher,
562  uint16_t version, bool is_dtls) {
563  *out_aead = NULL;
564  *out_mac_secret_len = 0;
565  *out_fixed_iv_len = 0;
566 
567  const bool is_tls12 = version == TLS1_2_VERSION && !is_dtls;
568  const bool is_tls13 = version == TLS1_3_VERSION && !is_dtls;
569 
570  if (cipher->algorithm_mac == SSL_AEAD) {
571  if (cipher->algorithm_enc == SSL_AES128GCM) {
572  if (is_tls12) {
573  *out_aead = EVP_aead_aes_128_gcm_tls12();
574  } else if (is_tls13) {
575  *out_aead = EVP_aead_aes_128_gcm_tls13();
576  } else {
577  *out_aead = EVP_aead_aes_128_gcm();
578  }
579  *out_fixed_iv_len = 4;
580  } else if (cipher->algorithm_enc == SSL_AES256GCM) {
581  if (is_tls12) {
582  *out_aead = EVP_aead_aes_256_gcm_tls12();
583  } else if (is_tls13) {
584  *out_aead = EVP_aead_aes_256_gcm_tls13();
585  } else {
586  *out_aead = EVP_aead_aes_256_gcm();
587  }
588  *out_fixed_iv_len = 4;
589  } else if (cipher->algorithm_enc == SSL_CHACHA20POLY1305) {
590  *out_aead = EVP_aead_chacha20_poly1305();
591  *out_fixed_iv_len = 12;
592  } else {
593  return false;
594  }
595 
596  // In TLS 1.3, the iv_len is equal to the AEAD nonce length whereas the code
597  // above computes the TLS 1.2 construction.
598  if (version >= TLS1_3_VERSION) {
599  *out_fixed_iv_len = EVP_AEAD_nonce_length(*out_aead);
600  }
601  } else if (cipher->algorithm_mac == SSL_SHA1) {
602  if (cipher->algorithm_enc == SSL_eNULL) {
603  *out_aead = EVP_aead_null_sha1_tls();
604  } else if (cipher->algorithm_enc == SSL_3DES) {
605  if (version == TLS1_VERSION) {
607  *out_fixed_iv_len = 8;
608  } else {
609  *out_aead = EVP_aead_des_ede3_cbc_sha1_tls();
610  }
611  } else if (cipher->algorithm_enc == SSL_AES128) {
612  if (version == TLS1_VERSION) {
614  *out_fixed_iv_len = 16;
615  } else {
616  *out_aead = EVP_aead_aes_128_cbc_sha1_tls();
617  }
618  } else if (cipher->algorithm_enc == SSL_AES256) {
619  if (version == TLS1_VERSION) {
621  *out_fixed_iv_len = 16;
622  } else {
623  *out_aead = EVP_aead_aes_256_cbc_sha1_tls();
624  }
625  } else {
626  return false;
627  }
628 
629  *out_mac_secret_len = SHA_DIGEST_LENGTH;
630  } else {
631  return false;
632  }
633 
634  return true;
635 }
636 
638  const SSL_CIPHER *cipher) {
639  switch (cipher->algorithm_prf) {
641  return version >= TLS1_2_VERSION ? EVP_sha256() : EVP_md5_sha1();
643  return EVP_sha256();
645  return EVP_sha384();
646  default:
647  assert(0);
648  return NULL;
649  }
650 }
651 
652 static bool is_cipher_list_separator(char c, bool is_strict) {
653  if (c == ':') {
654  return true;
655  }
656  return !is_strict && (c == ' ' || c == ';' || c == ',');
657 }
658 
659 // rule_equals returns whether the NUL-terminated string |rule| is equal to the
660 // |buf_len| bytes at |buf|.
661 static bool rule_equals(const char *rule, const char *buf, size_t buf_len) {
662  // |strncmp| alone only checks that |buf| is a prefix of |rule|.
663  return strncmp(rule, buf, buf_len) == 0 && rule[buf_len] == '\0';
664 }
665 
666 static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr,
667  CIPHER_ORDER **tail) {
668  if (curr == *tail) {
669  return;
670  }
671  if (curr == *head) {
672  *head = curr->next;
673  }
674  if (curr->prev != NULL) {
675  curr->prev->next = curr->next;
676  }
677  if (curr->next != NULL) {
678  curr->next->prev = curr->prev;
679  }
680  (*tail)->next = curr;
681  curr->prev = *tail;
682  curr->next = NULL;
683  *tail = curr;
684 }
685 
686 static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr,
687  CIPHER_ORDER **tail) {
688  if (curr == *head) {
689  return;
690  }
691  if (curr == *tail) {
692  *tail = curr->prev;
693  }
694  if (curr->next != NULL) {
695  curr->next->prev = curr->prev;
696  }
697  if (curr->prev != NULL) {
698  curr->prev->next = curr->next;
699  }
700  (*head)->prev = curr;
701  curr->next = *head;
702  curr->prev = NULL;
703  *head = curr;
704 }
705 
707  CIPHER_ORDER **out_head,
708  CIPHER_ORDER **out_tail) {
709  Array<CIPHER_ORDER> co_list;
710  if (!co_list.Init(OPENSSL_ARRAY_SIZE(kCiphers))) {
711  return false;
712  }
713 
714  size_t co_list_num = 0;
715  for (const SSL_CIPHER &cipher : kCiphers) {
716  // TLS 1.3 ciphers do not participate in this mechanism.
717  if (cipher.algorithm_mkey != SSL_kGENERIC) {
718  co_list[co_list_num].cipher = &cipher;
719  co_list[co_list_num].next = NULL;
720  co_list[co_list_num].prev = NULL;
721  co_list[co_list_num].active = false;
722  co_list[co_list_num].in_group = false;
723  co_list_num++;
724  }
725  }
726 
727  // Prepare linked list from list entries.
728  if (co_list_num > 0) {
729  co_list[0].prev = NULL;
730 
731  if (co_list_num > 1) {
732  co_list[0].next = &co_list[1];
733 
734  for (size_t i = 1; i < co_list_num - 1; i++) {
735  co_list[i].prev = &co_list[i - 1];
736  co_list[i].next = &co_list[i + 1];
737  }
738 
739  co_list[co_list_num - 1].prev = &co_list[co_list_num - 2];
740  }
741 
742  co_list[co_list_num - 1].next = NULL;
743 
744  *out_head = &co_list[0];
745  *out_tail = &co_list[co_list_num - 1];
746  } else {
747  *out_head = nullptr;
748  *out_tail = nullptr;
749  }
750  *out_co_list = std::move(co_list);
751  return true;
752 }
753 
756 }
757 
759  Span<const bool> in_group_flags_arg) {
760  if (sk_SSL_CIPHER_num(ciphers_arg.get()) != in_group_flags_arg.size()) {
762  return false;
763  }
764 
766  if (!copy.CopyFrom(in_group_flags_arg)) {
767  return false;
768  }
769  ciphers = std::move(ciphers_arg);
770  size_t unused_len;
771  copy.Release(&in_group_flags, &unused_len);
772  return true;
773 }
774 
776  size_t size = sk_SSL_CIPHER_num(other.ciphers.get());
777  Span<const bool> other_flags(other.in_group_flags, size);
779  other.ciphers.get()));
780  if (!other_ciphers) {
781  return false;
782  }
783  return Init(std::move(other_ciphers), other_flags);
784 }
785 
787  size_t index;
788  if (!sk_SSL_CIPHER_find(ciphers.get(), &index, cipher)) {
789  return;
790  }
791  if (!in_group_flags[index] /* last element of group */ && index > 0) {
792  in_group_flags[index-1] = false;
793  }
794  for (size_t i = index; i < sk_SSL_CIPHER_num(ciphers.get()) - 1; ++i) {
796  }
798 }
799 
800 // ssl_cipher_apply_rule applies the rule type |rule| to ciphers matching its
801 // parameters in the linked list from |*head_p| to |*tail_p|. It writes the new
802 // head and tail of the list to |*head_p| and |*tail_p|, respectively.
803 //
804 // - If |cipher_id| is non-zero, only that cipher is selected.
805 // - Otherwise, if |strength_bits| is non-negative, it selects ciphers
806 // of that strength.
807 // - Otherwise, it selects ciphers that match each bitmasks in |alg_*| and
808 // |min_version|.
810  uint32_t cipher_id, uint32_t alg_mkey, uint32_t alg_auth,
811  uint32_t alg_enc, uint32_t alg_mac, uint16_t min_version, int rule,
812  int strength_bits, bool in_group, CIPHER_ORDER **head_p,
813  CIPHER_ORDER **tail_p) {
814  CIPHER_ORDER *head, *tail, *curr, *next, *last;
815  const SSL_CIPHER *cp;
816  bool reverse = false;
817 
818  if (cipher_id == 0 && strength_bits == -1 && min_version == 0 &&
819  (alg_mkey == 0 || alg_auth == 0 || alg_enc == 0 || alg_mac == 0)) {
820  // The rule matches nothing, so bail early.
821  return;
822  }
823 
824  if (rule == CIPHER_DEL) {
825  // needed to maintain sorting between currently deleted ciphers
826  reverse = true;
827  }
828 
829  head = *head_p;
830  tail = *tail_p;
831 
832  if (reverse) {
833  next = tail;
834  last = head;
835  } else {
836  next = head;
837  last = tail;
838  }
839 
840  curr = NULL;
841  for (;;) {
842  if (curr == last) {
843  break;
844  }
845 
846  curr = next;
847  if (curr == NULL) {
848  break;
849  }
850 
851  next = reverse ? curr->prev : curr->next;
852  cp = curr->cipher;
853 
854  // Selection criteria is either a specific cipher, the value of
855  // |strength_bits|, or the algorithms used.
856  if (cipher_id != 0) {
857  if (cipher_id != cp->id) {
858  continue;
859  }
860  } else if (strength_bits >= 0) {
861  if (strength_bits != SSL_CIPHER_get_bits(cp, NULL)) {
862  continue;
863  }
864  } else {
865  if (!(alg_mkey & cp->algorithm_mkey) ||
866  !(alg_auth & cp->algorithm_auth) ||
867  !(alg_enc & cp->algorithm_enc) ||
868  !(alg_mac & cp->algorithm_mac) ||
869  (min_version != 0 && SSL_CIPHER_get_min_version(cp) != min_version) ||
870  // The NULL cipher must be selected explicitly.
871  cp->algorithm_enc == SSL_eNULL) {
872  continue;
873  }
874  }
875 
876  // add the cipher if it has not been added yet.
877  if (rule == CIPHER_ADD) {
878  // reverse == false
879  if (!curr->active) {
880  ll_append_tail(&head, curr, &tail);
881  curr->active = true;
882  curr->in_group = in_group;
883  }
884  }
885 
886  // Move the added cipher to this location
887  else if (rule == CIPHER_ORD) {
888  // reverse == false
889  if (curr->active) {
890  ll_append_tail(&head, curr, &tail);
891  curr->in_group = false;
892  }
893  } else if (rule == CIPHER_DEL) {
894  // reverse == true
895  if (curr->active) {
896  // most recently deleted ciphersuites get best positions
897  // for any future CIPHER_ADD (note that the CIPHER_DEL loop
898  // works in reverse to maintain the order)
899  ll_append_head(&head, curr, &tail);
900  curr->active = false;
901  curr->in_group = false;
902  }
903  } else if (rule == CIPHER_KILL) {
904  // reverse == false
905  if (head == curr) {
906  head = curr->next;
907  } else {
908  curr->prev->next = curr->next;
909  }
910 
911  if (tail == curr) {
912  tail = curr->prev;
913  }
914  curr->active = false;
915  if (curr->next != NULL) {
916  curr->next->prev = curr->prev;
917  }
918  if (curr->prev != NULL) {
919  curr->prev->next = curr->next;
920  }
921  curr->next = NULL;
922  curr->prev = NULL;
923  }
924  }
925 
926  *head_p = head;
927  *tail_p = tail;
928 }
929 
931  CIPHER_ORDER **tail_p) {
932  // This routine sorts the ciphers with descending strength. The sorting must
933  // keep the pre-sorted sequence, so we apply the normal sorting routine as
934  // '+' movement to the end of the list.
935  int max_strength_bits = 0;
936  CIPHER_ORDER *curr = *head_p;
937  while (curr != NULL) {
938  if (curr->active &&
939  SSL_CIPHER_get_bits(curr->cipher, NULL) > max_strength_bits) {
940  max_strength_bits = SSL_CIPHER_get_bits(curr->cipher, NULL);
941  }
942  curr = curr->next;
943  }
944 
945  Array<int> number_uses;
946  if (!number_uses.Init(max_strength_bits + 1)) {
947  return false;
948  }
949  OPENSSL_memset(number_uses.data(), 0, (max_strength_bits + 1) * sizeof(int));
950 
951  // Now find the strength_bits values actually used.
952  curr = *head_p;
953  while (curr != NULL) {
954  if (curr->active) {
955  number_uses[SSL_CIPHER_get_bits(curr->cipher, NULL)]++;
956  }
957  curr = curr->next;
958  }
959 
960  // Go through the list of used strength_bits values in descending order.
961  for (int i = max_strength_bits; i >= 0; i--) {
962  if (number_uses[i] > 0) {
963  ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, CIPHER_ORD, i, false, head_p,
964  tail_p);
965  }
966  }
967 
968  return true;
969 }
970 
971 static bool ssl_cipher_process_rulestr(const char *rule_str,
972  CIPHER_ORDER **head_p,
973  CIPHER_ORDER **tail_p, bool strict) {
974  uint32_t alg_mkey, alg_auth, alg_enc, alg_mac;
975  uint16_t min_version;
976  const char *l, *buf;
977  int rule;
978  bool multi, skip_rule, in_group = false, has_group = false;
979  size_t j, buf_len;
980  uint32_t cipher_id;
981  char ch;
982 
983  l = rule_str;
984  for (;;) {
985  ch = *l;
986 
987  if (ch == '\0') {
988  break; // done
989  }
990 
991  if (in_group) {
992  if (ch == ']') {
993  if (*tail_p) {
994  (*tail_p)->in_group = false;
995  }
996  in_group = false;
997  l++;
998  continue;
999  }
1000 
1001  if (ch == '|') {
1002  rule = CIPHER_ADD;
1003  l++;
1004  continue;
1005  } else if (!(ch >= 'a' && ch <= 'z') && !(ch >= 'A' && ch <= 'Z') &&
1006  !(ch >= '0' && ch <= '9')) {
1008  return false;
1009  } else {
1010  rule = CIPHER_ADD;
1011  }
1012  } else if (ch == '-') {
1013  rule = CIPHER_DEL;
1014  l++;
1015  } else if (ch == '+') {
1016  rule = CIPHER_ORD;
1017  l++;
1018  } else if (ch == '!') {
1019  rule = CIPHER_KILL;
1020  l++;
1021  } else if (ch == '@') {
1022  rule = CIPHER_SPECIAL;
1023  l++;
1024  } else if (ch == '[') {
1025  assert(!in_group);
1026  in_group = true;
1027  has_group = true;
1028  l++;
1029  continue;
1030  } else {
1031  rule = CIPHER_ADD;
1032  }
1033 
1034  // If preference groups are enabled, the only legal operator is +.
1035  // Otherwise the in_group bits will get mixed up.
1036  if (has_group && rule != CIPHER_ADD) {
1038  return false;
1039  }
1040 
1041  if (is_cipher_list_separator(ch, strict)) {
1042  l++;
1043  continue;
1044  }
1045 
1046  multi = false;
1047  cipher_id = 0;
1048  alg_mkey = ~0u;
1049  alg_auth = ~0u;
1050  alg_enc = ~0u;
1051  alg_mac = ~0u;
1052  min_version = 0;
1053  skip_rule = false;
1054 
1055  for (;;) {
1056  ch = *l;
1057  buf = l;
1058  buf_len = 0;
1059  while ((ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') ||
1060  (ch >= 'a' && ch <= 'z') || ch == '-' || ch == '.' || ch == '_') {
1061  ch = *(++l);
1062  buf_len++;
1063  }
1064 
1065  if (buf_len == 0) {
1066  // We hit something we cannot deal with, it is no command or separator
1067  // nor alphanumeric, so we call this an error.
1069  return false;
1070  }
1071 
1072  if (rule == CIPHER_SPECIAL) {
1073  break;
1074  }
1075 
1076  // Look for a matching exact cipher. These aren't allowed in multipart
1077  // rules.
1078  if (!multi && ch != '+') {
1079  for (j = 0; j < OPENSSL_ARRAY_SIZE(kCiphers); j++) {
1080  const SSL_CIPHER *cipher = &kCiphers[j];
1081  if (rule_equals(cipher->name, buf, buf_len) ||
1082  rule_equals(cipher->standard_name, buf, buf_len)) {
1083  cipher_id = cipher->id;
1084  break;
1085  }
1086  }
1087  }
1088  if (cipher_id == 0) {
1089  // If not an exact cipher, look for a matching cipher alias.
1090  for (j = 0; j < kCipherAliasesLen; j++) {
1091  if (rule_equals(kCipherAliases[j].name, buf, buf_len)) {
1092  alg_mkey &= kCipherAliases[j].algorithm_mkey;
1093  alg_auth &= kCipherAliases[j].algorithm_auth;
1094  alg_enc &= kCipherAliases[j].algorithm_enc;
1095  alg_mac &= kCipherAliases[j].algorithm_mac;
1096 
1097  if (min_version != 0 &&
1098  min_version != kCipherAliases[j].min_version) {
1099  skip_rule = true;
1100  } else {
1101  min_version = kCipherAliases[j].min_version;
1102  }
1103  break;
1104  }
1105  }
1106  if (j == kCipherAliasesLen) {
1107  skip_rule = true;
1108  if (strict) {
1110  return false;
1111  }
1112  }
1113  }
1114 
1115  // Check for a multipart rule.
1116  if (ch != '+') {
1117  break;
1118  }
1119  l++;
1120  multi = true;
1121  }
1122 
1123  // Ok, we have the rule, now apply it.
1124  if (rule == CIPHER_SPECIAL) {
1125  if (buf_len != 8 || strncmp(buf, "STRENGTH", 8) != 0) {
1127  return false;
1128  }
1129  if (!ssl_cipher_strength_sort(head_p, tail_p)) {
1130  return false;
1131  }
1132 
1133  // We do not support any "multi" options together with "@", so throw away
1134  // the rest of the command, if any left, until end or ':' is found.
1135  while (*l != '\0' && !is_cipher_list_separator(*l, strict)) {
1136  l++;
1137  }
1138  } else if (!skip_rule) {
1139  ssl_cipher_apply_rule(cipher_id, alg_mkey, alg_auth, alg_enc, alg_mac,
1140  min_version, rule, -1, in_group, head_p, tail_p);
1141  }
1142  }
1143 
1144  if (in_group) {
1146  return false;
1147  }
1148 
1149  return true;
1150 }
1151 
1152 bool ssl_create_cipher_list(UniquePtr<SSLCipherPreferenceList> *out_cipher_list,
1153  const char *rule_str, bool strict) {
1154  // Return with error if nothing to do.
1155  if (rule_str == NULL || out_cipher_list == NULL) {
1156  return false;
1157  }
1158 
1159  // Now we have to collect the available ciphers from the compiled in ciphers.
1160  // We cannot get more than the number compiled in, so it is used for
1161  // allocation.
1162  Array<CIPHER_ORDER> co_list;
1163  CIPHER_ORDER *head = nullptr, *tail = nullptr;
1164  if (!ssl_cipher_collect_ciphers(&co_list, &head, &tail)) {
1165  return false;
1166  }
1167 
1168  // Now arrange all ciphers by preference:
1169  // TODO(davidben): Compute this order once and copy it.
1170 
1171  // Everything else being equal, prefer ECDHE_ECDSA and ECDHE_RSA over other
1172  // key exchange mechanisms
1174  false, &head, &tail);
1175  ssl_cipher_apply_rule(0, SSL_kECDHE, ~0u, ~0u, ~0u, 0, CIPHER_ADD, -1, false,
1176  &head, &tail);
1177  ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_DEL, -1, false, &head,
1178  &tail);
1179 
1180  // Order the bulk ciphers. First the preferred AEAD ciphers. We prefer
1181  // CHACHA20 unless there is hardware support for fast and constant-time
1182  // AES_GCM. Of the two CHACHA20 variants, the new one is preferred over the
1183  // old one.
1184  if (EVP_has_aes_hardware()) {
1185  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128GCM, ~0u, 0, CIPHER_ADD, -1,
1186  false, &head, &tail);
1187  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256GCM, ~0u, 0, CIPHER_ADD, -1,
1188  false, &head, &tail);
1190  -1, false, &head, &tail);
1191  } else {
1193  -1, false, &head, &tail);
1194  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128GCM, ~0u, 0, CIPHER_ADD, -1,
1195  false, &head, &tail);
1196  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256GCM, ~0u, 0, CIPHER_ADD, -1,
1197  false, &head, &tail);
1198  }
1199 
1200  // Then the legacy non-AEAD ciphers: AES_128_CBC, AES_256_CBC,
1201  // 3DES_EDE_CBC_SHA.
1202  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128, ~0u, 0, CIPHER_ADD, -1, false,
1203  &head, &tail);
1204  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256, ~0u, 0, CIPHER_ADD, -1, false,
1205  &head, &tail);
1206  ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_3DES, ~0u, 0, CIPHER_ADD, -1, false,
1207  &head, &tail);
1208 
1209  // Temporarily enable everything else for sorting
1210  ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_ADD, -1, false, &head,
1211  &tail);
1212 
1213  // Move ciphers without forward secrecy to the end.
1214  ssl_cipher_apply_rule(0, (SSL_kRSA | SSL_kPSK), ~0u, ~0u, ~0u, 0, CIPHER_ORD,
1215  -1, false, &head, &tail);
1216 
1217  // Now disable everything (maintaining the ordering!)
1218  ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_DEL, -1, false, &head,
1219  &tail);
1220 
1221  // If the rule_string begins with DEFAULT, apply the default rule before
1222  // using the (possibly available) additional rules.
1223  const char *rule_p = rule_str;
1224  if (strncmp(rule_str, "DEFAULT", 7) == 0) {
1226  strict)) {
1227  return false;
1228  }
1229  rule_p += 7;
1230  if (*rule_p == ':') {
1231  rule_p++;
1232  }
1233  }
1234 
1235  if (*rule_p != '\0' &&
1236  !ssl_cipher_process_rulestr(rule_p, &head, &tail, strict)) {
1237  return false;
1238  }
1239 
1240  // Allocate new "cipherstack" for the result, return with error
1241  // if we cannot get one.
1243  Array<bool> in_group_flags;
1244  if (cipherstack == nullptr ||
1245  !in_group_flags.Init(OPENSSL_ARRAY_SIZE(kCiphers))) {
1246  return false;
1247  }
1248 
1249  // The cipher selection for the list is done. The ciphers are added
1250  // to the resulting precedence to the STACK_OF(SSL_CIPHER).
1251  size_t num_in_group_flags = 0;
1252  for (CIPHER_ORDER *curr = head; curr != NULL; curr = curr->next) {
1253  if (curr->active) {
1254  if (!sk_SSL_CIPHER_push(cipherstack.get(), curr->cipher)) {
1255  return false;
1256  }
1257  in_group_flags[num_in_group_flags++] = curr->in_group;
1258  }
1259  }
1260 
1261  UniquePtr<SSLCipherPreferenceList> pref_list =
1262  MakeUnique<SSLCipherPreferenceList>();
1263  if (!pref_list ||
1264  !pref_list->Init(
1265  std::move(cipherstack),
1266  MakeConstSpan(in_group_flags).subspan(0, num_in_group_flags))) {
1267  return false;
1268  }
1269 
1270  *out_cipher_list = std::move(pref_list);
1271 
1272  // Configuring an empty cipher list is an error but still updates the
1273  // output.
1274  if (sk_SSL_CIPHER_num((*out_cipher_list)->ciphers.get()) == 0) {
1276  return false;
1277  }
1278 
1279  return true;
1280 }
1281 
1283  switch (EVP_PKEY_id(key)) {
1284  case EVP_PKEY_RSA:
1285  return SSL_aRSA;
1286  case EVP_PKEY_EC:
1287  case EVP_PKEY_ED25519:
1288  // Ed25519 keys in TLS 1.2 repurpose the ECDSA ciphers.
1289  return SSL_aECDSA;
1290  default:
1291  return 0;
1292  }
1293 }
1294 
1296  return (cipher->algorithm_auth & SSL_aCERT) != 0;
1297 }
1298 
1300  // Ephemeral Diffie-Hellman key exchanges require a ServerKeyExchange. It is
1301  // optional or omitted in all others.
1302  return (cipher->algorithm_mkey & SSL_kECDHE) != 0;
1303 }
1304 
1306  size_t block_size;
1307  switch (cipher->algorithm_enc) {
1308  case SSL_3DES:
1309  block_size = 8;
1310  break;
1311  case SSL_AES128:
1312  case SSL_AES256:
1313  block_size = 16;
1314  break;
1315  default:
1316  return 0;
1317  }
1318 
1319  // All supported TLS 1.0 ciphers use SHA-1.
1320  assert(cipher->algorithm_mac == SSL_SHA1);
1321  size_t ret = 1 + SHA_DIGEST_LENGTH;
1322  ret += block_size - (ret % block_size);
1323  return ret;
1324 }
1325 
1327 
1328 using namespace bssl;
1329 
1330 static constexpr int ssl_cipher_id_cmp_inner(const SSL_CIPHER *a,
1331  const SSL_CIPHER *b) {
1332  // C++11's constexpr functions must have a body consisting of just a
1333  // return-statement.
1334  return (a->id > b->id) ? 1 : ((a->id < b->id) ? -1 : 0);
1335 }
1336 
1337 static int ssl_cipher_id_cmp(const void *in_a, const void *in_b) {
1338  return ssl_cipher_id_cmp_inner(reinterpret_cast<const SSL_CIPHER *>(in_a),
1339  reinterpret_cast<const SSL_CIPHER *>(in_b));
1340 }
1341 
1342 template <typename T, size_t N>
1343 static constexpr size_t countof(T const (&)[N]) {
1344  return N;
1345 }
1346 
1347 template <typename T, size_t I>
1348 static constexpr int check_order(const T (&arr)[I], size_t N) {
1349  // C++11's constexpr functions must have a body consisting of just a
1350  // return-statement.
1351  return N > 1 ? ((ssl_cipher_id_cmp_inner(&arr[N - 2], &arr[N - 1]) < 0)
1352  ? check_order(arr, N - 1)
1353  : 0)
1354  : 1;
1355 }
1356 
1357 static_assert(check_order(kCiphers, countof(kCiphers)) == 1,
1358  "Ciphers are not sorted, bsearch won't work");
1359 
1361  SSL_CIPHER c;
1362 
1363  c.id = 0x03000000L | value;
1364  return reinterpret_cast<const SSL_CIPHER *>(bsearch(
1367 }
1368 
1369 uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher) { return cipher->id; }
1370 
1372  // All OpenSSL cipher IDs are prefaced with 0x03. Historically this referred
1373  // to SSLv2 vs SSLv3.
1374  assert((cipher->id & 0xff000000) == 0x03000000);
1375  return static_cast<uint16_t>(cipher->id);
1376 }
1377 
1379  return SSL_CIPHER_get_protocol_id(cipher);
1380 }
1381 
1382 int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher) {
1383  return (cipher->algorithm_mac & SSL_AEAD) != 0;
1384 }
1385 
1387  switch (cipher->algorithm_enc) {
1388  case SSL_eNULL:
1389  return NID_undef;
1390  case SSL_3DES:
1391  return NID_des_ede3_cbc;
1392  case SSL_AES128:
1393  return NID_aes_128_cbc;
1394  case SSL_AES256:
1395  return NID_aes_256_cbc;
1396  case SSL_AES128GCM:
1397  return NID_aes_128_gcm;
1398  case SSL_AES256GCM:
1399  return NID_aes_256_gcm;
1400  case SSL_CHACHA20POLY1305:
1401  return NID_chacha20_poly1305;
1402  }
1403  assert(0);
1404  return NID_undef;
1405 }
1406 
1408  switch (cipher->algorithm_mac) {
1409  case SSL_AEAD:
1410  return NID_undef;
1411  case SSL_SHA1:
1412  return NID_sha1;
1413  }
1414  assert(0);
1415  return NID_undef;
1416 }
1417 
1418 int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *cipher) {
1419  switch (cipher->algorithm_mkey) {
1420  case SSL_kRSA:
1421  return NID_kx_rsa;
1422  case SSL_kECDHE:
1423  return NID_kx_ecdhe;
1424  case SSL_kPSK:
1425  return NID_kx_psk;
1426  case SSL_kGENERIC:
1427  return NID_kx_any;
1428  }
1429  assert(0);
1430  return NID_undef;
1431 }
1432 
1434  switch (cipher->algorithm_auth) {
1435  case SSL_aRSA:
1436  return NID_auth_rsa;
1437  case SSL_aECDSA:
1438  return NID_auth_ecdsa;
1439  case SSL_aPSK:
1440  return NID_auth_psk;
1441  case SSL_aGENERIC:
1442  return NID_auth_any;
1443  }
1444  assert(0);
1445  return NID_undef;
1446 }
1447 
1449  switch (cipher->algorithm_prf) {
1451  return NID_md5_sha1;
1453  return NID_sha256;
1455  return NID_sha384;
1456  }
1457  assert(0);
1458  return NID_undef;
1459 }
1460 
1462  return (cipher->algorithm_enc & SSL_eNULL) == 0 &&
1463  cipher->algorithm_mac != SSL_AEAD;
1464 }
1465 
1467  if (cipher->algorithm_mkey == SSL_kGENERIC ||
1468  cipher->algorithm_auth == SSL_aGENERIC) {
1469  return TLS1_3_VERSION;
1470  }
1471 
1472  if (cipher->algorithm_prf != SSL_HANDSHAKE_MAC_DEFAULT) {
1473  // Cipher suites before TLS 1.2 use the default PRF, while all those added
1474  // afterwards specify a particular hash.
1475  return TLS1_2_VERSION;
1476  }
1477  return SSL3_VERSION;
1478 }
1479 
1481  if (cipher->algorithm_mkey == SSL_kGENERIC ||
1482  cipher->algorithm_auth == SSL_aGENERIC) {
1483  return TLS1_3_VERSION;
1484  }
1485  return TLS1_2_VERSION;
1486 }
1487 
1488 // return the actual cipher being used
1489 const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher) {
1490  if (cipher != NULL) {
1491  return cipher->name;
1492  }
1493 
1494  return "(NONE)";
1495 }
1496 
1497 const char *SSL_CIPHER_standard_name(const SSL_CIPHER *cipher) {
1498  return cipher->standard_name;
1499 }
1500 
1501 const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) {
1502  if (cipher == NULL) {
1503  return "";
1504  }
1505 
1506  switch (cipher->algorithm_mkey) {
1507  case SSL_kRSA:
1508  return "RSA";
1509 
1510  case SSL_kECDHE:
1511  switch (cipher->algorithm_auth) {
1512  case SSL_aECDSA:
1513  return "ECDHE_ECDSA";
1514  case SSL_aRSA:
1515  return "ECDHE_RSA";
1516  case SSL_aPSK:
1517  return "ECDHE_PSK";
1518  default:
1519  assert(0);
1520  return "UNKNOWN";
1521  }
1522 
1523  case SSL_kPSK:
1524  assert(cipher->algorithm_auth == SSL_aPSK);
1525  return "PSK";
1526 
1527  case SSL_kGENERIC:
1528  assert(cipher->algorithm_auth == SSL_aGENERIC);
1529  return "GENERIC";
1530 
1531  default:
1532  assert(0);
1533  return "UNKNOWN";
1534  }
1535 }
1536 
1537 char *SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher) {
1538  if (cipher == NULL) {
1539  return NULL;
1540  }
1541 
1542  return OPENSSL_strdup(SSL_CIPHER_standard_name(cipher));
1543 }
1544 
1545 int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) {
1546  if (cipher == NULL) {
1547  return 0;
1548  }
1549 
1550  int alg_bits, strength_bits;
1551  switch (cipher->algorithm_enc) {
1552  case SSL_AES128:
1553  case SSL_AES128GCM:
1554  alg_bits = 128;
1555  strength_bits = 128;
1556  break;
1557 
1558  case SSL_AES256:
1559  case SSL_AES256GCM:
1560  case SSL_CHACHA20POLY1305:
1561  alg_bits = 256;
1562  strength_bits = 256;
1563  break;
1564 
1565  case SSL_3DES:
1566  alg_bits = 168;
1567  strength_bits = 112;
1568  break;
1569 
1570  case SSL_eNULL:
1571  alg_bits = 0;
1572  strength_bits = 0;
1573  break;
1574 
1575  default:
1576  assert(0);
1577  alg_bits = 0;
1578  strength_bits = 0;
1579  }
1580 
1581  if (out_alg_bits != NULL) {
1582  *out_alg_bits = alg_bits;
1583  }
1584  return strength_bits;
1585 }
1586 
1587 const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf,
1588  int len) {
1589  const char *kx, *au, *enc, *mac;
1590  uint32_t alg_mkey, alg_auth, alg_enc, alg_mac;
1591 
1592  alg_mkey = cipher->algorithm_mkey;
1593  alg_auth = cipher->algorithm_auth;
1594  alg_enc = cipher->algorithm_enc;
1595  alg_mac = cipher->algorithm_mac;
1596 
1597  switch (alg_mkey) {
1598  case SSL_kRSA:
1599  kx = "RSA";
1600  break;
1601 
1602  case SSL_kECDHE:
1603  kx = "ECDH";
1604  break;
1605 
1606  case SSL_kPSK:
1607  kx = "PSK";
1608  break;
1609 
1610  case SSL_kGENERIC:
1611  kx = "GENERIC";
1612  break;
1613 
1614  default:
1615  kx = "unknown";
1616  }
1617 
1618  switch (alg_auth) {
1619  case SSL_aRSA:
1620  au = "RSA";
1621  break;
1622 
1623  case SSL_aECDSA:
1624  au = "ECDSA";
1625  break;
1626 
1627  case SSL_aPSK:
1628  au = "PSK";
1629  break;
1630 
1631  case SSL_aGENERIC:
1632  au = "GENERIC";
1633  break;
1634 
1635  default:
1636  au = "unknown";
1637  break;
1638  }
1639 
1640  switch (alg_enc) {
1641  case SSL_3DES:
1642  enc = "3DES(168)";
1643  break;
1644 
1645  case SSL_AES128:
1646  enc = "AES(128)";
1647  break;
1648 
1649  case SSL_AES256:
1650  enc = "AES(256)";
1651  break;
1652 
1653  case SSL_AES128GCM:
1654  enc = "AESGCM(128)";
1655  break;
1656 
1657  case SSL_AES256GCM:
1658  enc = "AESGCM(256)";
1659  break;
1660 
1661  case SSL_CHACHA20POLY1305:
1662  enc = "ChaCha20-Poly1305";
1663  break;
1664 
1665  case SSL_eNULL:
1666  enc="None";
1667  break;
1668 
1669  default:
1670  enc = "unknown";
1671  break;
1672  }
1673 
1674  switch (alg_mac) {
1675  case SSL_SHA1:
1676  mac = "SHA1";
1677  break;
1678 
1679  case SSL_AEAD:
1680  mac = "AEAD";
1681  break;
1682 
1683  default:
1684  mac = "unknown";
1685  break;
1686  }
1687 
1688  if (buf == NULL) {
1689  len = 128;
1690  buf = (char *)OPENSSL_malloc(len);
1691  if (buf == NULL) {
1692  return NULL;
1693  }
1694  } else if (len < 128) {
1695  return "Buffer too small";
1696  }
1697 
1698  BIO_snprintf(buf, len, "%-23s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s\n",
1699  cipher->name, kx, au, enc, mac);
1700  return buf;
1701 }
1702 
1703 const char *SSL_CIPHER_get_version(const SSL_CIPHER *cipher) {
1704  return "TLSv1/SSLv3";
1705 }
1706 
1708 
1709 int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm) { return 1; }
1710 
1711 const char *SSL_COMP_get_name(const COMP_METHOD *comp) { return NULL; }
1712 
1713 const char *SSL_COMP_get0_name(const SSL_COMP *comp) { return comp->name; }
1714 
1715 int SSL_COMP_get_id(const SSL_COMP *comp) { return comp->id; }
1716 
NID_aes_128_gcm
#define NID_aes_128_gcm
Definition: nid.h:3963
check_order
static constexpr int check_order(const T(&arr)[I], size_t N)
Definition: ssl_cipher.cc:1348
cipher_alias_st::algorithm_mac
uint32_t algorithm_mac
Definition: ssl_cipher.cc:493
SSL_AEAD
#define SSL_AEAD
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:568
ssl_get_handshake_digest
const EVP_MD * ssl_get_handshake_digest(uint16_t version, const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:637
cipher_order_st::in_group
bool in_group
Definition: ssl_cipher.cc:478
CIPHER_ADD
#define CIPHER_ADD
Definition: ssl_cipher.cc:469
SSL_CIPHER_get_auth_nid
int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1433
countof
static constexpr size_t countof(T const (&)[N])
Definition: ssl_cipher.cc:1343
TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:444
ssl_cipher_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:520
TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
Definition: tls1.h:513
NID_md5_sha1
#define NID_md5_sha1
Definition: nid.h:603
EVP_PKEY_id
#define EVP_PKEY_id
Definition: boringssl_prefix_symbols.h:1638
EVP_PKEY_EC
#define EVP_PKEY_EC
Definition: evp.h:178
SSL_CIPHER_get_value
uint16_t SSL_CIPHER_get_value(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1378
SSL_DEFAULT_CIPHER_LIST
#define SSL_DEFAULT_CIPHER_LIST
Definition: ssl.h:1503
CIPHER_ALIAS
struct cipher_alias_st CIPHER_ALIAS
sk_SSL_CIPHER_new_null
#define sk_SSL_CIPHER_new_null
Definition: boringssl_prefix_symbols.h:569
Array::Init
bool Init(size_t new_size)
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:314
EVP_md5_sha1
const OPENSSL_EXPORT EVP_MD * EVP_md5_sha1(void)
TLS1_TXT_PSK_WITH_AES_128_CBC_SHA
#define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA
Definition: tls1.h:524
SSL_HANDSHAKE_MAC_SHA256
#define SSL_HANDSHAKE_MAC_SHA256
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:572
sk_SSL_CIPHER_find
#define sk_SSL_CIPHER_find
Definition: boringssl_prefix_symbols.h:568
cipher_alias_st::name
const char * name
Definition: ssl_cipher.cc:484
NID_kx_ecdhe
#define NID_kx_ecdhe
Definition: nid.h:4212
Span::size
size_t size() const
Definition: boringssl-with-bazel/src/include/openssl/span.h:133
NID_aes_128_cbc
#define NID_aes_128_cbc
Definition: nid.h:1933
SSL_CHACHA20POLY1305
#define SSL_CHACHA20POLY1305
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:561
TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA
#define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA
Definition: tls1.h:300
EVP_aead_aes_256_cbc_sha1_tls
#define EVP_aead_aes_256_cbc_sha1_tls
Definition: boringssl_prefix_symbols.h:1686
NID_kx_any
#define NID_kx_any
Definition: nid.h:4232
SSL_SHA1
#define SSL_SHA1
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:566
env_md_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/digest/internal.h:67
Array::data
const T * data() const
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:274
SSL_CIPHER_get_prf_nid
int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1448
NID_auth_psk
#define NID_auth_psk
Definition: nid.h:4228
ssl_cipher_strength_sort
static bool ssl_cipher_strength_sort(CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
Definition: ssl_cipher.cc:930
TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:450
NID_auth_rsa
#define NID_auth_rsa
Definition: nid.h:4220
TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:614
uint16_t
unsigned short uint16_t
Definition: stdint-msvc2008.h:79
SSL_CIPHER_get_min_version
uint16_t SSL_CIPHER_get_min_version(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1466
SSLCipherPreferenceList::ciphers
UniquePtr< STACK_OF(SSL_CIPHER)> ciphers
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:620
TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:621
EVP_sha384
const OPENSSL_EXPORT EVP_MD * EVP_sha384(void)
TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:619
EVP_aead_aes_256_cbc_sha1_tls_implicit_iv
#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv
Definition: boringssl_prefix_symbols.h:1687
ssl_cipher_collect_ciphers
static bool ssl_cipher_collect_ciphers(Array< CIPHER_ORDER > *out_co_list, CIPHER_ORDER **out_head, CIPHER_ORDER **out_tail)
Definition: ssl_cipher.cc:706
ssl_cipher_st::id
uint32_t id
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:526
SSL3_CK_RSA_DES_192_CBC3_SHA
#define SSL3_CK_RSA_DES_192_CBC3_SHA
Definition: ssl3.h:147
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
internal.h
EVP_aead_aes_128_gcm_tls13
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls13(void)
SSL_COMP_get_compression_methods
#define SSL_COMP_get_compression_methods
Definition: boringssl_prefix_symbols.h:65
SSL_CIPHER_get_digest_nid
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1407
TLS1_CK_RSA_WITH_AES_128_SHA
#define TLS1_CK_RSA_WITH_AES_128_SHA
Definition: tls1.h:317
string.h
copy
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
Definition: message_compress.cc:145
OPENSSL_ARRAY_SIZE
#define OPENSSL_ARRAY_SIZE(array)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:179
ssl_cipher_st::algorithm_prf
uint32_t algorithm_prf
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:533
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
TLS1_CK_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:373
EVP_aead_aes_128_cbc_sha1_tls
#define EVP_aead_aes_128_cbc_sha1_tls
Definition: boringssl_prefix_symbols.h:1675
cipher_order_st::prev
struct cipher_order_st * prev
Definition: ssl_cipher.cc:479
SSL3_TXT_RSA_NULL_SHA
#define SSL3_TXT_RSA_NULL_SHA
Definition: ssl3.h:170
ssl_cipher_auth_mask_for_key
uint32_t ssl_cipher_auth_mask_for_key(const EVP_PKEY *key)
Definition: ssl_cipher.cc:1282
TLS1_TXT_RSA_WITH_AES_256_SHA
#define TLS1_TXT_RSA_WITH_AES_256_SHA
Definition: tls1.h:483
u
OPENSSL_EXPORT pem_password_cb void * u
Definition: pem.h:351
bssl
Definition: hpke_test.cc:37
EVP_PKEY_RSA
#define EVP_PKEY_RSA
Definition: evp.h:175
SSL_kRSA
#define SSL_kRSA
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:539
setup.name
name
Definition: setup.py:542
version
Definition: version.py:1
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
SSLCipherPreferenceList
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:608
ssl_comp_st::id
int id
Definition: ssl.h:4743
COMP_METHOD
void COMP_METHOD
Definition: ssl.h:4456
NID_sha384
#define NID_sha384
Definition: nid.h:2998
EVP_sha256
const OPENSSL_EXPORT EVP_MD * EVP_sha256(void)
SSL_AES
#define SSL_AES
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:563
rule_equals
static bool rule_equals(const char *rule, const char *buf, size_t buf_len)
Definition: ssl_cipher.cc:661
EVP_aead_des_ede3_cbc_sha1_tls
#define EVP_aead_des_ede3_cbc_sha1_tls
Definition: boringssl_prefix_symbols.h:1695
TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:581
OPENSSL_memset
static void * OPENSSL_memset(void *dst, int c, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:835
cipher_order_st::cipher
const SSL_CIPHER * cipher
Definition: ssl_cipher.cc:476
T
#define T(upbtypeconst, upbtype, ctype, default_value)
SSL_AES256GCM
#define SSL_AES256GCM
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:559
ssl_cipher_get_record_split_len
size_t ssl_cipher_get_record_split_len(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1305
TLS1_CK_CHACHA20_POLY1305_SHA256
#define TLS1_CK_CHACHA20_POLY1305_SHA256
Definition: tls1.h:457
ssl_cipher_uses_certificate_auth
bool ssl_cipher_uses_certificate_auth(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1295
SSL_CIPHER_get_name
const char * SSL_CIPHER_get_name(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1489
EVP_PKEY_ED25519
#define EVP_PKEY_ED25519
Definition: evp.h:179
sk_SSL_CIPHER_push
#define sk_SSL_CIPHER_push
Definition: boringssl_prefix_symbols.h:571
SSLCipherPreferenceList::in_group_flags
bool * in_group_flags
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:621
NID_auth_ecdsa
#define NID_auth_ecdsa
Definition: nid.h:4224
EVP_AEAD_nonce_length
#define EVP_AEAD_nonce_length
Definition: boringssl_prefix_symbols.h:1461
ssl_cipher_id_cmp_inner
static constexpr int ssl_cipher_id_cmp_inner(const SSL_CIPHER *a, const SSL_CIPHER *b)
Definition: ssl_cipher.cc:1330
EVP_aead_aes_256_gcm_tls13
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls13(void)
SSL_aCERT
#define SSL_aCERT
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:552
make_dist_html.reverse
reverse
Definition: make_dist_html.py:119
uint32_t
unsigned int uint32_t
Definition: stdint-msvc2008.h:80
ssl_create_cipher_list
bool ssl_create_cipher_list(UniquePtr< SSLCipherPreferenceList > *out_cipher_list, const char *rule_str, bool strict)
Definition: ssl_cipher.cc:1152
OPENSSL_malloc
#define OPENSSL_malloc
Definition: boringssl_prefix_symbols.h:1885
EVP_aead_aes_256_gcm
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm(void)
SSL_CIPHER_is_aead
int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1382
TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA
#define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA
Definition: tls1.h:528
NID_kx_psk
#define NID_kx_psk
Definition: nid.h:4216
SSL_AES128
#define SSL_AES128
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:556
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
ll_append_tail
static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr, CIPHER_ORDER **tail)
Definition: ssl_cipher.cc:666
SSL_CIPHER_is_block_cipher
int SSL_CIPHER_is_block_cipher(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1461
TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
Definition: tls1.h:501
SSLCipherPreferenceList::Init
bool Init(UniquePtr< STACK_OF(SSL_CIPHER)> ciphers, Span< const bool > in_group_flags)
Definition: ssl_cipher.cc:758
evp_pkey_st
Definition: evp.h:1046
absl::move
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
Definition: abseil-cpp/absl/utility/utility.h:221
Array
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:258
SSL_COMP_add_compression_method
int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
Definition: ssl_cipher.cc:1709
SSL_aPSK
#define SSL_aPSK
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:549
ssl_cipher_st::algorithm_mkey
uint32_t algorithm_mkey
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:529
TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:452
cipher_order_st::active
bool active
Definition: ssl_cipher.cc:477
NID_sha256
#define NID_sha256
Definition: nid.h:2993
cipher_alias_st::min_version
uint16_t min_version
Definition: ssl_cipher.cc:497
EVP_aead_aes_128_gcm_tls12
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls12(void)
ssl_st
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:3698
EVP_aead_null_sha1_tls
#define EVP_aead_null_sha1_tls
Definition: boringssl_prefix_symbols.h:1697
TLS1_CK_RSA_WITH_AES_256_SHA
#define TLS1_CK_RSA_WITH_AES_256_SHA
Definition: tls1.h:324
TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:606
cipher_alias_st::algorithm_mkey
uint32_t algorithm_mkey
Definition: ssl_cipher.cc:490
NID_aes_256_cbc
#define NID_aes_256_cbc
Definition: nid.h:1973
SSL_COMP_get_id
int SSL_COMP_get_id(const SSL_COMP *comp)
Definition: ssl_cipher.cc:1715
ssl_cipher_get_evp_aead
bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, size_t *out_mac_secret_len, size_t *out_fixed_iv_len, const SSL_CIPHER *cipher, uint16_t version, bool is_dtls)
Definition: ssl_cipher.cc:559
sha.h
CIPHER_KILL
#define CIPHER_KILL
Definition: ssl_cipher.cc:470
TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:451
TLS1_CK_PSK_WITH_AES_256_CBC_SHA
#define TLS1_CK_PSK_WITH_AES_256_CBC_SHA
Definition: tls1.h:296
SSL_CIPHER_get_id
uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1369
cipher_alias_st::algorithm_enc
uint32_t algorithm_enc
Definition: ssl_cipher.cc:492
BSSL_NAMESPACE_END
#define BSSL_NAMESPACE_END
Definition: base.h:480
TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:582
ssl_comp_st::name
const char * name
Definition: ssl.h:4744
err.h
ERR_R_INTERNAL_ERROR
#define ERR_R_INTERNAL_ERROR
Definition: err.h:374
SSL_aRSA
#define SSL_aRSA
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:546
SSL_COMP_get_name
const char * SSL_COMP_get_name(const COMP_METHOD *comp)
Definition: ssl_cipher.cc:1711
TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
Definition: tls1.h:500
SSLCipherPreferenceList::Remove
void Remove(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:786
TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:615
NID_undef
#define NID_undef
Definition: nid.h:85
TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
Definition: tls1.h:408
SSL_kGENERIC
#define SSL_kGENERIC
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:543
NID_des_ede3_cbc
#define NID_des_ede3_cbc
Definition: nid.h:287
ssl_cipher_st::algorithm_mac
uint32_t algorithm_mac
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:532
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
ssl_cipher_st::algorithm_auth
uint32_t algorithm_auth
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:530
CIPHER_ORDER
struct cipher_order_st CIPHER_ORDER
NID_sha1
#define NID_sha1
Definition: nid.h:372
Span
Definition: boringssl-with-bazel/src/include/openssl/span.h:32
TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
Definition: tls1.h:396
grpc_core::UniquePtr
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
Definition: src/core/lib/gprpp/memory.h:43
EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv
#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv
Definition: boringssl_prefix_symbols.h:1696
BIO_snprintf
#define BIO_snprintf
Definition: boringssl_prefix_symbols.h:864
SSL_CIPHER_description
const char * SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
Definition: ssl_cipher.cc:1587
NID_kx_rsa
#define NID_kx_rsa
Definition: nid.h:4208
SSL3_CK_RSA_NULL_SHA
#define SSL3_CK_RSA_NULL_SHA
Definition: ssl3.h:139
TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA
#define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA
Definition: tls1.h:529
ssl.h
SSLCipherPreferenceList::~SSLCipherPreferenceList
~SSLCipherPreferenceList()
Definition: ssl_cipher.cc:754
NID_aes_256_gcm
#define NID_aes_256_gcm
Definition: nid.h:3991
SSL3_VERSION
#define SSL3_VERSION
Definition: ssl.h:649
value
const char * value
Definition: hpack_parser_table.cc:165
SSL_AES256
#define SSL_AES256
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:557
evp_aead_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/cipher/internal.h:77
TLS1_3_VERSION
#define TLS1_3_VERSION
Definition: ssl.h:653
EVP_has_aes_hardware
#define EVP_has_aes_hardware
Definition: boringssl_prefix_symbols.h:1729
SSL_CIPHER_get_bits
int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits)
Definition: ssl_cipher.cc:1545
TLS1_2_VERSION
#define TLS1_2_VERSION
Definition: ssl.h:652
SSL_COMP_free_compression_methods
void SSL_COMP_free_compression_methods(void)
Definition: ssl_cipher.cc:1717
BSSL_NAMESPACE_BEGIN
Definition: trust_token_test.cc:45
TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
Definition: tls1.h:409
key
const char * key
Definition: hpack_parser_table.cc:164
cipher_order_st
Definition: ssl_cipher.cc:475
N
#define N
Definition: sync_test.cc:37
CIPHER_DEL
#define CIPHER_DEL
Definition: ssl_cipher.cc:471
TLS1_TXT_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_CHACHA20_POLY1305_SHA256
Definition: tls1.h:629
OPENSSL_strdup
#define OPENSSL_strdup
Definition: boringssl_prefix_symbols.h:1891
I
#define I(b, c, d)
Definition: md5.c:120
TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
Definition: tls1.h:512
TLS1_TXT_AES_256_GCM_SHA384
#define TLS1_TXT_AES_256_GCM_SHA384
Definition: tls1.h:628
ssl_cipher_requires_server_key_exchange
bool ssl_cipher_requires_server_key_exchange(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1299
TLS1_VERSION
#define TLS1_VERSION
Definition: ssl.h:650
md5.h
STACK_OF
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
Definition: ssl_cipher.cc:1707
SSL_R_UNEXPECTED_OPERATOR_IN_GROUP
#define SSL_R_UNEXPECTED_OPERATOR_IN_GROUP
Definition: ssl.h:5491
NID_auth_any
#define NID_auth_any
Definition: nid.h:4236
SSL_kECDHE
#define SSL_kECDHE
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:540
kCipherAliases
static const CIPHER_ALIAS kCipherAliases[]
Definition: ssl_cipher.cc:500
index
int index
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/protobuf.h:1184
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
SSL_kPSK
#define SSL_kPSK
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:542
EVP_aead_aes_256_gcm_tls12
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls12(void)
SSL_CIPHER_get_version
const char * SSL_CIPHER_get_version(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1703
ll_append_head
static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr, CIPHER_ORDER **tail)
Definition: ssl_cipher.cc:686
next
AllocList * next[kMaxLevel]
Definition: abseil-cpp/absl/base/internal/low_level_alloc.cc:100
L
lua_State * L
Definition: upb/upb/bindings/lua/main.c:35
cipher_alias_st::algorithm_auth
uint32_t algorithm_auth
Definition: ssl_cipher.cc:491
SSL_R_INVALID_COMMAND
#define SSL_R_INVALID_COMMAND
Definition: ssl.h:5426
SSL_aECDSA
#define SSL_aECDSA
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:547
CIPHER_ORD
#define CIPHER_ORD
Definition: ssl_cipher.cc:472
EVP_aead_aes_128_cbc_sha1_tls_implicit_iv
#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv
Definition: boringssl_prefix_symbols.h:1676
cipher_alias_st
Definition: ssl_cipher.cc:482
CIPHER_SPECIAL
#define CIPHER_SPECIAL
Definition: ssl_cipher.cc:473
TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:445
ssl_cipher_id_cmp
static int ssl_cipher_id_cmp(const void *in_a, const void *in_b)
Definition: ssl_cipher.cc:1337
TLS1_CK_AES_128_GCM_SHA256
#define TLS1_CK_AES_128_GCM_SHA256
Definition: tls1.h:455
SSL_CIPHER_get_protocol_id
uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1371
ssl_comp_st
Definition: ssl.h:4742
SSL_3DES
#define SSL_3DES
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:555
SHA_DIGEST_LENGTH
#define SHA_DIGEST_LENGTH
Definition: sha.h:74
SSL_COMP_get0_name
const char * SSL_COMP_get0_name(const SSL_COMP *comp)
Definition: ssl_cipher.cc:1713
SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS
#define SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS
Definition: ssl.h:5435
cipher_order_st::next
struct cipher_order_st * next
Definition: ssl_cipher.cc:479
SSL_CIPHER_get_max_version
uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1480
TLS1_TXT_AES_128_GCM_SHA256
#define TLS1_TXT_AES_128_GCM_SHA256
Definition: tls1.h:627
SSL_CIPHER_get_cipher_nid
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1386
EVP_aead_chacha20_poly1305
#define EVP_aead_chacha20_poly1305
Definition: boringssl_prefix_symbols.h:1694
kCiphers
static constexpr BSSL_NAMESPACE_BEGIN SSL_CIPHER kCiphers[]
Definition: ssl_cipher.cc:158
TLS1_CK_AES_256_GCM_SHA384
#define TLS1_CK_AES_256_GCM_SHA384
Definition: tls1.h:456
kCipherAliasesLen
static const size_t kCipherAliasesLen
Definition: ssl_cipher.cc:557
ssl_cipher_st::name
const char * name
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:522
mem.h
SSL_CIPHER_standard_name
const char * SSL_CIPHER_standard_name(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1497
SSL_aGENERIC
#define SSL_aGENERIC
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:550
TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:441
SSL_eNULL
#define SSL_eNULL
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:560
SSL_HANDSHAKE_MAC_SHA384
#define SSL_HANDSHAKE_MAC_SHA384
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:573
ch
char ch
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3621
len
int len
Definition: abseil-cpp/absl/base/internal/low_level_alloc_test.cc:46
SSL_HANDSHAKE_MAC_DEFAULT
#define SSL_HANDSHAKE_MAC_DEFAULT
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:571
TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:608
TLS1_TXT_PSK_WITH_AES_256_CBC_SHA
#define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA
Definition: tls1.h:525
ssl_cipher_st::standard_name
const char * standard_name
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:524
sk_SSL_CIPHER_dup
#define sk_SSL_CIPHER_dup
Definition: boringssl_prefix_symbols.h:567
run_grpclb_interop_tests.l
dictionary l
Definition: run_grpclb_interop_tests.py:410
size
voidpf void uLong size
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
sk_SSL_CIPHER_num
#define sk_SSL_CIPHER_num
Definition: boringssl_prefix_symbols.h:570
SSL_CIPHER_get_rfc_name
char * SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1537
TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA
#define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA
Definition: tls1.h:299
is_cipher_list_separator
static bool is_cipher_list_separator(char c, bool is_strict)
Definition: ssl_cipher.cc:652
sk_SSL_CIPHER_delete
#define sk_SSL_CIPHER_delete
Definition: boringssl_prefix_symbols.h:566
ssl_cipher_process_rulestr
static bool ssl_cipher_process_rulestr(const char *rule_str, CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p, bool strict)
Definition: ssl_cipher.cc:971
AllCiphers
Span< const SSL_CIPHER > AllCiphers()
Definition: ssl_cipher.cc:465
SSL_CIPHER_get_kx_name
const char * SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1501
EVP_aead_aes_128_gcm
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm(void)
OPENSSL_free
#define OPENSSL_free
Definition: boringssl_prefix_symbols.h:1869
SSL_CIPHER_get_kx_nid
int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *cipher)
Definition: ssl_cipher.cc:1418
TLS1_TXT_RSA_WITH_AES_128_SHA
#define TLS1_TXT_RSA_WITH_AES_128_SHA
Definition: tls1.h:476
NID_chacha20_poly1305
#define NID_chacha20_poly1305
Definition: nid.h:4204
TLS1_CK_PSK_WITH_AES_128_CBC_SHA
#define TLS1_CK_PSK_WITH_AES_128_CBC_SHA
Definition: tls1.h:295
SSL_R_NO_CIPHER_MATCH
#define SSL_R_NO_CIPHER_MATCH
Definition: ssl.h:5444
TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
Definition: tls1.h:440
SSL_AES128GCM
#define SSL_AES128GCM
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:558
ssl_cipher_st::algorithm_enc
uint32_t algorithm_enc
Definition: third_party/boringssl-with-bazel/src/ssl/internal.h:531
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
SSL_get_cipher_by_value
const SSL_CIPHER * SSL_get_cipher_by_value(uint16_t value)
Definition: ssl_cipher.cc:1360
TLS1_CK_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384
Definition: tls1.h:374
stack.h
TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
Definition: tls1.h:397
TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
Definition: tls1.h:623
ssl_cipher_apply_rule
static void ssl_cipher_apply_rule(uint32_t cipher_id, uint32_t alg_mkey, uint32_t alg_auth, uint32_t alg_enc, uint32_t alg_mac, uint16_t min_version, int rule, int strength_bits, bool in_group, CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
Definition: ssl_cipher.cc:809
SSL3_TXT_RSA_DES_192_CBC3_SHA
#define SSL3_TXT_RSA_DES_192_CBC3_SHA
Definition: ssl3.h:178
absl::MakeConstSpan
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
Definition: abseil-cpp/absl/types/span.h:707


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:20