Home | History | Annotate | Line # | Download | only in ssl
      1      1.1       spz /*
      2  1.1.1.8  christos  * Copyright 2012-2021 The OpenSSL Project Authors. All Rights Reserved.
      3      1.1       spz  *
      4  1.1.1.8  christos  * Licensed under the Apache License 2.0 (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.1.6  christos #include "ssl_local.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.8  christos     {0xC102, "IANA-GOST2012-GOST8912-GOST8912"},
    431  1.1.1.2  christos     {0xCCA8, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
    432  1.1.1.2  christos     {0xCCA9, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"},
    433  1.1.1.2  christos     {0xCCAA, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
    434  1.1.1.2  christos     {0xCCAB, "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    435  1.1.1.2  christos     {0xCCAC, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    436  1.1.1.2  christos     {0xCCAD, "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    437  1.1.1.2  christos     {0xCCAE, "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"},
    438  1.1.1.5  christos     {0x1301, "TLS_AES_128_GCM_SHA256"},
    439  1.1.1.5  christos     {0x1302, "TLS_AES_256_GCM_SHA384"},
    440  1.1.1.5  christos     {0x1303, "TLS_CHACHA20_POLY1305_SHA256"},
    441  1.1.1.5  christos     {0x1304, "TLS_AES_128_CCM_SHA256"},
    442  1.1.1.5  christos     {0x1305, "TLS_AES_128_CCM_8_SHA256"},
    443      1.1       spz     {0xFEFE, "SSL_RSA_FIPS_WITH_DES_CBC_SHA"},
    444      1.1       spz     {0xFEFF, "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"},
    445  1.1.1.8  christos     {0xFF85, "LEGACY-GOST2012-GOST8912-GOST8912"},
    446  1.1.1.5  christos     {0xFF87, "GOST2012-NULL-GOST12"},
    447  1.1.1.8  christos     {0xC100, "GOST2012-KUZNYECHIK-KUZNYECHIKOMAC"},
    448  1.1.1.8  christos     {0xC101, "GOST2012-MAGMA-MAGMAOMAC"},
    449  1.1.1.8  christos     {0xC102, "GOST2012-GOST8912-IANA"},
    450      1.1       spz };
    451      1.1       spz 
    452      1.1       spz /* Compression methods */
    453  1.1.1.5  christos static const ssl_trace_tbl ssl_comp_tbl[] = {
    454      1.1       spz     {0x0000, "No Compression"},
    455      1.1       spz     {0x0001, "Zlib Compression"}
    456      1.1       spz };
    457      1.1       spz 
    458  1.1.1.5  christos /* Extensions sorted by ascending id */
    459  1.1.1.5  christos static const ssl_trace_tbl ssl_exts_tbl[] = {
    460      1.1       spz     {TLSEXT_TYPE_server_name, "server_name"},
    461      1.1       spz     {TLSEXT_TYPE_max_fragment_length, "max_fragment_length"},
    462      1.1       spz     {TLSEXT_TYPE_client_certificate_url, "client_certificate_url"},
    463      1.1       spz     {TLSEXT_TYPE_trusted_ca_keys, "trusted_ca_keys"},
    464      1.1       spz     {TLSEXT_TYPE_truncated_hmac, "truncated_hmac"},
    465      1.1       spz     {TLSEXT_TYPE_status_request, "status_request"},
    466      1.1       spz     {TLSEXT_TYPE_user_mapping, "user_mapping"},
    467      1.1       spz     {TLSEXT_TYPE_client_authz, "client_authz"},
    468      1.1       spz     {TLSEXT_TYPE_server_authz, "server_authz"},
    469      1.1       spz     {TLSEXT_TYPE_cert_type, "cert_type"},
    470  1.1.1.5  christos     {TLSEXT_TYPE_supported_groups, "supported_groups"},
    471      1.1       spz     {TLSEXT_TYPE_ec_point_formats, "ec_point_formats"},
    472      1.1       spz     {TLSEXT_TYPE_srp, "srp"},
    473      1.1       spz     {TLSEXT_TYPE_signature_algorithms, "signature_algorithms"},
    474      1.1       spz     {TLSEXT_TYPE_use_srtp, "use_srtp"},
    475  1.1.1.5  christos     {TLSEXT_TYPE_application_layer_protocol_negotiation,
    476  1.1.1.5  christos      "application_layer_protocol_negotiation"},
    477  1.1.1.5  christos     {TLSEXT_TYPE_signed_certificate_timestamp, "signed_certificate_timestamps"},
    478  1.1.1.5  christos     {TLSEXT_TYPE_padding, "padding"},
    479  1.1.1.5  christos     {TLSEXT_TYPE_encrypt_then_mac, "encrypt_then_mac"},
    480  1.1.1.5  christos     {TLSEXT_TYPE_extended_master_secret, "extended_master_secret"},
    481      1.1       spz     {TLSEXT_TYPE_session_ticket, "session_ticket"},
    482  1.1.1.5  christos     {TLSEXT_TYPE_psk, "psk"},
    483  1.1.1.5  christos     {TLSEXT_TYPE_early_data, "early_data"},
    484  1.1.1.5  christos     {TLSEXT_TYPE_supported_versions, "supported_versions"},
    485  1.1.1.5  christos     {TLSEXT_TYPE_cookie, "cookie_ext"},
    486  1.1.1.5  christos     {TLSEXT_TYPE_psk_kex_modes, "psk_key_exchange_modes"},
    487  1.1.1.5  christos     {TLSEXT_TYPE_certificate_authorities, "certificate_authorities"},
    488  1.1.1.5  christos     {TLSEXT_TYPE_post_handshake_auth, "post_handshake_auth"},
    489  1.1.1.5  christos     {TLSEXT_TYPE_signature_algorithms_cert, "signature_algorithms_cert"},
    490  1.1.1.5  christos     {TLSEXT_TYPE_key_share, "key_share"},
    491      1.1       spz     {TLSEXT_TYPE_renegotiate, "renegotiate"},
    492  1.1.1.2  christos # ifndef OPENSSL_NO_NEXTPROTONEG
    493      1.1       spz     {TLSEXT_TYPE_next_proto_neg, "next_proto_neg"},
    494  1.1.1.2  christos # endif
    495      1.1       spz };
    496      1.1       spz 
    497  1.1.1.5  christos static const ssl_trace_tbl ssl_groups_tbl[] = {
    498      1.1       spz     {1, "sect163k1 (K-163)"},
    499      1.1       spz     {2, "sect163r1"},
    500      1.1       spz     {3, "sect163r2 (B-163)"},
    501      1.1       spz     {4, "sect193r1"},
    502      1.1       spz     {5, "sect193r2"},
    503      1.1       spz     {6, "sect233k1 (K-233)"},
    504      1.1       spz     {7, "sect233r1 (B-233)"},
    505      1.1       spz     {8, "sect239k1"},
    506      1.1       spz     {9, "sect283k1 (K-283)"},
    507      1.1       spz     {10, "sect283r1 (B-283)"},
    508      1.1       spz     {11, "sect409k1 (K-409)"},
    509      1.1       spz     {12, "sect409r1 (B-409)"},
    510      1.1       spz     {13, "sect571k1 (K-571)"},
    511      1.1       spz     {14, "sect571r1 (B-571)"},
    512      1.1       spz     {15, "secp160k1"},
    513      1.1       spz     {16, "secp160r1"},
    514      1.1       spz     {17, "secp160r2"},
    515      1.1       spz     {18, "secp192k1"},
    516      1.1       spz     {19, "secp192r1 (P-192)"},
    517      1.1       spz     {20, "secp224k1"},
    518      1.1       spz     {21, "secp224r1 (P-224)"},
    519      1.1       spz     {22, "secp256k1"},
    520      1.1       spz     {23, "secp256r1 (P-256)"},
    521      1.1       spz     {24, "secp384r1 (P-384)"},
    522      1.1       spz     {25, "secp521r1 (P-521)"},
    523      1.1       spz     {26, "brainpoolP256r1"},
    524      1.1       spz     {27, "brainpoolP384r1"},
    525      1.1       spz     {28, "brainpoolP512r1"},
    526  1.1.1.2  christos     {29, "ecdh_x25519"},
    527  1.1.1.5  christos     {30, "ecdh_x448"},
    528  1.1.1.8  christos     {34, "GC256A"},
    529  1.1.1.8  christos     {35, "GC256B"},
    530  1.1.1.8  christos     {36, "GC256C"},
    531  1.1.1.8  christos     {37, "GC256D"},
    532  1.1.1.8  christos     {38, "GC512A"},
    533  1.1.1.8  christos     {39, "GC512B"},
    534  1.1.1.8  christos     {40, "GC512C"},
    535  1.1.1.5  christos     {256, "ffdhe2048"},
    536  1.1.1.5  christos     {257, "ffdhe3072"},
    537  1.1.1.5  christos     {258, "ffdhe4096"},
    538  1.1.1.5  christos     {259, "ffdhe6144"},
    539  1.1.1.5  christos     {260, "ffdhe8192"},
    540      1.1       spz     {0xFF01, "arbitrary_explicit_prime_curves"},
    541      1.1       spz     {0xFF02, "arbitrary_explicit_char2_curves"}
    542      1.1       spz };
    543      1.1       spz 
    544  1.1.1.5  christos static const ssl_trace_tbl ssl_point_tbl[] = {
    545      1.1       spz     {0, "uncompressed"},
    546      1.1       spz     {1, "ansiX962_compressed_prime"},
    547      1.1       spz     {2, "ansiX962_compressed_char2"}
    548      1.1       spz };
    549      1.1       spz 
    550  1.1.1.5  christos static const ssl_trace_tbl ssl_mfl_tbl[] = {
    551  1.1.1.5  christos     {0, "disabled"},
    552  1.1.1.5  christos     {1, "max_fragment_length := 2^9 (512 bytes)"},
    553  1.1.1.5  christos     {2, "max_fragment_length := 2^10 (1024 bytes)"},
    554  1.1.1.5  christos     {3, "max_fragment_length := 2^11 (2048 bytes)"},
    555  1.1.1.5  christos     {4, "max_fragment_length := 2^12 (4096 bytes)"}
    556      1.1       spz };
    557      1.1       spz 
    558  1.1.1.5  christos static const ssl_trace_tbl ssl_sigalg_tbl[] = {
    559  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp256r1_sha256, "ecdsa_secp256r1_sha256"},
    560  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp384r1_sha384, "ecdsa_secp384r1_sha384"},
    561  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_secp521r1_sha512, "ecdsa_secp521r1_sha512"},
    562  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_sha224, "ecdsa_sha224"},
    563  1.1.1.5  christos     {TLSEXT_SIGALG_ed25519, "ed25519"},
    564  1.1.1.5  christos     {TLSEXT_SIGALG_ed448, "ed448"},
    565  1.1.1.5  christos     {TLSEXT_SIGALG_ecdsa_sha1, "ecdsa_sha1"},
    566  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha256, "rsa_pss_rsae_sha256"},
    567  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha384, "rsa_pss_rsae_sha384"},
    568  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_rsae_sha512, "rsa_pss_rsae_sha512"},
    569  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha256, "rsa_pss_pss_sha256"},
    570  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha384, "rsa_pss_pss_sha384"},
    571  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pss_pss_sha512, "rsa_pss_pss_sha512"},
    572  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha256, "rsa_pkcs1_sha256"},
    573  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha384, "rsa_pkcs1_sha384"},
    574  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha512, "rsa_pkcs1_sha512"},
    575  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha224, "rsa_pkcs1_sha224"},
    576  1.1.1.5  christos     {TLSEXT_SIGALG_rsa_pkcs1_sha1, "rsa_pkcs1_sha1"},
    577  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha256, "dsa_sha256"},
    578  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha384, "dsa_sha384"},
    579  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha512, "dsa_sha512"},
    580  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha224, "dsa_sha224"},
    581  1.1.1.5  christos     {TLSEXT_SIGALG_dsa_sha1, "dsa_sha1"},
    582  1.1.1.8  christos     {TLSEXT_SIGALG_gostr34102012_256_intrinsic, "gost2012_256"},
    583  1.1.1.8  christos     {TLSEXT_SIGALG_gostr34102012_512_intrinsic, "gost2012_512"},
    584  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, "gost2012_256"},
    585  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, "gost2012_512"},
    586  1.1.1.5  christos     {TLSEXT_SIGALG_gostr34102001_gostr3411, "gost2001_gost94"},
    587      1.1       spz };
    588      1.1       spz 
    589  1.1.1.5  christos static const ssl_trace_tbl ssl_ctype_tbl[] = {
    590      1.1       spz     {1, "rsa_sign"},
    591      1.1       spz     {2, "dss_sign"},
    592      1.1       spz     {3, "rsa_fixed_dh"},
    593      1.1       spz     {4, "dss_fixed_dh"},
    594      1.1       spz     {5, "rsa_ephemeral_dh"},
    595      1.1       spz     {6, "dss_ephemeral_dh"},
    596      1.1       spz     {20, "fortezza_dms"},
    597      1.1       spz     {64, "ecdsa_sign"},
    598      1.1       spz     {65, "rsa_fixed_ecdh"},
    599  1.1.1.8  christos     {66, "ecdsa_fixed_ecdh"},
    600  1.1.1.8  christos     {67, "gost_sign256"},
    601  1.1.1.8  christos     {68, "gost_sign512"},
    602      1.1       spz };
    603      1.1       spz 
    604  1.1.1.5  christos static const ssl_trace_tbl ssl_psk_kex_modes_tbl[] = {
    605  1.1.1.5  christos     {TLSEXT_KEX_MODE_KE, "psk_ke"},
    606  1.1.1.5  christos     {TLSEXT_KEX_MODE_KE_DHE, "psk_dhe_ke"}
    607  1.1.1.5  christos };
    608  1.1.1.5  christos 
    609  1.1.1.5  christos static const ssl_trace_tbl ssl_key_update_tbl[] = {
    610  1.1.1.5  christos     {SSL_KEY_UPDATE_NOT_REQUESTED, "update_not_requested"},
    611  1.1.1.5  christos     {SSL_KEY_UPDATE_REQUESTED, "update_requested"}
    612  1.1.1.5  christos };
    613  1.1.1.5  christos 
    614      1.1       spz static void ssl_print_hex(BIO *bio, int indent, const char *name,
    615      1.1       spz                           const unsigned char *msg, size_t msglen)
    616      1.1       spz {
    617      1.1       spz     size_t i;
    618  1.1.1.5  christos 
    619      1.1       spz     BIO_indent(bio, indent, 80);
    620      1.1       spz     BIO_printf(bio, "%s (len=%d): ", name, (int)msglen);
    621      1.1       spz     for (i = 0; i < msglen; i++)
    622      1.1       spz         BIO_printf(bio, "%02X", msg[i]);
    623      1.1       spz     BIO_puts(bio, "\n");
    624      1.1       spz }
    625      1.1       spz 
    626  1.1.1.5  christos static int ssl_print_hexbuf(BIO *bio, int indent, const char *name, size_t nlen,
    627      1.1       spz                             const unsigned char **pmsg, size_t *pmsglen)
    628      1.1       spz {
    629      1.1       spz     size_t blen;
    630      1.1       spz     const unsigned char *p = *pmsg;
    631  1.1.1.5  christos 
    632      1.1       spz     if (*pmsglen < nlen)
    633      1.1       spz         return 0;
    634      1.1       spz     blen = p[0];
    635      1.1       spz     if (nlen > 1)
    636      1.1       spz         blen = (blen << 8) | p[1];
    637      1.1       spz     if (*pmsglen < nlen + blen)
    638      1.1       spz         return 0;
    639      1.1       spz     p += nlen;
    640      1.1       spz     ssl_print_hex(bio, indent, name, p, blen);
    641      1.1       spz     *pmsg += blen + nlen;
    642      1.1       spz     *pmsglen -= blen + nlen;
    643      1.1       spz     return 1;
    644      1.1       spz }
    645      1.1       spz 
    646      1.1       spz static int ssl_print_version(BIO *bio, int indent, const char *name,
    647  1.1.1.5  christos                              const unsigned char **pmsg, size_t *pmsglen,
    648  1.1.1.5  christos                              unsigned int *version)
    649      1.1       spz {
    650      1.1       spz     int vers;
    651  1.1.1.5  christos 
    652      1.1       spz     if (*pmsglen < 2)
    653      1.1       spz         return 0;
    654      1.1       spz     vers = ((*pmsg)[0] << 8) | (*pmsg)[1];
    655  1.1.1.5  christos     if (version != NULL)
    656  1.1.1.5  christos         *version = vers;
    657      1.1       spz     BIO_indent(bio, indent, 80);
    658      1.1       spz     BIO_printf(bio, "%s=0x%x (%s)\n",
    659      1.1       spz                name, vers, ssl_trace_str(vers, ssl_version_tbl));
    660      1.1       spz     *pmsg += 2;
    661      1.1       spz     *pmsglen -= 2;
    662      1.1       spz     return 1;
    663      1.1       spz }
    664      1.1       spz 
    665      1.1       spz static int ssl_print_random(BIO *bio, int indent,
    666      1.1       spz                             const unsigned char **pmsg, size_t *pmsglen)
    667      1.1       spz {
    668      1.1       spz     unsigned int tm;
    669      1.1       spz     const unsigned char *p = *pmsg;
    670  1.1.1.5  christos 
    671      1.1       spz     if (*pmsglen < 32)
    672      1.1       spz         return 0;
    673  1.1.1.7  christos     tm = ((unsigned int)p[0] << 24)
    674  1.1.1.7  christos          | ((unsigned int)p[1] << 16)
    675  1.1.1.7  christos          | ((unsigned int)p[2] << 8)
    676  1.1.1.7  christos          | (unsigned int)p[3];
    677      1.1       spz     p += 4;
    678      1.1       spz     BIO_indent(bio, indent, 80);
    679      1.1       spz     BIO_puts(bio, "Random:\n");
    680      1.1       spz     BIO_indent(bio, indent + 2, 80);
    681      1.1       spz     BIO_printf(bio, "gmt_unix_time=0x%08X\n", tm);
    682      1.1       spz     ssl_print_hex(bio, indent + 2, "random_bytes", p, 28);
    683      1.1       spz     *pmsg += 32;
    684      1.1       spz     *pmsglen -= 32;
    685      1.1       spz     return 1;
    686      1.1       spz }
    687      1.1       spz 
    688  1.1.1.5  christos static int ssl_print_signature(BIO *bio, int indent, const SSL *ssl,
    689      1.1       spz                                const unsigned char **pmsg, size_t *pmsglen)
    690      1.1       spz {
    691      1.1       spz     if (*pmsglen < 2)
    692      1.1       spz         return 0;
    693  1.1.1.5  christos     if (SSL_USE_SIGALGS(ssl)) {
    694      1.1       spz         const unsigned char *p = *pmsg;
    695  1.1.1.5  christos         unsigned int sigalg = (p[0] << 8) | p[1];
    696  1.1.1.5  christos 
    697      1.1       spz         BIO_indent(bio, indent, 80);
    698  1.1.1.5  christos         BIO_printf(bio, "Signature Algorithm: %s (0x%04x)\n",
    699  1.1.1.5  christos                    ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
    700      1.1       spz         *pmsg += 2;
    701      1.1       spz         *pmsglen -= 2;
    702      1.1       spz     }
    703      1.1       spz     return ssl_print_hexbuf(bio, indent, "Signature", 2, pmsg, pmsglen);
    704      1.1       spz }
    705      1.1       spz 
    706  1.1.1.5  christos static int ssl_print_extension(BIO *bio, int indent, int server,
    707  1.1.1.5  christos                                unsigned char mt, int extype,
    708      1.1       spz                                const unsigned char *ext, size_t extlen)
    709      1.1       spz {
    710  1.1.1.5  christos     size_t xlen, share_len;
    711  1.1.1.5  christos     unsigned int sigalg;
    712  1.1.1.5  christos     uint32_t max_early_data;
    713  1.1.1.5  christos 
    714      1.1       spz     BIO_indent(bio, indent, 80);
    715      1.1       spz     BIO_printf(bio, "extension_type=%s(%d), length=%d\n",
    716      1.1       spz                ssl_trace_str(extype, ssl_exts_tbl), extype, (int)extlen);
    717      1.1       spz     switch (extype) {
    718  1.1.1.5  christos     case TLSEXT_TYPE_max_fragment_length:
    719  1.1.1.5  christos         if (extlen < 1)
    720  1.1.1.5  christos             return 0;
    721  1.1.1.5  christos         xlen = extlen;
    722  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext, xlen, 1, ssl_mfl_tbl);
    723  1.1.1.5  christos 
    724      1.1       spz     case TLSEXT_TYPE_ec_point_formats:
    725      1.1       spz         if (extlen < 1)
    726      1.1       spz             return 0;
    727      1.1       spz         xlen = ext[0];
    728      1.1       spz         if (extlen != xlen + 1)
    729      1.1       spz             return 0;
    730  1.1.1.2  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1, ssl_point_tbl);
    731      1.1       spz 
    732  1.1.1.5  christos     case TLSEXT_TYPE_supported_groups:
    733      1.1       spz         if (extlen < 2)
    734      1.1       spz             return 0;
    735      1.1       spz         xlen = (ext[0] << 8) | ext[1];
    736      1.1       spz         if (extlen != xlen + 2)
    737      1.1       spz             return 0;
    738  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 2, xlen, 2, ssl_groups_tbl);
    739  1.1.1.5  christos     case TLSEXT_TYPE_application_layer_protocol_negotiation:
    740  1.1.1.5  christos         if (extlen < 2)
    741  1.1.1.5  christos             return 0;
    742  1.1.1.5  christos         xlen = (ext[0] << 8) | ext[1];
    743  1.1.1.5  christos         if (extlen != xlen + 2)
    744  1.1.1.5  christos             return 0;
    745  1.1.1.5  christos         ext += 2;
    746  1.1.1.5  christos         while (xlen > 0) {
    747  1.1.1.5  christos             size_t plen = *ext++;
    748  1.1.1.5  christos 
    749  1.1.1.5  christos             if (plen + 1 > xlen)
    750  1.1.1.5  christos                 return 0;
    751  1.1.1.5  christos             BIO_indent(bio, indent + 2, 80);
    752  1.1.1.5  christos             BIO_write(bio, ext, plen);
    753  1.1.1.5  christos             BIO_puts(bio, "\n");
    754  1.1.1.5  christos             ext += plen;
    755  1.1.1.5  christos             xlen -= plen + 1;
    756  1.1.1.5  christos         }
    757  1.1.1.5  christos         return 1;
    758      1.1       spz 
    759      1.1       spz     case TLSEXT_TYPE_signature_algorithms:
    760      1.1       spz 
    761      1.1       spz         if (extlen < 2)
    762      1.1       spz             return 0;
    763      1.1       spz         xlen = (ext[0] << 8) | ext[1];
    764      1.1       spz         if (extlen != xlen + 2)
    765      1.1       spz             return 0;
    766      1.1       spz         if (xlen & 1)
    767      1.1       spz             return 0;
    768      1.1       spz         ext += 2;
    769      1.1       spz         while (xlen > 0) {
    770      1.1       spz             BIO_indent(bio, indent + 2, 80);
    771  1.1.1.5  christos             sigalg = (ext[0] << 8) | ext[1];
    772  1.1.1.5  christos             BIO_printf(bio, "%s (0x%04x)\n",
    773  1.1.1.5  christos                        ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
    774      1.1       spz             xlen -= 2;
    775      1.1       spz             ext += 2;
    776      1.1       spz         }
    777      1.1       spz         break;
    778      1.1       spz 
    779      1.1       spz     case TLSEXT_TYPE_renegotiate:
    780      1.1       spz         if (extlen < 1)
    781      1.1       spz             return 0;
    782      1.1       spz         xlen = ext[0];
    783      1.1       spz         if (xlen + 1 != extlen)
    784      1.1       spz             return 0;
    785      1.1       spz         ext++;
    786      1.1       spz         if (xlen) {
    787      1.1       spz             if (server) {
    788      1.1       spz                 if (xlen & 1)
    789      1.1       spz                     return 0;
    790      1.1       spz                 xlen >>= 1;
    791      1.1       spz             }
    792      1.1       spz             ssl_print_hex(bio, indent + 4, "client_verify_data", ext, xlen);
    793      1.1       spz             if (server) {
    794      1.1       spz                 ext += xlen;
    795  1.1.1.2  christos                 ssl_print_hex(bio, indent + 4, "server_verify_data", ext, xlen);
    796      1.1       spz             }
    797      1.1       spz         } else {
    798      1.1       spz             BIO_indent(bio, indent + 4, 80);
    799      1.1       spz             BIO_puts(bio, "<EMPTY>\n");
    800      1.1       spz         }
    801      1.1       spz         break;
    802      1.1       spz 
    803      1.1       spz     case TLSEXT_TYPE_session_ticket:
    804      1.1       spz         if (extlen != 0)
    805      1.1       spz             ssl_print_hex(bio, indent + 4, "ticket", ext, extlen);
    806      1.1       spz         break;
    807      1.1       spz 
    808  1.1.1.5  christos     case TLSEXT_TYPE_key_share:
    809  1.1.1.5  christos         if (server && extlen == 2) {
    810  1.1.1.5  christos             int group_id;
    811  1.1.1.5  christos 
    812  1.1.1.5  christos             /* We assume this is an HRR, otherwise this is an invalid key_share */
    813  1.1.1.5  christos             group_id = (ext[0] << 8) | ext[1];
    814  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    815  1.1.1.5  christos             BIO_printf(bio, "NamedGroup: %s (%d)\n",
    816  1.1.1.5  christos                        ssl_trace_str(group_id, ssl_groups_tbl), group_id);
    817  1.1.1.5  christos             break;
    818  1.1.1.5  christos         }
    819  1.1.1.5  christos         if (extlen < 2)
    820  1.1.1.5  christos             return 0;
    821  1.1.1.5  christos         if (server) {
    822  1.1.1.5  christos             xlen = extlen;
    823  1.1.1.5  christos         } else {
    824  1.1.1.5  christos             xlen = (ext[0] << 8) | ext[1];
    825  1.1.1.5  christos             if (extlen != xlen + 2)
    826  1.1.1.5  christos                 return 0;
    827  1.1.1.5  christos             ext += 2;
    828  1.1.1.5  christos         }
    829  1.1.1.5  christos         for (; xlen > 0; ext += share_len, xlen -= share_len) {
    830  1.1.1.5  christos             int group_id;
    831  1.1.1.5  christos 
    832  1.1.1.5  christos             if (xlen < 4)
    833  1.1.1.5  christos                 return 0;
    834  1.1.1.5  christos             group_id = (ext[0] << 8) | ext[1];
    835  1.1.1.5  christos             share_len = (ext[2] << 8) | ext[3];
    836  1.1.1.5  christos             ext += 4;
    837  1.1.1.5  christos             xlen -= 4;
    838  1.1.1.5  christos             if (xlen < share_len)
    839  1.1.1.5  christos                 return 0;
    840  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    841  1.1.1.5  christos             BIO_printf(bio, "NamedGroup: %s (%d)\n",
    842  1.1.1.5  christos                        ssl_trace_str(group_id, ssl_groups_tbl), group_id);
    843  1.1.1.5  christos             ssl_print_hex(bio, indent + 4, "key_exchange: ", ext, share_len);
    844  1.1.1.5  christos         }
    845  1.1.1.5  christos         break;
    846  1.1.1.5  christos 
    847  1.1.1.5  christos     case TLSEXT_TYPE_supported_versions:
    848  1.1.1.5  christos         if (server) {
    849  1.1.1.5  christos             int version;
    850  1.1.1.5  christos 
    851  1.1.1.5  christos             if (extlen != 2)
    852  1.1.1.5  christos                 return 0;
    853  1.1.1.5  christos             version = (ext[0] << 8) | ext[1];
    854  1.1.1.5  christos             BIO_indent(bio, indent + 4, 80);
    855  1.1.1.5  christos             BIO_printf(bio, "%s (%d)\n",
    856  1.1.1.5  christos                        ssl_trace_str(version, ssl_version_tbl), version);
    857  1.1.1.5  christos             break;
    858  1.1.1.5  christos         }
    859  1.1.1.5  christos         if (extlen < 1)
    860  1.1.1.5  christos             return 0;
    861  1.1.1.5  christos         xlen = ext[0];
    862  1.1.1.5  christos         if (extlen != xlen + 1)
    863  1.1.1.5  christos             return 0;
    864  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 2,
    865  1.1.1.5  christos                               ssl_version_tbl);
    866  1.1.1.5  christos 
    867  1.1.1.5  christos     case TLSEXT_TYPE_psk_kex_modes:
    868  1.1.1.5  christos         if (extlen < 1)
    869  1.1.1.5  christos             return 0;
    870  1.1.1.5  christos         xlen = ext[0];
    871  1.1.1.5  christos         if (extlen != xlen + 1)
    872  1.1.1.5  christos             return 0;
    873  1.1.1.5  christos         return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1,
    874  1.1.1.5  christos                               ssl_psk_kex_modes_tbl);
    875  1.1.1.5  christos 
    876  1.1.1.5  christos     case TLSEXT_TYPE_early_data:
    877  1.1.1.5  christos         if (mt != SSL3_MT_NEWSESSION_TICKET)
    878  1.1.1.5  christos             break;
    879  1.1.1.5  christos         if (extlen != 4)
    880  1.1.1.5  christos             return 0;
    881  1.1.1.7  christos         max_early_data = ((unsigned int)ext[0] << 24)
    882  1.1.1.7  christos                          | ((unsigned int)ext[1] << 16)
    883  1.1.1.7  christos                          | ((unsigned int)ext[2] << 8)
    884  1.1.1.7  christos                          | (unsigned int)ext[3];
    885  1.1.1.5  christos         BIO_indent(bio, indent + 2, 80);
    886  1.1.1.5  christos         BIO_printf(bio, "max_early_data=%u\n", max_early_data);
    887  1.1.1.5  christos         break;
    888  1.1.1.5  christos 
    889      1.1       spz     default:
    890  1.1.1.2  christos         BIO_dump_indent(bio, (const char *)ext, extlen, indent + 2);
    891      1.1       spz     }
    892      1.1       spz     return 1;
    893      1.1       spz }
    894      1.1       spz 
    895      1.1       spz static int ssl_print_extensions(BIO *bio, int indent, int server,
    896  1.1.1.5  christos                                 unsigned char mt, const unsigned char **msgin,
    897  1.1.1.5  christos                                 size_t *msginlen)
    898      1.1       spz {
    899  1.1.1.5  christos     size_t extslen, msglen = *msginlen;
    900  1.1.1.5  christos     const unsigned char *msg = *msgin;
    901  1.1.1.5  christos 
    902      1.1       spz     BIO_indent(bio, indent, 80);
    903      1.1       spz     if (msglen == 0) {
    904  1.1.1.5  christos         BIO_puts(bio, "No extensions\n");
    905      1.1       spz         return 1;
    906      1.1       spz     }
    907  1.1.1.4  christos     if (msglen < 2)
    908  1.1.1.4  christos         return 0;
    909      1.1       spz     extslen = (msg[0] << 8) | msg[1];
    910  1.1.1.5  christos     msglen -= 2;
    911      1.1       spz     msg += 2;
    912  1.1.1.5  christos     if (extslen == 0) {
    913  1.1.1.5  christos         BIO_puts(bio, "No extensions\n");
    914  1.1.1.5  christos         *msgin = msg;
    915  1.1.1.5  christos         *msginlen = msglen;
    916  1.1.1.5  christos         return 1;
    917  1.1.1.5  christos     }
    918  1.1.1.5  christos     if (extslen > msglen)
    919  1.1.1.5  christos         return 0;
    920  1.1.1.5  christos     BIO_printf(bio, "extensions, length = %d\n", (int)extslen);
    921  1.1.1.5  christos     msglen -= extslen;
    922  1.1.1.5  christos     while (extslen > 0) {
    923      1.1       spz         int extype;
    924      1.1       spz         size_t extlen;
    925  1.1.1.5  christos         if (extslen < 4)
    926      1.1       spz             return 0;
    927      1.1       spz         extype = (msg[0] << 8) | msg[1];
    928      1.1       spz         extlen = (msg[2] << 8) | msg[3];
    929  1.1.1.5  christos         if (extslen < extlen + 4) {
    930  1.1.1.5  christos             BIO_printf(bio, "extensions, extype = %d, extlen = %d\n", extype,
    931  1.1.1.5  christos                        (int)extlen);
    932  1.1.1.5  christos             BIO_dump_indent(bio, (const char *)msg, extslen, indent + 2);
    933      1.1       spz             return 0;
    934  1.1.1.5  christos         }
    935      1.1       spz         msg += 4;
    936  1.1.1.5  christos         if (!ssl_print_extension(bio, indent + 2, server, mt, extype, msg,
    937  1.1.1.5  christos                                  extlen))
    938      1.1       spz             return 0;
    939      1.1       spz         msg += extlen;
    940  1.1.1.5  christos         extslen -= extlen + 4;
    941      1.1       spz     }
    942  1.1.1.5  christos 
    943  1.1.1.5  christos     *msgin = msg;
    944  1.1.1.5  christos     *msginlen = msglen;
    945      1.1       spz     return 1;
    946      1.1       spz }
    947      1.1       spz 
    948  1.1.1.5  christos static int ssl_print_client_hello(BIO *bio, const SSL *ssl, int indent,
    949      1.1       spz                                   const unsigned char *msg, size_t msglen)
    950      1.1       spz {
    951      1.1       spz     size_t len;
    952      1.1       spz     unsigned int cs;
    953  1.1.1.5  christos 
    954  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "client_version", &msg, &msglen, NULL))
    955      1.1       spz         return 0;
    956      1.1       spz     if (!ssl_print_random(bio, indent, &msg, &msglen))
    957      1.1       spz         return 0;
    958      1.1       spz     if (!ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
    959      1.1       spz         return 0;
    960      1.1       spz     if (SSL_IS_DTLS(ssl)) {
    961      1.1       spz         if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
    962      1.1       spz             return 0;
    963      1.1       spz     }
    964      1.1       spz     if (msglen < 2)
    965      1.1       spz         return 0;
    966      1.1       spz     len = (msg[0] << 8) | msg[1];
    967      1.1       spz     msg += 2;
    968      1.1       spz     msglen -= 2;
    969      1.1       spz     BIO_indent(bio, indent, 80);
    970      1.1       spz     BIO_printf(bio, "cipher_suites (len=%d)\n", (int)len);
    971      1.1       spz     if (msglen < len || len & 1)
    972      1.1       spz         return 0;
    973      1.1       spz     while (len > 0) {
    974      1.1       spz         cs = (msg[0] << 8) | msg[1];
    975      1.1       spz         BIO_indent(bio, indent + 2, 80);
    976      1.1       spz         BIO_printf(bio, "{0x%02X, 0x%02X} %s\n",
    977      1.1       spz                    msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
    978      1.1       spz         msg += 2;
    979      1.1       spz         msglen -= 2;
    980      1.1       spz         len -= 2;
    981      1.1       spz     }
    982      1.1       spz     if (msglen < 1)
    983      1.1       spz         return 0;
    984      1.1       spz     len = msg[0];
    985      1.1       spz     msg++;
    986      1.1       spz     msglen--;
    987      1.1       spz     if (msglen < len)
    988      1.1       spz         return 0;
    989      1.1       spz     BIO_indent(bio, indent, 80);
    990      1.1       spz     BIO_printf(bio, "compression_methods (len=%d)\n", (int)len);
    991      1.1       spz     while (len > 0) {
    992      1.1       spz         BIO_indent(bio, indent + 2, 80);
    993      1.1       spz         BIO_printf(bio, "%s (0x%02X)\n",
    994      1.1       spz                    ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
    995      1.1       spz         msg++;
    996      1.1       spz         msglen--;
    997      1.1       spz         len--;
    998      1.1       spz     }
    999  1.1.1.5  christos     if (!ssl_print_extensions(bio, indent, 0, SSL3_MT_CLIENT_HELLO, &msg,
   1000  1.1.1.5  christos                               &msglen))
   1001      1.1       spz         return 0;
   1002      1.1       spz     return 1;
   1003      1.1       spz }
   1004      1.1       spz 
   1005      1.1       spz static int dtls_print_hello_vfyrequest(BIO *bio, int indent,
   1006  1.1.1.2  christos                                        const unsigned char *msg, size_t msglen)
   1007      1.1       spz {
   1008  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, NULL))
   1009      1.1       spz         return 0;
   1010      1.1       spz     if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
   1011      1.1       spz         return 0;
   1012      1.1       spz     return 1;
   1013      1.1       spz }
   1014      1.1       spz 
   1015      1.1       spz static int ssl_print_server_hello(BIO *bio, int indent,
   1016      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1017      1.1       spz {
   1018      1.1       spz     unsigned int cs;
   1019  1.1.1.5  christos     unsigned int vers;
   1020  1.1.1.5  christos 
   1021  1.1.1.5  christos     if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, &vers))
   1022      1.1       spz         return 0;
   1023      1.1       spz     if (!ssl_print_random(bio, indent, &msg, &msglen))
   1024      1.1       spz         return 0;
   1025  1.1.1.5  christos     if (vers != TLS1_3_VERSION
   1026  1.1.1.5  christos             && !ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
   1027      1.1       spz         return 0;
   1028      1.1       spz     if (msglen < 2)
   1029      1.1       spz         return 0;
   1030      1.1       spz     cs = (msg[0] << 8) | msg[1];
   1031      1.1       spz     BIO_indent(bio, indent, 80);
   1032      1.1       spz     BIO_printf(bio, "cipher_suite {0x%02X, 0x%02X} %s\n",
   1033      1.1       spz                msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
   1034      1.1       spz     msg += 2;
   1035      1.1       spz     msglen -= 2;
   1036  1.1.1.5  christos     if (vers != TLS1_3_VERSION) {
   1037  1.1.1.5  christos         if (msglen < 1)
   1038  1.1.1.5  christos             return 0;
   1039  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1040  1.1.1.5  christos         BIO_printf(bio, "compression_method: %s (0x%02X)\n",
   1041  1.1.1.5  christos                    ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
   1042  1.1.1.5  christos         msg++;
   1043  1.1.1.5  christos         msglen--;
   1044  1.1.1.5  christos     }
   1045  1.1.1.5  christos     if (!ssl_print_extensions(bio, indent, 1, SSL3_MT_SERVER_HELLO, &msg,
   1046  1.1.1.5  christos                               &msglen))
   1047      1.1       spz         return 0;
   1048      1.1       spz     return 1;
   1049      1.1       spz }
   1050      1.1       spz 
   1051  1.1.1.5  christos static int ssl_get_keyex(const char **pname, const SSL *ssl)
   1052      1.1       spz {
   1053  1.1.1.8  christos     unsigned long alg_k = ssl->s3.tmp.new_cipher->algorithm_mkey;
   1054  1.1.1.5  christos 
   1055      1.1       spz     if (alg_k & SSL_kRSA) {
   1056      1.1       spz         *pname = "rsa";
   1057      1.1       spz         return SSL_kRSA;
   1058      1.1       spz     }
   1059  1.1.1.2  christos     if (alg_k & SSL_kDHE) {
   1060  1.1.1.2  christos         *pname = "DHE";
   1061  1.1.1.2  christos         return SSL_kDHE;
   1062  1.1.1.2  christos     }
   1063  1.1.1.2  christos     if (alg_k & SSL_kECDHE) {
   1064  1.1.1.2  christos         *pname = "ECDHE";
   1065  1.1.1.2  christos         return SSL_kECDHE;
   1066      1.1       spz     }
   1067      1.1       spz     if (alg_k & SSL_kPSK) {
   1068      1.1       spz         *pname = "PSK";
   1069      1.1       spz         return SSL_kPSK;
   1070      1.1       spz     }
   1071  1.1.1.2  christos     if (alg_k & SSL_kRSAPSK) {
   1072  1.1.1.2  christos         *pname = "RSAPSK";
   1073  1.1.1.2  christos         return SSL_kRSAPSK;
   1074  1.1.1.2  christos     }
   1075  1.1.1.2  christos     if (alg_k & SSL_kDHEPSK) {
   1076  1.1.1.2  christos         *pname = "DHEPSK";
   1077  1.1.1.2  christos         return SSL_kDHEPSK;
   1078  1.1.1.2  christos     }
   1079  1.1.1.2  christos     if (alg_k & SSL_kECDHEPSK) {
   1080  1.1.1.2  christos         *pname = "ECDHEPSK";
   1081  1.1.1.2  christos         return SSL_kECDHEPSK;
   1082  1.1.1.2  christos     }
   1083      1.1       spz     if (alg_k & SSL_kSRP) {
   1084      1.1       spz         *pname = "SRP";
   1085      1.1       spz         return SSL_kSRP;
   1086      1.1       spz     }
   1087      1.1       spz     if (alg_k & SSL_kGOST) {
   1088      1.1       spz         *pname = "GOST";
   1089      1.1       spz         return SSL_kGOST;
   1090      1.1       spz     }
   1091  1.1.1.8  christos     if (alg_k & SSL_kGOST18) {
   1092  1.1.1.8  christos         *pname = "GOST18";
   1093  1.1.1.8  christos         return SSL_kGOST18;
   1094  1.1.1.8  christos     }
   1095      1.1       spz     *pname = "UNKNOWN";
   1096      1.1       spz     return 0;
   1097      1.1       spz }
   1098      1.1       spz 
   1099  1.1.1.5  christos static int ssl_print_client_keyex(BIO *bio, int indent, const SSL *ssl,
   1100      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1101      1.1       spz {
   1102      1.1       spz     const char *algname;
   1103  1.1.1.5  christos     int id = ssl_get_keyex(&algname, ssl);
   1104  1.1.1.5  christos 
   1105      1.1       spz     BIO_indent(bio, indent, 80);
   1106      1.1       spz     BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
   1107  1.1.1.2  christos     if (id & SSL_PSK) {
   1108  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2,
   1109  1.1.1.2  christos                               "psk_identity", 2, &msg, &msglen))
   1110  1.1.1.2  christos             return 0;
   1111  1.1.1.2  christos     }
   1112      1.1       spz     switch (id) {
   1113      1.1       spz 
   1114      1.1       spz     case SSL_kRSA:
   1115  1.1.1.2  christos     case SSL_kRSAPSK:
   1116      1.1       spz         if (TLS1_get_version(ssl) == SSL3_VERSION) {
   1117      1.1       spz             ssl_print_hex(bio, indent + 2,
   1118  1.1.1.5  christos                           "EncryptedPreMasterSecret", msg, msglen);
   1119      1.1       spz         } else {
   1120      1.1       spz             if (!ssl_print_hexbuf(bio, indent + 2,
   1121  1.1.1.5  christos                                   "EncryptedPreMasterSecret", 2, &msg, &msglen))
   1122      1.1       spz                 return 0;
   1123      1.1       spz         }
   1124      1.1       spz         break;
   1125      1.1       spz 
   1126  1.1.1.2  christos     case SSL_kDHE:
   1127  1.1.1.2  christos     case SSL_kDHEPSK:
   1128      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_Yc", 2, &msg, &msglen))
   1129      1.1       spz             return 0;
   1130      1.1       spz         break;
   1131      1.1       spz 
   1132  1.1.1.2  christos     case SSL_kECDHE:
   1133  1.1.1.2  christos     case SSL_kECDHEPSK:
   1134      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "ecdh_Yc", 1, &msg, &msglen))
   1135      1.1       spz             return 0;
   1136      1.1       spz         break;
   1137  1.1.1.8  christos     case SSL_kGOST:
   1138  1.1.1.8  christos         ssl_print_hex(bio, indent + 2, "GostKeyTransportBlob", msg, msglen);
   1139  1.1.1.8  christos         msglen = 0;
   1140  1.1.1.8  christos         break;
   1141  1.1.1.8  christos     case SSL_kGOST18:
   1142  1.1.1.8  christos         ssl_print_hex(bio, indent + 2,
   1143  1.1.1.8  christos                       "GOST-wrapped PreMasterSecret", msg, msglen);
   1144  1.1.1.8  christos         msglen = 0;
   1145  1.1.1.8  christos         break;
   1146      1.1       spz     }
   1147      1.1       spz 
   1148  1.1.1.2  christos     return !msglen;
   1149      1.1       spz }
   1150      1.1       spz 
   1151  1.1.1.5  christos static int ssl_print_server_keyex(BIO *bio, int indent, const SSL *ssl,
   1152      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1153      1.1       spz {
   1154      1.1       spz     const char *algname;
   1155  1.1.1.5  christos     int id = ssl_get_keyex(&algname, ssl);
   1156  1.1.1.5  christos 
   1157      1.1       spz     BIO_indent(bio, indent, 80);
   1158      1.1       spz     BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
   1159  1.1.1.2  christos     if (id & SSL_PSK) {
   1160  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2,
   1161  1.1.1.2  christos                               "psk_identity_hint", 2, &msg, &msglen))
   1162  1.1.1.2  christos             return 0;
   1163  1.1.1.2  christos     }
   1164      1.1       spz     switch (id) {
   1165      1.1       spz     case SSL_kRSA:
   1166      1.1       spz 
   1167  1.1.1.2  christos         if (!ssl_print_hexbuf(bio, indent + 2, "rsa_modulus", 2, &msg, &msglen))
   1168      1.1       spz             return 0;
   1169      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "rsa_exponent", 2,
   1170      1.1       spz                               &msg, &msglen))
   1171      1.1       spz             return 0;
   1172      1.1       spz         break;
   1173      1.1       spz 
   1174  1.1.1.2  christos     case SSL_kDHE:
   1175  1.1.1.2  christos     case SSL_kDHEPSK:
   1176      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_p", 2, &msg, &msglen))
   1177      1.1       spz             return 0;
   1178      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_g", 2, &msg, &msglen))
   1179      1.1       spz             return 0;
   1180      1.1       spz         if (!ssl_print_hexbuf(bio, indent + 2, "dh_Ys", 2, &msg, &msglen))
   1181      1.1       spz             return 0;
   1182      1.1       spz         break;
   1183      1.1       spz 
   1184  1.1.1.2  christos     case SSL_kECDHE:
   1185  1.1.1.2  christos     case SSL_kECDHEPSK:
   1186      1.1       spz         if (msglen < 1)
   1187      1.1       spz             return 0;
   1188      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1189      1.1       spz         if (msg[0] == EXPLICIT_PRIME_CURVE_TYPE)
   1190      1.1       spz             BIO_puts(bio, "explicit_prime\n");
   1191      1.1       spz         else if (msg[0] == EXPLICIT_CHAR2_CURVE_TYPE)
   1192      1.1       spz             BIO_puts(bio, "explicit_char2\n");
   1193      1.1       spz         else if (msg[0] == NAMED_CURVE_TYPE) {
   1194      1.1       spz             int curve;
   1195      1.1       spz             if (msglen < 3)
   1196      1.1       spz                 return 0;
   1197      1.1       spz             curve = (msg[1] << 8) | msg[2];
   1198      1.1       spz             BIO_printf(bio, "named_curve: %s (%d)\n",
   1199  1.1.1.5  christos                        ssl_trace_str(curve, ssl_groups_tbl), curve);
   1200      1.1       spz             msg += 3;
   1201      1.1       spz             msglen -= 3;
   1202      1.1       spz             if (!ssl_print_hexbuf(bio, indent + 2, "point", 1, &msg, &msglen))
   1203      1.1       spz                 return 0;
   1204  1.1.1.2  christos         } else {
   1205  1.1.1.2  christos             BIO_printf(bio, "UNKNOWN CURVE PARAMETER TYPE %d\n", msg[0]);
   1206  1.1.1.2  christos             return 0;
   1207      1.1       spz         }
   1208      1.1       spz         break;
   1209  1.1.1.2  christos 
   1210  1.1.1.2  christos     case SSL_kPSK:
   1211  1.1.1.2  christos     case SSL_kRSAPSK:
   1212  1.1.1.2  christos         break;
   1213      1.1       spz     }
   1214  1.1.1.2  christos     if (!(id & SSL_PSK))
   1215  1.1.1.2  christos         ssl_print_signature(bio, indent, ssl, &msg, &msglen);
   1216  1.1.1.2  christos     return !msglen;
   1217      1.1       spz }
   1218      1.1       spz 
   1219      1.1       spz static int ssl_print_certificate(BIO *bio, int indent,
   1220      1.1       spz                                  const unsigned char **pmsg, size_t *pmsglen)
   1221      1.1       spz {
   1222      1.1       spz     size_t msglen = *pmsglen;
   1223      1.1       spz     size_t clen;
   1224      1.1       spz     X509 *x;
   1225      1.1       spz     const unsigned char *p = *pmsg, *q;
   1226  1.1.1.5  christos 
   1227      1.1       spz     if (msglen < 3)
   1228      1.1       spz         return 0;
   1229      1.1       spz     clen = (p[0] << 16) | (p[1] << 8) | p[2];
   1230      1.1       spz     if (msglen < clen + 3)
   1231      1.1       spz         return 0;
   1232      1.1       spz     q = p + 3;
   1233      1.1       spz     BIO_indent(bio, indent, 80);
   1234      1.1       spz     BIO_printf(bio, "ASN.1Cert, length=%d", (int)clen);
   1235      1.1       spz     x = d2i_X509(NULL, &q, clen);
   1236      1.1       spz     if (!x)
   1237      1.1       spz         BIO_puts(bio, "<UNPARSEABLE CERTIFICATE>\n");
   1238      1.1       spz     else {
   1239      1.1       spz         BIO_puts(bio, "\n------details-----\n");
   1240      1.1       spz         X509_print_ex(bio, x, XN_FLAG_ONELINE, 0);
   1241      1.1       spz         PEM_write_bio_X509(bio, x);
   1242      1.1       spz         /* Print certificate stuff */
   1243      1.1       spz         BIO_puts(bio, "------------------\n");
   1244      1.1       spz         X509_free(x);
   1245      1.1       spz     }
   1246      1.1       spz     if (q != p + 3 + clen) {
   1247      1.1       spz         BIO_puts(bio, "<TRAILING GARBAGE AFTER CERTIFICATE>\n");
   1248      1.1       spz     }
   1249      1.1       spz     *pmsg += clen + 3;
   1250      1.1       spz     *pmsglen -= clen + 3;
   1251      1.1       spz     return 1;
   1252      1.1       spz }
   1253      1.1       spz 
   1254  1.1.1.5  christos static int ssl_print_certificates(BIO *bio, const SSL *ssl, int server,
   1255  1.1.1.5  christos                                   int indent, const unsigned char *msg,
   1256  1.1.1.5  christos                                   size_t msglen)
   1257      1.1       spz {
   1258      1.1       spz     size_t clen;
   1259  1.1.1.5  christos 
   1260  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)
   1261  1.1.1.5  christos             && !ssl_print_hexbuf(bio, indent, "context", 1, &msg, &msglen))
   1262  1.1.1.5  christos         return 0;
   1263  1.1.1.5  christos 
   1264      1.1       spz     if (msglen < 3)
   1265      1.1       spz         return 0;
   1266      1.1       spz     clen = (msg[0] << 16) | (msg[1] << 8) | msg[2];
   1267      1.1       spz     if (msglen != clen + 3)
   1268      1.1       spz         return 0;
   1269      1.1       spz     msg += 3;
   1270      1.1       spz     BIO_indent(bio, indent, 80);
   1271      1.1       spz     BIO_printf(bio, "certificate_list, length=%d\n", (int)clen);
   1272      1.1       spz     while (clen > 0) {
   1273      1.1       spz         if (!ssl_print_certificate(bio, indent + 2, &msg, &clen))
   1274      1.1       spz             return 0;
   1275  1.1.1.6  christos         if (SSL_IS_TLS13(ssl)
   1276  1.1.1.6  christos             && !ssl_print_extensions(bio, indent + 2, server,
   1277  1.1.1.6  christos                                      SSL3_MT_CERTIFICATE, &msg, &clen))
   1278  1.1.1.5  christos             return 0;
   1279  1.1.1.5  christos 
   1280      1.1       spz     }
   1281      1.1       spz     return 1;
   1282      1.1       spz }
   1283      1.1       spz 
   1284  1.1.1.5  christos static int ssl_print_cert_request(BIO *bio, int indent, const SSL *ssl,
   1285      1.1       spz                                   const unsigned char *msg, size_t msglen)
   1286      1.1       spz {
   1287      1.1       spz     size_t xlen;
   1288  1.1.1.5  christos     unsigned int sigalg;
   1289  1.1.1.5  christos 
   1290  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1291  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent, "request_context", 1, &msg, &msglen))
   1292  1.1.1.5  christos             return 0;
   1293  1.1.1.5  christos         if (!ssl_print_extensions(bio, indent, 1,
   1294  1.1.1.5  christos                                   SSL3_MT_CERTIFICATE_REQUEST, &msg, &msglen))
   1295  1.1.1.5  christos             return 0;
   1296  1.1.1.5  christos         return 1;
   1297  1.1.1.5  christos     } else {
   1298  1.1.1.5  christos         if (msglen < 1)
   1299  1.1.1.5  christos             return 0;
   1300  1.1.1.5  christos         xlen = msg[0];
   1301  1.1.1.5  christos         if (msglen < xlen + 1)
   1302  1.1.1.5  christos             return 0;
   1303  1.1.1.5  christos         msg++;
   1304  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1305  1.1.1.5  christos         BIO_printf(bio, "certificate_types (len=%d)\n", (int)xlen);
   1306  1.1.1.5  christos         if (!ssl_trace_list(bio, indent + 2, msg, xlen, 1, ssl_ctype_tbl))
   1307  1.1.1.5  christos             return 0;
   1308  1.1.1.5  christos         msg += xlen;
   1309  1.1.1.5  christos         msglen -= xlen + 1;
   1310  1.1.1.5  christos     }
   1311  1.1.1.5  christos     if (SSL_USE_SIGALGS(ssl)) {
   1312  1.1.1.5  christos         if (msglen < 2)
   1313  1.1.1.5  christos             return 0;
   1314  1.1.1.5  christos         xlen = (msg[0] << 8) | msg[1];
   1315  1.1.1.5  christos         if (msglen < xlen + 2 || (xlen & 1))
   1316  1.1.1.5  christos             return 0;
   1317      1.1       spz         msg += 2;
   1318  1.1.1.5  christos         msglen -= xlen + 2;
   1319  1.1.1.5  christos         BIO_indent(bio, indent, 80);
   1320  1.1.1.5  christos         BIO_printf(bio, "signature_algorithms (len=%d)\n", (int)xlen);
   1321  1.1.1.5  christos         while (xlen > 0) {
   1322  1.1.1.5  christos             BIO_indent(bio, indent + 2, 80);
   1323  1.1.1.5  christos             sigalg = (msg[0] << 8) | msg[1];
   1324  1.1.1.5  christos             BIO_printf(bio, "%s (0x%04x)\n",
   1325  1.1.1.5  christos                        ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
   1326  1.1.1.5  christos             xlen -= 2;
   1327  1.1.1.5  christos             msg += 2;
   1328  1.1.1.5  christos         }
   1329  1.1.1.5  christos         msg += xlen;
   1330      1.1       spz     }
   1331      1.1       spz 
   1332  1.1.1.4  christos     if (msglen < 2)
   1333  1.1.1.4  christos         return 0;
   1334      1.1       spz     xlen = (msg[0] << 8) | msg[1];
   1335      1.1       spz     BIO_indent(bio, indent, 80);
   1336      1.1       spz     if (msglen < xlen + 2)
   1337      1.1       spz         return 0;
   1338      1.1       spz     msg += 2;
   1339  1.1.1.5  christos     msglen -= 2 + xlen;
   1340      1.1       spz     BIO_printf(bio, "certificate_authorities (len=%d)\n", (int)xlen);
   1341      1.1       spz     while (xlen > 0) {
   1342      1.1       spz         size_t dlen;
   1343      1.1       spz         X509_NAME *nm;
   1344      1.1       spz         const unsigned char *p;
   1345      1.1       spz         if (xlen < 2)
   1346      1.1       spz             return 0;
   1347      1.1       spz         dlen = (msg[0] << 8) | msg[1];
   1348      1.1       spz         if (xlen < dlen + 2)
   1349      1.1       spz             return 0;
   1350      1.1       spz         msg += 2;
   1351      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1352      1.1       spz         BIO_printf(bio, "DistinguishedName (len=%d): ", (int)dlen);
   1353      1.1       spz         p = msg;
   1354      1.1       spz         nm = d2i_X509_NAME(NULL, &p, dlen);
   1355      1.1       spz         if (!nm) {
   1356      1.1       spz             BIO_puts(bio, "<UNPARSEABLE DN>\n");
   1357      1.1       spz         } else {
   1358      1.1       spz             X509_NAME_print_ex(bio, nm, 0, XN_FLAG_ONELINE);
   1359      1.1       spz             BIO_puts(bio, "\n");
   1360      1.1       spz             X509_NAME_free(nm);
   1361      1.1       spz         }
   1362      1.1       spz         xlen -= dlen + 2;
   1363      1.1       spz         msg += dlen;
   1364      1.1       spz     }
   1365  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1366  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent, "request_extensions", 2,
   1367  1.1.1.5  christos                               &msg, &msglen))
   1368  1.1.1.5  christos             return 0;
   1369  1.1.1.5  christos     }
   1370  1.1.1.5  christos     return msglen == 0;
   1371      1.1       spz }
   1372      1.1       spz 
   1373  1.1.1.5  christos static int ssl_print_ticket(BIO *bio, int indent, const SSL *ssl,
   1374      1.1       spz                             const unsigned char *msg, size_t msglen)
   1375      1.1       spz {
   1376      1.1       spz     unsigned int tick_life;
   1377  1.1.1.5  christos 
   1378      1.1       spz     if (msglen == 0) {
   1379      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1380      1.1       spz         BIO_puts(bio, "No Ticket\n");
   1381      1.1       spz         return 1;
   1382      1.1       spz     }
   1383      1.1       spz     if (msglen < 4)
   1384      1.1       spz         return 0;
   1385  1.1.1.7  christos     tick_life = ((unsigned int)msg[0] << 24)
   1386  1.1.1.7  christos                 | ((unsigned int)msg[1] << 16)
   1387  1.1.1.7  christos                 | ((unsigned int)msg[2] << 8)
   1388  1.1.1.7  christos                 | (unsigned int)msg[3];
   1389      1.1       spz     msglen -= 4;
   1390      1.1       spz     msg += 4;
   1391      1.1       spz     BIO_indent(bio, indent + 2, 80);
   1392      1.1       spz     BIO_printf(bio, "ticket_lifetime_hint=%u\n", tick_life);
   1393  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)) {
   1394  1.1.1.5  christos         unsigned int ticket_age_add;
   1395  1.1.1.5  christos 
   1396  1.1.1.5  christos         if (msglen < 4)
   1397  1.1.1.5  christos             return 0;
   1398  1.1.1.5  christos         ticket_age_add =
   1399  1.1.1.7  christos             ((unsigned int)msg[0] << 24)
   1400  1.1.1.7  christos             | ((unsigned int)msg[1] << 16)
   1401  1.1.1.7  christos             | ((unsigned int)msg[2] << 8)
   1402  1.1.1.7  christos             | (unsigned int)msg[3];
   1403  1.1.1.5  christos         msglen -= 4;
   1404  1.1.1.5  christos         msg += 4;
   1405  1.1.1.5  christos         BIO_indent(bio, indent + 2, 80);
   1406  1.1.1.5  christos         BIO_printf(bio, "ticket_age_add=%u\n", ticket_age_add);
   1407  1.1.1.5  christos         if (!ssl_print_hexbuf(bio, indent + 2, "ticket_nonce", 1, &msg,
   1408  1.1.1.5  christos                               &msglen))
   1409  1.1.1.5  christos             return 0;
   1410  1.1.1.5  christos     }
   1411      1.1       spz     if (!ssl_print_hexbuf(bio, indent + 2, "ticket", 2, &msg, &msglen))
   1412      1.1       spz         return 0;
   1413  1.1.1.5  christos     if (SSL_IS_TLS13(ssl)
   1414  1.1.1.5  christos             && !ssl_print_extensions(bio, indent + 2, 0,
   1415  1.1.1.5  christos                                      SSL3_MT_NEWSESSION_TICKET, &msg, &msglen))
   1416  1.1.1.5  christos         return 0;
   1417      1.1       spz     if (msglen)
   1418      1.1       spz         return 0;
   1419      1.1       spz     return 1;
   1420      1.1       spz }
   1421      1.1       spz 
   1422  1.1.1.5  christos static int ssl_print_handshake(BIO *bio, const SSL *ssl, int server,
   1423      1.1       spz                                const unsigned char *msg, size_t msglen,
   1424      1.1       spz                                int indent)
   1425      1.1       spz {
   1426      1.1       spz     size_t hlen;
   1427      1.1       spz     unsigned char htype;
   1428  1.1.1.5  christos 
   1429      1.1       spz     if (msglen < 4)
   1430      1.1       spz         return 0;
   1431      1.1       spz     htype = msg[0];
   1432      1.1       spz     hlen = (msg[1] << 16) | (msg[2] << 8) | msg[3];
   1433      1.1       spz     BIO_indent(bio, indent, 80);
   1434      1.1       spz     BIO_printf(bio, "%s, Length=%d\n",
   1435      1.1       spz                ssl_trace_str(htype, ssl_handshake_tbl), (int)hlen);
   1436      1.1       spz     msg += 4;
   1437      1.1       spz     msglen -= 4;
   1438      1.1       spz     if (SSL_IS_DTLS(ssl)) {
   1439      1.1       spz         if (msglen < 8)
   1440      1.1       spz             return 0;
   1441      1.1       spz         BIO_indent(bio, indent, 80);
   1442      1.1       spz         BIO_printf(bio, "message_seq=%d, fragment_offset=%d, "
   1443      1.1       spz                    "fragment_length=%d\n",
   1444      1.1       spz                    (msg[0] << 8) | msg[1],
   1445      1.1       spz                    (msg[2] << 16) | (msg[3] << 8) | msg[4],
   1446      1.1       spz                    (msg[5] << 16) | (msg[6] << 8) | msg[7]);
   1447      1.1       spz         msg += 8;
   1448      1.1       spz         msglen -= 8;
   1449      1.1       spz     }
   1450      1.1       spz     if (msglen < hlen)
   1451      1.1       spz         return 0;
   1452      1.1       spz     switch (htype) {
   1453      1.1       spz     case SSL3_MT_CLIENT_HELLO:
   1454      1.1       spz         if (!ssl_print_client_hello(bio, ssl, indent + 2, msg, msglen))
   1455      1.1       spz             return 0;
   1456      1.1       spz         break;
   1457      1.1       spz 
   1458      1.1       spz     case DTLS1_MT_HELLO_VERIFY_REQUEST:
   1459      1.1       spz         if (!dtls_print_hello_vfyrequest(bio, indent + 2, msg, msglen))
   1460      1.1       spz             return 0;
   1461      1.1       spz         break;
   1462      1.1       spz 
   1463      1.1       spz     case SSL3_MT_SERVER_HELLO:
   1464      1.1       spz         if (!ssl_print_server_hello(bio, indent + 2, msg, msglen))
   1465      1.1       spz             return 0;
   1466      1.1       spz         break;
   1467      1.1       spz 
   1468      1.1       spz     case SSL3_MT_SERVER_KEY_EXCHANGE:
   1469      1.1       spz         if (!ssl_print_server_keyex(bio, indent + 2, ssl, msg, msglen))
   1470      1.1       spz             return 0;
   1471      1.1       spz         break;
   1472      1.1       spz 
   1473      1.1       spz     case SSL3_MT_CLIENT_KEY_EXCHANGE:
   1474      1.1       spz         if (!ssl_print_client_keyex(bio, indent + 2, ssl, msg, msglen))
   1475      1.1       spz             return 0;
   1476      1.1       spz         break;
   1477      1.1       spz 
   1478      1.1       spz     case SSL3_MT_CERTIFICATE:
   1479  1.1.1.5  christos         if (!ssl_print_certificates(bio, ssl, server, indent + 2, msg, msglen))
   1480      1.1       spz             return 0;
   1481      1.1       spz         break;
   1482      1.1       spz 
   1483      1.1       spz     case SSL3_MT_CERTIFICATE_VERIFY:
   1484      1.1       spz         if (!ssl_print_signature(bio, indent + 2, ssl, &msg, &msglen))
   1485      1.1       spz             return 0;
   1486      1.1       spz         break;
   1487      1.1       spz 
   1488      1.1       spz     case SSL3_MT_CERTIFICATE_REQUEST:
   1489      1.1       spz         if (!ssl_print_cert_request(bio, indent + 2, ssl, msg, msglen))
   1490      1.1       spz             return 0;
   1491      1.1       spz         break;
   1492      1.1       spz 
   1493      1.1       spz     case SSL3_MT_FINISHED:
   1494      1.1       spz         ssl_print_hex(bio, indent + 2, "verify_data", msg, msglen);
   1495      1.1       spz         break;
   1496      1.1       spz 
   1497      1.1       spz     case SSL3_MT_SERVER_DONE:
   1498      1.1       spz         if (msglen != 0)
   1499      1.1       spz             ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
   1500      1.1       spz         break;
   1501      1.1       spz 
   1502      1.1       spz     case SSL3_MT_NEWSESSION_TICKET:
   1503  1.1.1.5  christos         if (!ssl_print_ticket(bio, indent + 2, ssl, msg, msglen))
   1504  1.1.1.5  christos             return 0;
   1505  1.1.1.5  christos         break;
   1506  1.1.1.5  christos 
   1507  1.1.1.5  christos     case SSL3_MT_ENCRYPTED_EXTENSIONS:
   1508  1.1.1.5  christos         if (!ssl_print_extensions(bio, indent + 2, 1,
   1509  1.1.1.5  christos                                   SSL3_MT_ENCRYPTED_EXTENSIONS, &msg, &msglen))
   1510  1.1.1.5  christos             return 0;
   1511  1.1.1.5  christos         break;
   1512  1.1.1.5  christos 
   1513  1.1.1.5  christos     case SSL3_MT_KEY_UPDATE:
   1514  1.1.1.5  christos         if (msglen != 1) {
   1515  1.1.1.5  christos             ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
   1516  1.1.1.5  christos             return 0;
   1517  1.1.1.5  christos         }
   1518  1.1.1.5  christos         if (!ssl_trace_list(bio, indent + 2, msg, msglen, 1,
   1519  1.1.1.5  christos                             ssl_key_update_tbl))
   1520      1.1       spz             return 0;
   1521      1.1       spz         break;
   1522      1.1       spz 
   1523      1.1       spz     default:
   1524      1.1       spz         BIO_indent(bio, indent + 2, 80);
   1525      1.1       spz         BIO_puts(bio, "Unsupported, hex dump follows:\n");
   1526  1.1.1.2  christos         BIO_dump_indent(bio, (const char *)msg, msglen, indent + 4);
   1527      1.1       spz     }
   1528      1.1       spz     return 1;
   1529      1.1       spz }
   1530      1.1       spz 
   1531      1.1       spz void SSL_trace(int write_p, int version, int content_type,
   1532      1.1       spz                const void *buf, size_t msglen, SSL *ssl, void *arg)
   1533      1.1       spz {
   1534      1.1       spz     const unsigned char *msg = buf;
   1535      1.1       spz     BIO *bio = arg;
   1536      1.1       spz 
   1537      1.1       spz     switch (content_type) {
   1538      1.1       spz     case SSL3_RT_HEADER:
   1539      1.1       spz         {
   1540  1.1.1.4  christos             int hvers;
   1541  1.1.1.4  christos 
   1542  1.1.1.4  christos             /* avoid overlapping with length at the end of buffer */
   1543  1.1.1.4  christos             if (msglen < (size_t)(SSL_IS_DTLS(ssl) ?
   1544  1.1.1.5  christos                      DTLS1_RT_HEADER_LENGTH : SSL3_RT_HEADER_LENGTH)) {
   1545  1.1.1.4  christos                 BIO_puts(bio, write_p ? "Sent" : "Received");
   1546  1.1.1.4  christos                 ssl_print_hex(bio, 0, " too short message", msg, msglen);
   1547  1.1.1.4  christos                 break;
   1548  1.1.1.4  christos             }
   1549  1.1.1.4  christos             hvers = msg[1] << 8 | msg[2];
   1550      1.1       spz             BIO_puts(bio, write_p ? "Sent" : "Received");
   1551      1.1       spz             BIO_printf(bio, " Record\nHeader:\n  Version = %s (0x%x)\n",
   1552      1.1       spz                        ssl_trace_str(hvers, ssl_version_tbl), hvers);
   1553      1.1       spz             if (SSL_IS_DTLS(ssl)) {
   1554      1.1       spz                 BIO_printf(bio,
   1555      1.1       spz                            "  epoch=%d, sequence_number=%04x%04x%04x\n",
   1556      1.1       spz                            (msg[3] << 8 | msg[4]),
   1557      1.1       spz                            (msg[5] << 8 | msg[6]),
   1558      1.1       spz                            (msg[7] << 8 | msg[8]), (msg[9] << 8 | msg[10]));
   1559      1.1       spz             }
   1560      1.1       spz 
   1561      1.1       spz             BIO_printf(bio, "  Content Type = %s (%d)\n  Length = %d",
   1562      1.1       spz                        ssl_trace_str(msg[0], ssl_content_tbl), msg[0],
   1563      1.1       spz                        msg[msglen - 2] << 8 | msg[msglen - 1]);
   1564      1.1       spz         }
   1565      1.1       spz         break;
   1566  1.1.1.5  christos 
   1567  1.1.1.5  christos     case SSL3_RT_INNER_CONTENT_TYPE:
   1568  1.1.1.5  christos         BIO_printf(bio, "  Inner Content Type = %s (%d)",
   1569  1.1.1.5  christos                    ssl_trace_str(msg[0], ssl_content_tbl), msg[0]);
   1570  1.1.1.5  christos         break;
   1571  1.1.1.5  christos 
   1572      1.1       spz     case SSL3_RT_HANDSHAKE:
   1573  1.1.1.5  christos         if (!ssl_print_handshake(bio, ssl, ssl->server ? write_p : !write_p,
   1574  1.1.1.5  christos                                  msg, msglen, 4))
   1575      1.1       spz             BIO_printf(bio, "Message length parse error!\n");
   1576      1.1       spz         break;
   1577      1.1       spz 
   1578      1.1       spz     case SSL3_RT_CHANGE_CIPHER_SPEC:
   1579      1.1       spz         if (msglen == 1 && msg[0] == 1)
   1580      1.1       spz             BIO_puts(bio, "    change_cipher_spec (1)\n");
   1581      1.1       spz         else
   1582      1.1       spz             ssl_print_hex(bio, 4, "unknown value", msg, msglen);
   1583      1.1       spz         break;
   1584      1.1       spz 
   1585      1.1       spz     case SSL3_RT_ALERT:
   1586  1.1.1.5  christos         if (msglen != 2)
   1587      1.1       spz             BIO_puts(bio, "    Illegal Alert Length\n");
   1588  1.1.1.5  christos         else {
   1589      1.1       spz             BIO_printf(bio, "    Level=%s(%d), description=%s(%d)\n",
   1590      1.1       spz                        SSL_alert_type_string_long(msg[0] << 8),
   1591      1.1       spz                        msg[0], SSL_alert_desc_string_long(msg[1]), msg[1]);
   1592      1.1       spz         }
   1593      1.1       spz 
   1594      1.1       spz     }
   1595      1.1       spz 
   1596      1.1       spz     BIO_puts(bio, "\n");
   1597      1.1       spz }
   1598      1.1       spz 
   1599      1.1       spz #endif
   1600