Home | History | Annotate | Line # | Download | only in ssl
t1_trce.c revision 1.1.1.5
      1      1.1       spz /*
      2  1.1.1.4  christos  * Copyright 2012-2018 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1       spz  *
      4  1.1.1.2  christos  * Licensed under the OpenSSL license (the "License").  You may not use
      5  1.1.1.2  christos  * this file except in compliance with the License.  You can obtain a copy
      6  1.1.1.2  christos  * in the file LICENSE in the source distribution or at
      7  1.1.1.2  christos  * https://www.openssl.org/source/license.html
      8      1.1       spz  */
      9      1.1       spz 
     10      1.1       spz #include "ssl_locl.h"
     11      1.1       spz 
     12      1.1       spz #ifndef OPENSSL_NO_SSL_TRACE
     13      1.1       spz 
     14      1.1       spz /* Packet trace support for OpenSSL */
     15      1.1       spz 
     16      1.1       spz typedef struct {
     17      1.1       spz     int num;
     18      1.1       spz     const char *name;
     19      1.1       spz } ssl_trace_tbl;
     20      1.1       spz 
     21      1.1       spz # define ssl_trace_str(val, tbl) \
     22  1.1.1.5  christos     do_ssl_trace_str(val, tbl, OSSL_NELEM(tbl))
     23      1.1       spz 
     24      1.1       spz # define ssl_trace_list(bio, indent, msg, msglen, value, table) \
     25  1.1.1.5  christos     do_ssl_trace_list(bio, indent, msg, msglen, value, \
     26  1.1.1.5  christos                       table, OSSL_NELEM(table))
     27      1.1       spz 
     28  1.1.1.5  christos static const char *do_ssl_trace_str(int val, const ssl_trace_tbl *tbl,
     29  1.1.1.5  christos                                     size_t ntbl)
     30      1.1       spz {
     31      1.1       spz     size_t i;
     32  1.1.1.5  christos 
     33      1.1       spz     for (i = 0; i < ntbl; i++, tbl++) {
     34      1.1       spz         if (tbl->num == val)
     35      1.1       spz             return tbl->name;
     36      1.1       spz     }
     37      1.1       spz     return "UNKNOWN";
     38      1.1       spz }
     39      1.1       spz 
     40      1.1       spz static int do_ssl_trace_list(BIO *bio, int indent,
     41      1.1       spz                              const unsigned char *msg, size_t msglen,
     42  1.1.1.5  christos                              size_t vlen, const ssl_trace_tbl *tbl, size_t ntbl)
     43      1.1       spz {
     44      1.1       spz     int val;
     45  1.1.1.5  christos 
     46      1.1       spz     if (msglen % vlen)
     47      1.1       spz         return 0;
     48      1.1       spz     while (msglen) {
     49      1.1       spz         val = msg[0];
     50      1.1       spz         if (vlen == 2)
     51      1.1       spz             val = (val << 8) | msg[1];
     52      1.1       spz         BIO_indent(bio, indent, 80);
     53      1.1       spz         BIO_printf(bio, "%s (%d)\n", do_ssl_trace_str(val, tbl, ntbl), val);
     54      1.1       spz         msg += vlen;
     55      1.1       spz         msglen -= vlen;
     56      1.1       spz     }
     57      1.1       spz     return 1;
     58      1.1       spz }
     59      1.1       spz 
     60      1.1       spz /* Version number */
     61      1.1       spz 
     62  1.1.1.5  christos static const ssl_trace_tbl ssl_version_tbl[] = {
     63      1.1       spz     {SSL3_VERSION, "SSL 3.0"},
     64      1.1       spz     {TLS1_VERSION, "TLS 1.0"},
     65      1.1       spz     {TLS1_1_VERSION, "TLS 1.1"},
     66      1.1       spz     {TLS1_2_VERSION, "TLS 1.2"},
     67  1.1.1.5  christos     {TLS1_3_VERSION, "TLS 1.3"},
     68      1.1       spz     {DTLS1_VERSION, "DTLS 1.0"},
     69      1.1       spz     {DTLS1_2_VERSION, "DTLS 1.2"},
     70      1.1       spz     {DTLS1_BAD_VER, "DTLS 1.0 (bad)"}
     71      1.1       spz };
     72      1.1       spz 
     73  1.1.1.5  christos static const ssl_trace_tbl ssl_content_tbl[] = {
     74      1.1       spz     {SSL3_RT_CHANGE_CIPHER_SPEC, "ChangeCipherSpec"},
     75      1.1       spz     {SSL3_RT_ALERT, "Alert"},
     76      1.1       spz     {SSL3_RT_HANDSHAKE, "Handshake"},
     77      1.1       spz     {SSL3_RT_APPLICATION_DATA, "ApplicationData"},
     78      1.1       spz };
     79      1.1       spz 
     80  1.1.1.5  christos /* Handshake types, sorted by ascending id  */
     81  1.1.1.5  christos static const ssl_trace_tbl ssl_handshake_tbl[] = {
     82      1.1       spz     {SSL3_MT_HELLO_REQUEST, "HelloRequest"},
     83      1.1       spz     {SSL3_MT_CLIENT_HELLO, "ClientHello"},
     84      1.1       spz     {SSL3_MT_SERVER_HELLO, "ServerHello"},
     85      1.1       spz     {DTLS1_MT_HELLO_VERIFY_REQUEST, "HelloVerifyRequest"},
     86      1.1       spz     {SSL3_MT_NEWSESSION_TICKET, "NewSessionTicket"},
     87  1.1.1.5  christos     {SSL3_MT_END_OF_EARLY_DATA, "EndOfEarlyData"},
     88  1.1.1.5  christos     {SSL3_MT_ENCRYPTED_EXTENSIONS, "EncryptedExtensions"},
     89      1.1       spz     {SSL3_MT_CERTIFICATE, "Certificate"},
     90      1.1       spz     {SSL3_MT_SERVER_KEY_EXCHANGE, "ServerKeyExchange"},
     91      1.1       spz     {SSL3_MT_CERTIFICATE_REQUEST, "CertificateRequest"},
     92      1.1       spz     {SSL3_MT_SERVER_DONE, "ServerHelloDone"},
     93      1.1       spz     {SSL3_MT_CERTIFICATE_VERIFY, "CertificateVerify"},
     94      1.1       spz     {SSL3_MT_CLIENT_KEY_EXCHANGE, "ClientKeyExchange"},
     95      1.1       spz     {SSL3_MT_FINISHED, "Finished"},
     96  1.1.1.5  christos     {SSL3_MT_CERTIFICATE_URL, "CertificateUrl"},
     97  1.1.1.5  christos     {SSL3_MT_CERTIFICATE_STATUS, "CertificateStatus"},
     98  1.1.1.5  christos     {SSL3_MT_SUPPLEMENTAL_DATA, "SupplementalData"},
     99  1.1.1.5  christos     {SSL3_MT_KEY_UPDATE, "KeyUpdate"},
    100  1.1.1.5  christos # ifndef OPENSSL_NO_NEXTPROTONEG
    101  1.1.1.5  christos     {SSL3_MT_NEXT_PROTO, "NextProto"},
    102  1.1.1.5  christos # endif
    103  1.1.1.5  christos     {SSL3_MT_MESSAGE_HASH, "MessageHash"}
    104      1.1       spz };
    105      1.1       spz 
    106      1.1       spz /* Cipher suites */
    107  1.1.1.5  christos static const ssl_trace_tbl ssl_ciphers_tbl[] = {
    108  1.1.1.5  christos     {0x0000, "TLS_NULL_WITH_NULL_NULL"},
    109  1.1.1.5  christos     {0x0001, "TLS_RSA_WITH_NULL_MD5"},
    110  1.1.1.5  christos     {0x0002, "TLS_RSA_WITH_NULL_SHA"},
    111  1.1.1.5  christos     {0x0003, "TLS_RSA_EXPORT_WITH_RC4_40_MD5"},
    112  1.1.1.5  christos     {0x0004, "TLS_RSA_WITH_RC4_128_MD5"},
    113  1.1.1.5  christos     {0x0005, "TLS_RSA_WITH_RC4_128_SHA"},
    114  1.1.1.5  christos     {0x0006, "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"},
    115  1.1.1.5  christos     {0x0007, "TLS_RSA_WITH_IDEA_CBC_SHA"},
    116  1.1.1.5  christos     {0x0008, "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"},
    117  1.1.1.5  christos     {0x0009, "TLS_RSA_WITH_DES_CBC_SHA"},
    118  1.1.1.5  christos     {0x000A, "TLS_RSA_WITH_3DES_EDE_CBC_SHA"},
    119  1.1.1.5  christos     {0x000B, "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"},
    120  1.1.1.5  christos     {0x000C, "TLS_DH_DSS_WITH_DES_CBC_SHA"},
    121  1.1.1.5  christos     {0x000D, "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"},
    122  1.1.1.5  christos     {0x000E, "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"},
    123  1.1.1.5  christos     {0x000F, "TLS_DH_RSA_WITH_DES_CBC_SHA"},
    124  1.1.1.5  christos     {0x0010, "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"},
    125  1.1.1.5  christos     {0x0011, "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"},
    126  1.1.1.5  christos     {0x0012, "TLS_DHE_DSS_WITH_DES_CBC_SHA"},
    127  1.1.1.5  christos     {0x0013, "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"},
    128  1.1.1.5  christos     {0x0014, "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"},
    129  1.1.1.5  christos     {0x0015, "TLS_DHE_RSA_WITH_DES_CBC_SHA"},
    130  1.1.1.5  christos     {0x0016, "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"},
    131  1.1.1.5  christos     {0x0017, "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5"},
    132  1.1.1.5  christos     {0x0018, "TLS_DH_anon_WITH_RC4_128_MD5"},
    133  1.1.1.5  christos     {0x0019, "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA"},
    134  1.1.1.5  christos     {0x001A, "TLS_DH_anon_WITH_DES_CBC_SHA"},
    135  1.1.1.5  christos     {0x001B, "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"},
    136      1.1       spz     {0x001D, "SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA"},
    137      1.1       spz     {0x001E, "SSL_FORTEZZA_KEA_WITH_RC4_128_SHA"},
    138      1.1       spz     {0x001F, "TLS_KRB5_WITH_3DES_EDE_CBC_SHA"},
    139      1.1       spz     {0x0020, "TLS_KRB5_WITH_RC4_128_SHA"},
    140      1.1       spz     {0x0021, "TLS_KRB5_WITH_IDEA_CBC_SHA"},
    141      1.1       spz     {0x0022, "TLS_KRB5_WITH_DES_CBC_MD5"},
    142      1.1       spz     {0x0023, "TLS_KRB5_WITH_3DES_EDE_CBC_MD5"},
    143      1.1       spz     {0x0024, "TLS_KRB5_WITH_RC4_128_MD5"},
    144      1.1       spz     {0x0025, "TLS_KRB5_WITH_IDEA_CBC_MD5"},
    145      1.1       spz     {0x0026, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"},
    146      1.1       spz     {0x0027, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"},
    147      1.1       spz     {0x0028, "TLS_KRB5_EXPORT_WITH_RC4_40_SHA"},
    148      1.1       spz     {0x0029, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"},
    149      1.1       spz     {0x002A, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"},
    150      1.1       spz     {0x002B, "TLS_KRB5_EXPORT_WITH_RC4_40_MD5"},
    151  1.1.1.2  christos     {0x002C, "TLS_PSK_WITH_NULL_SHA"},
    152  1.1.1.2  christos     {0x002D, "TLS_DHE_PSK_WITH_NULL_SHA"},
    153  1.1.1.2  christos     {0x002E, "TLS_RSA_PSK_WITH_NULL_SHA"},
    154      1.1       spz     {0x002F, "TLS_RSA_WITH_AES_128_CBC_SHA"},
    155      1.1       spz     {0x0030, "TLS_DH_DSS_WITH_AES_128_CBC_SHA"},
    156      1.1       spz     {0x0031, "TLS_DH_RSA_WITH_AES_128_CBC_SHA"},
    157      1.1       spz     {0x0032, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"},
    158      1.1       spz     {0x0033, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"},
    159      1.1       spz     {0x0034, "TLS_DH_anon_WITH_AES_128_CBC_SHA"},
    160      1.1       spz     {0x0035, "TLS_RSA_WITH_AES_256_CBC_SHA"},
    161      1.1       spz     {0x0036, "TLS_DH_DSS_WITH_AES_256_CBC_SHA"},
    162      1.1       spz     {0x0037, "TLS_DH_RSA_WITH_AES_256_CBC_SHA"},
    163      1.1       spz     {0x0038, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"},
    164      1.1       spz     {0x0039, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
    165      1.1       spz     {0x003A, "TLS_DH_anon_WITH_AES_256_CBC_SHA"},
    166      1.1       spz     {0x003B, "TLS_RSA_WITH_NULL_SHA256"},
    167      1.1       spz     {0x003C, "TLS_RSA_WITH_AES_128_CBC_SHA256"},
    168      1.1       spz     {0x003D, "TLS_RSA_WITH_AES_256_CBC_SHA256"},
    169      1.1       spz     {0x003E, "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"},
    170      1.1       spz     {0x003F, "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"},
    171      1.1       spz     {0x0040, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"},
    172      1.1       spz     {0x0041, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"},
    173      1.1       spz     {0x0042, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"},
    174      1.1       spz     {0x0043, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"},
    175      1.1       spz     {0x0044, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"},
    176      1.1       spz     {0x0045, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"},
    177      1.1       spz     {0x0046, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"},
    178      1.1       spz     {0x0067, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"},
    179      1.1       spz     {0x0068, "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"},
    180      1.1       spz     {0x0069, "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"},
    181      1.1       spz     {0x006A, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"},
    182      1.1       spz     {0x006B, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
    183      1.1       spz     {0x006C, "TLS_DH_anon_WITH_AES_128_CBC_SHA256"},
    184      1.1       spz     {0x006D, "TLS_DH_anon_WITH_AES_256_CBC_SHA256"},
    185  1.1.1.5  christos     {0x0081, "TLS_GOSTR341001_WITH_28147_CNT_IMIT"},
    186  1.1.1.5  christos     {0x0083, "TLS_GOSTR341001_WITH_NULL_GOSTR3411"},
    187      1.1       spz     {0x0084, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"},
    188      1.1       spz     {0x0085, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"},
    189      1.1       spz     {0x0086, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"},
    190      1.1       spz     {0x0087, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"},
    191      1.1       spz     {0x0088, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"},
    192      1.1       spz     {0x0089, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"},
    193      1.1       spz     {0x008A, "TLS_PSK_WITH_RC4_128_SHA"},
    194      1.1       spz     {0x008B, "TLS_PSK_WITH_3DES_EDE_CBC_SHA"},
    195      1.1       spz     {0x008C, "TLS_PSK_WITH_AES_128_CBC_SHA"},
    196      1.1       spz     {0x008D, "TLS_PSK_WITH_AES_256_CBC_SHA"},
    197      1.1       spz     {0x008E, "TLS_DHE_PSK_WITH_RC4_128_SHA"},
    198      1.1       spz     {0x008F, "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"},
    199      1.1       spz     {0x0090, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"},
    200      1.1       spz     {0x0091, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"},
    201      1.1       spz     {0x0092, "TLS_RSA_PSK_WITH_RC4_128_SHA"},
    202      1.1       spz     {0x0093, "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"},
    203      1.1       spz     {0x0094, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"},
    204      1.1       spz     {0x0095, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"},
    205      1.1       spz     {0x0096, "TLS_RSA_WITH_SEED_CBC_SHA"},
    206      1.1       spz     {0x0097, "TLS_DH_DSS_WITH_SEED_CBC_SHA"},
    207      1.1       spz     {0x0098, "TLS_DH_RSA_WITH_SEED_CBC_SHA"},
    208      1.1       spz     {0x0099, "TLS_DHE_DSS_WITH_SEED_CBC_SHA"},
    209      1.1       spz     {0x009A, "TLS_DHE_RSA_WITH_SEED_CBC_SHA"},
    210      1.1       spz     {0x009B, "TLS_DH_anon_WITH_SEED_CBC_SHA"},
    211      1.1       spz     {0x009C, "TLS_RSA_WITH_AES_128_GCM_SHA256"},
    212      1.1       spz     {0x009D, "TLS_RSA_WITH_AES_256_GCM_SHA384"},
    213      1.1       spz     {0x009E, "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"},
    214      1.1       spz     {0x009F, "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"},
    215      1.1       spz     {0x00A0, "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"},
    216      1.1       spz     {0x00A1, "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"},
    217      1.1       spz     {0x00A2, "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"},
    218      1.1       spz     {0x00A3, "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"},
    219      1.1       spz     {0x00A4, "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"},
    220      1.1       spz     {0x00A5, "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"},
    221      1.1       spz     {0x00A6, "TLS_DH_anon_WITH_AES_128_GCM_SHA256"},
    222      1.1       spz     {0x00A7, "TLS_DH_anon_WITH_AES_256_GCM_SHA384"},
    223      1.1       spz     {0x00A8, "TLS_PSK_WITH_AES_128_GCM_SHA256"},
    224      1.1       spz     {0x00A9, "TLS_PSK_WITH_AES_256_GCM_SHA384"},
    225      1.1       spz     {0x00AA, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"},
    226      1.1       spz     {0x00AB, "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"},
    227      1.1       spz     {0x00AC, "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"},
    228      1.1       spz     {0x00AD, "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"},
    229      1.1       spz     {0x00AE, "TLS_PSK_WITH_AES_128_CBC_SHA256"},
    230      1.1       spz     {0x00AF, "TLS_PSK_WITH_AES_256_CBC_SHA384"},
    231      1.1       spz     {0x00B0, "TLS_PSK_WITH_NULL_SHA256"},
    232      1.1       spz     {0x00B1, "TLS_PSK_WITH_NULL_SHA384"},
    233      1.1       spz     {0x00B2, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"},
    234      1.1       spz     {0x00B3, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"},
    235      1.1       spz     {0x00B4, "TLS_DHE_PSK_WITH_NULL_SHA256"},
    236      1.1       spz     {0x00B5, "TLS_DHE_PSK_WITH_NULL_SHA384"},
    237      1.1       spz     {0x00B6, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"},
    238      1.1       spz     {0x00B7, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"},
    239      1.1       spz     {0x00B8, "TLS_RSA_PSK_WITH_NULL_SHA256"},
    240      1.1       spz     {0x00B9, "TLS_RSA_PSK_WITH_NULL_SHA384"},
    241      1.1       spz     {0x00BA, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
    242      1.1       spz     {0x00BB, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
    243      1.1       spz     {0x00BC, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
    244      1.1       spz     {0x00BD, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
    245      1.1       spz     {0x00BE, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
    246      1.1       spz     {0x00BF, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"},
    247      1.1       spz     {0x00C0, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
    248      1.1       spz     {0x00C1, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
    249      1.1       spz     {0x00C2, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
    250      1.1       spz     {0x00C3, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
    251      1.1       spz     {0x00C4, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
    252      1.1       spz     {0x00C5, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"},
    253      1.1       spz     {0x00FF, "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"},
    254  1.1.1.2  christos     {0x5600, "TLS_FALLBACK_SCSV"},
    255      1.1       spz     {0xC001, "TLS_ECDH_ECDSA_WITH_NULL_SHA"},
    256      1.1       spz     {0xC002, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA"},
    257      1.1       spz     {0xC003, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"},
    258      1.1       spz     {0xC004, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"},
    259      1.1       spz     {0xC005, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"},
    260      1.1       spz     {0xC006, "TLS_ECDHE_ECDSA_WITH_NULL_SHA"},
    261      1.1       spz     {0xC007, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"},
    262      1.1       spz     {0xC008, "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"},
    263      1.1       spz     {0xC009, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"},
    264      1.1       spz     {0xC00A, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"},
    265      1.1       spz     {0xC00B, "TLS_ECDH_RSA_WITH_NULL_SHA"},
    266      1.1       spz     {0xC00C, "TLS_ECDH_RSA_WITH_RC4_128_SHA"},
    267      1.1       spz     {0xC00D, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"},
    268      1.1       spz     {0xC00E, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"},
    269      1.1       spz     {0xC00F, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"},
    270      1.1       spz     {0xC010, "TLS_ECDHE_RSA_WITH_NULL_SHA"},
    271      1.1       spz     {0xC011, "TLS_ECDHE_RSA_WITH_RC4_128_SHA"},
    272      1.1       spz     {0xC012, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"},
    273      1.1       spz     {0xC013, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"},
    274      1.1       spz     {0xC014, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"},
    275      1.1       spz     {0xC015, "TLS_ECDH_anon_WITH_NULL_SHA"},
    276      1.1       spz     {0xC016, "TLS_ECDH_anon_WITH_RC4_128_SHA"},
    277      1.1       spz     {0xC017, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"},
    278      1.1       spz     {0xC018, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA"},
    279      1.1       spz     {0xC019, "TLS_ECDH_anon_WITH_AES_256_CBC_SHA"},
    280      1.1       spz     {0xC01A, "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"},
    281      1.1       spz     {0xC01B, "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"},
    282      1.1       spz     {0xC01C, "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"},
    283      1.1       spz     {0xC01D, "TLS_SRP_SHA_WITH_AES_128_CBC_SHA"},
    284      1.1       spz     {0xC01E, "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"},
    285      1.1       spz     {0xC01F, "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"},
    286      1.1       spz     {0xC020, "TLS_SRP_SHA_WITH_AES_256_CBC_SHA"},
    287      1.1       spz     {0xC021, "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"},
    288      1.1       spz     {0xC022, "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"},
    289      1.1       spz     {0xC023, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"},
    290      1.1       spz     {0xC024, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
    291      1.1       spz     {0xC025, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"},
    292      1.1       spz     {0xC026, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"},
    293      1.1       spz     {0xC027, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
    294      1.1       spz     {0xC028, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"},
    295      1.1       spz     {0xC029, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"},
    296      1.1       spz     {0xC02A, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"},
    297      1.1       spz     {0xC02B, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"},
    298      1.1       spz     {0xC02C, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"},
    299      1.1       spz     {0xC02D, "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"},
    300      1.1       spz     {0xC02E, "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"},
    301      1.1       spz     {0xC02F, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"},
    302      1.1       spz     {0xC030, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"},
    303      1.1       spz     {0xC031, "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"},
    304      1.1       spz     {0xC032, "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"},
    305  1.1.1.2  christos     {0xC033, "TLS_ECDHE_PSK_WITH_RC4_128_SHA"},
    306  1.1.1.2  christos     {0xC034, "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"},
    307  1.1.1.2  christos     {0xC035, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"},
    308  1.1.1.2  christos     {0xC036, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"},
    309  1.1.1.2  christos     {0xC037, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"},
    310  1.1.1.2  christos     {0xC038, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"},
    311  1.1.1.2  christos     {0xC039, "TLS_ECDHE_PSK_WITH_NULL_SHA"},
    312  1.1.1.2  christos     {0xC03A, "TLS_ECDHE_PSK_WITH_NULL_SHA256"},
    313  1.1.1.2  christos     {0xC03B, "TLS_ECDHE_PSK_WITH_NULL_SHA384"},
    314  1.1.1.2  christos     {0xC03C, "TLS_RSA_WITH_ARIA_128_CBC_SHA256"},
    315  1.1.1.2  christos     {0xC03D, "TLS_RSA_WITH_ARIA_256_CBC_SHA384"},
    316  1.1.1.2  christos     {0xC03E, "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"},
    317  1.1.1.2  christos     {0xC03F, "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"},
    318  1.1.1.2  christos     {0xC040, "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"},
    319  1.1.1.2  christos     {0xC041, "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"},
    320  1.1.1.2  christos     {0xC042, "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"},
    321  1.1.1.2  christos     {0xC043, "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"},
    322  1.1.1.2  christos     {0xC044, "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"},
    323  1.1.1.2  christos     {0xC045, "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"},
    324  1.1.1.2  christos     {0xC046, "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"},
    325  1.1.1.2  christos     {0xC047, "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"},
    326  1.1.1.2  christos     {0xC048, "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"},
    327  1.1.1.2  christos     {0xC049, "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"},
    328  1.1.1.2  christos     {0xC04A, "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"},
    329  1.1.1.2  christos     {0xC04B, "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"},
    330  1.1.1.2  christos     {0xC04C, "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"},
    331  1.1.1.2  christos     {0xC04D, "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"},
    332  1.1.1.2  christos     {0xC04E, "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"},
    333  1.1.1.2  christos     {0xC04F, "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"},
    334  1.1.1.2  christos     {0xC050, "TLS_RSA_WITH_ARIA_128_GCM_SHA256"},
    335  1.1.1.2  christos     {0xC051, "TLS_RSA_WITH_ARIA_256_GCM_SHA384"},
    336  1.1.1.2  christos     {0xC052, "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"},
    337  1.1.1.2  christos     {0xC053, "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"},
    338  1.1.1.2  christos     {0xC054, "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"},
    339  1.1.1.2  christos     {0xC055, "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"},
    340  1.1.1.2  christos     {0xC056, "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"},
    341  1.1.1.2  christos     {0xC057, "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"},
    342  1.1.1.2  christos     {0xC058, "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"},
    343  1.1.1.2  christos     {0xC059, "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"},
    344  1.1.1.2  christos     {0xC05A, "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"},
    345  1.1.1.2  christos     {0xC05B, "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"},
    346  1.1.1.2  christos     {0xC05C, "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"},
    347  1.1.1.2  christos     {0xC05D, "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"},
    348  1.1.1.2  christos     {0xC05E, "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"},
    349  1.1.1.2  christos     {0xC05F, "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"},
    350  1.1.1.2  christos     {0xC060, "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"},
    351  1.1.1.2  christos     {0xC061, "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"},
    352  1.1.1.2  christos     {0xC062, "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"},
    353  1.1.1.2  christos     {0xC063, "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"},
    354  1.1.1.2  christos     {0xC064, "TLS_PSK_WITH_ARIA_128_CBC_SHA256"},
    355  1.1.1.2  christos     {0xC065, "TLS_PSK_WITH_ARIA_256_CBC_SHA384"},
    356  1.1.1.2  christos     {0xC066, "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"},
    357  1.1.1.2  christos     {0xC067, "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"},
    358  1.1.1.2  christos     {0xC068, "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"},
    359  1.1.1.2  christos     {0xC069, "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"},
    360  1.1.1.2  christos     {0xC06A, "TLS_PSK_WITH_ARIA_128_GCM_SHA256"},
    361  1.1.1.2  christos     {0xC06B, "TLS_PSK_WITH_ARIA_256_GCM_SHA384"},
    362  1.1.1.2  christos     {0xC06C, "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"},
    363  1.1.1.2  christos     {0xC06D, "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"},
    364  1.1.1.2  christos     {0xC06E, "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"},
    365  1.1.1.2  christos     {0xC06F, "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"},
    366  1.1.1.2  christos     {0xC070, "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"},
    367  1.1.1.2  christos     {0xC071, "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"},
    368  1.1.1.2  christos     {0xC072, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"},
    369  1.1.1.2  christos     {0xC073, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"},
    370  1.1.1.2  christos     {0xC074, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"},
    371  1.1.1.2  christos     {0xC075, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"},
    372  1.1.1.2  christos     {0xC076, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
    373  1.1.1.2  christos     {0xC077, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"},
    374  1.1.1.2  christos     {0xC078, "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
    375  1.1.1.2  christos     {0xC079, "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"},
    376  1.1.1.2  christos     {0xC07A, "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
    377  1.1.1.2  christos     {0xC07B, "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
    378  1.1.1.2  christos     {0xC07C, "TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
    379  1.1.1.2  christos     {0xC07D, "TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
    380  1.1.1.2  christos     {0xC07E, "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
    381  1.1.1.2  christos     {0xC07F, "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
    382  1.1.1.2  christos     {0xC080, "TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"},
    383  1.1.1.2  christos     {0xC081, "TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"},
    384  1.1.1.2  christos     {0xC082, "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"},
    385  1.1.1.2  christos     {0xC083, "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"},
    386  1.1.1.2  christos     {0xC084, "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"},
    387  1.1.1.2  christos     {0xC085, "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"},
    388  1.1.1.2  christos     {0xC086, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"},
    389  1.1.1.2  christos     {0xC087, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"},
    390  1.1.1.2  christos     {0xC088, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"},
    391  1.1.1.2  christos     {0xC089, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"},
    392  1.1.1.2  christos     {0xC08A, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
    393  1.1.1.2  christos     {0xC08B, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
    394  1.1.1.2  christos     {0xC08C, "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
    395  1.1.1.2  christos     {0xC08D, "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
    396  1.1.1.2  christos     {0xC08E, "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
    397  1.1.1.2  christos     {0xC08F, "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
    398  1.1.1.2  christos     {0xC090, "TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
    399  1.1.1.2  christos     {0xC091, "TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
    400  1.1.1.2  christos     {0xC092, "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
    401  1.1.1.2  christos     {0xC093, "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
    402  1.1.1.2  christos     {0xC094, "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
    403  1.1.1.2  christos     {0xC095, "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
    404  1.1.1.2  christos     {0xC096, "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
    405  1.1.1.2  christos     {0xC097, "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
    406  1.1.1.2  christos     {0xC098, "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
    407  1.1.1.2  christos     {0xC099, "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
    408  1.1.1.2  christos     {0xC09A, "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
    409  1.1.1.2  christos     {0xC09B, "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
    410  1.1.1.2  christos     {0xC09C, "TLS_RSA_WITH_AES_128_CCM"},
    411  1.1.1.2  christos     {0xC09D, "TLS_RSA_WITH_AES_256_CCM"},
    412  1.1.1.2  christos     {0xC09E, "TLS_DHE_RSA_WITH_AES_128_CCM"},
    413  1.1.1.2  christos     {0xC09F, "TLS_DHE_RSA_WITH_AES_256_CCM"},
    414  1.1.1.2  christos     {0xC0A0, "TLS_RSA_WITH_AES_128_CCM_8"},
    415  1.1.1.2  christos     {0xC0A1, "TLS_RSA_WITH_AES_256_CCM_8"},
    416  1.1.1.2  christos     {0xC0A2, "TLS_DHE_RSA_WITH_AES_128_CCM_8"},
    417  1.1.1.2  christos     {0xC0A3, "TLS_DHE_RSA_WITH_AES_256_CCM_8"},
    418  1.1.1.2  christos     {0xC0A4, "TLS_PSK_WITH_AES_128_CCM"},
    419  1.1.1.2  christos     {0xC0A5, "TLS_PSK_WITH_AES_256_CCM"},
    420  1.1.1.2  christos     {0xC0A6, "TLS_DHE_PSK_WITH_AES_128_CCM"},
    421  1.1.1.2  christos     {0xC0A7, "TLS_DHE_PSK_WITH_AES_256_CCM"},
    422  1.1.1.2  christos     {0xC0A8, "TLS_PSK_WITH_AES_128_CCM_8"},
    423  1.1.1.2  christos     {0xC0A9, "TLS_PSK_WITH_AES_256_CCM_8"},
    424  1.1.1.2  christos     {0xC0AA, "TLS_PSK_DHE_WITH_AES_128_CCM_8"},
    425  1.1.1.2  christos     {0xC0AB, "TLS_PSK_DHE_WITH_AES_256_CCM_8"},
    426  1.1.1.2  christos     {0xC0AC, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM"},
    427  1.1.1.2  christos     {0xC0AD, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM"},
    428  1.1.1.2  christos     {0xC0AE, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8"},
    429  1.1.1.2  christos     {0xC0AF, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8"},
    430  1.1.1.2  christos     {0xCCA8, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
    431  1.1.1.2  christos     {0xCCA9, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"},
    432  1.1.1.2  christos     {0xCCAA, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
    433  1.1.1.2  christos     {0xCCAB, "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    434  1.1.1.2  christos     {0xCCAC, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    435  1.1.1.2  christos     {0xCCAD, "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    436  1.1.1.2  christos     {0xCCAE, "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    437  1.1.1.5  christos     {0x1301, "TLS_AES_128_GCM_SHA256"},
    438  1.1.1.5  christos     {0x1302, "TLS_AES_256_GCM_SHA384"},
    439  1.1.1.5  christos     {0x1303, "TLS_CHACHA20_POLY1305_SHA256"},
    440  1.1.1.5  christos     {0x1304, "TLS_AES_128_CCM_SHA256"},
    441  1.1.1.5  christos     {0x1305, "TLS_AES_128_CCM_8_SHA256"},
    442      1.1       spz     {0xFEFE, "SSL_RSA_FIPS_WITH_DES_CBC_SHA"},
    443      1.1       spz     {0xFEFF, "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"},
    444  1.1.1.5  christos     {0xFF85, "GOST2012-GOST8912-GOST8912"},
    445  1.1.1.5  christos     {0xFF87, "GOST2012-NULL-GOST12"},
    446      1.1       spz };
    447      1.1       spz 
    448      1.1       spz /* Compression methods */
    449  1.1.1.5  christos static const ssl_trace_tbl ssl_comp_tbl[] = {
    450      1.1       spz     {0x0000, "No Compression"},
    451      1.1       spz     {0x0001, "Zlib Compression"}
    452      1.1       spz };
    453      1.1       spz 
    454  1.1.1.5  christos /* Extensions sorted by ascending id */
    455  1.1.1.5  christos static const ssl_trace_tbl ssl_exts_tbl[] = {
    456      1.1       spz     {TLSEXT_TYPE_server_name, "server_name"},
    457      1.1       spz     {TLSEXT_TYPE_max_fragment_length, "max_fragment_length"},
    458      1.1       spz     {TLSEXT_TYPE_client_certificate_url, "client_certificate_url"},
    459      1.1       spz     {TLSEXT_TYPE_trusted_ca_keys, "trusted_ca_keys"},
    460      1.1       spz     {TLSEXT_TYPE_truncated_hmac, "truncated_hmac"},
    461      1.1       spz     {TLSEXT_TYPE_status_request, "status_request"},
    462      1.1       spz     {TLSEXT_TYPE_user_mapping, "user_mapping"},
    463      1.1       spz     {TLSEXT_TYPE_client_authz, "client_authz"},
    464      1.1       spz     {TLSEXT_TYPE_server_authz, "server_authz"},
    465      1.1       spz     {TLSEXT_TYPE_cert_type, "cert_type"},
    466  1.1.1.5  christos     {TLSEXT_TYPE_supported_groups, "supported_groups"},
    467      1.1       spz     {TLSEXT_TYPE_ec_point_formats, "ec_point_formats"},
    468      1.1       spz     {TLSEXT_TYPE_srp, "srp"},
    469      1.1       spz     {TLSEXT_TYPE_signature_algorithms, "signature_algorithms"},
    470      1.1       spz     {TLSEXT_TYPE_use_srtp, "use_srtp"},
    471  1.1.1.5  christos     {TLSEXT_TYPE_heartbeat, "tls_heartbeat"},
    472  1.1.1.5  christos     {TLSEXT_TYPE_application_layer_protocol_negotiation,
    473  1.1.1.5  christos      "application_layer_protocol_negotiation"},
    474  1.1.1.5  christos     {TLSEXT_TYPE_signed_certificate_timestamp, "signed_certificate_timestamps"},
    475  1.1.1.5  christos     {TLSEXT_TYPE_padding, "padding"},
    476  1.1.1.5  christos     {TLSEXT_TYPE_encrypt_then_mac, "encrypt_then_mac"},
    477  1.1.1.5  christos     {TLSEXT_TYPE_extended_master_secret, "extended_master_secret"},
    478      1.1       spz     {TLSEXT_TYPE_session_ticket, "session_ticket"},
    479  1.1.1.5  christos     {TLSEXT_TYPE_psk, "psk"},
    480  1.1.1.5  christos     {TLSEXT_TYPE_early_data, "early_data"},
    481  1.1.1.5  christos     {TLSEXT_TYPE_supported_versions, "supported_versions"},
    482  1.1.1.5  christos     {TLSEXT_TYPE_cookie, "cookie_ext"},
    483  1.1.1.5  christos     {TLSEXT_TYPE_psk_kex_modes, "psk_key_exchange_modes"},
    484  1.1.1.5  christos     {TLSEXT_TYPE_certificate_authorities, "certificate_authorities"},
    485  1.1.1.5  christos     {TLSEXT_TYPE_post_handshake_auth, "post_handshake_auth"},
    486  1.1.1.5  christos     {TLSEXT_TYPE_signature_algorithms_cert, "signature_algorithms_cert"},
    487  1.1.1.5  christos     {TLSEXT_TYPE_key_share, "key_share"},
    488      1.1       spz     {TLSEXT_TYPE_renegotiate, "renegotiate"},
    489  1.1.1.2  christos # ifndef OPENSSL_NO_NEXTPROTONEG
    490      1.1       spz     {TLSEXT_TYPE_next_proto_neg, "next_proto_neg"},
    491  1.1.1.2  christos # endif
    492      1.1       spz };
    493      1.1       spz 
    494  1.1.1.5  christos static const ssl_trace_tbl ssl_groups_tbl[] = {
    495      1.1       spz     {1, "sect163k1 (K-163)"},
    496      1.1       spz     {2, "sect163r1"},
    497      1.1       spz     {3, "sect163r2 (B-163)"},
    498      1.1       spz     {4, "sect193r1"},
    499      1.1       spz     {5, "sect193r2"},
    500      1.1       spz     {6, "sect233k1 (K-233)"},
    501      1.1       spz     {7, "sect233r1 (B-233)"},
    502      1.1       spz     {8, "sect239k1"},
    503      1.1       spz     {9, "sect283k1 (K-283)"},
    504      1.1       spz     {10, "sect283r1 (B-283)"},
    505      1.1       spz     {11, "sect409k1 (K-409)"},
    506      1.1       spz     {12, "sect409r1 (B-409)"},
    507      1.1       spz     {13, "sect571k1 (K-571)"},
    508      1.1       spz     {14, "sect571r1 (B-571)"},
    509      1.1       spz     {15, "secp160k1"},
    510      1.1       spz     {16, "secp160r1"},
    511      1.1       spz     {17, "secp160r2"},
    512      1.1       spz     {18, "secp192k1"},
    513      1.1       spz     {19, "secp192r1 (P-192)"},
    514      1.1       spz     {20, "secp224k1"},
    515      1.1       spz     {21, "secp224r1 (P-224)"},
    516      1.1       spz     {22, "secp256k1"},
    517      1.1       spz     {23, "secp256r1 (P-256)"},
    518      1.1       spz     {24, "secp384r1 (P-384)"},
    519      1.1       spz     {25, "secp521r1 (P-521)"},
    520      1.1       spz     {26, "brainpoolP256r1"},
    521      1.1       spz     {27, "brainpoolP384r1"},
    522      1.1       spz     {28, "brainpoolP512r1"},
    523  1.1.1.2  christos     {29, "ecdh_x25519"},
    524  1.1.1.5  christos     {30, "ecdh_x448"},
    525  1.1.1.5  christos     {256, "ffdhe2048"},
    526  1.1.1.5  christos     {257, "ffdhe3072"},
    527  1.1.1.5  christos     {258, "ffdhe4096"},
    528  1.1.1.5  christos     {259, "ffdhe6144"},
    529  1.1.1.5  christos     {260, "ffdhe8192"},
    530      1.1       spz     {0xFF01, "arbitrary_explicit_prime_curves"},
    531      1.1       spz     {0xFF02, "arbitrary_explicit_char2_curves"}
    532      1.1       spz };
    533      1.1       spz 
    534  1.1.1.5  christos static const ssl_trace_tbl ssl_point_tbl[] = {
    535      1.1       spz     {0, "uncompressed"},
    536      1.1       spz     {1, "ansiX962_compressed_prime"},
    537      1.1       spz     {2, "ansiX962_compressed_char2"}
    538      1.1       spz };
    539      1.1       spz 
    540  1.1.1.5  christos static const ssl_trace_tbl ssl_mfl_tbl[] = {
    541  1.1.1.5  christos     {0, "disabled"},
    542  1.1.1.5  christos     {1, "max_fragment_length := 2^9 (512 bytes)"},
    543  1.1.1.5  christos     {2, "max_fragment_length := 2^10 (1024 bytes)"},
    544  1.1.1.5  christos     {3, "max_fragment_length := 2^11 (2048 bytes)"},
    545  1.1.1.5  christos     {4, "max_fragment_length := 2^12 (4096 bytes)"}
    546      1.1       spz };
    547      1.1       spz 
    548  1.1.1.5  christos static const ssl_trace_tbl ssl_sigalg_tbl[] = {
    549  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp256r1_sha256, "ecdsa_secp256r1_sha256"},
    550  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp384r1_sha384, "ecdsa_secp384r1_sha384"},
    551  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp521r1_sha512, "ecdsa_secp521r1_sha512"},
    552  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_sha224, "ecdsa_sha224"},
    553  1.1.1.5  christos     {TLSEXT_SIGALG_ed25519, "ed25519"},
    554  1.1.1.5  christos     {TLSEXT_SIGALG_ed448, "ed448"},
    555  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_sha1, "ecdsa_sha1"},
    556  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha256, "rsa_pss_rsae_sha256"},
    557  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha384, "rsa_pss_rsae_sha384"},
    558  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha512, "rsa_pss_rsae_sha512"},
    559  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha256, "rsa_pss_pss_sha256"},
    560  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha384, "rsa_pss_pss_sha384"},
    561  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha512, "rsa_pss_pss_sha512"},
    562  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha256, "rsa_pkcs1_sha256"},
    563  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha384, "rsa_pkcs1_sha384"},
    564  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha512, "rsa_pkcs1_sha512"},
    565  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha224, "rsa_pkcs1_sha224"},
    566  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha1, "rsa_pkcs1_sha1"},
    567  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha256, "dsa_sha256"},
    568  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha384, "dsa_sha384"},
    569  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha512, "dsa_sha512"},
    570  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha224, "dsa_sha224"},
    571  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha1, "dsa_sha1"},
    572  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, "gost2012_256"},
    573  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, "gost2012_512"},
    574  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102001_gostr3411, "gost2001_gost94"},
    575      1.1       spz };
    576      1.1       spz 
    577  1.1.1.5  christos static const ssl_trace_tbl ssl_ctype_tbl[] = {
    578      1.1       spz     {1, "rsa_sign"},
    579      1.1       spz     {2, "dss_sign"},
    580      1.1       spz     {3, "rsa_fixed_dh"},
    581      1.1       spz     {4, "dss_fixed_dh"},
    582      1.1       spz     {5, "rsa_ephemeral_dh"},
    583      1.1       spz     {6, "dss_ephemeral_dh"},
    584      1.1       spz     {20, "fortezza_dms"},
    585      1.1       spz     {64, "ecdsa_sign"},
    586      1.1       spz     {65, "rsa_fixed_ecdh"},
    587      1.1       spz     {66, "ecdsa_fixed_ecdh"}
    588      1.1       spz };
    589      1.1       spz 
    590  1.1.1.5  christos static const ssl_trace_tbl ssl_psk_kex_modes_tbl[] = {
    591  1.1.1.5  christos     {TLSEXT_KEX_MODE_KE, "psk_ke"},
    592  1.1.1.5  christos     {TLSEXT_KEX_MODE_KE_DHE, "psk_dhe_ke"}
    593  1.1.1.5  christos };
    594  1.1.1.5  christos 
    595  1.1.1.5  christos static const ssl_trace_tbl ssl_key_update_tbl[] = {
    596  1.1.1.5  christos     {SSL_KEY_UPDATE_NOT_REQUESTED, "update_not_requested"},
    597  1.1.1.5  christos     {SSL_KEY_UPDATE_REQUESTED, "update_requested"}
    598  1.1.1.5  christos };
    599  1.1.1.5  christos 
    600      1.1       spz static void ssl_print_hex(BIO *bio, int indent, const char *name,
    601      1.1       spz                           const unsigned char *msg, size_t msglen)
    602      1.1       spz {
    603      1.1       spz     size_t i;
    604  1.1.1.5  christos 
    605      1.1       spz     BIO_indent(bio, indent, 80);
    606      1.1       spz     BIO_printf(bio, "%s (len=%d): ", name, (int)msglen);
    607      1.1       spz     for (i = 0; i < msglen; i++)
    608      1.1       spz         BIO_printf(bio, "%02X", msg[i]);
    609      1.1       spz     BIO_puts(bio, "\n");
    610      1.1       spz }
    611      1.1       spz 
    612  1.1.1.5  christos static int ssl_print_hexbuf(BIO *bio, int indent, const char *name, size_t nlen,
    613      1.1       spz                             const unsigned char **pmsg, size_t *pmsglen)
    614      1.1       spz {
    615      1.1       spz     size_t blen;
    616      1.1       spz     const unsigned char *p = *pmsg;
    617  1.1.1.5  christos 
    618      1.1       spz     if (*pmsglen < nlen)
    619      1.1       spz         return 0;
    620      1.1       spz     blen = p[0];
    621      1.1       spz     if (nlen > 1)
    622      1.1       spz         blen = (blen << 8) | p[1];
    623      1.1       spz     if (*pmsglen < nlen + blen)
    624      1.1       spz         return 0;
    625      1.1       spz     p += nlen;
    626      1.1       spz     ssl_print_hex(bio, indent, name, p, blen);
    627      1.1       spz     *pmsg += blen + nlen;
    628      1.1       spz     *pmsglen -= blen + nlen;
    629      1.1       spz     return 1;
    630      1.1       spz }
    631      1.1       spz 
    632      1.1       spz static int ssl_print_version(BIO *bio, int indent, const char *name,
    633  1.1.1.5  christos                              const unsigned char **pmsg, size_t *pmsglen,
    634  1.1.1.5  christos                              unsigned int *version)
    635      1.1       spz {
    636      1.1       spz     int vers;
    637  1.1.1.5  christos 
    638      1.1       spz     if (*pmsglen < 2)
    639      1.1       spz         return 0;
    640      1.1       spz     vers = ((*pmsg)[0] << 8) | (*pmsg)[1];
    641  1.1.1.5  christos     if (version != NULL)
    642  1.1.1.5  christos         *version = vers;
    643      1.1       spz     BIO_indent(bio, indent, 80);
    644      1.1       spz     BIO_printf(bio, "%s=0x%x (%s)\n",
    645      1.1       spz                name, vers, ssl_trace_str(vers, ssl_version_tbl));
    646      1.1       spz     *pmsg += 2;
    647      1.1       spz     *pmsglen -= 2;
    648      1.1       spz     return 1;
    649      1.1       spz }
    650      1.1       spz 
    651      1.1       spz static int ssl_print_random(BIO *bio, int indent,
    652      1.1       spz                             const unsigned char **pmsg, size_t *pmsglen)
    653      1.1       spz {
    654      1.1       spz     unsigned int tm;
    655      1.1       spz     const unsigned char *p = *pmsg;
    656  1.1.1.5  christos 
    657      1.1       spz     if (*pmsglen < 32)
    658      1.1       spz         return 0;
    659      1.1       spz     tm = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];
    660      1.1       spz     p += 4;
    661      1.1       spz     BIO_indent(bio, indent, 80);
    662      1.1       spz     BIO_puts(bio, "Random:\n");
    663      1.1       spz     BIO_indent(bio, indent + 2, 80);
    664      1.1       spz     BIO_printf(bio, "gmt_unix_time=0x%08X\n", tm);
    665      1.1       spz     ssl_print_hex(bio, indent + 2, "random_bytes", p, 28);
    666      1.1       spz     *pmsg += 32;
    667      1.1       spz     *pmsglen -= 32;
    668      1.1       spz     return 1;
    669      1.1       spz }
    670      1.1       spz 
    671  1.1.1.5  christos static int ssl_print_signature(BIO *bio, int indent, const SSL *ssl,
    672      1.1       spz                                const unsigned char **pmsg, size_t *pmsglen)
    673      1.1       spz {
    674      1.1       spz     if (*pmsglen < 2)
    675      1.1       spz         return 0;
    676  1.1.1.5  christos     if (SSL_USE_SIGALGS(ssl)) {
    677      1.1       spz         const unsigned char *p = *pmsg;
    678  1.1.1.5  christos         unsigned int sigalg = (p[0] << 8) | p[1];
    679  1.1.1.5  christos 
    680      1.1       spz         BIO_indent(bio, indent, 80);
    681  1.1.1.5  christos         BIO_printf(bio, "Signature Algorithm: %s (0x%04x)\n",
    682  1.1.1.5  christos                    ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
    683      1.1       spz         *pmsg += 2;
    684      1.1       spz         *pmsglen -= 2;
    685      1.1       spz     }
    686      1.1       spz     return ssl_print_hexbuf(bio, indent, "Signature", 2, pmsg, pmsglen);
    687      1.1       spz }
    688      1.1       spz 
    689  1.1.1.5  christos static int ssl_print_extension(BIO *bio, int indent, int server,
    690  1.1.1.5  christos                                unsigned char mt, int extype,
    691      1.1       spz                                const unsigned char *ext, size_t extlen)
    692      1.1       spz {
    693  1.1.1.5  christos     size_t xlen, share_len;
    694  1.1.1.5  christos     unsigned int sigalg;
    695  1.1.1.5  christos     uint32_t max_early_data;
    696  1.1.1.5  christos 
    697      1.1       spz     BIO_indent(bio, indent, 80);
    698      1.1       spz     BIO_printf(bio, "extension_type=%s(%d), length=%d\n",
    699      1.1       spz                ssl_trace_str(extype, ssl_exts_tbl), extype, (int)extlen);
    700      1.1       spz     switch (extype) {
    701  1.1.1.5  christos     case TLSEXT_TYPE_max_fragment_length:
    702  1.1.1.5  christos         if (extlen < 1)
    703  1.1.1.5  christos             return 0;
    704  1.1.1.5  christos         xlen = extlen;
    705  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext, xlen, 1, ssl_mfl_tbl);
    706  1.1.1.5  christos 
    707      1.1       spz     case TLSEXT_TYPE_ec_point_formats:
    708      1.1       spz         if (extlen < 1)
    709      1.1       spz             return 0;
    710      1.1       spz         xlen = ext[0];
    711      1.1       spz         if (extlen != xlen + 1)
    712      1.1       spz             return 0;
    713  1.1.1.2  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1, ssl_point_tbl);
    714      1.1       spz 
    715  1.1.1.5  christos     case TLSEXT_TYPE_supported_groups:
    716      1.1       spz         if (extlen < 2)
    717      1.1       spz             return 0;
    718      1.1       spz         xlen = (ext[0] << 8) | ext[1];
    719      1.1       spz         if (extlen != xlen + 2)
    720      1.1       spz             return 0;
    721  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 2, xlen, 2, ssl_groups_tbl);
    722  1.1.1.5  christos     case TLSEXT_TYPE_application_layer_protocol_negotiation:
    723  1.1.1.5  christos         if (extlen < 2)
    724  1.1.1.5  christos             return 0;
    725  1.1.1.5  christos         xlen = (ext[0] << 8) | ext[1];
    726  1.1.1.5  christos         if (extlen != xlen + 2)
    727  1.1.1.5  christos             return 0;
    728  1.1.1.5  christos         ext += 2;
    729  1.1.1.5  christos         while (xlen > 0) {
    730  1.1.1.5  christos             size_t plen = *ext++;
    731  1.1.1.5  christos 
    732  1.1.1.5  christos             if (plen + 1 > xlen)
    733  1.1.1.5  christos                 return 0;
    734  1.1.1.5  christos             BIO_indent(bio, indent + 2, 80);
    735  1.1.1.5  christos             BIO_write(bio, ext, plen);
    736  1.1.1.5  christos             BIO_puts(bio, "\n");
    737  1.1.1.5  christos             ext += plen;
    738  1.1.1.5  christos             xlen -= plen + 1;
    739  1.1.1.5  christos         }
    740  1.1.1.5  christos         return 1;
    741      1.1       spz 
    742      1.1       spz     case TLSEXT_TYPE_signature_algorithms:
    743      1.1       spz 
    744      1.1       spz         if (extlen < 2)
    745      1.1       spz             return 0;
    746      1.1       spz         xlen = (ext[0] << 8) | ext[1];
    747      1.1       spz         if (extlen != xlen + 2)
    748      1.1       spz             return 0;
    749      1.1       spz         if (xlen & 1)
    750      1.1       spz             return 0;
    751      1.1       spz         ext += 2;
    752      1.1       spz         while (xlen > 0) {
    753      1.1       spz             BIO_indent(bio, indent + 2, 80);
    754  1.1.1.5  christos             sigalg = (ext[0] << 8) | ext[1];
    755  1.1.1.5  christos             BIO_printf(bio, "%s (0x%04x)\n",
    756  1.1.1.5  christos                        ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
    757      1.1       spz             xlen -= 2;
    758      1.1       spz             ext += 2;
    759      1.1       spz         }
    760      1.1       spz         break;
    761      1.1       spz 
    762      1.1       spz     case TLSEXT_TYPE_renegotiate:
    763      1.1       spz         if (extlen < 1)
    764      1.1       spz             return 0;
    765      1.1       spz         xlen = ext[0];
    766      1.1       spz         if (xlen + 1 != extlen)
    767      1.1       spz             return 0;
    768      1.1       spz         ext++;
    769      1.1       spz         if (xlen) {
    770      1.1       spz             if (server) {
    771      1.1       spz                 if (xlen & 1)
    772      1.1       spz                     return 0;
    773      1.1       spz                 xlen >>= 1;
    774      1.1       spz             }
    775      1.1       spz             ssl_print_hex(bio, indent + 4, "client_verify_data", ext, xlen);
    776      1.1       spz             if (server) {
    777      1.1       spz                 ext += xlen;
    778  1.1.1.2  christos                 ssl_print_hex(bio, indent + 4, "server_verify_data", ext, xlen);
    779      1.1       spz             }
    780      1.1       spz         } else {
    781      1.1       spz             BIO_indent(bio, indent + 4, 80);
    782      1.1       spz             BIO_puts(bio, "<EMPTY>\n");
    783      1.1       spz         }
    784      1.1       spz         break;
    785      1.1       spz 
    786      1.1       spz     case TLSEXT_TYPE_heartbeat:
    787  1.1.1.5  christos         return 0;
    788      1.1       spz 
    789      1.1       spz     case TLSEXT_TYPE_session_ticket:
    790      1.1       spz         if (extlen != 0)
    791      1.1       spz             ssl_print_hex(bio, indent + 4, "ticket", ext, extlen);
    792      1.1       spz         break;
    793      1.1       spz 
    794  1.1.1.5  christos     case TLSEXT_TYPE_key_share:
    795  1.1.1.5  christos         if (server && extlen == 2) {
    796  1.1.1.5  christos             int group_id;
    797  1.1.1.5  christos 
    798  1.1.1.5  christos             /* We assume this is an HRR, otherwise this is an invalid key_share */
    799  1.1.1.5  christos             group_id = (ext[0] << 8) | ext[1];
    800  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    801  1.1.1.5  christos             BIO_printf(bio, "NamedGroup: %s (%d)\n",
    802  1.1.1.5  christos                        ssl_trace_str(group_id, ssl_groups_tbl), group_id);
    803  1.1.1.5  christos             break;
    804  1.1.1.5  christos         }
    805  1.1.1.5  christos         if (extlen < 2)
    806  1.1.1.5  christos             return 0;
    807  1.1.1.5  christos         if (server) {
    808  1.1.1.5  christos             xlen = extlen;
    809  1.1.1.5  christos         } else {
    810  1.1.1.5  christos             xlen = (ext[0] << 8) | ext[1];
    811  1.1.1.5  christos             if (extlen != xlen + 2)
    812  1.1.1.5  christos                 return 0;
    813  1.1.1.5  christos             ext += 2;
    814  1.1.1.5  christos         }
    815  1.1.1.5  christos         for (; xlen > 0; ext += share_len, xlen -= share_len) {
    816  1.1.1.5  christos             int group_id;
    817  1.1.1.5  christos 
    818  1.1.1.5  christos             if (xlen < 4)
    819  1.1.1.5  christos                 return 0;
    820  1.1.1.5  christos             group_id = (ext[0] << 8) | ext[1];
    821  1.1.1.5  christos             share_len = (ext[2] << 8) | ext[3];
    822  1.1.1.5  christos             ext += 4;
    823  1.1.1.5  christos             xlen -= 4;
    824  1.1.1.5  christos             if (xlen < share_len)
    825  1.1.1.5  christos                 return 0;
    826  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    827  1.1.1.5  christos             BIO_printf(bio, "NamedGroup: %s (%d)\n",
    828  1.1.1.5  christos                        ssl_trace_str(group_id, ssl_groups_tbl), group_id);
    829  1.1.1.5  christos             ssl_print_hex(bio, indent + 4, "key_exchange: ", ext, share_len);
    830  1.1.1.5  christos         }
    831  1.1.1.5  christos         break;
    832  1.1.1.5  christos 
    833  1.1.1.5  christos     case TLSEXT_TYPE_supported_versions:
    834  1.1.1.5  christos         if (server) {
    835  1.1.1.5  christos             int version;
    836  1.1.1.5  christos 
    837  1.1.1.5  christos             if (extlen != 2)
    838  1.1.1.5  christos                 return 0;
    839  1.1.1.5  christos             version = (ext[0] << 8) | ext[1];
    840  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    841  1.1.1.5  christos             BIO_printf(bio, "%s (%d)\n",
    842  1.1.1.5  christos                        ssl_trace_str(version, ssl_version_tbl), version);
    843  1.1.1.5  christos             break;
    844  1.1.1.5  christos         }
    845  1.1.1.5  christos         if (extlen < 1)
    846  1.1.1.5  christos             return 0;
    847  1.1.1.5  christos         xlen = ext[0];
    848  1.1.1.5  christos         if (extlen != xlen + 1)
    849  1.1.1.5  christos             return 0;
    850  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 2,
    851  1.1.1.5  christos                               ssl_version_tbl);
    852  1.1.1.5  christos 
    853  1.1.1.5  christos     case TLSEXT_TYPE_psk_kex_modes:
    854  1.1.1.5  christos         if (extlen < 1)
    855  1.1.1.5  christos             return 0;
    856  1.1.1.5  christos         xlen = ext[0];
    857  1.1.1.5  christos         if (extlen != xlen + 1)
    858  1.1.1.5  christos             return 0;
    859  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1,
    860  1.1.1.5  christos                               ssl_psk_kex_modes_tbl);
    861  1.1.1.5  christos 
    862  1.1.1.5  christos     case TLSEXT_TYPE_early_data:
    863  1.1.1.5  christos         if (mt != SSL3_MT_NEWSESSION_TICKET)
    864  1.1.1.5  christos             break;
    865  1.1.1.5  christos         if (extlen != 4)
    866  1.1.1.5  christos             return 0;
    867  1.1.1.5  christos         max_early_data = (ext[0] << 24) | (ext[1] << 16) | (ext[2] << 8)
    868  1.1.1.5  christos                          | ext[3];
    869  1.1.1.5  christos         BIO_indent(bio, indent + 2, 80);
    870  1.1.1.5  christos         BIO_printf(bio, "max_early_data=%u\n", max_early_data);
    871  1.1.1.5  christos         break;
    872  1.1.1.5  christos 
    873      1.1       spz     default:
    874  1.1.1.2  christos         BIO_dump_indent(bio, (const char *)ext, extlen, indent + 2);
    875      1.1       spz     }
    876      1.1       spz     return 1;
    877      1.1       spz }
    878      1.1       spz 
    879      1.1       spz static int ssl_print_extensions(BIO *bio, int indent, int server,
    880  1.1.1.5  christos                                 unsigned char mt, const unsigned char **msgin,
    881  1.1.1.5  christos                                 size_t *msginlen)
    882      1.1       spz {
    883  1.1.1.5  christos     size_t extslen, msglen = *msginlen;
    884  1.1.1.5  christos     const unsigned char *msg = *msgin;
    885  1.1.1.5  christos 
    886      1.1       spz     BIO_indent(bio, indent, 80);
    887      1.1       spz     if (msglen == 0) {
    888  1.1.1.5  christos         BIO_puts(bio, "No extensions\n");
    889      1.1       spz         return 1;
    890      1.1       spz     }
    891  1.1.1.4  christos     if (msglen < 2)
    892  1.1.1.4  christos         return 0;
    893      1.1       spz     extslen = (msg[0] << 8) | msg[1];
    894  1.1.1.5  christos     msglen -= 2;
    895      1.1       spz     msg += 2;
    896  1.1.1.5  christos     if (extslen == 0) {
    897  1.1.1.5  christos         BIO_puts(bio, "No extensions\n");
    898  1.1.1.5  christos         *msgin = msg;
    899  1.1.1.5  christos         *msginlen = msglen;
    900  1.1.1.5  christos         return 1;
    901  1.1.1.5  christos     }
    902  1.1.1.5  christos     if (extslen > msglen)
    903  1.1.1.5  christos         return 0;
    904  1.1.1.5  christos     BIO_printf(bio, "extensions, length = %d\n", (int)extslen);
    905  1.1.1.5  christos     msglen -= extslen;
    906  1.1.1.5  christos     while (extslen > 0) {
    907      1.1       spz         int extype;
    908      1.1       spz         size_t extlen;
    909  1.1.1.5  christos         if (extslen < 4)
    910      1.1       spz             return 0;
    911      1.1       spz         extype = (msg[0] << 8) | msg[1];
    912      1.1       spz         extlen = (msg[2] << 8) | msg[3];
    913  1.1.1.5  christos         if (extslen < extlen + 4) {
    914  1.1.1.5  christos             BIO_printf(bio, "extensions, extype = %d, extlen = %d\n", extype,
    915  1.1.1.5  christos                        (int)extlen);
    916  1.1.1.5  christos             BIO_dump_indent(bio, (const char *)msg, extslen, indent + 2);
    917      1.1       spz             return 0;
    918  1.1.1.5  christos         }
    919      1.1       spz         msg += 4;
    920  1.1.1.5  christos         if (!ssl_print_extension(bio, indent + 2, server, mt, extype, msg,
    921  1.1.1.5  christos                                  extlen))
    922      1.1       spz             return 0;
    923      1.1       spz         msg += extlen;
    924  1.1.1.5  christos         extslen -= extlen + 4;
    925      1.1       spz     }
    926  1.1.1.5  christos 
    927  1.1.1.5  christos     *msgin = msg;
    928  1.1.1.5  christos     *msginlen = msglen;
    929      1.1       spz     return 1;
    930      1.1       spz }
    931      1.1       spz 
    932  1.1.1.5  christos static int ssl_print_client_hello(BIO *bio, const SSL *ssl, int indent,
    933      1.1       spz                                   const unsigned char *msg, size_t msglen)
    934      1.1       spz {
    935      1.1       spz     size_t len;
    936      1.1       spz     unsigned int cs;
    937  1.1.1.5  christos 
    938  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "client_version", &msg, &msglen, NULL))
    939      1.1       spz         return 0;
    940      1.1       spz     if (!ssl_print_random(bio, indent, &msg, &msglen))
    941      1.1       spz         return 0;
    942      1.1       spz     if (!ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
    943      1.1       spz         return 0;
    944      1.1       spz     if (SSL_IS_DTLS(ssl)) {
    945      1.1       spz         if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
    946      1.1       spz             return 0;
    947      1.1       spz     }
    948      1.1       spz     if (msglen < 2)
    949      1.1       spz         return 0;
    950      1.1       spz     len = (msg[0] << 8) | msg[1];
    951      1.1       spz     msg += 2;
    952      1.1       spz     msglen -= 2;
    953      1.1       spz     BIO_indent(bio, indent, 80);
    954      1.1       spz     BIO_printf(bio, "cipher_suites (len=%d)\n", (int)len);
    955      1.1       spz     if (msglen < len || len & 1)
    956      1.1       spz         return 0;
    957      1.1       spz     while (len > 0) {
    958      1.1       spz         cs = (msg[0] << 8) | msg[1];
    959      1.1       spz         BIO_indent(bio, indent + 2, 80);
    960      1.1       spz         BIO_printf(bio, "{0x%02X, 0x%02X} %s\n",
    961      1.1       spz                    msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
    962      1.1       spz         msg += 2;
    963      1.1       spz         msglen -= 2;
    964      1.1       spz         len -= 2;
    965      1.1       spz     }
    966      1.1       spz     if (msglen < 1)
    967      1.1       spz         return 0;
    968      1.1       spz     len = msg[0];
    969      1.1       spz     msg++;
    970      1.1       spz     msglen--;
    971      1.1       spz     if (msglen < len)
    972      1.1       spz         return 0;
    973      1.1       spz     BIO_indent(bio, indent, 80);
    974      1.1       spz     BIO_printf(bio, "compression_methods (len=%d)\n", (int)len);
    975      1.1       spz     while (len > 0) {
    976      1.1       spz         BIO_indent(bio, indent + 2, 80);
    977      1.1       spz         BIO_printf(bio, "%s (0x%02X)\n",
    978      1.1       spz                    ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
    979      1.1       spz         msg++;
    980      1.1       spz         msglen--;
    981      1.1       spz         len--;
    982      1.1       spz     }
    983  1.1.1.5  christos     if (!ssl_print_extensions(bio, indent, 0, SSL3_MT_CLIENT_HELLO, &msg,
    984  1.1.1.5  christos                               &msglen))
    985      1.1       spz         return 0;
    986      1.1       spz     return 1;
    987      1.1       spz }
    988      1.1       spz 
    989      1.1       spz static int dtls_print_hello_vfyrequest(BIO *bio, int indent,
    990  1.1.1.2  christos                                        const unsigned char *msg, size_t msglen)
    991      1.1       spz {
    992  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, NULL))
    993      1.1       spz         return 0;
    994      1.1       spz     if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
    995      1.1       spz         return 0;
    996      1.1       spz     return 1;
    997      1.1       spz }
    998      1.1       spz 
    999      1.1       spz static int ssl_print_server_hello(BIO *bio, int indent,
   1000      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1001      1.1       spz {
   1002      1.1       spz     unsigned int cs;
   1003  1.1.1.5  christos     unsigned int vers;
   1004  1.1.1.5  christos 
   1005  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, &vers))
   1006      1.1       spz         return 0;
   1007      1.1       spz     if (!ssl_print_random(bio, indent, &msg, &msglen))
   1008      1.1       spz         return 0;
   1009  1.1.1.5  christos     if (vers != TLS1_3_VERSION
   1010  1.1.1.5  christos             && !ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
   1011      1.1       spz         return 0;
   1012      1.1       spz     if (msglen < 2)
   1013      1.1       spz         return 0;
   1014      1.1       spz     cs = (msg[0] << 8) | msg[1];
   1015      1.1       spz     BIO_indent(bio, indent, 80);
   1016      1.1       spz     BIO_printf(bio, "cipher_suite {0x%02X, 0x%02X} %s\n",
   1017      1.1       spz                msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
   1018      1.1       spz     msg += 2;
   1019      1.1       spz     msglen -= 2;
   1020  1.1.1.5  christos     if (vers != TLS1_3_VERSION) {
   1021  1.1.1.5  christos         if (msglen < 1)
   1022  1.1.1.5  christos             return 0;
   1023  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1024  1.1.1.5  christos         BIO_printf(bio, "compression_method: %s (0x%02X)\n",
   1025  1.1.1.5  christos                    ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
   1026  1.1.1.5  christos         msg++;
   1027  1.1.1.5  christos         msglen--;
   1028  1.1.1.5  christos     }
   1029  1.1.1.5  christos     if (!ssl_print_extensions(bio, indent, 1, SSL3_MT_SERVER_HELLO, &msg,
   1030  1.1.1.5  christos                               &msglen))
   1031      1.1       spz         return 0;
   1032      1.1       spz     return 1;
   1033      1.1       spz }
   1034      1.1       spz 
   1035  1.1.1.5  christos static int ssl_get_keyex(const char **pname, const SSL *ssl)
   1036      1.1       spz {
   1037      1.1       spz     unsigned long alg_k = ssl->s3->tmp.new_cipher->algorithm_mkey;
   1038  1.1.1.5  christos 
   1039      1.1       spz     if (alg_k & SSL_kRSA) {
   1040      1.1       spz         *pname = "rsa";
   1041      1.1       spz         return SSL_kRSA;
   1042      1.1       spz     }
   1043  1.1.1.2  christos     if (alg_k & SSL_kDHE) {
   1044  1.1.1.2  christos         *pname = "DHE";
   1045  1.1.1.2  christos         return SSL_kDHE;
   1046  1.1.1.2  christos     }
   1047  1.1.1.2  christos     if (alg_k & SSL_kECDHE) {
   1048  1.1.1.2  christos         *pname = "ECDHE";
   1049  1.1.1.2  christos         return SSL_kECDHE;
   1050      1.1       spz     }
   1051      1.1       spz     if (alg_k & SSL_kPSK) {
   1052      1.1       spz         *pname = "PSK";
   1053      1.1       spz         return SSL_kPSK;
   1054      1.1       spz     }
   1055  1.1.1.2  christos     if (alg_k & SSL_kRSAPSK) {
   1056  1.1.1.2  christos         *pname = "RSAPSK";
   1057  1.1.1.2  christos         return SSL_kRSAPSK;
   1058  1.1.1.2  christos     }
   1059  1.1.1.2  christos     if (alg_k & SSL_kDHEPSK) {
   1060  1.1.1.2  christos         *pname = "DHEPSK";
   1061  1.1.1.2  christos         return SSL_kDHEPSK;
   1062  1.1.1.2  christos     }
   1063  1.1.1.2  christos     if (alg_k & SSL_kECDHEPSK) {
   1064  1.1.1.2  christos         *pname = "ECDHEPSK";
   1065  1.1.1.2  christos         return SSL_kECDHEPSK;
   1066  1.1.1.2  christos     }
   1067      1.1       spz     if (alg_k & SSL_kSRP) {
   1068      1.1       spz         *pname = "SRP";
   1069      1.1       spz         return SSL_kSRP;
   1070      1.1       spz     }
   1071      1.1       spz     if (alg_k & SSL_kGOST) {
   1072      1.1       spz         *pname = "GOST";
   1073      1.1       spz         return SSL_kGOST;
   1074      1.1       spz     }
   1075      1.1       spz     *pname = "UNKNOWN";
   1076      1.1       spz     return 0;
   1077      1.1       spz }
   1078      1.1       spz 
   1079  1.1.1.5  christos static int ssl_print_client_keyex(BIO *bio, int indent, const SSL *ssl,
   1080      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1081      1.1       spz {
   1082      1.1       spz     const char *algname;
   1083  1.1.1.5  christos     int id = ssl_get_keyex(&algname, ssl);
   1084  1.1.1.5  christos 
   1085      1.1       spz     BIO_indent(bio, indent, 80);
   1086      1.1       spz     BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
   1087  1.1.1.2  christos     if (id & SSL_PSK) {
   1088  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2,
   1089  1.1.1.2  christos                               "psk_identity", 2, &msg, &msglen))
   1090  1.1.1.2  christos             return 0;
   1091  1.1.1.2  christos     }
   1092      1.1       spz     switch (id) {
   1093      1.1       spz 
   1094      1.1       spz     case SSL_kRSA:
   1095  1.1.1.2  christos     case SSL_kRSAPSK:
   1096      1.1       spz         if (TLS1_get_version(ssl) == SSL3_VERSION) {
   1097      1.1       spz             ssl_print_hex(bio, indent + 2,
   1098  1.1.1.5  christos                           "EncryptedPreMasterSecret", msg, msglen);
   1099      1.1       spz         } else {
   1100      1.1       spz             if (!ssl_print_hexbuf(bio, indent + 2,
   1101  1.1.1.5  christos                                   "EncryptedPreMasterSecret", 2, &msg, &msglen))
   1102      1.1       spz                 return 0;
   1103      1.1       spz         }
   1104      1.1       spz         break;
   1105      1.1       spz 
   1106  1.1.1.2  christos     case SSL_kDHE:
   1107  1.1.1.2  christos     case SSL_kDHEPSK:
   1108      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_Yc", 2, &msg, &msglen))
   1109      1.1       spz             return 0;
   1110      1.1       spz         break;
   1111      1.1       spz 
   1112  1.1.1.2  christos     case SSL_kECDHE:
   1113  1.1.1.2  christos     case SSL_kECDHEPSK:
   1114      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "ecdh_Yc", 1, &msg, &msglen))
   1115      1.1       spz             return 0;
   1116      1.1       spz         break;
   1117  1.1.1.2  christos 
   1118      1.1       spz     }
   1119      1.1       spz 
   1120  1.1.1.2  christos     return !msglen;
   1121      1.1       spz }
   1122      1.1       spz 
   1123  1.1.1.5  christos static int ssl_print_server_keyex(BIO *bio, int indent, const SSL *ssl,
   1124      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1125      1.1       spz {
   1126      1.1       spz     const char *algname;
   1127  1.1.1.5  christos     int id = ssl_get_keyex(&algname, ssl);
   1128  1.1.1.5  christos 
   1129      1.1       spz     BIO_indent(bio, indent, 80);
   1130      1.1       spz     BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
   1131  1.1.1.2  christos     if (id & SSL_PSK) {
   1132  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2,
   1133  1.1.1.2  christos                               "psk_identity_hint", 2, &msg, &msglen))
   1134  1.1.1.2  christos             return 0;
   1135  1.1.1.2  christos     }
   1136      1.1       spz     switch (id) {
   1137      1.1       spz     case SSL_kRSA:
   1138      1.1       spz 
   1139  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2, "rsa_modulus", 2, &msg, &msglen))
   1140      1.1       spz             return 0;
   1141      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "rsa_exponent", 2,
   1142      1.1       spz                               &msg, &msglen))
   1143      1.1       spz             return 0;
   1144      1.1       spz         break;
   1145      1.1       spz 
   1146  1.1.1.2  christos     case SSL_kDHE:
   1147  1.1.1.2  christos     case SSL_kDHEPSK:
   1148      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_p", 2, &msg, &msglen))
   1149      1.1       spz             return 0;
   1150      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_g", 2, &msg, &msglen))
   1151      1.1       spz             return 0;
   1152      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_Ys", 2, &msg, &msglen))
   1153      1.1       spz             return 0;
   1154      1.1       spz         break;
   1155      1.1       spz 
   1156  1.1.1.2  christos # ifndef OPENSSL_NO_EC
   1157  1.1.1.2  christos     case SSL_kECDHE:
   1158  1.1.1.2  christos     case SSL_kECDHEPSK:
   1159      1.1       spz         if (msglen < 1)
   1160      1.1       spz             return 0;
   1161      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1162      1.1       spz         if (msg[0] == EXPLICIT_PRIME_CURVE_TYPE)
   1163      1.1       spz             BIO_puts(bio, "explicit_prime\n");
   1164      1.1       spz         else if (msg[0] == EXPLICIT_CHAR2_CURVE_TYPE)
   1165      1.1       spz             BIO_puts(bio, "explicit_char2\n");
   1166      1.1       spz         else if (msg[0] == NAMED_CURVE_TYPE) {
   1167      1.1       spz             int curve;
   1168      1.1       spz             if (msglen < 3)
   1169      1.1       spz                 return 0;
   1170      1.1       spz             curve = (msg[1] << 8) | msg[2];
   1171      1.1       spz             BIO_printf(bio, "named_curve: %s (%d)\n",
   1172  1.1.1.5  christos                        ssl_trace_str(curve, ssl_groups_tbl), curve);
   1173      1.1       spz             msg += 3;
   1174      1.1       spz             msglen -= 3;
   1175      1.1       spz             if (!ssl_print_hexbuf(bio, indent + 2, "point", 1, &msg, &msglen))
   1176      1.1       spz                 return 0;
   1177  1.1.1.2  christos         } else {
   1178  1.1.1.2  christos             BIO_printf(bio, "UNKNOWN CURVE PARAMETER TYPE %d\n", msg[0]);
   1179  1.1.1.2  christos             return 0;
   1180      1.1       spz         }
   1181      1.1       spz         break;
   1182  1.1.1.2  christos # endif
   1183  1.1.1.2  christos 
   1184  1.1.1.2  christos     case SSL_kPSK:
   1185  1.1.1.2  christos     case SSL_kRSAPSK:
   1186  1.1.1.2  christos         break;
   1187      1.1       spz     }
   1188  1.1.1.2  christos     if (!(id & SSL_PSK))
   1189  1.1.1.2  christos         ssl_print_signature(bio, indent, ssl, &msg, &msglen);
   1190  1.1.1.2  christos     return !msglen;
   1191      1.1       spz }
   1192      1.1       spz 
   1193      1.1       spz static int ssl_print_certificate(BIO *bio, int indent,
   1194      1.1       spz                                  const unsigned char **pmsg, size_t *pmsglen)
   1195      1.1       spz {
   1196      1.1       spz     size_t msglen = *pmsglen;
   1197      1.1       spz     size_t clen;
   1198      1.1       spz     X509 *x;
   1199      1.1       spz     const unsigned char *p = *pmsg, *q;
   1200  1.1.1.5  christos 
   1201      1.1       spz     if (msglen < 3)
   1202      1.1       spz         return 0;
   1203      1.1       spz     clen = (p[0] << 16) | (p[1] << 8) | p[2];
   1204      1.1       spz     if (msglen < clen + 3)
   1205      1.1       spz         return 0;
   1206      1.1       spz     q = p + 3;
   1207      1.1       spz     BIO_indent(bio, indent, 80);
   1208      1.1       spz     BIO_printf(bio, "ASN.1Cert, length=%d", (int)clen);
   1209      1.1       spz     x = d2i_X509(NULL, &q, clen);
   1210      1.1       spz     if (!x)
   1211      1.1       spz         BIO_puts(bio, "<UNPARSEABLE CERTIFICATE>\n");
   1212      1.1       spz     else {
   1213      1.1       spz         BIO_puts(bio, "\n------details-----\n");
   1214      1.1       spz         X509_print_ex(bio, x, XN_FLAG_ONELINE, 0);
   1215      1.1       spz         PEM_write_bio_X509(bio, x);
   1216      1.1       spz         /* Print certificate stuff */
   1217      1.1       spz         BIO_puts(bio, "------------------\n");
   1218      1.1       spz         X509_free(x);
   1219      1.1       spz     }
   1220      1.1       spz     if (q != p + 3 + clen) {
   1221      1.1       spz         BIO_puts(bio, "<TRAILING GARBAGE AFTER CERTIFICATE>\n");
   1222      1.1       spz     }
   1223      1.1       spz     *pmsg += clen + 3;
   1224      1.1       spz     *pmsglen -= clen + 3;
   1225      1.1       spz     return 1;
   1226      1.1       spz }
   1227      1.1       spz 
   1228  1.1.1.5  christos static int ssl_print_certificates(BIO *bio, const SSL *ssl, int server,
   1229  1.1.1.5  christos                                   int indent, const unsigned char *msg,
   1230  1.1.1.5  christos                                   size_t msglen)
   1231      1.1       spz {
   1232      1.1       spz     size_t clen;
   1233  1.1.1.5  christos 
   1234  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)
   1235  1.1.1.5  christos             && !ssl_print_hexbuf(bio, indent, "context", 1, &msg, &msglen))
   1236  1.1.1.5  christos         return 0;
   1237  1.1.1.5  christos 
   1238      1.1       spz     if (msglen < 3)
   1239      1.1       spz         return 0;
   1240      1.1       spz     clen = (msg[0] << 16) | (msg[1] << 8) | msg[2];
   1241      1.1       spz     if (msglen != clen + 3)
   1242      1.1       spz         return 0;
   1243      1.1       spz     msg += 3;
   1244      1.1       spz     BIO_indent(bio, indent, 80);
   1245      1.1       spz     BIO_printf(bio, "certificate_list, length=%d\n", (int)clen);
   1246      1.1       spz     while (clen > 0) {
   1247      1.1       spz         if (!ssl_print_certificate(bio, indent + 2, &msg, &clen))
   1248      1.1       spz             return 0;
   1249  1.1.1.5  christos         if (!ssl_print_extensions(bio, indent + 2, server, SSL3_MT_CERTIFICATE,
   1250  1.1.1.5  christos                                   &msg, &clen))
   1251  1.1.1.5  christos             return 0;
   1252  1.1.1.5  christos 
   1253      1.1       spz     }
   1254      1.1       spz     return 1;
   1255      1.1       spz }
   1256      1.1       spz 
   1257  1.1.1.5  christos static int ssl_print_cert_request(BIO *bio, int indent, const SSL *ssl,
   1258      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1259      1.1       spz {
   1260      1.1       spz     size_t xlen;
   1261  1.1.1.5  christos     unsigned int sigalg;
   1262  1.1.1.5  christos 
   1263  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1264  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent, "request_context", 1, &msg, &msglen))
   1265  1.1.1.5  christos             return 0;
   1266  1.1.1.5  christos         if (!ssl_print_extensions(bio, indent, 1,
   1267  1.1.1.5  christos                                   SSL3_MT_CERTIFICATE_REQUEST, &msg, &msglen))
   1268  1.1.1.5  christos             return 0;
   1269  1.1.1.5  christos         return 1;
   1270  1.1.1.5  christos     } else {
   1271  1.1.1.5  christos         if (msglen < 1)
   1272  1.1.1.5  christos             return 0;
   1273  1.1.1.5  christos         xlen = msg[0];
   1274  1.1.1.5  christos         if (msglen < xlen + 1)
   1275  1.1.1.5  christos             return 0;
   1276  1.1.1.5  christos         msg++;
   1277  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1278  1.1.1.5  christos         BIO_printf(bio, "certificate_types (len=%d)\n", (int)xlen);
   1279  1.1.1.5  christos         if (!ssl_trace_list(bio, indent + 2, msg, xlen, 1, ssl_ctype_tbl))
   1280  1.1.1.5  christos             return 0;
   1281  1.1.1.5  christos         msg += xlen;
   1282  1.1.1.5  christos         msglen -= xlen + 1;
   1283  1.1.1.5  christos     }
   1284  1.1.1.5  christos     if (SSL_USE_SIGALGS(ssl)) {
   1285  1.1.1.5  christos         if (msglen < 2)
   1286  1.1.1.5  christos             return 0;
   1287  1.1.1.5  christos         xlen = (msg[0] << 8) | msg[1];
   1288  1.1.1.5  christos         if (msglen < xlen + 2 || (xlen & 1))
   1289  1.1.1.5  christos             return 0;
   1290      1.1       spz         msg += 2;
   1291  1.1.1.5  christos         msglen -= xlen + 2;
   1292  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1293  1.1.1.5  christos         BIO_printf(bio, "signature_algorithms (len=%d)\n", (int)xlen);
   1294  1.1.1.5  christos         while (xlen > 0) {
   1295  1.1.1.5  christos             BIO_indent(bio, indent + 2, 80);
   1296  1.1.1.5  christos             sigalg = (msg[0] << 8) | msg[1];
   1297  1.1.1.5  christos             BIO_printf(bio, "%s (0x%04x)\n",
   1298  1.1.1.5  christos                        ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
   1299  1.1.1.5  christos             xlen -= 2;
   1300  1.1.1.5  christos             msg += 2;
   1301  1.1.1.5  christos         }
   1302  1.1.1.5  christos         msg += xlen;
   1303      1.1       spz     }
   1304      1.1       spz 
   1305  1.1.1.4  christos     if (msglen < 2)
   1306  1.1.1.4  christos         return 0;
   1307      1.1       spz     xlen = (msg[0] << 8) | msg[1];
   1308      1.1       spz     BIO_indent(bio, indent, 80);
   1309      1.1       spz     if (msglen < xlen + 2)
   1310      1.1       spz         return 0;
   1311      1.1       spz     msg += 2;
   1312  1.1.1.5  christos     msglen -= 2 + xlen;
   1313      1.1       spz     BIO_printf(bio, "certificate_authorities (len=%d)\n", (int)xlen);
   1314      1.1       spz     while (xlen > 0) {
   1315      1.1       spz         size_t dlen;
   1316      1.1       spz         X509_NAME *nm;
   1317      1.1       spz         const unsigned char *p;
   1318      1.1       spz         if (xlen < 2)
   1319      1.1       spz             return 0;
   1320      1.1       spz         dlen = (msg[0] << 8) | msg[1];
   1321      1.1       spz         if (xlen < dlen + 2)
   1322      1.1       spz             return 0;
   1323      1.1       spz         msg += 2;
   1324      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1325      1.1       spz         BIO_printf(bio, "DistinguishedName (len=%d): ", (int)dlen);
   1326      1.1       spz         p = msg;
   1327      1.1       spz         nm = d2i_X509_NAME(NULL, &p, dlen);
   1328      1.1       spz         if (!nm) {
   1329      1.1       spz             BIO_puts(bio, "<UNPARSEABLE DN>\n");
   1330      1.1       spz         } else {
   1331      1.1       spz             X509_NAME_print_ex(bio, nm, 0, XN_FLAG_ONELINE);
   1332      1.1       spz             BIO_puts(bio, "\n");
   1333      1.1       spz             X509_NAME_free(nm);
   1334      1.1       spz         }
   1335      1.1       spz         xlen -= dlen + 2;
   1336      1.1       spz         msg += dlen;
   1337      1.1       spz     }
   1338  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1339  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent, "request_extensions", 2,
   1340  1.1.1.5  christos                               &msg, &msglen))
   1341  1.1.1.5  christos             return 0;
   1342  1.1.1.5  christos     }
   1343  1.1.1.5  christos     return msglen == 0;
   1344      1.1       spz }
   1345      1.1       spz 
   1346  1.1.1.5  christos static int ssl_print_ticket(BIO *bio, int indent, const SSL *ssl,
   1347      1.1       spz                             const unsigned char *msg, size_t msglen)
   1348      1.1       spz {
   1349      1.1       spz     unsigned int tick_life;
   1350  1.1.1.5  christos 
   1351      1.1       spz     if (msglen == 0) {
   1352      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1353      1.1       spz         BIO_puts(bio, "No Ticket\n");
   1354      1.1       spz         return 1;
   1355      1.1       spz     }
   1356      1.1       spz     if (msglen < 4)
   1357      1.1       spz         return 0;
   1358      1.1       spz     tick_life = (msg[0] << 24) | (msg[1] << 16) | (msg[2] << 8) | msg[3];
   1359      1.1       spz     msglen -= 4;
   1360      1.1       spz     msg += 4;
   1361      1.1       spz     BIO_indent(bio, indent + 2, 80);
   1362      1.1       spz     BIO_printf(bio, "ticket_lifetime_hint=%u\n", tick_life);
   1363  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1364  1.1.1.5  christos         unsigned int ticket_age_add;
   1365  1.1.1.5  christos 
   1366  1.1.1.5  christos         if (msglen < 4)
   1367  1.1.1.5  christos             return 0;
   1368  1.1.1.5  christos         ticket_age_add =
   1369  1.1.1.5  christos             (msg[0] << 24) | (msg[1] << 16) | (msg[2] << 8) | msg[3];
   1370  1.1.1.5  christos         msglen -= 4;
   1371  1.1.1.5  christos         msg += 4;
   1372  1.1.1.5  christos         BIO_indent(bio, indent + 2, 80);
   1373  1.1.1.5  christos         BIO_printf(bio, "ticket_age_add=%u\n", ticket_age_add);
   1374  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent + 2, "ticket_nonce", 1, &msg,
   1375  1.1.1.5  christos                               &msglen))
   1376  1.1.1.5  christos             return 0;
   1377  1.1.1.5  christos     }
   1378      1.1       spz     if (!ssl_print_hexbuf(bio, indent + 2, "ticket", 2, &msg, &msglen))
   1379      1.1       spz         return 0;
   1380  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)
   1381  1.1.1.5  christos             && !ssl_print_extensions(bio, indent + 2, 0,
   1382  1.1.1.5  christos                                      SSL3_MT_NEWSESSION_TICKET, &msg, &msglen))
   1383  1.1.1.5  christos         return 0;
   1384      1.1       spz     if (msglen)
   1385      1.1       spz         return 0;
   1386      1.1       spz     return 1;
   1387      1.1       spz }
   1388      1.1       spz 
   1389  1.1.1.5  christos static int ssl_print_handshake(BIO *bio, const SSL *ssl, int server,
   1390      1.1       spz                                const unsigned char *msg, size_t msglen,
   1391      1.1       spz                                int indent)
   1392      1.1       spz {
   1393      1.1       spz     size_t hlen;
   1394      1.1       spz     unsigned char htype;
   1395  1.1.1.5  christos 
   1396      1.1       spz     if (msglen < 4)
   1397      1.1       spz         return 0;
   1398      1.1       spz     htype = msg[0];
   1399      1.1       spz     hlen = (msg[1] << 16) | (msg[2] << 8) | msg[3];
   1400      1.1       spz     BIO_indent(bio, indent, 80);
   1401      1.1       spz     BIO_printf(bio, "%s, Length=%d\n",
   1402      1.1       spz                ssl_trace_str(htype, ssl_handshake_tbl), (int)hlen);
   1403      1.1       spz     msg += 4;
   1404      1.1       spz     msglen -= 4;
   1405      1.1       spz     if (SSL_IS_DTLS(ssl)) {
   1406      1.1       spz         if (msglen < 8)
   1407      1.1       spz             return 0;
   1408      1.1       spz         BIO_indent(bio, indent, 80);
   1409      1.1       spz         BIO_printf(bio, "message_seq=%d, fragment_offset=%d, "
   1410      1.1       spz                    "fragment_length=%d\n",
   1411      1.1       spz                    (msg[0] << 8) | msg[1],
   1412      1.1       spz                    (msg[2] << 16) | (msg[3] << 8) | msg[4],
   1413      1.1       spz                    (msg[5] << 16) | (msg[6] << 8) | msg[7]);
   1414      1.1       spz         msg += 8;
   1415      1.1       spz         msglen -= 8;
   1416      1.1       spz     }
   1417      1.1       spz     if (msglen < hlen)
   1418      1.1       spz         return 0;
   1419      1.1       spz     switch (htype) {
   1420      1.1       spz     case SSL3_MT_CLIENT_HELLO:
   1421      1.1       spz         if (!ssl_print_client_hello(bio, ssl, indent + 2, msg, msglen))
   1422      1.1       spz             return 0;
   1423      1.1       spz         break;
   1424      1.1       spz 
   1425      1.1       spz     case DTLS1_MT_HELLO_VERIFY_REQUEST:
   1426      1.1       spz         if (!dtls_print_hello_vfyrequest(bio, indent + 2, msg, msglen))
   1427      1.1       spz             return 0;
   1428      1.1       spz         break;
   1429      1.1       spz 
   1430      1.1       spz     case SSL3_MT_SERVER_HELLO:
   1431      1.1       spz         if (!ssl_print_server_hello(bio, indent + 2, msg, msglen))
   1432      1.1       spz             return 0;
   1433      1.1       spz         break;
   1434      1.1       spz 
   1435      1.1       spz     case SSL3_MT_SERVER_KEY_EXCHANGE:
   1436      1.1       spz         if (!ssl_print_server_keyex(bio, indent + 2, ssl, msg, msglen))
   1437      1.1       spz             return 0;
   1438      1.1       spz         break;
   1439      1.1       spz 
   1440      1.1       spz     case SSL3_MT_CLIENT_KEY_EXCHANGE:
   1441      1.1       spz         if (!ssl_print_client_keyex(bio, indent + 2, ssl, msg, msglen))
   1442      1.1       spz             return 0;
   1443      1.1       spz         break;
   1444      1.1       spz 
   1445      1.1       spz     case SSL3_MT_CERTIFICATE:
   1446  1.1.1.5  christos         if (!ssl_print_certificates(bio, ssl, server, indent + 2, msg, msglen))
   1447      1.1       spz             return 0;
   1448      1.1       spz         break;
   1449      1.1       spz 
   1450      1.1       spz     case SSL3_MT_CERTIFICATE_VERIFY:
   1451      1.1       spz         if (!ssl_print_signature(bio, indent + 2, ssl, &msg, &msglen))
   1452      1.1       spz             return 0;
   1453      1.1       spz         break;
   1454      1.1       spz 
   1455      1.1       spz     case SSL3_MT_CERTIFICATE_REQUEST:
   1456      1.1       spz         if (!ssl_print_cert_request(bio, indent + 2, ssl, msg, msglen))
   1457      1.1       spz             return 0;
   1458      1.1       spz         break;
   1459      1.1       spz 
   1460      1.1       spz     case SSL3_MT_FINISHED:
   1461      1.1       spz         ssl_print_hex(bio, indent + 2, "verify_data", msg, msglen);
   1462      1.1       spz         break;
   1463      1.1       spz 
   1464      1.1       spz     case SSL3_MT_SERVER_DONE:
   1465      1.1       spz         if (msglen != 0)
   1466      1.1       spz             ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
   1467      1.1       spz         break;
   1468      1.1       spz 
   1469      1.1       spz     case SSL3_MT_NEWSESSION_TICKET:
   1470  1.1.1.5  christos         if (!ssl_print_ticket(bio, indent + 2, ssl, msg, msglen))
   1471  1.1.1.5  christos             return 0;
   1472  1.1.1.5  christos         break;
   1473  1.1.1.5  christos 
   1474  1.1.1.5  christos     case SSL3_MT_ENCRYPTED_EXTENSIONS:
   1475  1.1.1.5  christos         if (!ssl_print_extensions(bio, indent + 2, 1,
   1476  1.1.1.5  christos                                   SSL3_MT_ENCRYPTED_EXTENSIONS, &msg, &msglen))
   1477  1.1.1.5  christos             return 0;
   1478  1.1.1.5  christos         break;
   1479  1.1.1.5  christos 
   1480  1.1.1.5  christos     case SSL3_MT_KEY_UPDATE:
   1481  1.1.1.5  christos         if (msglen != 1) {
   1482  1.1.1.5  christos             ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
   1483  1.1.1.5  christos             return 0;
   1484  1.1.1.5  christos         }
   1485  1.1.1.5  christos         if (!ssl_trace_list(bio, indent + 2, msg, msglen, 1,
   1486  1.1.1.5  christos                             ssl_key_update_tbl))
   1487      1.1       spz             return 0;
   1488      1.1       spz         break;
   1489      1.1       spz 
   1490      1.1       spz     default:
   1491      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1492      1.1       spz         BIO_puts(bio, "Unsupported, hex dump follows:\n");
   1493  1.1.1.2  christos         BIO_dump_indent(bio, (const char *)msg, msglen, indent + 4);
   1494      1.1       spz     }
   1495      1.1       spz     return 1;
   1496      1.1       spz }
   1497      1.1       spz 
   1498      1.1       spz void SSL_trace(int write_p, int version, int content_type,
   1499      1.1       spz                const void *buf, size_t msglen, SSL *ssl, void *arg)
   1500      1.1       spz {
   1501      1.1       spz     const unsigned char *msg = buf;
   1502      1.1       spz     BIO *bio = arg;
   1503      1.1       spz 
   1504      1.1       spz     switch (content_type) {
   1505      1.1       spz     case SSL3_RT_HEADER:
   1506      1.1       spz         {
   1507  1.1.1.4  christos             int hvers;
   1508  1.1.1.4  christos 
   1509  1.1.1.4  christos             /* avoid overlapping with length at the end of buffer */
   1510  1.1.1.4  christos             if (msglen < (size_t)(SSL_IS_DTLS(ssl) ?
   1511  1.1.1.5  christos                      DTLS1_RT_HEADER_LENGTH : SSL3_RT_HEADER_LENGTH)) {
   1512  1.1.1.4  christos                 BIO_puts(bio, write_p ? "Sent" : "Received");
   1513  1.1.1.4  christos                 ssl_print_hex(bio, 0, " too short message", msg, msglen);
   1514  1.1.1.4  christos                 break;
   1515  1.1.1.4  christos             }
   1516  1.1.1.4  christos             hvers = msg[1] << 8 | msg[2];
   1517      1.1       spz             BIO_puts(bio, write_p ? "Sent" : "Received");
   1518      1.1       spz             BIO_printf(bio, " Record\nHeader:\n  Version = %s (0x%x)\n",
   1519      1.1       spz                        ssl_trace_str(hvers, ssl_version_tbl), hvers);
   1520      1.1       spz             if (SSL_IS_DTLS(ssl)) {
   1521      1.1       spz                 BIO_printf(bio,
   1522      1.1       spz                            "  epoch=%d, sequence_number=%04x%04x%04x\n",
   1523      1.1       spz                            (msg[3] << 8 | msg[4]),
   1524      1.1       spz                            (msg[5] << 8 | msg[6]),
   1525      1.1       spz                            (msg[7] << 8 | msg[8]), (msg[9] << 8 | msg[10]));
   1526      1.1       spz             }
   1527      1.1       spz 
   1528      1.1       spz             BIO_printf(bio, "  Content Type = %s (%d)\n  Length = %d",
   1529      1.1       spz                        ssl_trace_str(msg[0], ssl_content_tbl), msg[0],
   1530      1.1       spz                        msg[msglen - 2] << 8 | msg[msglen - 1]);
   1531      1.1       spz         }
   1532      1.1       spz         break;
   1533  1.1.1.5  christos 
   1534  1.1.1.5  christos     case SSL3_RT_INNER_CONTENT_TYPE:
   1535  1.1.1.5  christos         BIO_printf(bio, "  Inner Content Type = %s (%d)",
   1536  1.1.1.5  christos                    ssl_trace_str(msg[0], ssl_content_tbl), msg[0]);
   1537  1.1.1.5  christos         break;
   1538  1.1.1.5  christos 
   1539      1.1       spz     case SSL3_RT_HANDSHAKE:
   1540  1.1.1.5  christos         if (!ssl_print_handshake(bio, ssl, ssl->server ? write_p : !write_p,
   1541  1.1.1.5  christos                                  msg, msglen, 4))
   1542      1.1       spz             BIO_printf(bio, "Message length parse error!\n");
   1543      1.1       spz         break;
   1544      1.1       spz 
   1545      1.1       spz     case SSL3_RT_CHANGE_CIPHER_SPEC:
   1546      1.1       spz         if (msglen == 1 && msg[0] == 1)
   1547      1.1       spz             BIO_puts(bio, "    change_cipher_spec (1)\n");
   1548      1.1       spz         else
   1549      1.1       spz             ssl_print_hex(bio, 4, "unknown value", msg, msglen);
   1550      1.1       spz         break;
   1551      1.1       spz 
   1552      1.1       spz     case SSL3_RT_ALERT:
   1553  1.1.1.5  christos         if (msglen != 2)
   1554      1.1       spz             BIO_puts(bio, "    Illegal Alert Length\n");
   1555  1.1.1.5  christos         else {
   1556      1.1       spz             BIO_printf(bio, "    Level=%s(%d), description=%s(%d)\n",
   1557      1.1       spz                        SSL_alert_type_string_long(msg[0] << 8),
   1558      1.1       spz                        msg[0], SSL_alert_desc_string_long(msg[1]), msg[1]);
   1559      1.1       spz         }
   1560      1.1       spz 
   1561      1.1       spz     }
   1562      1.1       spz 
   1563      1.1       spz     BIO_puts(bio, "\n");
   1564      1.1       spz }
   1565      1.1       spz 
   1566      1.1       spz #endif
   1567