1 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com) 2 * All rights reserved. 3 * 4 * This package is an SSL implementation written 5 * by Eric Young (eay (at) 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 (at) 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 (at) 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 (at) 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 (at) 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 (at) cryptsoft.com). This product includes software written by Tim 107 * Hudson (tjh (at) 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/buf.h> 147 #include <openssl/err.h> 148 #include <openssl/md5.h> 149 #include <openssl/mem.h> 150 #include <openssl/sha.h> 151 #include <openssl/stack.h> 152 153 #include "internal.h" 154 #include "../crypto/internal.h" 155 156 157 namespace bssl { 158 159 // kCiphers is an array of all supported ciphers, sorted by id. 160 static const SSL_CIPHER kCiphers[] = { 161 // The RSA ciphers 162 // Cipher 02 163 { 164 SSL3_TXT_RSA_NULL_SHA, 165 "TLS_RSA_WITH_NULL_SHA", 166 SSL3_CK_RSA_NULL_SHA, 167 SSL_kRSA, 168 SSL_aRSA, 169 SSL_eNULL, 170 SSL_SHA1, 171 SSL_HANDSHAKE_MAC_DEFAULT, 172 }, 173 174 // Cipher 0A 175 { 176 SSL3_TXT_RSA_DES_192_CBC3_SHA, 177 "TLS_RSA_WITH_3DES_EDE_CBC_SHA", 178 SSL3_CK_RSA_DES_192_CBC3_SHA, 179 SSL_kRSA, 180 SSL_aRSA, 181 SSL_3DES, 182 SSL_SHA1, 183 SSL_HANDSHAKE_MAC_DEFAULT, 184 }, 185 186 187 // New AES ciphersuites 188 189 // Cipher 2F 190 { 191 TLS1_TXT_RSA_WITH_AES_128_SHA, 192 "TLS_RSA_WITH_AES_128_CBC_SHA", 193 TLS1_CK_RSA_WITH_AES_128_SHA, 194 SSL_kRSA, 195 SSL_aRSA, 196 SSL_AES128, 197 SSL_SHA1, 198 SSL_HANDSHAKE_MAC_DEFAULT, 199 }, 200 201 // Cipher 35 202 { 203 TLS1_TXT_RSA_WITH_AES_256_SHA, 204 "TLS_RSA_WITH_AES_256_CBC_SHA", 205 TLS1_CK_RSA_WITH_AES_256_SHA, 206 SSL_kRSA, 207 SSL_aRSA, 208 SSL_AES256, 209 SSL_SHA1, 210 SSL_HANDSHAKE_MAC_DEFAULT, 211 }, 212 213 214 // TLS v1.2 ciphersuites 215 216 // Cipher 3C 217 { 218 TLS1_TXT_RSA_WITH_AES_128_SHA256, 219 "TLS_RSA_WITH_AES_128_CBC_SHA256", 220 TLS1_CK_RSA_WITH_AES_128_SHA256, 221 SSL_kRSA, 222 SSL_aRSA, 223 SSL_AES128, 224 SSL_SHA256, 225 SSL_HANDSHAKE_MAC_SHA256, 226 }, 227 228 // Cipher 3D 229 { 230 TLS1_TXT_RSA_WITH_AES_256_SHA256, 231 "TLS_RSA_WITH_AES_256_CBC_SHA256", 232 TLS1_CK_RSA_WITH_AES_256_SHA256, 233 SSL_kRSA, 234 SSL_aRSA, 235 SSL_AES256, 236 SSL_SHA256, 237 SSL_HANDSHAKE_MAC_SHA256, 238 }, 239 240 // PSK cipher suites. 241 242 // Cipher 8C 243 { 244 TLS1_TXT_PSK_WITH_AES_128_CBC_SHA, 245 "TLS_PSK_WITH_AES_128_CBC_SHA", 246 TLS1_CK_PSK_WITH_AES_128_CBC_SHA, 247 SSL_kPSK, 248 SSL_aPSK, 249 SSL_AES128, 250 SSL_SHA1, 251 SSL_HANDSHAKE_MAC_DEFAULT, 252 }, 253 254 // Cipher 8D 255 { 256 TLS1_TXT_PSK_WITH_AES_256_CBC_SHA, 257 "TLS_PSK_WITH_AES_256_CBC_SHA", 258 TLS1_CK_PSK_WITH_AES_256_CBC_SHA, 259 SSL_kPSK, 260 SSL_aPSK, 261 SSL_AES256, 262 SSL_SHA1, 263 SSL_HANDSHAKE_MAC_DEFAULT, 264 }, 265 266 // GCM ciphersuites from RFC5288 267 268 // Cipher 9C 269 { 270 TLS1_TXT_RSA_WITH_AES_128_GCM_SHA256, 271 "TLS_RSA_WITH_AES_128_GCM_SHA256", 272 TLS1_CK_RSA_WITH_AES_128_GCM_SHA256, 273 SSL_kRSA, 274 SSL_aRSA, 275 SSL_AES128GCM, 276 SSL_AEAD, 277 SSL_HANDSHAKE_MAC_SHA256, 278 }, 279 280 // Cipher 9D 281 { 282 TLS1_TXT_RSA_WITH_AES_256_GCM_SHA384, 283 "TLS_RSA_WITH_AES_256_GCM_SHA384", 284 TLS1_CK_RSA_WITH_AES_256_GCM_SHA384, 285 SSL_kRSA, 286 SSL_aRSA, 287 SSL_AES256GCM, 288 SSL_AEAD, 289 SSL_HANDSHAKE_MAC_SHA384, 290 }, 291 292 // TLS 1.3 suites. 293 294 // Cipher 1301 295 { 296 TLS1_TXT_AES_128_GCM_SHA256, 297 "TLS_AES_128_GCM_SHA256", 298 TLS1_CK_AES_128_GCM_SHA256, 299 SSL_kGENERIC, 300 SSL_aGENERIC, 301 SSL_AES128GCM, 302 SSL_AEAD, 303 SSL_HANDSHAKE_MAC_SHA256, 304 }, 305 306 // Cipher 1302 307 { 308 TLS1_TXT_AES_256_GCM_SHA384, 309 "TLS_AES_256_GCM_SHA384", 310 TLS1_CK_AES_256_GCM_SHA384, 311 SSL_kGENERIC, 312 SSL_aGENERIC, 313 SSL_AES256GCM, 314 SSL_AEAD, 315 SSL_HANDSHAKE_MAC_SHA384, 316 }, 317 318 // Cipher 1303 319 { 320 TLS1_TXT_CHACHA20_POLY1305_SHA256, 321 "TLS_CHACHA20_POLY1305_SHA256", 322 TLS1_CK_CHACHA20_POLY1305_SHA256, 323 SSL_kGENERIC, 324 SSL_aGENERIC, 325 SSL_CHACHA20POLY1305, 326 SSL_AEAD, 327 SSL_HANDSHAKE_MAC_SHA256, 328 }, 329 330 // Cipher C009 331 { 332 TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 333 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", 334 TLS1_CK_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 335 SSL_kECDHE, 336 SSL_aECDSA, 337 SSL_AES128, 338 SSL_SHA1, 339 SSL_HANDSHAKE_MAC_DEFAULT, 340 }, 341 342 // Cipher C00A 343 { 344 TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 345 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 346 TLS1_CK_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 347 SSL_kECDHE, 348 SSL_aECDSA, 349 SSL_AES256, 350 SSL_SHA1, 351 SSL_HANDSHAKE_MAC_DEFAULT, 352 }, 353 354 // Cipher C013 355 { 356 TLS1_TXT_ECDHE_RSA_WITH_AES_128_CBC_SHA, 357 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 358 TLS1_CK_ECDHE_RSA_WITH_AES_128_CBC_SHA, 359 SSL_kECDHE, 360 SSL_aRSA, 361 SSL_AES128, 362 SSL_SHA1, 363 SSL_HANDSHAKE_MAC_DEFAULT, 364 }, 365 366 // Cipher C014 367 { 368 TLS1_TXT_ECDHE_RSA_WITH_AES_256_CBC_SHA, 369 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 370 TLS1_CK_ECDHE_RSA_WITH_AES_256_CBC_SHA, 371 SSL_kECDHE, 372 SSL_aRSA, 373 SSL_AES256, 374 SSL_SHA1, 375 SSL_HANDSHAKE_MAC_DEFAULT, 376 }, 377 378 379 // HMAC based TLS v1.2 ciphersuites from RFC5289 380 381 // Cipher C023 382 { 383 TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_SHA256, 384 "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", 385 TLS1_CK_ECDHE_ECDSA_WITH_AES_128_SHA256, 386 SSL_kECDHE, 387 SSL_aECDSA, 388 SSL_AES128, 389 SSL_SHA256, 390 SSL_HANDSHAKE_MAC_SHA256, 391 }, 392 393 // Cipher C024 394 { 395 TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_SHA384, 396 "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", 397 TLS1_CK_ECDHE_ECDSA_WITH_AES_256_SHA384, 398 SSL_kECDHE, 399 SSL_aECDSA, 400 SSL_AES256, 401 SSL_SHA384, 402 SSL_HANDSHAKE_MAC_SHA384, 403 }, 404 405 // Cipher C027 406 { 407 TLS1_TXT_ECDHE_RSA_WITH_AES_128_SHA256, 408 "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", 409 TLS1_CK_ECDHE_RSA_WITH_AES_128_SHA256, 410 SSL_kECDHE, 411 SSL_aRSA, 412 SSL_AES128, 413 SSL_SHA256, 414 SSL_HANDSHAKE_MAC_SHA256, 415 }, 416 417 // Cipher C028 418 { 419 TLS1_TXT_ECDHE_RSA_WITH_AES_256_SHA384, 420 "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", 421 TLS1_CK_ECDHE_RSA_WITH_AES_256_SHA384, 422 SSL_kECDHE, 423 SSL_aRSA, 424 SSL_AES256, 425 SSL_SHA384, 426 SSL_HANDSHAKE_MAC_SHA384, 427 }, 428 429 430 // GCM based TLS v1.2 ciphersuites from RFC5289 431 432 // Cipher C02B 433 { 434 TLS1_TXT_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 435 "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", 436 TLS1_CK_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 437 SSL_kECDHE, 438 SSL_aECDSA, 439 SSL_AES128GCM, 440 SSL_AEAD, 441 SSL_HANDSHAKE_MAC_SHA256, 442 }, 443 444 // Cipher C02C 445 { 446 TLS1_TXT_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 447 "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", 448 TLS1_CK_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 449 SSL_kECDHE, 450 SSL_aECDSA, 451 SSL_AES256GCM, 452 SSL_AEAD, 453 SSL_HANDSHAKE_MAC_SHA384, 454 }, 455 456 // Cipher C02F 457 { 458 TLS1_TXT_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 459 "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", 460 TLS1_CK_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 461 SSL_kECDHE, 462 SSL_aRSA, 463 SSL_AES128GCM, 464 SSL_AEAD, 465 SSL_HANDSHAKE_MAC_SHA256, 466 }, 467 468 // Cipher C030 469 { 470 TLS1_TXT_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 471 "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", 472 TLS1_CK_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 473 SSL_kECDHE, 474 SSL_aRSA, 475 SSL_AES256GCM, 476 SSL_AEAD, 477 SSL_HANDSHAKE_MAC_SHA384, 478 }, 479 480 // ECDHE-PSK cipher suites. 481 482 // Cipher C035 483 { 484 TLS1_TXT_ECDHE_PSK_WITH_AES_128_CBC_SHA, 485 "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA", 486 TLS1_CK_ECDHE_PSK_WITH_AES_128_CBC_SHA, 487 SSL_kECDHE, 488 SSL_aPSK, 489 SSL_AES128, 490 SSL_SHA1, 491 SSL_HANDSHAKE_MAC_DEFAULT, 492 }, 493 494 // Cipher C036 495 { 496 TLS1_TXT_ECDHE_PSK_WITH_AES_256_CBC_SHA, 497 "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA", 498 TLS1_CK_ECDHE_PSK_WITH_AES_256_CBC_SHA, 499 SSL_kECDHE, 500 SSL_aPSK, 501 SSL_AES256, 502 SSL_SHA1, 503 SSL_HANDSHAKE_MAC_DEFAULT, 504 }, 505 506 // ChaCha20-Poly1305 cipher suites. 507 508 // Cipher CCA8 509 { 510 TLS1_TXT_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 511 "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", 512 TLS1_CK_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 513 SSL_kECDHE, 514 SSL_aRSA, 515 SSL_CHACHA20POLY1305, 516 SSL_AEAD, 517 SSL_HANDSHAKE_MAC_SHA256, 518 }, 519 520 // Cipher CCA9 521 { 522 TLS1_TXT_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 523 "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", 524 TLS1_CK_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 525 SSL_kECDHE, 526 SSL_aECDSA, 527 SSL_CHACHA20POLY1305, 528 SSL_AEAD, 529 SSL_HANDSHAKE_MAC_SHA256, 530 }, 531 532 // Cipher CCAB 533 { 534 TLS1_TXT_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, 535 "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256", 536 TLS1_CK_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, 537 SSL_kECDHE, 538 SSL_aPSK, 539 SSL_CHACHA20POLY1305, 540 SSL_AEAD, 541 SSL_HANDSHAKE_MAC_SHA256, 542 }, 543 544 }; 545 546 static const size_t kCiphersLen = OPENSSL_ARRAY_SIZE(kCiphers); 547 548 #define CIPHER_ADD 1 549 #define CIPHER_KILL 2 550 #define CIPHER_DEL 3 551 #define CIPHER_ORD 4 552 #define CIPHER_SPECIAL 5 553 554 typedef struct cipher_order_st { 555 const SSL_CIPHER *cipher; 556 bool active; 557 bool in_group; 558 struct cipher_order_st *next, *prev; 559 } CIPHER_ORDER; 560 561 typedef struct cipher_alias_st { 562 // name is the name of the cipher alias. 563 const char *name; 564 565 // The following fields are bitmasks for the corresponding fields on 566 // |SSL_CIPHER|. A cipher matches a cipher alias iff, for each bitmask, the 567 // bit corresponding to the cipher's value is set to 1. If any bitmask is 568 // all zeroes, the alias matches nothing. Use |~0u| for the default value. 569 uint32_t algorithm_mkey; 570 uint32_t algorithm_auth; 571 uint32_t algorithm_enc; 572 uint32_t algorithm_mac; 573 574 // min_version, if non-zero, matches all ciphers which were added in that 575 // particular protocol version. 576 uint16_t min_version; 577 } CIPHER_ALIAS; 578 579 static const CIPHER_ALIAS kCipherAliases[] = { 580 // "ALL" doesn't include eNULL. It must be explicitly enabled. 581 {"ALL", ~0u, ~0u, ~0u, ~0u, 0}, 582 583 // The "COMPLEMENTOFDEFAULT" rule is omitted. It matches nothing. 584 585 // key exchange aliases 586 // (some of those using only a single bit here combine 587 // multiple key exchange algs according to the RFCs. 588 {"kRSA", SSL_kRSA, ~0u, ~0u, ~0u, 0}, 589 590 {"kECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0}, 591 {"kEECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0}, 592 {"ECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0}, 593 594 {"kPSK", SSL_kPSK, ~0u, ~0u, ~0u, 0}, 595 596 // server authentication aliases 597 {"aRSA", ~0u, SSL_aRSA, ~0u, ~0u, 0}, 598 {"aECDSA", ~0u, SSL_aECDSA, ~0u, ~0u, 0}, 599 {"ECDSA", ~0u, SSL_aECDSA, ~0u, ~0u, 0}, 600 {"aPSK", ~0u, SSL_aPSK, ~0u, ~0u, 0}, 601 602 // aliases combining key exchange and server authentication 603 {"ECDHE", SSL_kECDHE, ~0u, ~0u, ~0u, 0}, 604 {"EECDH", SSL_kECDHE, ~0u, ~0u, ~0u, 0}, 605 {"RSA", SSL_kRSA, SSL_aRSA, ~0u, ~0u, 0}, 606 {"PSK", SSL_kPSK, SSL_aPSK, ~0u, ~0u, 0}, 607 608 // symmetric encryption aliases 609 {"3DES", ~0u, ~0u, SSL_3DES, ~0u, 0}, 610 {"AES128", ~0u, ~0u, SSL_AES128 | SSL_AES128GCM, ~0u, 0}, 611 {"AES256", ~0u, ~0u, SSL_AES256 | SSL_AES256GCM, ~0u, 0}, 612 {"AES", ~0u, ~0u, SSL_AES, ~0u, 0}, 613 {"AESGCM", ~0u, ~0u, SSL_AES128GCM | SSL_AES256GCM, ~0u, 0}, 614 {"CHACHA20", ~0u, ~0u, SSL_CHACHA20POLY1305, ~0u, 0}, 615 616 // MAC aliases 617 {"SHA1", ~0u, ~0u, ~0u, SSL_SHA1, 0}, 618 {"SHA", ~0u, ~0u, ~0u, SSL_SHA1, 0}, 619 {"SHA256", ~0u, ~0u, ~0u, SSL_SHA256, 0}, 620 {"SHA384", ~0u, ~0u, ~0u, SSL_SHA384, 0}, 621 622 // Legacy protocol minimum version aliases. "TLSv1" is intentionally the 623 // same as "SSLv3". 624 {"SSLv3", ~0u, ~0u, ~0u, ~0u, SSL3_VERSION}, 625 {"TLSv1", ~0u, ~0u, ~0u, ~0u, SSL3_VERSION}, 626 {"TLSv1.2", ~0u, ~0u, ~0u, ~0u, TLS1_2_VERSION}, 627 628 // Legacy strength classes. 629 {"HIGH", ~0u, ~0u, ~0u, ~0u, 0}, 630 {"FIPS", ~0u, ~0u, ~0u, ~0u, 0}, 631 }; 632 633 static const size_t kCipherAliasesLen = OPENSSL_ARRAY_SIZE(kCipherAliases); 634 635 static int ssl_cipher_id_cmp(const void *in_a, const void *in_b) { 636 const SSL_CIPHER *a = reinterpret_cast<const SSL_CIPHER *>(in_a); 637 const SSL_CIPHER *b = reinterpret_cast<const SSL_CIPHER *>(in_b); 638 639 if (a->id > b->id) { 640 return 1; 641 } else if (a->id < b->id) { 642 return -1; 643 } else { 644 return 0; 645 } 646 } 647 648 bool ssl_cipher_get_evp_aead(const EVP_AEAD **out_aead, 649 size_t *out_mac_secret_len, 650 size_t *out_fixed_iv_len, const SSL_CIPHER *cipher, 651 uint16_t version, int is_dtls) { 652 *out_aead = NULL; 653 *out_mac_secret_len = 0; 654 *out_fixed_iv_len = 0; 655 656 const int is_tls12 = version == TLS1_2_VERSION && !is_dtls; 657 658 if (cipher->algorithm_mac == SSL_AEAD) { 659 if (cipher->algorithm_enc == SSL_AES128GCM) { 660 *out_aead = 661 is_tls12 ? EVP_aead_aes_128_gcm_tls12() : EVP_aead_aes_128_gcm(); 662 *out_fixed_iv_len = 4; 663 } else if (cipher->algorithm_enc == SSL_AES256GCM) { 664 *out_aead = 665 is_tls12 ? EVP_aead_aes_256_gcm_tls12() : EVP_aead_aes_256_gcm(); 666 *out_fixed_iv_len = 4; 667 } else if (cipher->algorithm_enc == SSL_CHACHA20POLY1305) { 668 *out_aead = EVP_aead_chacha20_poly1305(); 669 *out_fixed_iv_len = 12; 670 } else { 671 return false; 672 } 673 674 // In TLS 1.3, the iv_len is equal to the AEAD nonce length whereas the code 675 // above computes the TLS 1.2 construction. 676 if (version >= TLS1_3_VERSION) { 677 *out_fixed_iv_len = EVP_AEAD_nonce_length(*out_aead); 678 } 679 } else if (cipher->algorithm_mac == SSL_SHA1) { 680 if (cipher->algorithm_enc == SSL_eNULL) { 681 if (version == SSL3_VERSION) { 682 *out_aead = EVP_aead_null_sha1_ssl3(); 683 } else { 684 *out_aead = EVP_aead_null_sha1_tls(); 685 } 686 } else if (cipher->algorithm_enc == SSL_3DES) { 687 if (version == SSL3_VERSION) { 688 *out_aead = EVP_aead_des_ede3_cbc_sha1_ssl3(); 689 *out_fixed_iv_len = 8; 690 } else if (version == TLS1_VERSION) { 691 *out_aead = EVP_aead_des_ede3_cbc_sha1_tls_implicit_iv(); 692 *out_fixed_iv_len = 8; 693 } else { 694 *out_aead = EVP_aead_des_ede3_cbc_sha1_tls(); 695 } 696 } else if (cipher->algorithm_enc == SSL_AES128) { 697 if (version == SSL3_VERSION) { 698 *out_aead = EVP_aead_aes_128_cbc_sha1_ssl3(); 699 *out_fixed_iv_len = 16; 700 } else if (version == TLS1_VERSION) { 701 *out_aead = EVP_aead_aes_128_cbc_sha1_tls_implicit_iv(); 702 *out_fixed_iv_len = 16; 703 } else { 704 *out_aead = EVP_aead_aes_128_cbc_sha1_tls(); 705 } 706 } else if (cipher->algorithm_enc == SSL_AES256) { 707 if (version == SSL3_VERSION) { 708 *out_aead = EVP_aead_aes_256_cbc_sha1_ssl3(); 709 *out_fixed_iv_len = 16; 710 } else if (version == TLS1_VERSION) { 711 *out_aead = EVP_aead_aes_256_cbc_sha1_tls_implicit_iv(); 712 *out_fixed_iv_len = 16; 713 } else { 714 *out_aead = EVP_aead_aes_256_cbc_sha1_tls(); 715 } 716 } else { 717 return false; 718 } 719 720 *out_mac_secret_len = SHA_DIGEST_LENGTH; 721 } else if (cipher->algorithm_mac == SSL_SHA256) { 722 if (cipher->algorithm_enc == SSL_AES128) { 723 *out_aead = EVP_aead_aes_128_cbc_sha256_tls(); 724 } else if (cipher->algorithm_enc == SSL_AES256) { 725 *out_aead = EVP_aead_aes_256_cbc_sha256_tls(); 726 } else { 727 return false; 728 } 729 730 *out_mac_secret_len = SHA256_DIGEST_LENGTH; 731 } else if (cipher->algorithm_mac == SSL_SHA384) { 732 if (cipher->algorithm_enc != SSL_AES256) { 733 return false; 734 } 735 736 *out_aead = EVP_aead_aes_256_cbc_sha384_tls(); 737 *out_mac_secret_len = SHA384_DIGEST_LENGTH; 738 } else { 739 return false; 740 } 741 742 return true; 743 } 744 745 const EVP_MD *ssl_get_handshake_digest(uint16_t version, 746 const SSL_CIPHER *cipher) { 747 switch (cipher->algorithm_prf) { 748 case SSL_HANDSHAKE_MAC_DEFAULT: 749 return version >= TLS1_2_VERSION ? EVP_sha256() : EVP_md5_sha1(); 750 case SSL_HANDSHAKE_MAC_SHA256: 751 return EVP_sha256(); 752 case SSL_HANDSHAKE_MAC_SHA384: 753 return EVP_sha384(); 754 default: 755 assert(0); 756 return NULL; 757 } 758 } 759 760 static bool is_cipher_list_separator(char c, int is_strict) { 761 if (c == ':') { 762 return true; 763 } 764 return !is_strict && (c == ' ' || c == ';' || c == ','); 765 } 766 767 // rule_equals returns whether the NUL-terminated string |rule| is equal to the 768 // |buf_len| bytes at |buf|. 769 static bool rule_equals(const char *rule, const char *buf, size_t buf_len) { 770 // |strncmp| alone only checks that |buf| is a prefix of |rule|. 771 return strncmp(rule, buf, buf_len) == 0 && rule[buf_len] == '\0'; 772 } 773 774 static void ll_append_tail(CIPHER_ORDER **head, CIPHER_ORDER *curr, 775 CIPHER_ORDER **tail) { 776 if (curr == *tail) { 777 return; 778 } 779 if (curr == *head) { 780 *head = curr->next; 781 } 782 if (curr->prev != NULL) { 783 curr->prev->next = curr->next; 784 } 785 if (curr->next != NULL) { 786 curr->next->prev = curr->prev; 787 } 788 (*tail)->next = curr; 789 curr->prev = *tail; 790 curr->next = NULL; 791 *tail = curr; 792 } 793 794 static void ll_append_head(CIPHER_ORDER **head, CIPHER_ORDER *curr, 795 CIPHER_ORDER **tail) { 796 if (curr == *head) { 797 return; 798 } 799 if (curr == *tail) { 800 *tail = curr->prev; 801 } 802 if (curr->next != NULL) { 803 curr->next->prev = curr->prev; 804 } 805 if (curr->prev != NULL) { 806 curr->prev->next = curr->next; 807 } 808 (*head)->prev = curr; 809 curr->next = *head; 810 curr->prev = NULL; 811 *head = curr; 812 } 813 814 static void ssl_cipher_collect_ciphers(CIPHER_ORDER *co_list, 815 CIPHER_ORDER **head_p, 816 CIPHER_ORDER **tail_p) { 817 size_t co_list_num = 0; 818 for (const SSL_CIPHER &cipher : kCiphers) { 819 // TLS 1.3 ciphers do not participate in this mechanism. 820 if (cipher.algorithm_mkey != SSL_kGENERIC) { 821 co_list[co_list_num].cipher = &cipher; 822 co_list[co_list_num].next = NULL; 823 co_list[co_list_num].prev = NULL; 824 co_list[co_list_num].active = false; 825 co_list[co_list_num].in_group = false; 826 co_list_num++; 827 } 828 } 829 830 // Prepare linked list from list entries. 831 if (co_list_num > 0) { 832 co_list[0].prev = NULL; 833 834 if (co_list_num > 1) { 835 co_list[0].next = &co_list[1]; 836 837 for (size_t i = 1; i < co_list_num - 1; i++) { 838 co_list[i].prev = &co_list[i - 1]; 839 co_list[i].next = &co_list[i + 1]; 840 } 841 842 co_list[co_list_num - 1].prev = &co_list[co_list_num - 2]; 843 } 844 845 co_list[co_list_num - 1].next = NULL; 846 847 *head_p = &co_list[0]; 848 *tail_p = &co_list[co_list_num - 1]; 849 } 850 } 851 852 // ssl_cipher_apply_rule applies the rule type |rule| to ciphers matching its 853 // parameters in the linked list from |*head_p| to |*tail_p|. It writes the new 854 // head and tail of the list to |*head_p| and |*tail_p|, respectively. 855 // 856 // - If |cipher_id| is non-zero, only that cipher is selected. 857 // - Otherwise, if |strength_bits| is non-negative, it selects ciphers 858 // of that strength. 859 // - Otherwise, it selects ciphers that match each bitmasks in |alg_*| and 860 // |min_version|. 861 static void ssl_cipher_apply_rule( 862 uint32_t cipher_id, uint32_t alg_mkey, uint32_t alg_auth, 863 uint32_t alg_enc, uint32_t alg_mac, uint16_t min_version, int rule, 864 int strength_bits, bool in_group, CIPHER_ORDER **head_p, 865 CIPHER_ORDER **tail_p) { 866 CIPHER_ORDER *head, *tail, *curr, *next, *last; 867 const SSL_CIPHER *cp; 868 bool reverse = false; 869 870 if (cipher_id == 0 && strength_bits == -1 && min_version == 0 && 871 (alg_mkey == 0 || alg_auth == 0 || alg_enc == 0 || alg_mac == 0)) { 872 // The rule matches nothing, so bail early. 873 return; 874 } 875 876 if (rule == CIPHER_DEL) { 877 // needed to maintain sorting between currently deleted ciphers 878 reverse = true; 879 } 880 881 head = *head_p; 882 tail = *tail_p; 883 884 if (reverse) { 885 next = tail; 886 last = head; 887 } else { 888 next = head; 889 last = tail; 890 } 891 892 curr = NULL; 893 for (;;) { 894 if (curr == last) { 895 break; 896 } 897 898 curr = next; 899 if (curr == NULL) { 900 break; 901 } 902 903 next = reverse ? curr->prev : curr->next; 904 cp = curr->cipher; 905 906 // Selection criteria is either a specific cipher, the value of 907 // |strength_bits|, or the algorithms used. 908 if (cipher_id != 0) { 909 if (cipher_id != cp->id) { 910 continue; 911 } 912 } else if (strength_bits >= 0) { 913 if (strength_bits != SSL_CIPHER_get_bits(cp, NULL)) { 914 continue; 915 } 916 } else { 917 if (!(alg_mkey & cp->algorithm_mkey) || 918 !(alg_auth & cp->algorithm_auth) || 919 !(alg_enc & cp->algorithm_enc) || 920 !(alg_mac & cp->algorithm_mac) || 921 (min_version != 0 && SSL_CIPHER_get_min_version(cp) != min_version) || 922 // The NULL cipher must be selected explicitly. 923 cp->algorithm_enc == SSL_eNULL) { 924 continue; 925 } 926 } 927 928 // add the cipher if it has not been added yet. 929 if (rule == CIPHER_ADD) { 930 // reverse == false 931 if (!curr->active) { 932 ll_append_tail(&head, curr, &tail); 933 curr->active = true; 934 curr->in_group = in_group; 935 } 936 } 937 938 // Move the added cipher to this location 939 else if (rule == CIPHER_ORD) { 940 // reverse == false 941 if (curr->active) { 942 ll_append_tail(&head, curr, &tail); 943 curr->in_group = false; 944 } 945 } else if (rule == CIPHER_DEL) { 946 // reverse == true 947 if (curr->active) { 948 // most recently deleted ciphersuites get best positions 949 // for any future CIPHER_ADD (note that the CIPHER_DEL loop 950 // works in reverse to maintain the order) 951 ll_append_head(&head, curr, &tail); 952 curr->active = false; 953 curr->in_group = false; 954 } 955 } else if (rule == CIPHER_KILL) { 956 // reverse == false 957 if (head == curr) { 958 head = curr->next; 959 } else { 960 curr->prev->next = curr->next; 961 } 962 963 if (tail == curr) { 964 tail = curr->prev; 965 } 966 curr->active = false; 967 if (curr->next != NULL) { 968 curr->next->prev = curr->prev; 969 } 970 if (curr->prev != NULL) { 971 curr->prev->next = curr->next; 972 } 973 curr->next = NULL; 974 curr->prev = NULL; 975 } 976 } 977 978 *head_p = head; 979 *tail_p = tail; 980 } 981 982 static bool ssl_cipher_strength_sort(CIPHER_ORDER **head_p, 983 CIPHER_ORDER **tail_p) { 984 // This routine sorts the ciphers with descending strength. The sorting must 985 // keep the pre-sorted sequence, so we apply the normal sorting routine as 986 // '+' movement to the end of the list. 987 int max_strength_bits = 0; 988 CIPHER_ORDER *curr = *head_p; 989 while (curr != NULL) { 990 if (curr->active && 991 SSL_CIPHER_get_bits(curr->cipher, NULL) > max_strength_bits) { 992 max_strength_bits = SSL_CIPHER_get_bits(curr->cipher, NULL); 993 } 994 curr = curr->next; 995 } 996 997 Array<int> number_uses; 998 if (!number_uses.Init(max_strength_bits + 1)) { 999 return false; 1000 } 1001 OPENSSL_memset(number_uses.data(), 0, (max_strength_bits + 1) * sizeof(int)); 1002 1003 // Now find the strength_bits values actually used. 1004 curr = *head_p; 1005 while (curr != NULL) { 1006 if (curr->active) { 1007 number_uses[SSL_CIPHER_get_bits(curr->cipher, NULL)]++; 1008 } 1009 curr = curr->next; 1010 } 1011 1012 // Go through the list of used strength_bits values in descending order. 1013 for (int i = max_strength_bits; i >= 0; i--) { 1014 if (number_uses[i] > 0) { 1015 ssl_cipher_apply_rule(0, 0, 0, 0, 0, 0, CIPHER_ORD, i, false, head_p, 1016 tail_p); 1017 } 1018 } 1019 1020 return true; 1021 } 1022 1023 static bool ssl_cipher_process_rulestr(const char *rule_str, 1024 CIPHER_ORDER **head_p, 1025 CIPHER_ORDER **tail_p, bool strict) { 1026 uint32_t alg_mkey, alg_auth, alg_enc, alg_mac; 1027 uint16_t min_version; 1028 const char *l, *buf; 1029 int rule; 1030 bool multi, skip_rule, in_group = false, has_group = false; 1031 size_t j, buf_len; 1032 uint32_t cipher_id; 1033 char ch; 1034 1035 l = rule_str; 1036 for (;;) { 1037 ch = *l; 1038 1039 if (ch == '\0') { 1040 break; // done 1041 } 1042 1043 if (in_group) { 1044 if (ch == ']') { 1045 if (*tail_p) { 1046 (*tail_p)->in_group = false; 1047 } 1048 in_group = false; 1049 l++; 1050 continue; 1051 } 1052 1053 if (ch == '|') { 1054 rule = CIPHER_ADD; 1055 l++; 1056 continue; 1057 } else if (!(ch >= 'a' && ch <= 'z') && !(ch >= 'A' && ch <= 'Z') && 1058 !(ch >= '0' && ch <= '9')) { 1059 OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_OPERATOR_IN_GROUP); 1060 return false; 1061 } else { 1062 rule = CIPHER_ADD; 1063 } 1064 } else if (ch == '-') { 1065 rule = CIPHER_DEL; 1066 l++; 1067 } else if (ch == '+') { 1068 rule = CIPHER_ORD; 1069 l++; 1070 } else if (ch == '!') { 1071 rule = CIPHER_KILL; 1072 l++; 1073 } else if (ch == '@') { 1074 rule = CIPHER_SPECIAL; 1075 l++; 1076 } else if (ch == '[') { 1077 assert(!in_group); 1078 in_group = true; 1079 has_group = true; 1080 l++; 1081 continue; 1082 } else { 1083 rule = CIPHER_ADD; 1084 } 1085 1086 // If preference groups are enabled, the only legal operator is +. 1087 // Otherwise the in_group bits will get mixed up. 1088 if (has_group && rule != CIPHER_ADD) { 1089 OPENSSL_PUT_ERROR(SSL, SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS); 1090 return false; 1091 } 1092 1093 if (is_cipher_list_separator(ch, strict)) { 1094 l++; 1095 continue; 1096 } 1097 1098 multi = false; 1099 cipher_id = 0; 1100 alg_mkey = ~0u; 1101 alg_auth = ~0u; 1102 alg_enc = ~0u; 1103 alg_mac = ~0u; 1104 min_version = 0; 1105 skip_rule = false; 1106 1107 for (;;) { 1108 ch = *l; 1109 buf = l; 1110 buf_len = 0; 1111 while ((ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || 1112 (ch >= 'a' && ch <= 'z') || ch == '-' || ch == '.' || ch == '_') { 1113 ch = *(++l); 1114 buf_len++; 1115 } 1116 1117 if (buf_len == 0) { 1118 // We hit something we cannot deal with, it is no command or separator 1119 // nor alphanumeric, so we call this an error. 1120 OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMMAND); 1121 return false; 1122 } 1123 1124 if (rule == CIPHER_SPECIAL) { 1125 break; 1126 } 1127 1128 // Look for a matching exact cipher. These aren't allowed in multipart 1129 // rules. 1130 if (!multi && ch != '+') { 1131 for (j = 0; j < kCiphersLen; j++) { 1132 const SSL_CIPHER *cipher = &kCiphers[j]; 1133 if (rule_equals(cipher->name, buf, buf_len) || 1134 rule_equals(cipher->standard_name, buf, buf_len)) { 1135 cipher_id = cipher->id; 1136 break; 1137 } 1138 } 1139 } 1140 if (cipher_id == 0) { 1141 // If not an exact cipher, look for a matching cipher alias. 1142 for (j = 0; j < kCipherAliasesLen; j++) { 1143 if (rule_equals(kCipherAliases[j].name, buf, buf_len)) { 1144 alg_mkey &= kCipherAliases[j].algorithm_mkey; 1145 alg_auth &= kCipherAliases[j].algorithm_auth; 1146 alg_enc &= kCipherAliases[j].algorithm_enc; 1147 alg_mac &= kCipherAliases[j].algorithm_mac; 1148 1149 if (min_version != 0 && 1150 min_version != kCipherAliases[j].min_version) { 1151 skip_rule = true; 1152 } else { 1153 min_version = kCipherAliases[j].min_version; 1154 } 1155 break; 1156 } 1157 } 1158 if (j == kCipherAliasesLen) { 1159 skip_rule = true; 1160 if (strict) { 1161 OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMMAND); 1162 return false; 1163 } 1164 } 1165 } 1166 1167 // Check for a multipart rule. 1168 if (ch != '+') { 1169 break; 1170 } 1171 l++; 1172 multi = true; 1173 } 1174 1175 // Ok, we have the rule, now apply it. 1176 if (rule == CIPHER_SPECIAL) { 1177 if (buf_len != 8 || strncmp(buf, "STRENGTH", 8) != 0) { 1178 OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMMAND); 1179 return false; 1180 } 1181 if (!ssl_cipher_strength_sort(head_p, tail_p)) { 1182 return false; 1183 } 1184 1185 // We do not support any "multi" options together with "@", so throw away 1186 // the rest of the command, if any left, until end or ':' is found. 1187 while (*l != '\0' && !is_cipher_list_separator(*l, strict)) { 1188 l++; 1189 } 1190 } else if (!skip_rule) { 1191 ssl_cipher_apply_rule(cipher_id, alg_mkey, alg_auth, alg_enc, alg_mac, 1192 min_version, rule, -1, in_group, head_p, tail_p); 1193 } 1194 } 1195 1196 if (in_group) { 1197 OPENSSL_PUT_ERROR(SSL, SSL_R_INVALID_COMMAND); 1198 return false; 1199 } 1200 1201 return true; 1202 } 1203 1204 bool ssl_create_cipher_list( 1205 struct ssl_cipher_preference_list_st **out_cipher_list, 1206 const char *rule_str, bool strict) { 1207 STACK_OF(SSL_CIPHER) *cipherstack = NULL; 1208 CIPHER_ORDER *co_list = NULL, *head = NULL, *tail = NULL, *curr; 1209 uint8_t *in_group_flags = NULL; 1210 unsigned int num_in_group_flags = 0; 1211 struct ssl_cipher_preference_list_st *pref_list = NULL; 1212 1213 // Return with error if nothing to do. 1214 if (rule_str == NULL || out_cipher_list == NULL) { 1215 return false; 1216 } 1217 1218 // Now we have to collect the available ciphers from the compiled in ciphers. 1219 // We cannot get more than the number compiled in, so it is used for 1220 // allocation. 1221 co_list = (CIPHER_ORDER *)OPENSSL_malloc(sizeof(CIPHER_ORDER) * kCiphersLen); 1222 if (co_list == NULL) { 1223 OPENSSL_PUT_ERROR(SSL, ERR_R_MALLOC_FAILURE); 1224 return false; 1225 } 1226 1227 ssl_cipher_collect_ciphers(co_list, &head, &tail); 1228 1229 // Now arrange all ciphers by preference: 1230 // TODO(davidben): Compute this order once and copy it. 1231 1232 // Everything else being equal, prefer ECDHE_ECDSA and ECDHE_RSA over other 1233 // key exchange mechanisms 1234 ssl_cipher_apply_rule(0, SSL_kECDHE, SSL_aECDSA, ~0u, ~0u, 0, CIPHER_ADD, -1, 1235 false, &head, &tail); 1236 ssl_cipher_apply_rule(0, SSL_kECDHE, ~0u, ~0u, ~0u, 0, CIPHER_ADD, -1, false, 1237 &head, &tail); 1238 ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_DEL, -1, false, &head, 1239 &tail); 1240 1241 // Order the bulk ciphers. First the preferred AEAD ciphers. We prefer 1242 // CHACHA20 unless there is hardware support for fast and constant-time 1243 // AES_GCM. Of the two CHACHA20 variants, the new one is preferred over the 1244 // old one. 1245 if (EVP_has_aes_hardware()) { 1246 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128GCM, ~0u, 0, CIPHER_ADD, -1, 1247 false, &head, &tail); 1248 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256GCM, ~0u, 0, CIPHER_ADD, -1, 1249 false, &head, &tail); 1250 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_CHACHA20POLY1305, ~0u, 0, CIPHER_ADD, 1251 -1, false, &head, &tail); 1252 } else { 1253 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_CHACHA20POLY1305, ~0u, 0, CIPHER_ADD, 1254 -1, false, &head, &tail); 1255 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128GCM, ~0u, 0, CIPHER_ADD, -1, 1256 false, &head, &tail); 1257 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256GCM, ~0u, 0, CIPHER_ADD, -1, 1258 false, &head, &tail); 1259 } 1260 1261 // Then the legacy non-AEAD ciphers: AES_128_CBC, AES_256_CBC, 1262 // 3DES_EDE_CBC_SHA. 1263 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES128, ~0u, 0, CIPHER_ADD, -1, false, 1264 &head, &tail); 1265 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_AES256, ~0u, 0, CIPHER_ADD, -1, false, 1266 &head, &tail); 1267 ssl_cipher_apply_rule(0, ~0u, ~0u, SSL_3DES, ~0u, 0, CIPHER_ADD, -1, false, 1268 &head, &tail); 1269 1270 // Temporarily enable everything else for sorting 1271 ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_ADD, -1, false, &head, 1272 &tail); 1273 1274 // Move ciphers without forward secrecy to the end. 1275 ssl_cipher_apply_rule(0, (SSL_kRSA | SSL_kPSK), ~0u, ~0u, ~0u, 0, CIPHER_ORD, 1276 -1, false, &head, &tail); 1277 1278 // Now disable everything (maintaining the ordering!) 1279 ssl_cipher_apply_rule(0, ~0u, ~0u, ~0u, ~0u, 0, CIPHER_DEL, -1, false, &head, 1280 &tail); 1281 1282 // If the rule_string begins with DEFAULT, apply the default rule before 1283 // using the (possibly available) additional rules. 1284 const char *rule_p = rule_str; 1285 if (strncmp(rule_str, "DEFAULT", 7) == 0) { 1286 if (!ssl_cipher_process_rulestr(SSL_DEFAULT_CIPHER_LIST, &head, &tail, 1287 strict)) { 1288 goto err; 1289 } 1290 rule_p += 7; 1291 if (*rule_p == ':') { 1292 rule_p++; 1293 } 1294 } 1295 1296 if (*rule_p != '\0' && 1297 !ssl_cipher_process_rulestr(rule_p, &head, &tail, strict)) { 1298 goto err; 1299 } 1300 1301 // Allocate new "cipherstack" for the result, return with error 1302 // if we cannot get one. 1303 cipherstack = sk_SSL_CIPHER_new_null(); 1304 if (cipherstack == NULL) { 1305 goto err; 1306 } 1307 1308 in_group_flags = (uint8_t *)OPENSSL_malloc(kCiphersLen); 1309 if (!in_group_flags) { 1310 goto err; 1311 } 1312 1313 // The cipher selection for the list is done. The ciphers are added 1314 // to the resulting precedence to the STACK_OF(SSL_CIPHER). 1315 for (curr = head; curr != NULL; curr = curr->next) { 1316 if (curr->active) { 1317 if (!sk_SSL_CIPHER_push(cipherstack, curr->cipher)) { 1318 goto err; 1319 } 1320 in_group_flags[num_in_group_flags++] = curr->in_group; 1321 } 1322 } 1323 OPENSSL_free(co_list); // Not needed any longer 1324 co_list = NULL; 1325 1326 pref_list = (ssl_cipher_preference_list_st *)OPENSSL_malloc( 1327 sizeof(struct ssl_cipher_preference_list_st)); 1328 if (!pref_list) { 1329 goto err; 1330 } 1331 pref_list->ciphers = cipherstack; 1332 pref_list->in_group_flags = NULL; 1333 if (num_in_group_flags) { 1334 pref_list->in_group_flags = (uint8_t *)OPENSSL_malloc(num_in_group_flags); 1335 if (!pref_list->in_group_flags) { 1336 goto err; 1337 } 1338 OPENSSL_memcpy(pref_list->in_group_flags, in_group_flags, 1339 num_in_group_flags); 1340 } 1341 OPENSSL_free(in_group_flags); 1342 in_group_flags = NULL; 1343 if (*out_cipher_list != NULL) { 1344 ssl_cipher_preference_list_free(*out_cipher_list); 1345 } 1346 *out_cipher_list = pref_list; 1347 pref_list = NULL; 1348 1349 // Configuring an empty cipher list is an error but still updates the 1350 // output. 1351 if (sk_SSL_CIPHER_num((*out_cipher_list)->ciphers) == 0) { 1352 OPENSSL_PUT_ERROR(SSL, SSL_R_NO_CIPHER_MATCH); 1353 return false; 1354 } 1355 1356 return true; 1357 1358 err: 1359 OPENSSL_free(co_list); 1360 OPENSSL_free(in_group_flags); 1361 sk_SSL_CIPHER_free(cipherstack); 1362 if (pref_list) { 1363 OPENSSL_free(pref_list->in_group_flags); 1364 } 1365 OPENSSL_free(pref_list); 1366 return false; 1367 } 1368 1369 uint16_t ssl_cipher_get_value(const SSL_CIPHER *cipher) { 1370 uint32_t id = cipher->id; 1371 // All ciphers are SSLv3. 1372 assert((id & 0xff000000) == 0x03000000); 1373 return id & 0xffff; 1374 } 1375 1376 uint32_t ssl_cipher_auth_mask_for_key(const EVP_PKEY *key) { 1377 switch (EVP_PKEY_id(key)) { 1378 case EVP_PKEY_RSA: 1379 return SSL_aRSA; 1380 case EVP_PKEY_EC: 1381 case EVP_PKEY_ED25519: 1382 // Ed25519 keys in TLS 1.2 repurpose the ECDSA ciphers. 1383 return SSL_aECDSA; 1384 default: 1385 return 0; 1386 } 1387 } 1388 1389 bool ssl_cipher_uses_certificate_auth(const SSL_CIPHER *cipher) { 1390 return (cipher->algorithm_auth & SSL_aCERT) != 0; 1391 } 1392 1393 bool ssl_cipher_requires_server_key_exchange(const SSL_CIPHER *cipher) { 1394 // Ephemeral Diffie-Hellman key exchanges require a ServerKeyExchange. It is 1395 // optional or omitted in all others. 1396 return (cipher->algorithm_mkey & SSL_kECDHE) != 0; 1397 } 1398 1399 size_t ssl_cipher_get_record_split_len(const SSL_CIPHER *cipher) { 1400 size_t block_size; 1401 switch (cipher->algorithm_enc) { 1402 case SSL_3DES: 1403 block_size = 8; 1404 break; 1405 case SSL_AES128: 1406 case SSL_AES256: 1407 block_size = 16; 1408 break; 1409 default: 1410 return 0; 1411 } 1412 1413 // All supported TLS 1.0 ciphers use SHA-1. 1414 assert(cipher->algorithm_mac == SSL_SHA1); 1415 size_t ret = 1 + SHA_DIGEST_LENGTH; 1416 ret += block_size - (ret % block_size); 1417 return ret; 1418 } 1419 1420 } // namespace bssl 1421 1422 using namespace bssl; 1423 1424 const SSL_CIPHER *SSL_get_cipher_by_value(uint16_t value) { 1425 SSL_CIPHER c; 1426 1427 c.id = 0x03000000L | value; 1428 return reinterpret_cast<const SSL_CIPHER *>(bsearch( 1429 &c, kCiphers, kCiphersLen, sizeof(SSL_CIPHER), ssl_cipher_id_cmp)); 1430 } 1431 1432 uint32_t SSL_CIPHER_get_id(const SSL_CIPHER *cipher) { return cipher->id; } 1433 1434 int SSL_CIPHER_is_aead(const SSL_CIPHER *cipher) { 1435 return (cipher->algorithm_mac & SSL_AEAD) != 0; 1436 } 1437 1438 int SSL_CIPHER_get_cipher_nid(const SSL_CIPHER *cipher) { 1439 switch (cipher->algorithm_enc) { 1440 case SSL_eNULL: 1441 return NID_undef; 1442 case SSL_3DES: 1443 return NID_des_ede3_cbc; 1444 case SSL_AES128: 1445 return NID_aes_128_cbc; 1446 case SSL_AES256: 1447 return NID_aes_256_cbc; 1448 case SSL_AES128GCM: 1449 return NID_aes_128_gcm; 1450 case SSL_AES256GCM: 1451 return NID_aes_256_gcm; 1452 case SSL_CHACHA20POLY1305: 1453 return NID_chacha20_poly1305; 1454 } 1455 assert(0); 1456 return NID_undef; 1457 } 1458 1459 int SSL_CIPHER_get_digest_nid(const SSL_CIPHER *cipher) { 1460 switch (cipher->algorithm_mac) { 1461 case SSL_AEAD: 1462 return NID_undef; 1463 case SSL_SHA1: 1464 return NID_sha1; 1465 case SSL_SHA256: 1466 return NID_sha256; 1467 case SSL_SHA384: 1468 return NID_sha384; 1469 } 1470 assert(0); 1471 return NID_undef; 1472 } 1473 1474 int SSL_CIPHER_get_kx_nid(const SSL_CIPHER *cipher) { 1475 switch (cipher->algorithm_mkey) { 1476 case SSL_kRSA: 1477 return NID_kx_rsa; 1478 case SSL_kECDHE: 1479 return NID_kx_ecdhe; 1480 case SSL_kPSK: 1481 return NID_kx_psk; 1482 case SSL_kGENERIC: 1483 return NID_kx_any; 1484 } 1485 assert(0); 1486 return NID_undef; 1487 } 1488 1489 int SSL_CIPHER_get_auth_nid(const SSL_CIPHER *cipher) { 1490 switch (cipher->algorithm_auth) { 1491 case SSL_aRSA: 1492 return NID_auth_rsa; 1493 case SSL_aECDSA: 1494 return NID_auth_ecdsa; 1495 case SSL_aPSK: 1496 return NID_auth_psk; 1497 case SSL_aGENERIC: 1498 return NID_auth_any; 1499 } 1500 assert(0); 1501 return NID_undef; 1502 } 1503 1504 int SSL_CIPHER_get_prf_nid(const SSL_CIPHER *cipher) { 1505 switch (cipher->algorithm_prf) { 1506 case SSL_HANDSHAKE_MAC_DEFAULT: 1507 return NID_md5_sha1; 1508 case SSL_HANDSHAKE_MAC_SHA256: 1509 return NID_sha256; 1510 case SSL_HANDSHAKE_MAC_SHA384: 1511 return NID_sha384; 1512 } 1513 assert(0); 1514 return NID_undef; 1515 } 1516 1517 int SSL_CIPHER_is_block_cipher(const SSL_CIPHER *cipher) { 1518 return (cipher->algorithm_enc & SSL_eNULL) == 0 && 1519 cipher->algorithm_mac != SSL_AEAD; 1520 } 1521 1522 uint16_t SSL_CIPHER_get_min_version(const SSL_CIPHER *cipher) { 1523 if (cipher->algorithm_mkey == SSL_kGENERIC || 1524 cipher->algorithm_auth == SSL_aGENERIC) { 1525 return TLS1_3_VERSION; 1526 } 1527 1528 if (cipher->algorithm_prf != SSL_HANDSHAKE_MAC_DEFAULT) { 1529 // Cipher suites before TLS 1.2 use the default PRF, while all those added 1530 // afterwards specify a particular hash. 1531 return TLS1_2_VERSION; 1532 } 1533 return SSL3_VERSION; 1534 } 1535 1536 uint16_t SSL_CIPHER_get_max_version(const SSL_CIPHER *cipher) { 1537 if (cipher->algorithm_mkey == SSL_kGENERIC || 1538 cipher->algorithm_auth == SSL_aGENERIC) { 1539 return TLS1_3_VERSION; 1540 } 1541 return TLS1_2_VERSION; 1542 } 1543 1544 // return the actual cipher being used 1545 const char *SSL_CIPHER_get_name(const SSL_CIPHER *cipher) { 1546 if (cipher != NULL) { 1547 return cipher->name; 1548 } 1549 1550 return "(NONE)"; 1551 } 1552 1553 const char *SSL_CIPHER_standard_name(const SSL_CIPHER *cipher) { 1554 return cipher->standard_name; 1555 } 1556 1557 const char *SSL_CIPHER_get_kx_name(const SSL_CIPHER *cipher) { 1558 if (cipher == NULL) { 1559 return ""; 1560 } 1561 1562 switch (cipher->algorithm_mkey) { 1563 case SSL_kRSA: 1564 return "RSA"; 1565 1566 case SSL_kECDHE: 1567 switch (cipher->algorithm_auth) { 1568 case SSL_aECDSA: 1569 return "ECDHE_ECDSA"; 1570 case SSL_aRSA: 1571 return "ECDHE_RSA"; 1572 case SSL_aPSK: 1573 return "ECDHE_PSK"; 1574 default: 1575 assert(0); 1576 return "UNKNOWN"; 1577 } 1578 1579 case SSL_kPSK: 1580 assert(cipher->algorithm_auth == SSL_aPSK); 1581 return "PSK"; 1582 1583 case SSL_kGENERIC: 1584 assert(cipher->algorithm_auth == SSL_aGENERIC); 1585 return "GENERIC"; 1586 1587 default: 1588 assert(0); 1589 return "UNKNOWN"; 1590 } 1591 } 1592 1593 char *SSL_CIPHER_get_rfc_name(const SSL_CIPHER *cipher) { 1594 if (cipher == NULL) { 1595 return NULL; 1596 } 1597 1598 return OPENSSL_strdup(SSL_CIPHER_standard_name(cipher)); 1599 } 1600 1601 int SSL_CIPHER_get_bits(const SSL_CIPHER *cipher, int *out_alg_bits) { 1602 if (cipher == NULL) { 1603 return 0; 1604 } 1605 1606 int alg_bits, strength_bits; 1607 switch (cipher->algorithm_enc) { 1608 case SSL_AES128: 1609 case SSL_AES128GCM: 1610 alg_bits = 128; 1611 strength_bits = 128; 1612 break; 1613 1614 case SSL_AES256: 1615 case SSL_AES256GCM: 1616 case SSL_CHACHA20POLY1305: 1617 alg_bits = 256; 1618 strength_bits = 256; 1619 break; 1620 1621 case SSL_3DES: 1622 alg_bits = 168; 1623 strength_bits = 112; 1624 break; 1625 1626 case SSL_eNULL: 1627 alg_bits = 0; 1628 strength_bits = 0; 1629 break; 1630 1631 default: 1632 assert(0); 1633 alg_bits = 0; 1634 strength_bits = 0; 1635 } 1636 1637 if (out_alg_bits != NULL) { 1638 *out_alg_bits = alg_bits; 1639 } 1640 return strength_bits; 1641 } 1642 1643 const char *SSL_CIPHER_description(const SSL_CIPHER *cipher, char *buf, 1644 int len) { 1645 const char *kx, *au, *enc, *mac; 1646 uint32_t alg_mkey, alg_auth, alg_enc, alg_mac; 1647 1648 alg_mkey = cipher->algorithm_mkey; 1649 alg_auth = cipher->algorithm_auth; 1650 alg_enc = cipher->algorithm_enc; 1651 alg_mac = cipher->algorithm_mac; 1652 1653 switch (alg_mkey) { 1654 case SSL_kRSA: 1655 kx = "RSA"; 1656 break; 1657 1658 case SSL_kECDHE: 1659 kx = "ECDH"; 1660 break; 1661 1662 case SSL_kPSK: 1663 kx = "PSK"; 1664 break; 1665 1666 case SSL_kGENERIC: 1667 kx = "GENERIC"; 1668 break; 1669 1670 default: 1671 kx = "unknown"; 1672 } 1673 1674 switch (alg_auth) { 1675 case SSL_aRSA: 1676 au = "RSA"; 1677 break; 1678 1679 case SSL_aECDSA: 1680 au = "ECDSA"; 1681 break; 1682 1683 case SSL_aPSK: 1684 au = "PSK"; 1685 break; 1686 1687 case SSL_aGENERIC: 1688 au = "GENERIC"; 1689 break; 1690 1691 default: 1692 au = "unknown"; 1693 break; 1694 } 1695 1696 switch (alg_enc) { 1697 case SSL_3DES: 1698 enc = "3DES(168)"; 1699 break; 1700 1701 case SSL_AES128: 1702 enc = "AES(128)"; 1703 break; 1704 1705 case SSL_AES256: 1706 enc = "AES(256)"; 1707 break; 1708 1709 case SSL_AES128GCM: 1710 enc = "AESGCM(128)"; 1711 break; 1712 1713 case SSL_AES256GCM: 1714 enc = "AESGCM(256)"; 1715 break; 1716 1717 case SSL_CHACHA20POLY1305: 1718 enc = "ChaCha20-Poly1305"; 1719 break; 1720 1721 case SSL_eNULL: 1722 enc="None"; 1723 break; 1724 1725 default: 1726 enc = "unknown"; 1727 break; 1728 } 1729 1730 switch (alg_mac) { 1731 case SSL_SHA1: 1732 mac = "SHA1"; 1733 break; 1734 1735 case SSL_SHA256: 1736 mac = "SHA256"; 1737 break; 1738 1739 case SSL_SHA384: 1740 mac = "SHA384"; 1741 break; 1742 1743 case SSL_AEAD: 1744 mac = "AEAD"; 1745 break; 1746 1747 default: 1748 mac = "unknown"; 1749 break; 1750 } 1751 1752 if (buf == NULL) { 1753 len = 128; 1754 buf = (char *)OPENSSL_malloc(len); 1755 if (buf == NULL) { 1756 return NULL; 1757 } 1758 } else if (len < 128) { 1759 return "Buffer too small"; 1760 } 1761 1762 BIO_snprintf(buf, len, "%-23s Kx=%-8s Au=%-4s Enc=%-9s Mac=%-4s\n", 1763 cipher->name, kx, au, enc, mac); 1764 return buf; 1765 } 1766 1767 const char *SSL_CIPHER_get_version(const SSL_CIPHER *cipher) { 1768 return "TLSv1/SSLv3"; 1769 } 1770 1771 STACK_OF(SSL_COMP) *SSL_COMP_get_compression_methods(void) { return NULL; } 1772 1773 int SSL_COMP_add_compression_method(int id, COMP_METHOD *cm) { return 1; } 1774 1775 const char *SSL_COMP_get_name(const COMP_METHOD *comp) { return NULL; } 1776 1777 void SSL_COMP_free_compression_methods(void) {} 1778