diff options
| author | Denys Vlasenko <vda.linux@googlemail.com> | 2018-11-26 00:17:10 +0100 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2018-11-26 00:17:10 +0100 |
| commit | ca7cdd4b0350d47445f9c02adc161ebcb41b4c20 (patch) | |
| tree | f533aa7d84bee46327c978cba32d228fe58c4e55 | |
| parent | 838b88c044f04af07a260313f0f18ead5eb0fc6f (diff) | |
| download | busybox-w32-ca7cdd4b0350d47445f9c02adc161ebcb41b4c20.tar.gz busybox-w32-ca7cdd4b0350d47445f9c02adc161ebcb41b4c20.tar.bz2 busybox-w32-ca7cdd4b0350d47445f9c02adc161ebcb41b4c20.zip | |
tls: add support for 8 more cipher ids - all tested to work
function old new delta
tls_handshake 2059 2116 +57
static.ciphers - 30 +30
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 1/0 up/down: 87/0) Total: 87 bytes
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | networking/tls.c | 204 |
1 files changed, 117 insertions, 87 deletions
diff --git a/networking/tls.c b/networking/tls.c index 66d62fe3d..e76a78585 100644 --- a/networking/tls.c +++ b/networking/tls.c | |||
| @@ -19,6 +19,10 @@ | |||
| 19 | 19 | ||
| 20 | #include "tls.h" | 20 | #include "tls.h" |
| 21 | 21 | ||
| 22 | // works against "openssl s_server -cipher NULL" | ||
| 23 | // and against wolfssl-3.9.10-stable/examples/server/server.c: | ||
| 24 | #define ALLOW_RSA_NULL_SHA256 0 // for testing (does everything except encrypting) | ||
| 25 | |||
| 22 | //Tested against kernel.org: | 26 | //Tested against kernel.org: |
| 23 | //#define CIPHER_ID TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA // ok, recvs SERVER_KEY_EXCHANGE *** matrixssl uses this on my box | 27 | //#define CIPHER_ID TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA // ok, recvs SERVER_KEY_EXCHANGE *** matrixssl uses this on my box |
| 24 | //#define CIPHER_ID TLS_RSA_WITH_AES_256_CBC_SHA256 // ok, no SERVER_KEY_EXCHANGE | 28 | //#define CIPHER_ID TLS_RSA_WITH_AES_256_CBC_SHA256 // ok, no SERVER_KEY_EXCHANGE |
| @@ -35,10 +39,6 @@ | |||
| 35 | //#define CIPHER_ID TLS_RSA_WITH_AES_256_GCM_SHA384 // ok, no SERVER_KEY_EXCHANGE | 39 | //#define CIPHER_ID TLS_RSA_WITH_AES_256_GCM_SHA384 // ok, no SERVER_KEY_EXCHANGE |
| 36 | //#define CIPHER_ID TLS_RSA_WITH_AES_128_GCM_SHA256 // ok, no SERVER_KEY_EXCHANGE | 40 | //#define CIPHER_ID TLS_RSA_WITH_AES_128_GCM_SHA256 // ok, no SERVER_KEY_EXCHANGE |
| 37 | 41 | ||
| 38 | // works against "openssl s_server -cipher NULL" | ||
| 39 | // and against wolfssl-3.9.10-stable/examples/server/server.c: | ||
| 40 | //#define CIPHER_ID1 TLS_RSA_WITH_NULL_SHA256 // for testing (does everything except encrypting) | ||
| 41 | |||
| 42 | // works against wolfssl-3.9.10-stable/examples/server/server.c | 42 | // works against wolfssl-3.9.10-stable/examples/server/server.c |
| 43 | // works for kernel.org | 43 | // works for kernel.org |
| 44 | // does not work for cdn.kernel.org (e.g. downloading an actual tarball, not a web page) | 44 | // does not work for cdn.kernel.org (e.g. downloading an actual tarball, not a web page) |
| @@ -50,41 +50,15 @@ | |||
| 50 | // ok: openssl s_client -connect cdn.kernel.org:443 -debug -tls1_2 -no_tls1 -no_tls1_1 -cipher AES128-GCM-SHA256 | 50 | // ok: openssl s_client -connect cdn.kernel.org:443 -debug -tls1_2 -no_tls1 -no_tls1_1 -cipher AES128-GCM-SHA256 |
| 51 | // ok: openssl s_client -connect cdn.kernel.org:443 -debug -tls1_2 -no_tls1 -no_tls1_1 -cipher AES128-SHA | 51 | // ok: openssl s_client -connect cdn.kernel.org:443 -debug -tls1_2 -no_tls1 -no_tls1_1 -cipher AES128-SHA |
| 52 | // (TLS_RSA_WITH_AES_128_CBC_SHA - in TLS 1.2 it's mandated to be always supported) | 52 | // (TLS_RSA_WITH_AES_128_CBC_SHA - in TLS 1.2 it's mandated to be always supported) |
| 53 | #define CIPHER_ID1 TLS_RSA_WITH_AES_256_CBC_SHA256 //0x003D | 53 | //#define CIPHER_ID1 TLS_RSA_WITH_AES_256_CBC_SHA256 //0x003D |
| 54 | // Works with "wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.5.tar.xz" | 54 | // Works with "wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.5.tar.xz" |
| 55 | #define CIPHER_ID2 TLS_RSA_WITH_AES_128_CBC_SHA //0x002F | 55 | //#define CIPHER_ID2 TLS_RSA_WITH_AES_128_CBC_SHA //0x002F |
| 56 | 56 | ||
| 57 | // bug #11456: | 57 | // bug #11456: |
| 58 | // ftp.openbsd.org only supports ECDHE-RSA-AESnnn-GCM-SHAnnn or ECDHE-RSA-CHACHA20-POLY1305 | 58 | // ftp.openbsd.org only supports ECDHE-RSA-AESnnn-GCM-SHAnnn or ECDHE-RSA-CHACHA20-POLY1305 |
| 59 | #define CIPHER_ID3 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 //0xC02F | 59 | //#define CIPHER_ID3 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 //0xC02F |
| 60 | // host is.gd accepts only ECDHE-ECDSA-foo (the simplest which works: ECDHE-ECDSA-AES128-SHA 0xC009) | 60 | // host is.gd accepts only ECDHE-ECDSA-foo (the simplest which works: ECDHE-ECDSA-AES128-SHA 0xC009) |
| 61 | #define CIPHER_ID4 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA //0xC009 | 61 | //#define CIPHER_ID4 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA //0xC009 |
| 62 | |||
| 63 | #define NUM_CIPHERS 4 | ||
| 64 | //TODO: we can support all these: | ||
| 65 | // TLS_RSA_WITH_AES_128_CBC_SHA 0x002F | ||
| 66 | // TLS_RSA_WITH_AES_256_CBC_SHA 0x0035 | ||
| 67 | // TLS_RSA_WITH_AES_128_CBC_SHA256 0x003C | ||
| 68 | // TLS_RSA_WITH_AES_256_CBC_SHA256 0x003D | ||
| 69 | // TLS_RSA_WITH_AES_128_GCM_SHA256 0x009C | ||
| 70 | // TLS_RSA_WITH_AES_256_GCM_SHA384 0x009D | ||
| 71 | // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA 0xC009 | ||
| 72 | // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA 0xC00A | ||
| 73 | // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA 0xC013 | ||
| 74 | // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA 0xC014 | ||
| 75 | // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 0xC023 | ||
| 76 | ////TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 0xC024 - can't do SHA384 yet | ||
| 77 | // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 0xC027 | ||
| 78 | ////TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 0xC028 - can't do SHA384 yet | ||
| 79 | // TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 0xC02B | ||
| 80 | // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 0xC02C | ||
| 81 | // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 0xC02F | ||
| 82 | // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 0xC030 | ||
| 83 | //possibly these too: | ||
| 84 | // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA 0xC035 | ||
| 85 | // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA 0xC036 | ||
| 86 | // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 0xC037 | ||
| 87 | ////TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 0xC038 - can't do SHA384 yet | ||
| 88 | 62 | ||
| 89 | 63 | ||
| 90 | #define TLS_DEBUG 0 | 64 | #define TLS_DEBUG 0 |
| @@ -291,7 +265,7 @@ enum { | |||
| 291 | GOT_CERT_RSA_KEY_ALG = 1 << 1, | 265 | GOT_CERT_RSA_KEY_ALG = 1 << 1, |
| 292 | GOT_CERT_ECDSA_KEY_ALG = 1 << 2, // so far unused | 266 | GOT_CERT_ECDSA_KEY_ALG = 1 << 2, // so far unused |
| 293 | GOT_EC_KEY = 1 << 3, | 267 | GOT_EC_KEY = 1 << 3, |
| 294 | ENCRYPTION_AESGCM = 1 << 4, // else AES-SHA (or NULL-SHA if CIPHER_ID1 set to allow one) | 268 | ENCRYPTION_AESGCM = 1 << 4, // else AES-SHA (or NULL-SHA if ALLOW_RSA_NULL_SHA256=1) |
| 295 | ENCRYPT_ON_WRITE = 1 << 5, | 269 | ENCRYPT_ON_WRITE = 1 << 5, |
| 296 | }; | 270 | }; |
| 297 | 271 | ||
| @@ -676,7 +650,7 @@ static void xwrite_encrypted_and_hmac_signed(tls_state_t *tls, unsigned size, un | |||
| 676 | uint8_t padding_length; | 650 | uint8_t padding_length; |
| 677 | 651 | ||
| 678 | xhdr = (void*)(buf - RECHDR_LEN); | 652 | xhdr = (void*)(buf - RECHDR_LEN); |
| 679 | if (CIPHER_ID1 != TLS_RSA_WITH_NULL_SHA256 /* if "no encryption" can't be selected */ | 653 | if (!ALLOW_RSA_NULL_SHA256 /* if "no encryption" can't be selected */ |
| 680 | || tls->cipher_id != TLS_RSA_WITH_NULL_SHA256 /* or if it wasn't selected */ | 654 | || tls->cipher_id != TLS_RSA_WITH_NULL_SHA256 /* or if it wasn't selected */ |
| 681 | ) { | 655 | ) { |
| 682 | xhdr = (void*)(buf - RECHDR_LEN - AES_BLOCK_SIZE); /* place for IV */ | 656 | xhdr = (void*)(buf - RECHDR_LEN - AES_BLOCK_SIZE); /* place for IV */ |
| @@ -734,7 +708,7 @@ static void xwrite_encrypted_and_hmac_signed(tls_state_t *tls, unsigned size, un | |||
| 734 | // -------- ----------- ---------- -------------- | 708 | // -------- ----------- ---------- -------------- |
| 735 | // SHA HMAC-SHA1 20 20 | 709 | // SHA HMAC-SHA1 20 20 |
| 736 | // SHA256 HMAC-SHA256 32 32 | 710 | // SHA256 HMAC-SHA256 32 32 |
| 737 | if (CIPHER_ID1 == TLS_RSA_WITH_NULL_SHA256 | 711 | if (ALLOW_RSA_NULL_SHA256 |
| 738 | && tls->cipher_id == TLS_RSA_WITH_NULL_SHA256 | 712 | && tls->cipher_id == TLS_RSA_WITH_NULL_SHA256 |
| 739 | ) { | 713 | ) { |
| 740 | /* No encryption, only signing */ | 714 | /* No encryption, only signing */ |
| @@ -1478,6 +1452,39 @@ static ALWAYS_INLINE void fill_handshake_record_hdr(void *buf, unsigned type, un | |||
| 1478 | 1452 | ||
| 1479 | static void send_client_hello_and_alloc_hsd(tls_state_t *tls, const char *sni) | 1453 | static void send_client_hello_and_alloc_hsd(tls_state_t *tls, const char *sni) |
| 1480 | { | 1454 | { |
| 1455 | #define NUM_CIPHERS (12 + ALLOW_RSA_NULL_SHA256) | ||
| 1456 | static const uint8_t ciphers[] = { | ||
| 1457 | 0x00,(1 + NUM_CIPHERS) * 2, //len16_be | ||
| 1458 | 0x00,0xFF, //not a cipher - TLS_EMPTY_RENEGOTIATION_INFO_SCSV | ||
| 1459 | /* ^^^^^^ RFC 5746 Renegotiation Indication Extension - some servers will refuse to work with us otherwise */ | ||
| 1460 | 0xC0,0x09, // 1 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - ok: wget https://is.gd/ | ||
| 1461 | 0xC0,0x0A, // 2 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - ok: wget https://is.gd/ | ||
| 1462 | 0xC0,0x13, // 3 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-SHA | ||
| 1463 | // 0xC0,0x14, // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - openssl s_server ... -cipher ECDHE-RSA-AES256-SHA: "No ciphers enabled for max supported SSL/TLS version" | ||
| 1464 | 0xC0,0x23, // 4 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - ok: wget https://is.gd/ | ||
| 1465 | // 0xC0,0x24, // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1466 | 0xC0,0x27, // 5 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-SHA256 | ||
| 1467 | // 0xC0,0x28, // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1468 | 0xC0,0x2B, // 6 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - ok: wget https://is.gd/ | ||
| 1469 | // 0xC0,0x2C, // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - wget https://is.gd/: "TLS error from peer (alert code 20): bad MAC" | ||
| 1470 | 0xC0,0x2F, // 7 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-GCM-SHA256 | ||
| 1471 | // 0xC0,0x30, // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - openssl s_server ... -cipher ECDHE-RSA-AES256-GCM-SHA384: "decryption failed or bad record mac" | ||
| 1472 | //possibly these too: | ||
| 1473 | // 0xC0,0x35, // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | ||
| 1474 | // 0xC0,0x36, // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | ||
| 1475 | // 0xC0,0x37, // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 | ||
| 1476 | // 0xC0,0x38, // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1477 | 0x00,0x2F, // 8 TLS_RSA_WITH_AES_128_CBC_SHA - ok: openssl s_server ... -cipher AES128-SHA | ||
| 1478 | 0x00,0x35, // 9 TLS_RSA_WITH_AES_256_CBC_SHA - ok: openssl s_server ... -cipher AES256-SHA | ||
| 1479 | 0x00,0x3C, //10 TLS_RSA_WITH_AES_128_CBC_SHA256 - ok: openssl s_server ... -cipher AES128-SHA256 | ||
| 1480 | 0x00,0x3D, //11 TLS_RSA_WITH_AES_256_CBC_SHA256 - ok: openssl s_server ... -cipher AES256-SHA256 | ||
| 1481 | 0x00,0x9C, //12 TLS_RSA_WITH_AES_128_GCM_SHA256 - ok: openssl s_server ... -cipher AES128-GCM-SHA256 | ||
| 1482 | // 0x00,0x9D, // TLS_RSA_WITH_AES_256_GCM_SHA384 - openssl s_server ... -cipher AES256-GCM-SHA384: "decryption failed or bad record mac" | ||
| 1483 | #if ALLOW_RSA_NULL_SHA256 | ||
| 1484 | 0x00,0x3B, // TLS_RSA_WITH_NULL_SHA256 | ||
| 1485 | #endif | ||
| 1486 | 0x01,0x00, //not a cipher - comprtypes_len, comprtype | ||
| 1487 | }; | ||
| 1481 | static const uint8_t supported_groups[] = { | 1488 | static const uint8_t supported_groups[] = { |
| 1482 | 0x00,0x0a, //extension_type: "supported_groups" | 1489 | 0x00,0x0a, //extension_type: "supported_groups" |
| 1483 | 0x00,0x04, //ext len | 1490 | 0x00,0x04, //ext len |
| @@ -1502,7 +1509,7 @@ static void send_client_hello_and_alloc_hsd(tls_state_t *tls, const char *sni) | |||
| 1502 | uint8_t session_id_len; | 1509 | uint8_t session_id_len; |
| 1503 | /* uint8_t session_id[]; */ | 1510 | /* uint8_t session_id[]; */ |
| 1504 | uint8_t cipherid_len16_hi, cipherid_len16_lo; | 1511 | uint8_t cipherid_len16_hi, cipherid_len16_lo; |
| 1505 | uint8_t cipherid[2 * (1 + NUM_CIPHERS)]; /* actually variable */ | 1512 | uint8_t cipherid[(1 + NUM_CIPHERS) * 2]; /* actually variable */ |
| 1506 | uint8_t comprtypes_len; | 1513 | uint8_t comprtypes_len; |
| 1507 | uint8_t comprtypes[1]; /* actually variable */ | 1514 | uint8_t comprtypes[1]; /* actually variable */ |
| 1508 | /* Extensions (SNI shown): | 1515 | /* Extensions (SNI shown): |
| @@ -1550,28 +1557,8 @@ static void send_client_hello_and_alloc_hsd(tls_state_t *tls, const char *sni) | |||
| 1550 | memset(record->rand32, 0x11, sizeof(record->rand32)); | 1557 | memset(record->rand32, 0x11, sizeof(record->rand32)); |
| 1551 | /* record->session_id_len = 0; - already is */ | 1558 | /* record->session_id_len = 0; - already is */ |
| 1552 | 1559 | ||
| 1553 | /* record->cipherid_len16_hi = 0; */ | 1560 | BUILD_BUG_ON(sizeof(ciphers) != 2 + (1 + NUM_CIPHERS) * 2 + 2); |
| 1554 | record->cipherid_len16_lo = sizeof(record->cipherid); | 1561 | memcpy(&record->cipherid_len16_hi, ciphers, sizeof(ciphers)); |
| 1555 | /* RFC 5746 Renegotiation Indication Extension - some servers will refuse to work with us otherwise */ | ||
| 1556 | /*record->cipherid[0] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV >> 8; - zero */ | ||
| 1557 | record->cipherid[1] = TLS_EMPTY_RENEGOTIATION_INFO_SCSV & 0xff; | ||
| 1558 | if ((CIPHER_ID1 >> 8) != 0) record->cipherid[2] = CIPHER_ID1 >> 8; | ||
| 1559 | /*************************/ record->cipherid[3] = CIPHER_ID1 & 0xff; | ||
| 1560 | #if CIPHER_ID2 | ||
| 1561 | if ((CIPHER_ID2 >> 8) != 0) record->cipherid[4] = CIPHER_ID2 >> 8; | ||
| 1562 | /*************************/ record->cipherid[5] = CIPHER_ID2 & 0xff; | ||
| 1563 | #endif | ||
| 1564 | #if CIPHER_ID3 | ||
| 1565 | if ((CIPHER_ID3 >> 8) != 0) record->cipherid[6] = CIPHER_ID3 >> 8; | ||
| 1566 | /*************************/ record->cipherid[7] = CIPHER_ID3 & 0xff; | ||
| 1567 | #endif | ||
| 1568 | #if CIPHER_ID4 | ||
| 1569 | if ((CIPHER_ID4 >> 8) != 0) record->cipherid[8] = CIPHER_ID4 >> 8; | ||
| 1570 | /*************************/ record->cipherid[9] = CIPHER_ID4 & 0xff; | ||
| 1571 | #endif | ||
| 1572 | |||
| 1573 | record->comprtypes_len = 1; | ||
| 1574 | /* record->comprtypes[0] = 0; */ | ||
| 1575 | 1562 | ||
| 1576 | ptr = (void*)(record + 1); | 1563 | ptr = (void*)(record + 1); |
| 1577 | *ptr++ = ext_len >> 8; | 1564 | *ptr++ = ext_len >> 8; |
| @@ -1626,6 +1613,7 @@ static void get_server_hello(tls_state_t *tls) | |||
| 1626 | 1613 | ||
| 1627 | struct server_hello *hp; | 1614 | struct server_hello *hp; |
| 1628 | uint8_t *cipherid; | 1615 | uint8_t *cipherid; |
| 1616 | uint8_t cipherid1; | ||
| 1629 | unsigned cipher; | 1617 | unsigned cipher; |
| 1630 | int len, len24; | 1618 | int len, len24; |
| 1631 | 1619 | ||
| @@ -1659,39 +1647,81 @@ static void get_server_hello(tls_state_t *tls) | |||
| 1659 | len24 += 32; /* what len would be if session id would be present */ | 1647 | len24 += 32; /* what len would be if session id would be present */ |
| 1660 | } | 1648 | } |
| 1661 | 1649 | ||
| 1662 | if (len24 < 70 | 1650 | if (len24 < 70) |
| 1663 | // || cipherid[0] != (CIPHER_ID >> 8) | ||
| 1664 | // || cipherid[1] != (CIPHER_ID & 0xff) | ||
| 1665 | // || cipherid[2] != 0 /* comprtype */ | ||
| 1666 | ) { | ||
| 1667 | bad_record_die(tls, "'server hello'", len); | 1651 | bad_record_die(tls, "'server hello'", len); |
| 1668 | } | ||
| 1669 | dbg("<< SERVER_HELLO\n"); | 1652 | dbg("<< SERVER_HELLO\n"); |
| 1670 | 1653 | ||
| 1671 | memcpy(tls->hsd->client_and_server_rand32 + 32, hp->rand32, sizeof(hp->rand32)); | 1654 | memcpy(tls->hsd->client_and_server_rand32 + 32, hp->rand32, sizeof(hp->rand32)); |
| 1672 | 1655 | ||
| 1673 | tls->cipher_id = cipher = 0x100 * cipherid[0] + cipherid[1]; | 1656 | /* Set up encryption params based on selected cipher */ |
| 1657 | #if 0 | ||
| 1658 | 0xC0,0x09, // 1 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA - ok: wget https://is.gd/ | ||
| 1659 | 0xC0,0x0A, // 2 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA - ok: wget https://is.gd/ | ||
| 1660 | 0xC0,0x13, // 3 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-SHA | ||
| 1661 | // 0xC0,0x14, // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA - openssl s_server ... -cipher ECDHE-RSA-AES256-SHA: "No ciphers enabled for max supported SSL/TLS version" | ||
| 1662 | 0xC0,0x23, // 4 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 - ok: wget https://is.gd/ | ||
| 1663 | // 0xC0,0x24, // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1664 | 0xC0,0x27, // 5 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-SHA256 | ||
| 1665 | // 0xC0,0x28, // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1666 | 0xC0,0x2B, // 6 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 - ok: wget https://is.gd/ | ||
| 1667 | // 0xC0,0x2C, // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 - wget https://is.gd/: "TLS error from peer (alert code 20): bad MAC" | ||
| 1668 | 0xC0,0x2F, // 7 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 - ok: openssl s_server ... -cipher ECDHE-RSA-AES128-GCM-SHA256 | ||
| 1669 | // 0xC0,0x30, // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 - openssl s_server ... -cipher ECDHE-RSA-AES256-GCM-SHA384: "decryption failed or bad record mac" | ||
| 1670 | //possibly these too: | ||
| 1671 | // 0xC0,0x35, // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA | ||
| 1672 | // 0xC0,0x36, // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA | ||
| 1673 | // 0xC0,0x37, // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256 | ||
| 1674 | // 0xC0,0x38, // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384 - can't do SHA384 yet | ||
| 1675 | 0x00,0x2F, // 8 TLS_RSA_WITH_AES_128_CBC_SHA - ok: openssl s_server ... -cipher AES128-SHA | ||
| 1676 | 0x00,0x35, // 9 TLS_RSA_WITH_AES_256_CBC_SHA - ok: openssl s_server ... -cipher AES256-SHA | ||
| 1677 | 0x00,0x3C, //10 TLS_RSA_WITH_AES_128_CBC_SHA256 - ok: openssl s_server ... -cipher AES128-SHA256 | ||
| 1678 | 0x00,0x3D, //11 TLS_RSA_WITH_AES_256_CBC_SHA256 - ok: openssl s_server ... -cipher AES256-SHA256 | ||
| 1679 | 0x00,0x9C, //12 TLS_RSA_WITH_AES_128_GCM_SHA256 - ok: openssl s_server ... -cipher AES128-GCM-SHA256 | ||
| 1680 | // 0x00,0x9D, // TLS_RSA_WITH_AES_256_GCM_SHA384 - openssl s_server ... -cipher AES256-GCM-SHA384: "decryption failed or bad record mac" | ||
| 1681 | 0x00,0x3B, // TLS_RSA_WITH_NULL_SHA256 | ||
| 1682 | #endif | ||
| 1683 | cipherid1 = cipherid[1]; | ||
| 1684 | tls->cipher_id = cipher = 0x100 * cipherid[0] + cipherid1; | ||
| 1674 | dbg("server chose cipher %04x\n", cipher); | 1685 | dbg("server chose cipher %04x\n", cipher); |
| 1675 | 1686 | tls->key_size = AES256_KEYSIZE; | |
| 1676 | if (cipher == TLS_RSA_WITH_AES_128_CBC_SHA | 1687 | tls->MAC_size = SHA256_OUTSIZE; |
| 1677 | || cipher == TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA | 1688 | /*tls->IV_size = 0; - already is */ |
| 1678 | ) { | 1689 | if (cipherid[0] == 0xC0) { |
| 1679 | if (cipher == TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA) | 1690 | /* All C0xx are ECDHE */ |
| 1680 | tls->flags |= NEED_EC_KEY; | 1691 | tls->flags |= NEED_EC_KEY; |
| 1681 | tls->key_size = AES128_KEYSIZE; | 1692 | if (cipherid1 & 1) { |
| 1682 | tls->MAC_size = SHA1_OUTSIZE; | 1693 | /* Odd numbered C0xx use AES128 (even ones use AES256) */ |
| 1683 | } | 1694 | tls->key_size = AES128_KEYSIZE; |
| 1684 | else | 1695 | } |
| 1685 | if (cipher == TLS_RSA_WITH_AES_256_CBC_SHA256) { | 1696 | if (cipherid1 <= 0x14) { |
| 1686 | tls->key_size = AES256_KEYSIZE; | 1697 | tls->MAC_size = SHA1_OUTSIZE; |
| 1687 | tls->MAC_size = SHA256_OUTSIZE; | 1698 | } else |
| 1688 | } | 1699 | if (cipherid1 >= 0x2B && cipherid1 <= 0x30) { |
| 1689 | else { /* TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 */ | 1700 | /* C02B,2C,2F,30 are AES-GCM */ |
| 1690 | tls->flags |= NEED_EC_KEY | ENCRYPTION_AESGCM; | 1701 | tls->flags |= ENCRYPTION_AESGCM; |
| 1691 | tls->key_size = AES128_KEYSIZE; | 1702 | tls->MAC_size = 0; |
| 1692 | /* tls->MAC_size = 0; */ | 1703 | tls->IV_size = 4; |
| 1693 | tls->IV_size = 4; | 1704 | } |
| 1705 | } else { | ||
| 1706 | /* All 00xx are RSA */ | ||
| 1707 | if (cipherid1 == 0x2F | ||
| 1708 | || cipherid1 == 0x3C | ||
| 1709 | || cipherid1 == 0x9C | ||
| 1710 | ) { | ||
| 1711 | tls->key_size = AES128_KEYSIZE; | ||
| 1712 | } | ||
| 1713 | if (cipherid1 <= 0x35) { | ||
| 1714 | tls->MAC_size = SHA1_OUTSIZE; | ||
| 1715 | } else | ||
| 1716 | if (cipherid1 == 0x9C || cipherid1 == 0x9D) { | ||
| 1717 | /* 009C,9D are AES-GCM */ | ||
| 1718 | tls->flags |= ENCRYPTION_AESGCM; | ||
| 1719 | tls->MAC_size = 0; | ||
| 1720 | tls->IV_size = 4; | ||
| 1721 | } | ||
| 1694 | } | 1722 | } |
| 1723 | dbg("key_size:%u MAC_size:%u IV_size:%u\n", tls->key_size, tls->MAC_size, tls->IV_size); | ||
| 1724 | |||
| 1695 | /* Handshake hash eventually destined to FINISHED record | 1725 | /* Handshake hash eventually destined to FINISHED record |
| 1696 | * is sha256 regardless of cipher | 1726 | * is sha256 regardless of cipher |
| 1697 | * (at least for all ciphers defined by RFC5246). | 1727 | * (at least for all ciphers defined by RFC5246). |
| @@ -2171,7 +2201,7 @@ void FAST_FUNC tls_handshake(tls_state_t *tls, const char *sni) | |||
| 2171 | bad_record_die(tls, "switch to encrypted traffic", len); | 2201 | bad_record_die(tls, "switch to encrypted traffic", len); |
| 2172 | dbg("<< CHANGE_CIPHER_SPEC\n"); | 2202 | dbg("<< CHANGE_CIPHER_SPEC\n"); |
| 2173 | 2203 | ||
| 2174 | if (CIPHER_ID1 == TLS_RSA_WITH_NULL_SHA256 | 2204 | if (ALLOW_RSA_NULL_SHA256 |
| 2175 | && tls->cipher_id == TLS_RSA_WITH_NULL_SHA256 | 2205 | && tls->cipher_id == TLS_RSA_WITH_NULL_SHA256 |
| 2176 | ) { | 2206 | ) { |
| 2177 | tls->min_encrypted_len_on_read = tls->MAC_size; | 2207 | tls->min_encrypted_len_on_read = tls->MAC_size; |
