Go to the documentation of this file.
153 #include "../crypto/internal.h"
163 "TLS_RSA_WITH_NULL_SHA",
175 "TLS_RSA_WITH_3DES_EDE_CBC_SHA",
190 "TLS_RSA_WITH_AES_128_CBC_SHA",
202 "TLS_RSA_WITH_AES_256_CBC_SHA",
216 "TLS_PSK_WITH_AES_128_CBC_SHA",
228 "TLS_PSK_WITH_AES_256_CBC_SHA",
242 "TLS_RSA_WITH_AES_128_GCM_SHA256",
254 "TLS_RSA_WITH_AES_256_GCM_SHA384",
268 "TLS_AES_128_GCM_SHA256",
280 "TLS_AES_256_GCM_SHA384",
292 "TLS_CHACHA20_POLY1305_SHA256",
304 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
316 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
328 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
340 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
354 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
366 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
378 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
390 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
404 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
416 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
430 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
442 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
454 "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",
470 #define CIPHER_KILL 2
473 #define CIPHER_SPECIAL 5
502 {
"ALL", ~0
u, ~0
u, ~0
u, ~0
u, 0},
548 {
"HIGH", ~0
u, ~0
u, ~0
u, ~0
u, 0},
549 {
"FIPS", ~0
u, ~0
u, ~0
u, ~0
u, 0},
553 {
"SHA256", 0, 0, 0, 0, 0},
554 {
"SHA384", 0, 0, 0, 0, 0},
560 size_t *out_mac_secret_len,
561 size_t *out_fixed_iv_len,
const SSL_CIPHER *cipher,
564 *out_mac_secret_len = 0;
565 *out_fixed_iv_len = 0;
574 }
else if (is_tls13) {
579 *out_fixed_iv_len = 4;
583 }
else if (is_tls13) {
588 *out_fixed_iv_len = 4;
591 *out_fixed_iv_len = 12;
607 *out_fixed_iv_len = 8;
614 *out_fixed_iv_len = 16;
621 *out_fixed_iv_len = 16;
656 return !is_strict && (
c ==
' ' ||
c ==
';' ||
c ==
',');
663 return strncmp(rule,
buf, buf_len) == 0 && rule[buf_len] ==
'\0';
674 if (curr->
prev != NULL) {
677 if (curr->
next != NULL) {
680 (*tail)->
next = curr;
694 if (curr->
next != NULL) {
697 if (curr->
prev != NULL) {
700 (*head)->
prev = curr;
714 size_t co_list_num = 0;
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;
728 if (co_list_num > 0) {
729 co_list[0].prev = NULL;
731 if (co_list_num > 1) {
732 co_list[0].next = &co_list[1];
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];
739 co_list[co_list_num - 1].prev = &co_list[co_list_num - 2];
742 co_list[co_list_num - 1].next = NULL;
744 *out_head = &co_list[0];
745 *out_tail = &co_list[co_list_num - 1];
766 if (!
copy.CopyFrom(in_group_flags_arg)) {
780 if (!other_ciphers) {
812 int strength_bits,
bool in_group,
CIPHER_ORDER **head_p,
818 if (cipher_id == 0 && strength_bits == -1 && min_version == 0 &&
819 (alg_mkey == 0 || alg_auth == 0 || alg_enc == 0 || alg_mac == 0)) {
856 if (cipher_id != 0) {
857 if (cipher_id != cp->
id) {
860 }
else if (strength_bits >= 0) {
915 if (curr->
next != NULL) {
918 if (curr->
prev != NULL) {
935 int max_strength_bits = 0;
937 while (curr != NULL) {
946 if (!number_uses.
Init(max_strength_bits + 1)) {
953 while (curr != NULL) {
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,
974 uint32_t alg_mkey, alg_auth, alg_enc, alg_mac;
978 bool multi, skip_rule, in_group =
false, has_group =
false;
994 (*tail_p)->in_group =
false;
1005 }
else if (!(
ch >=
'a' &&
ch <=
'z') && !(
ch >=
'A' &&
ch <=
'Z') &&
1006 !(
ch >=
'0' &&
ch <=
'9')) {
1012 }
else if (
ch ==
'-') {
1015 }
else if (
ch ==
'+') {
1018 }
else if (
ch ==
'!') {
1021 }
else if (
ch ==
'@') {
1024 }
else if (
ch ==
'[') {
1059 while ((
ch >=
'A' &&
ch <=
'Z') || (
ch >=
'0' &&
ch <=
'9') ||
1060 (
ch >=
'a' &&
ch <=
'z') ||
ch ==
'-' ||
ch ==
'.' ||
ch ==
'_') {
1078 if (!multi &&
ch !=
'+') {
1083 cipher_id = cipher->
id;
1088 if (cipher_id == 0) {
1097 if (min_version != 0 &&
1125 if (buf_len != 8 || strncmp(
buf,
"STRENGTH", 8) != 0) {
1138 }
else if (!skip_rule) {
1140 min_version, rule, -1, in_group, head_p, tail_p);
1153 const char *rule_str,
bool strict) {
1155 if (rule_str == NULL || out_cipher_list == NULL) {
1174 false, &head, &tail);
1177 ssl_cipher_apply_rule(0, ~0
u, ~0
u, ~0
u, ~0
u, 0,
CIPHER_DEL, -1,
false, &head,
1186 false, &head, &tail);
1188 false, &head, &tail);
1190 -1,
false, &head, &tail);
1193 -1,
false, &head, &tail);
1195 false, &head, &tail);
1197 false, &head, &tail);
1210 ssl_cipher_apply_rule(0, ~0
u, ~0
u, ~0
u, ~0
u, 0,
CIPHER_ADD, -1,
false, &head,
1215 -1,
false, &head, &tail);
1218 ssl_cipher_apply_rule(0, ~0
u, ~0
u, ~0
u, ~0
u, 0,
CIPHER_DEL, -1,
false, &head,
1223 const char *rule_p = rule_str;
1224 if (strncmp(rule_str,
"DEFAULT", 7) == 0) {
1230 if (*rule_p ==
':') {
1235 if (*rule_p !=
'\0' &&
1244 if (cipherstack ==
nullptr ||
1251 size_t num_in_group_flags = 0;
1257 in_group_flags[num_in_group_flags++] = curr->in_group;
1261 UniquePtr<SSLCipherPreferenceList> pref_list =
1262 MakeUnique<SSLCipherPreferenceList>();
1266 MakeConstSpan(in_group_flags).subspan(0, num_in_group_flags))) {
1270 *out_cipher_list =
std::move(pref_list);
1322 ret += block_size - (
ret % block_size);
1328 using namespace bssl;
1334 return (
a->id >
b->id) ? 1 : ((
a->id <
b->id) ? -1 : 0);
1342 template <
typename T,
size_t N>
1347 template <
typename T,
size_t I>
1358 "Ciphers are not sorted, bsearch won't work");
1363 c.id = 0x03000000
L |
value;
1364 return reinterpret_cast<const SSL_CIPHER *
>(bsearch(
1374 assert((cipher->
id & 0xff000000) == 0x03000000);
1490 if (cipher != NULL) {
1491 return cipher->
name;
1502 if (cipher == NULL) {
1513 return "ECDHE_ECDSA";
1538 if (cipher == NULL) {
1546 if (cipher == NULL) {
1550 int alg_bits, strength_bits;
1555 strength_bits = 128;
1562 strength_bits = 256;
1567 strength_bits = 112;
1581 if (out_alg_bits != NULL) {
1582 *out_alg_bits = alg_bits;
1584 return strength_bits;
1589 const char *kx, *au, *enc, *mac;
1590 uint32_t alg_mkey, alg_auth, alg_enc, alg_mac;
1654 enc =
"AESGCM(128)";
1658 enc =
"AESGCM(256)";
1662 enc =
"ChaCha20-Poly1305";
1694 }
else if (
len < 128) {
1695 return "Buffer too small";
1699 cipher->
name, kx, au, enc, mac);
1704 return "TLSv1/SSLv3";
static constexpr int check_order(const T(&arr)[I], size_t N)
const EVP_MD * ssl_get_handshake_digest(uint16_t version, const SSL_CIPHER *cipher)
int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *cipher)
static constexpr size_t countof(T const (&)[N])
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256
#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA
uint16_t SSL_CIPHER_get_value(const SSL_CIPHER *cipher)
#define SSL_DEFAULT_CIPHER_LIST
struct cipher_alias_st CIPHER_ALIAS
#define sk_SSL_CIPHER_new_null
bool Init(size_t new_size)
const OPENSSL_EXPORT EVP_MD * EVP_md5_sha1(void)
#define TLS1_TXT_PSK_WITH_AES_128_CBC_SHA
#define SSL_HANDSHAKE_MAC_SHA256
#define sk_SSL_CIPHER_find
#define SSL_CHACHA20POLY1305
#define TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA
#define EVP_aead_aes_256_cbc_sha1_tls
int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher)
static bool ssl_cipher_strength_sort(CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p)
#define TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256
uint16_t SSL_CIPHER_get_min_version(const SSL_CIPHER *cipher)
UniquePtr< STACK_OF(SSL_CIPHER)> ciphers
#define TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
const OPENSSL_EXPORT EVP_MD * EVP_sha384(void)
#define TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
#define EVP_aead_aes_256_cbc_sha1_tls_implicit_iv
static bool ssl_cipher_collect_ciphers(Array< CIPHER_ORDER > *out_co_list, CIPHER_ORDER **out_head, CIPHER_ORDER **out_tail)
#define SSL3_CK_RSA_DES_192_CBC3_SHA
#define OPENSSL_PUT_ERROR(library, reason)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls13(void)
#define SSL_COMP_get_compression_methods
int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *cipher)
#define TLS1_CK_RSA_WITH_AES_128_SHA
static int copy(grpc_slice_buffer *input, grpc_slice_buffer *output)
#define OPENSSL_ARRAY_SIZE(array)
#define TLS1_CK_RSA_WITH_AES_128_GCM_SHA256
#define EVP_aead_aes_128_cbc_sha1_tls
struct cipher_order_st * prev
#define SSL3_TXT_RSA_NULL_SHA
uint32_t ssl_cipher_auth_mask_for_key(const EVP_PKEY *key)
#define TLS1_TXT_RSA_WITH_AES_256_SHA
OPENSSL_EXPORT pem_password_cb void * u
const OPENSSL_EXPORT EVP_MD * EVP_sha256(void)
static bool rule_equals(const char *rule, const char *buf, size_t buf_len)
#define EVP_aead_des_ede3_cbc_sha1_tls
#define TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256
static void * OPENSSL_memset(void *dst, int c, size_t n)
const SSL_CIPHER * cipher
#define T(upbtypeconst, upbtype, ctype, default_value)
size_t ssl_cipher_get_record_split_len(const SSL_CIPHER *cipher)
#define TLS1_CK_CHACHA20_POLY1305_SHA256
bool ssl_cipher_uses_certificate_auth(const SSL_CIPHER *cipher)
const char * SSL_CIPHER_get_name(const SSL_CIPHER *cipher)
#define sk_SSL_CIPHER_push
#define EVP_AEAD_nonce_length
static constexpr int ssl_cipher_id_cmp_inner(const SSL_CIPHER *a, const SSL_CIPHER *b)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls13(void)
bool ssl_create_cipher_list(UniquePtr< SSLCipherPreferenceList > *out_cipher_list, const char *rule_str, bool strict)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm(void)
int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher)
#define TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA
static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr, CIPHER_ORDER **tail)
int SSL_CIPHER_is_block_cipher(const SSL_CIPHER *cipher)
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
bool Init(UniquePtr< STACK_OF(SSL_CIPHER)> ciphers, Span< const bool > in_group_flags)
constexpr absl::remove_reference_t< T > && move(T &&t) noexcept
int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm)
#define TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm_tls12(void)
#define EVP_aead_null_sha1_tls
#define TLS1_CK_RSA_WITH_AES_256_SHA
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
int SSL_COMP_get_id(const SSL_COMP *comp)
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)
#define TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
#define TLS1_CK_PSK_WITH_AES_256_CBC_SHA
uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher)
#define BSSL_NAMESPACE_END
#define TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384
#define ERR_R_INTERNAL_ERROR
const char * SSL_COMP_get_name(const COMP_METHOD *comp)
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
void Remove(const SSL_CIPHER *cipher)
#define TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA
struct cipher_order_st CIPHER_ORDER
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
std::unique_ptr< T, DefaultDeleteChar > UniquePtr
#define EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv
const char * SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, int len)
#define SSL3_CK_RSA_NULL_SHA
#define TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA
~SSLCipherPreferenceList()
#define EVP_has_aes_hardware
int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits)
void SSL_COMP_free_compression_methods(void)
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA
#define TLS1_TXT_CHACHA20_POLY1305_SHA256
#define TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA
#define TLS1_TXT_AES_256_GCM_SHA384
bool ssl_cipher_requires_server_key_exchange(const SSL_CIPHER *cipher)
STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void)
#define SSL_R_UNEXPECTED_OPERATOR_IN_GROUP
static const CIPHER_ALIAS kCipherAliases[]
UniquePtr< SSL_SESSION > ret
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_256_gcm_tls12(void)
const char * SSL_CIPHER_get_version(const SSL_CIPHER *cipher)
static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr, CIPHER_ORDER **tail)
AllocList * next[kMaxLevel]
#define SSL_R_INVALID_COMMAND
#define EVP_aead_aes_128_cbc_sha1_tls_implicit_iv
#define TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384
static int ssl_cipher_id_cmp(const void *in_a, const void *in_b)
#define TLS1_CK_AES_128_GCM_SHA256
uint16_t SSL_CIPHER_get_protocol_id(const SSL_CIPHER *cipher)
#define SHA_DIGEST_LENGTH
const char * SSL_COMP_get0_name(const SSL_COMP *comp)
#define SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS
struct cipher_order_st * next
uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher)
#define TLS1_TXT_AES_128_GCM_SHA256
int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *cipher)
#define EVP_aead_chacha20_poly1305
static constexpr BSSL_NAMESPACE_BEGIN SSL_CIPHER kCiphers[]
#define TLS1_CK_AES_256_GCM_SHA384
static const size_t kCipherAliasesLen
const char * SSL_CIPHER_standard_name(const SSL_CIPHER *cipher)
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
#define SSL_HANDSHAKE_MAC_SHA384
#define SSL_HANDSHAKE_MAC_DEFAULT
#define TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
#define TLS1_TXT_PSK_WITH_AES_256_CBC_SHA
const char * standard_name
#define sk_SSL_CIPHER_dup
#define sk_SSL_CIPHER_num
char * SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher)
#define TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA
static bool is_cipher_list_separator(char c, bool is_strict)
#define sk_SSL_CIPHER_delete
static bool ssl_cipher_process_rulestr(const char *rule_str, CIPHER_ORDER **head_p, CIPHER_ORDER **tail_p, bool strict)
Span< const SSL_CIPHER > AllCiphers()
const char * SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher)
const OPENSSL_EXPORT EVP_AEAD * EVP_aead_aes_128_gcm(void)
int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *cipher)
#define TLS1_TXT_RSA_WITH_AES_128_SHA
#define NID_chacha20_poly1305
#define TLS1_CK_PSK_WITH_AES_128_CBC_SHA
#define SSL_R_NO_CIPHER_MATCH
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
const SSL_CIPHER * SSL_get_cipher_by_value(uint16_t value)
#define TLS1_CK_RSA_WITH_AES_256_GCM_SHA384
#define TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
#define TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256
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)
#define SSL3_TXT_RSA_DES_192_CBC3_SHA
constexpr Span< const T > MakeConstSpan(T *ptr, size_t size) noexcept
grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:20