17bded2dbSJung-uk Kim /*
2*b077aed3SPierre Pronchery * Copyright 2012-2021 The OpenSSL Project Authors. All Rights Reserved.
37bded2dbSJung-uk Kim *
4*b077aed3SPierre Pronchery * Licensed under the Apache License 2.0 (the "License"). You may not use
5e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy
6e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at
7e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html
87bded2dbSJung-uk Kim */
97bded2dbSJung-uk Kim
1017f01e99SJung-uk Kim #include "ssl_local.h"
117bded2dbSJung-uk Kim
127bded2dbSJung-uk Kim #ifndef OPENSSL_NO_SSL_TRACE
137bded2dbSJung-uk Kim
147bded2dbSJung-uk Kim /* Packet trace support for OpenSSL */
157bded2dbSJung-uk Kim
167bded2dbSJung-uk Kim typedef struct {
177bded2dbSJung-uk Kim int num;
187bded2dbSJung-uk Kim const char *name;
197bded2dbSJung-uk Kim } ssl_trace_tbl;
207bded2dbSJung-uk Kim
217bded2dbSJung-uk Kim # define ssl_trace_str(val, tbl) \
22e71b7053SJung-uk Kim do_ssl_trace_str(val, tbl, OSSL_NELEM(tbl))
237bded2dbSJung-uk Kim
247bded2dbSJung-uk Kim # define ssl_trace_list(bio, indent, msg, msglen, value, table) \
257bded2dbSJung-uk Kim do_ssl_trace_list(bio, indent, msg, msglen, value, \
26e71b7053SJung-uk Kim table, OSSL_NELEM(table))
277bded2dbSJung-uk Kim
do_ssl_trace_str(int val,const ssl_trace_tbl * tbl,size_t ntbl)28e71b7053SJung-uk Kim static const char *do_ssl_trace_str(int val, const ssl_trace_tbl *tbl,
29e71b7053SJung-uk Kim size_t ntbl)
307bded2dbSJung-uk Kim {
317bded2dbSJung-uk Kim size_t i;
32e71b7053SJung-uk Kim
337bded2dbSJung-uk Kim for (i = 0; i < ntbl; i++, tbl++) {
347bded2dbSJung-uk Kim if (tbl->num == val)
357bded2dbSJung-uk Kim return tbl->name;
367bded2dbSJung-uk Kim }
377bded2dbSJung-uk Kim return "UNKNOWN";
387bded2dbSJung-uk Kim }
397bded2dbSJung-uk Kim
do_ssl_trace_list(BIO * bio,int indent,const unsigned char * msg,size_t msglen,size_t vlen,const ssl_trace_tbl * tbl,size_t ntbl)407bded2dbSJung-uk Kim static int do_ssl_trace_list(BIO *bio, int indent,
417bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen,
42e71b7053SJung-uk Kim size_t vlen, const ssl_trace_tbl *tbl, size_t ntbl)
437bded2dbSJung-uk Kim {
447bded2dbSJung-uk Kim int val;
45e71b7053SJung-uk Kim
467bded2dbSJung-uk Kim if (msglen % vlen)
477bded2dbSJung-uk Kim return 0;
487bded2dbSJung-uk Kim while (msglen) {
497bded2dbSJung-uk Kim val = msg[0];
507bded2dbSJung-uk Kim if (vlen == 2)
517bded2dbSJung-uk Kim val = (val << 8) | msg[1];
527bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
537bded2dbSJung-uk Kim BIO_printf(bio, "%s (%d)\n", do_ssl_trace_str(val, tbl, ntbl), val);
547bded2dbSJung-uk Kim msg += vlen;
557bded2dbSJung-uk Kim msglen -= vlen;
567bded2dbSJung-uk Kim }
577bded2dbSJung-uk Kim return 1;
587bded2dbSJung-uk Kim }
597bded2dbSJung-uk Kim
607bded2dbSJung-uk Kim /* Version number */
617bded2dbSJung-uk Kim
62e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_version_tbl[] = {
637bded2dbSJung-uk Kim {SSL3_VERSION, "SSL 3.0"},
647bded2dbSJung-uk Kim {TLS1_VERSION, "TLS 1.0"},
657bded2dbSJung-uk Kim {TLS1_1_VERSION, "TLS 1.1"},
667bded2dbSJung-uk Kim {TLS1_2_VERSION, "TLS 1.2"},
67e71b7053SJung-uk Kim {TLS1_3_VERSION, "TLS 1.3"},
687bded2dbSJung-uk Kim {DTLS1_VERSION, "DTLS 1.0"},
697bded2dbSJung-uk Kim {DTLS1_2_VERSION, "DTLS 1.2"},
707bded2dbSJung-uk Kim {DTLS1_BAD_VER, "DTLS 1.0 (bad)"}
717bded2dbSJung-uk Kim };
727bded2dbSJung-uk Kim
73e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_content_tbl[] = {
747bded2dbSJung-uk Kim {SSL3_RT_CHANGE_CIPHER_SPEC, "ChangeCipherSpec"},
757bded2dbSJung-uk Kim {SSL3_RT_ALERT, "Alert"},
767bded2dbSJung-uk Kim {SSL3_RT_HANDSHAKE, "Handshake"},
777bded2dbSJung-uk Kim {SSL3_RT_APPLICATION_DATA, "ApplicationData"},
787bded2dbSJung-uk Kim };
797bded2dbSJung-uk Kim
80e71b7053SJung-uk Kim /* Handshake types, sorted by ascending id */
81e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_handshake_tbl[] = {
827bded2dbSJung-uk Kim {SSL3_MT_HELLO_REQUEST, "HelloRequest"},
837bded2dbSJung-uk Kim {SSL3_MT_CLIENT_HELLO, "ClientHello"},
847bded2dbSJung-uk Kim {SSL3_MT_SERVER_HELLO, "ServerHello"},
857bded2dbSJung-uk Kim {DTLS1_MT_HELLO_VERIFY_REQUEST, "HelloVerifyRequest"},
867bded2dbSJung-uk Kim {SSL3_MT_NEWSESSION_TICKET, "NewSessionTicket"},
87e71b7053SJung-uk Kim {SSL3_MT_END_OF_EARLY_DATA, "EndOfEarlyData"},
88e71b7053SJung-uk Kim {SSL3_MT_ENCRYPTED_EXTENSIONS, "EncryptedExtensions"},
897bded2dbSJung-uk Kim {SSL3_MT_CERTIFICATE, "Certificate"},
907bded2dbSJung-uk Kim {SSL3_MT_SERVER_KEY_EXCHANGE, "ServerKeyExchange"},
917bded2dbSJung-uk Kim {SSL3_MT_CERTIFICATE_REQUEST, "CertificateRequest"},
927bded2dbSJung-uk Kim {SSL3_MT_SERVER_DONE, "ServerHelloDone"},
937bded2dbSJung-uk Kim {SSL3_MT_CERTIFICATE_VERIFY, "CertificateVerify"},
947bded2dbSJung-uk Kim {SSL3_MT_CLIENT_KEY_EXCHANGE, "ClientKeyExchange"},
957bded2dbSJung-uk Kim {SSL3_MT_FINISHED, "Finished"},
96e71b7053SJung-uk Kim {SSL3_MT_CERTIFICATE_URL, "CertificateUrl"},
97e71b7053SJung-uk Kim {SSL3_MT_CERTIFICATE_STATUS, "CertificateStatus"},
98e71b7053SJung-uk Kim {SSL3_MT_SUPPLEMENTAL_DATA, "SupplementalData"},
99e71b7053SJung-uk Kim {SSL3_MT_KEY_UPDATE, "KeyUpdate"},
100e71b7053SJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
101e71b7053SJung-uk Kim {SSL3_MT_NEXT_PROTO, "NextProto"},
102e71b7053SJung-uk Kim # endif
103e71b7053SJung-uk Kim {SSL3_MT_MESSAGE_HASH, "MessageHash"}
1047bded2dbSJung-uk Kim };
1057bded2dbSJung-uk Kim
1067bded2dbSJung-uk Kim /* Cipher suites */
107e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_ciphers_tbl[] = {
108e71b7053SJung-uk Kim {0x0000, "TLS_NULL_WITH_NULL_NULL"},
109e71b7053SJung-uk Kim {0x0001, "TLS_RSA_WITH_NULL_MD5"},
110e71b7053SJung-uk Kim {0x0002, "TLS_RSA_WITH_NULL_SHA"},
111e71b7053SJung-uk Kim {0x0003, "TLS_RSA_EXPORT_WITH_RC4_40_MD5"},
112e71b7053SJung-uk Kim {0x0004, "TLS_RSA_WITH_RC4_128_MD5"},
113e71b7053SJung-uk Kim {0x0005, "TLS_RSA_WITH_RC4_128_SHA"},
114e71b7053SJung-uk Kim {0x0006, "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"},
115e71b7053SJung-uk Kim {0x0007, "TLS_RSA_WITH_IDEA_CBC_SHA"},
116e71b7053SJung-uk Kim {0x0008, "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA"},
117e71b7053SJung-uk Kim {0x0009, "TLS_RSA_WITH_DES_CBC_SHA"},
118e71b7053SJung-uk Kim {0x000A, "TLS_RSA_WITH_3DES_EDE_CBC_SHA"},
119e71b7053SJung-uk Kim {0x000B, "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"},
120e71b7053SJung-uk Kim {0x000C, "TLS_DH_DSS_WITH_DES_CBC_SHA"},
121e71b7053SJung-uk Kim {0x000D, "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"},
122e71b7053SJung-uk Kim {0x000E, "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"},
123e71b7053SJung-uk Kim {0x000F, "TLS_DH_RSA_WITH_DES_CBC_SHA"},
124e71b7053SJung-uk Kim {0x0010, "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"},
125e71b7053SJung-uk Kim {0x0011, "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"},
126e71b7053SJung-uk Kim {0x0012, "TLS_DHE_DSS_WITH_DES_CBC_SHA"},
127e71b7053SJung-uk Kim {0x0013, "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA"},
128e71b7053SJung-uk Kim {0x0014, "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"},
129e71b7053SJung-uk Kim {0x0015, "TLS_DHE_RSA_WITH_DES_CBC_SHA"},
130e71b7053SJung-uk Kim {0x0016, "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA"},
131e71b7053SJung-uk Kim {0x0017, "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5"},
132e71b7053SJung-uk Kim {0x0018, "TLS_DH_anon_WITH_RC4_128_MD5"},
133e71b7053SJung-uk Kim {0x0019, "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA"},
134e71b7053SJung-uk Kim {0x001A, "TLS_DH_anon_WITH_DES_CBC_SHA"},
135e71b7053SJung-uk Kim {0x001B, "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA"},
1367bded2dbSJung-uk Kim {0x001D, "SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA"},
1377bded2dbSJung-uk Kim {0x001E, "SSL_FORTEZZA_KEA_WITH_RC4_128_SHA"},
1387bded2dbSJung-uk Kim {0x001F, "TLS_KRB5_WITH_3DES_EDE_CBC_SHA"},
1397bded2dbSJung-uk Kim {0x0020, "TLS_KRB5_WITH_RC4_128_SHA"},
1407bded2dbSJung-uk Kim {0x0021, "TLS_KRB5_WITH_IDEA_CBC_SHA"},
1417bded2dbSJung-uk Kim {0x0022, "TLS_KRB5_WITH_DES_CBC_MD5"},
1427bded2dbSJung-uk Kim {0x0023, "TLS_KRB5_WITH_3DES_EDE_CBC_MD5"},
1437bded2dbSJung-uk Kim {0x0024, "TLS_KRB5_WITH_RC4_128_MD5"},
1447bded2dbSJung-uk Kim {0x0025, "TLS_KRB5_WITH_IDEA_CBC_MD5"},
1457bded2dbSJung-uk Kim {0x0026, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"},
1467bded2dbSJung-uk Kim {0x0027, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"},
1477bded2dbSJung-uk Kim {0x0028, "TLS_KRB5_EXPORT_WITH_RC4_40_SHA"},
1487bded2dbSJung-uk Kim {0x0029, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"},
1497bded2dbSJung-uk Kim {0x002A, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"},
1507bded2dbSJung-uk Kim {0x002B, "TLS_KRB5_EXPORT_WITH_RC4_40_MD5"},
151e71b7053SJung-uk Kim {0x002C, "TLS_PSK_WITH_NULL_SHA"},
152e71b7053SJung-uk Kim {0x002D, "TLS_DHE_PSK_WITH_NULL_SHA"},
153e71b7053SJung-uk Kim {0x002E, "TLS_RSA_PSK_WITH_NULL_SHA"},
1547bded2dbSJung-uk Kim {0x002F, "TLS_RSA_WITH_AES_128_CBC_SHA"},
1557bded2dbSJung-uk Kim {0x0030, "TLS_DH_DSS_WITH_AES_128_CBC_SHA"},
1567bded2dbSJung-uk Kim {0x0031, "TLS_DH_RSA_WITH_AES_128_CBC_SHA"},
1577bded2dbSJung-uk Kim {0x0032, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"},
1587bded2dbSJung-uk Kim {0x0033, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"},
1597bded2dbSJung-uk Kim {0x0034, "TLS_DH_anon_WITH_AES_128_CBC_SHA"},
1607bded2dbSJung-uk Kim {0x0035, "TLS_RSA_WITH_AES_256_CBC_SHA"},
1617bded2dbSJung-uk Kim {0x0036, "TLS_DH_DSS_WITH_AES_256_CBC_SHA"},
1627bded2dbSJung-uk Kim {0x0037, "TLS_DH_RSA_WITH_AES_256_CBC_SHA"},
1637bded2dbSJung-uk Kim {0x0038, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"},
1647bded2dbSJung-uk Kim {0x0039, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"},
1657bded2dbSJung-uk Kim {0x003A, "TLS_DH_anon_WITH_AES_256_CBC_SHA"},
1667bded2dbSJung-uk Kim {0x003B, "TLS_RSA_WITH_NULL_SHA256"},
1677bded2dbSJung-uk Kim {0x003C, "TLS_RSA_WITH_AES_128_CBC_SHA256"},
1687bded2dbSJung-uk Kim {0x003D, "TLS_RSA_WITH_AES_256_CBC_SHA256"},
1697bded2dbSJung-uk Kim {0x003E, "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"},
1707bded2dbSJung-uk Kim {0x003F, "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"},
1717bded2dbSJung-uk Kim {0x0040, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"},
1727bded2dbSJung-uk Kim {0x0041, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"},
1737bded2dbSJung-uk Kim {0x0042, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"},
1747bded2dbSJung-uk Kim {0x0043, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"},
1757bded2dbSJung-uk Kim {0x0044, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"},
1767bded2dbSJung-uk Kim {0x0045, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"},
1777bded2dbSJung-uk Kim {0x0046, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"},
1787bded2dbSJung-uk Kim {0x0067, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"},
1797bded2dbSJung-uk Kim {0x0068, "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"},
1807bded2dbSJung-uk Kim {0x0069, "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"},
1817bded2dbSJung-uk Kim {0x006A, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"},
1827bded2dbSJung-uk Kim {0x006B, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"},
1837bded2dbSJung-uk Kim {0x006C, "TLS_DH_anon_WITH_AES_128_CBC_SHA256"},
1847bded2dbSJung-uk Kim {0x006D, "TLS_DH_anon_WITH_AES_256_CBC_SHA256"},
185e71b7053SJung-uk Kim {0x0081, "TLS_GOSTR341001_WITH_28147_CNT_IMIT"},
186e71b7053SJung-uk Kim {0x0083, "TLS_GOSTR341001_WITH_NULL_GOSTR3411"},
1877bded2dbSJung-uk Kim {0x0084, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"},
1887bded2dbSJung-uk Kim {0x0085, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"},
1897bded2dbSJung-uk Kim {0x0086, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"},
1907bded2dbSJung-uk Kim {0x0087, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"},
1917bded2dbSJung-uk Kim {0x0088, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"},
1927bded2dbSJung-uk Kim {0x0089, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"},
1937bded2dbSJung-uk Kim {0x008A, "TLS_PSK_WITH_RC4_128_SHA"},
1947bded2dbSJung-uk Kim {0x008B, "TLS_PSK_WITH_3DES_EDE_CBC_SHA"},
1957bded2dbSJung-uk Kim {0x008C, "TLS_PSK_WITH_AES_128_CBC_SHA"},
1967bded2dbSJung-uk Kim {0x008D, "TLS_PSK_WITH_AES_256_CBC_SHA"},
1977bded2dbSJung-uk Kim {0x008E, "TLS_DHE_PSK_WITH_RC4_128_SHA"},
1987bded2dbSJung-uk Kim {0x008F, "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"},
1997bded2dbSJung-uk Kim {0x0090, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"},
2007bded2dbSJung-uk Kim {0x0091, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"},
2017bded2dbSJung-uk Kim {0x0092, "TLS_RSA_PSK_WITH_RC4_128_SHA"},
2027bded2dbSJung-uk Kim {0x0093, "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"},
2037bded2dbSJung-uk Kim {0x0094, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"},
2047bded2dbSJung-uk Kim {0x0095, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"},
2057bded2dbSJung-uk Kim {0x0096, "TLS_RSA_WITH_SEED_CBC_SHA"},
2067bded2dbSJung-uk Kim {0x0097, "TLS_DH_DSS_WITH_SEED_CBC_SHA"},
2077bded2dbSJung-uk Kim {0x0098, "TLS_DH_RSA_WITH_SEED_CBC_SHA"},
2087bded2dbSJung-uk Kim {0x0099, "TLS_DHE_DSS_WITH_SEED_CBC_SHA"},
2097bded2dbSJung-uk Kim {0x009A, "TLS_DHE_RSA_WITH_SEED_CBC_SHA"},
2107bded2dbSJung-uk Kim {0x009B, "TLS_DH_anon_WITH_SEED_CBC_SHA"},
2117bded2dbSJung-uk Kim {0x009C, "TLS_RSA_WITH_AES_128_GCM_SHA256"},
2127bded2dbSJung-uk Kim {0x009D, "TLS_RSA_WITH_AES_256_GCM_SHA384"},
2137bded2dbSJung-uk Kim {0x009E, "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"},
2147bded2dbSJung-uk Kim {0x009F, "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"},
2157bded2dbSJung-uk Kim {0x00A0, "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"},
2167bded2dbSJung-uk Kim {0x00A1, "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"},
2177bded2dbSJung-uk Kim {0x00A2, "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"},
2187bded2dbSJung-uk Kim {0x00A3, "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"},
2197bded2dbSJung-uk Kim {0x00A4, "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"},
2207bded2dbSJung-uk Kim {0x00A5, "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"},
2217bded2dbSJung-uk Kim {0x00A6, "TLS_DH_anon_WITH_AES_128_GCM_SHA256"},
2227bded2dbSJung-uk Kim {0x00A7, "TLS_DH_anon_WITH_AES_256_GCM_SHA384"},
2237bded2dbSJung-uk Kim {0x00A8, "TLS_PSK_WITH_AES_128_GCM_SHA256"},
2247bded2dbSJung-uk Kim {0x00A9, "TLS_PSK_WITH_AES_256_GCM_SHA384"},
2257bded2dbSJung-uk Kim {0x00AA, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"},
2267bded2dbSJung-uk Kim {0x00AB, "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"},
2277bded2dbSJung-uk Kim {0x00AC, "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"},
2287bded2dbSJung-uk Kim {0x00AD, "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"},
2297bded2dbSJung-uk Kim {0x00AE, "TLS_PSK_WITH_AES_128_CBC_SHA256"},
2307bded2dbSJung-uk Kim {0x00AF, "TLS_PSK_WITH_AES_256_CBC_SHA384"},
2317bded2dbSJung-uk Kim {0x00B0, "TLS_PSK_WITH_NULL_SHA256"},
2327bded2dbSJung-uk Kim {0x00B1, "TLS_PSK_WITH_NULL_SHA384"},
2337bded2dbSJung-uk Kim {0x00B2, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"},
2347bded2dbSJung-uk Kim {0x00B3, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"},
2357bded2dbSJung-uk Kim {0x00B4, "TLS_DHE_PSK_WITH_NULL_SHA256"},
2367bded2dbSJung-uk Kim {0x00B5, "TLS_DHE_PSK_WITH_NULL_SHA384"},
2377bded2dbSJung-uk Kim {0x00B6, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"},
2387bded2dbSJung-uk Kim {0x00B7, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"},
2397bded2dbSJung-uk Kim {0x00B8, "TLS_RSA_PSK_WITH_NULL_SHA256"},
2407bded2dbSJung-uk Kim {0x00B9, "TLS_RSA_PSK_WITH_NULL_SHA384"},
2417bded2dbSJung-uk Kim {0x00BA, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
2427bded2dbSJung-uk Kim {0x00BB, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
2437bded2dbSJung-uk Kim {0x00BC, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
2447bded2dbSJung-uk Kim {0x00BD, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"},
2457bded2dbSJung-uk Kim {0x00BE, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
2467bded2dbSJung-uk Kim {0x00BF, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"},
2477bded2dbSJung-uk Kim {0x00C0, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
2487bded2dbSJung-uk Kim {0x00C1, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
2497bded2dbSJung-uk Kim {0x00C2, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
2507bded2dbSJung-uk Kim {0x00C3, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"},
2517bded2dbSJung-uk Kim {0x00C4, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"},
2527bded2dbSJung-uk Kim {0x00C5, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"},
2537bded2dbSJung-uk Kim {0x00FF, "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"},
254e71b7053SJung-uk Kim {0x5600, "TLS_FALLBACK_SCSV"},
2557bded2dbSJung-uk Kim {0xC001, "TLS_ECDH_ECDSA_WITH_NULL_SHA"},
2567bded2dbSJung-uk Kim {0xC002, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA"},
2577bded2dbSJung-uk Kim {0xC003, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"},
2587bded2dbSJung-uk Kim {0xC004, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"},
2597bded2dbSJung-uk Kim {0xC005, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"},
2607bded2dbSJung-uk Kim {0xC006, "TLS_ECDHE_ECDSA_WITH_NULL_SHA"},
2617bded2dbSJung-uk Kim {0xC007, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"},
2627bded2dbSJung-uk Kim {0xC008, "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"},
2637bded2dbSJung-uk Kim {0xC009, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"},
2647bded2dbSJung-uk Kim {0xC00A, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"},
2657bded2dbSJung-uk Kim {0xC00B, "TLS_ECDH_RSA_WITH_NULL_SHA"},
2667bded2dbSJung-uk Kim {0xC00C, "TLS_ECDH_RSA_WITH_RC4_128_SHA"},
2677bded2dbSJung-uk Kim {0xC00D, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"},
2687bded2dbSJung-uk Kim {0xC00E, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"},
2697bded2dbSJung-uk Kim {0xC00F, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"},
2707bded2dbSJung-uk Kim {0xC010, "TLS_ECDHE_RSA_WITH_NULL_SHA"},
2717bded2dbSJung-uk Kim {0xC011, "TLS_ECDHE_RSA_WITH_RC4_128_SHA"},
2727bded2dbSJung-uk Kim {0xC012, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"},
2737bded2dbSJung-uk Kim {0xC013, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"},
2747bded2dbSJung-uk Kim {0xC014, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"},
2757bded2dbSJung-uk Kim {0xC015, "TLS_ECDH_anon_WITH_NULL_SHA"},
2767bded2dbSJung-uk Kim {0xC016, "TLS_ECDH_anon_WITH_RC4_128_SHA"},
2777bded2dbSJung-uk Kim {0xC017, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"},
2787bded2dbSJung-uk Kim {0xC018, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA"},
2797bded2dbSJung-uk Kim {0xC019, "TLS_ECDH_anon_WITH_AES_256_CBC_SHA"},
2807bded2dbSJung-uk Kim {0xC01A, "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"},
2817bded2dbSJung-uk Kim {0xC01B, "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"},
2827bded2dbSJung-uk Kim {0xC01C, "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"},
2837bded2dbSJung-uk Kim {0xC01D, "TLS_SRP_SHA_WITH_AES_128_CBC_SHA"},
2847bded2dbSJung-uk Kim {0xC01E, "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"},
2857bded2dbSJung-uk Kim {0xC01F, "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"},
2867bded2dbSJung-uk Kim {0xC020, "TLS_SRP_SHA_WITH_AES_256_CBC_SHA"},
2877bded2dbSJung-uk Kim {0xC021, "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"},
2887bded2dbSJung-uk Kim {0xC022, "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"},
2897bded2dbSJung-uk Kim {0xC023, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"},
2907bded2dbSJung-uk Kim {0xC024, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"},
2917bded2dbSJung-uk Kim {0xC025, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"},
2927bded2dbSJung-uk Kim {0xC026, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"},
2937bded2dbSJung-uk Kim {0xC027, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"},
2947bded2dbSJung-uk Kim {0xC028, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"},
2957bded2dbSJung-uk Kim {0xC029, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"},
2967bded2dbSJung-uk Kim {0xC02A, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"},
2977bded2dbSJung-uk Kim {0xC02B, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"},
2987bded2dbSJung-uk Kim {0xC02C, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"},
2997bded2dbSJung-uk Kim {0xC02D, "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"},
3007bded2dbSJung-uk Kim {0xC02E, "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"},
3017bded2dbSJung-uk Kim {0xC02F, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"},
3027bded2dbSJung-uk Kim {0xC030, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"},
3037bded2dbSJung-uk Kim {0xC031, "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"},
3047bded2dbSJung-uk Kim {0xC032, "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"},
305e71b7053SJung-uk Kim {0xC033, "TLS_ECDHE_PSK_WITH_RC4_128_SHA"},
306e71b7053SJung-uk Kim {0xC034, "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"},
307e71b7053SJung-uk Kim {0xC035, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"},
308e71b7053SJung-uk Kim {0xC036, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"},
309e71b7053SJung-uk Kim {0xC037, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"},
310e71b7053SJung-uk Kim {0xC038, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"},
311e71b7053SJung-uk Kim {0xC039, "TLS_ECDHE_PSK_WITH_NULL_SHA"},
312e71b7053SJung-uk Kim {0xC03A, "TLS_ECDHE_PSK_WITH_NULL_SHA256"},
313e71b7053SJung-uk Kim {0xC03B, "TLS_ECDHE_PSK_WITH_NULL_SHA384"},
314e71b7053SJung-uk Kim {0xC03C, "TLS_RSA_WITH_ARIA_128_CBC_SHA256"},
315e71b7053SJung-uk Kim {0xC03D, "TLS_RSA_WITH_ARIA_256_CBC_SHA384"},
316e71b7053SJung-uk Kim {0xC03E, "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"},
317e71b7053SJung-uk Kim {0xC03F, "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"},
318e71b7053SJung-uk Kim {0xC040, "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"},
319e71b7053SJung-uk Kim {0xC041, "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"},
320e71b7053SJung-uk Kim {0xC042, "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"},
321e71b7053SJung-uk Kim {0xC043, "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"},
322e71b7053SJung-uk Kim {0xC044, "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"},
323e71b7053SJung-uk Kim {0xC045, "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"},
324e71b7053SJung-uk Kim {0xC046, "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"},
325e71b7053SJung-uk Kim {0xC047, "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"},
326e71b7053SJung-uk Kim {0xC048, "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"},
327e71b7053SJung-uk Kim {0xC049, "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"},
328e71b7053SJung-uk Kim {0xC04A, "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"},
329e71b7053SJung-uk Kim {0xC04B, "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"},
330e71b7053SJung-uk Kim {0xC04C, "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"},
331e71b7053SJung-uk Kim {0xC04D, "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"},
332e71b7053SJung-uk Kim {0xC04E, "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"},
333e71b7053SJung-uk Kim {0xC04F, "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"},
334e71b7053SJung-uk Kim {0xC050, "TLS_RSA_WITH_ARIA_128_GCM_SHA256"},
335e71b7053SJung-uk Kim {0xC051, "TLS_RSA_WITH_ARIA_256_GCM_SHA384"},
336e71b7053SJung-uk Kim {0xC052, "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"},
337e71b7053SJung-uk Kim {0xC053, "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"},
338e71b7053SJung-uk Kim {0xC054, "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"},
339e71b7053SJung-uk Kim {0xC055, "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"},
340e71b7053SJung-uk Kim {0xC056, "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"},
341e71b7053SJung-uk Kim {0xC057, "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"},
342e71b7053SJung-uk Kim {0xC058, "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"},
343e71b7053SJung-uk Kim {0xC059, "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"},
344e71b7053SJung-uk Kim {0xC05A, "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"},
345e71b7053SJung-uk Kim {0xC05B, "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"},
346e71b7053SJung-uk Kim {0xC05C, "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"},
347e71b7053SJung-uk Kim {0xC05D, "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"},
348e71b7053SJung-uk Kim {0xC05E, "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"},
349e71b7053SJung-uk Kim {0xC05F, "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"},
350e71b7053SJung-uk Kim {0xC060, "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"},
351e71b7053SJung-uk Kim {0xC061, "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"},
352e71b7053SJung-uk Kim {0xC062, "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"},
353e71b7053SJung-uk Kim {0xC063, "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"},
354e71b7053SJung-uk Kim {0xC064, "TLS_PSK_WITH_ARIA_128_CBC_SHA256"},
355e71b7053SJung-uk Kim {0xC065, "TLS_PSK_WITH_ARIA_256_CBC_SHA384"},
356e71b7053SJung-uk Kim {0xC066, "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"},
357e71b7053SJung-uk Kim {0xC067, "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"},
358e71b7053SJung-uk Kim {0xC068, "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"},
359e71b7053SJung-uk Kim {0xC069, "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"},
360e71b7053SJung-uk Kim {0xC06A, "TLS_PSK_WITH_ARIA_128_GCM_SHA256"},
361e71b7053SJung-uk Kim {0xC06B, "TLS_PSK_WITH_ARIA_256_GCM_SHA384"},
362e71b7053SJung-uk Kim {0xC06C, "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"},
363e71b7053SJung-uk Kim {0xC06D, "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"},
364e71b7053SJung-uk Kim {0xC06E, "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"},
365e71b7053SJung-uk Kim {0xC06F, "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"},
366e71b7053SJung-uk Kim {0xC070, "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"},
367e71b7053SJung-uk Kim {0xC071, "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"},
368e71b7053SJung-uk Kim {0xC072, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"},
369e71b7053SJung-uk Kim {0xC073, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"},
370e71b7053SJung-uk Kim {0xC074, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"},
371e71b7053SJung-uk Kim {0xC075, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"},
372e71b7053SJung-uk Kim {0xC076, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
373e71b7053SJung-uk Kim {0xC077, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"},
374e71b7053SJung-uk Kim {0xC078, "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"},
375e71b7053SJung-uk Kim {0xC079, "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"},
376e71b7053SJung-uk Kim {0xC07A, "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
377e71b7053SJung-uk Kim {0xC07B, "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
378e71b7053SJung-uk Kim {0xC07C, "TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
379e71b7053SJung-uk Kim {0xC07D, "TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
380e71b7053SJung-uk Kim {0xC07E, "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
381e71b7053SJung-uk Kim {0xC07F, "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
382e71b7053SJung-uk Kim {0xC080, "TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"},
383e71b7053SJung-uk Kim {0xC081, "TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"},
384e71b7053SJung-uk Kim {0xC082, "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"},
385e71b7053SJung-uk Kim {0xC083, "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"},
386e71b7053SJung-uk Kim {0xC084, "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"},
387e71b7053SJung-uk Kim {0xC085, "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"},
388e71b7053SJung-uk Kim {0xC086, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"},
389e71b7053SJung-uk Kim {0xC087, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"},
390e71b7053SJung-uk Kim {0xC088, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"},
391e71b7053SJung-uk Kim {0xC089, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"},
392e71b7053SJung-uk Kim {0xC08A, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
393e71b7053SJung-uk Kim {0xC08B, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
394e71b7053SJung-uk Kim {0xC08C, "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"},
395e71b7053SJung-uk Kim {0xC08D, "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"},
396e71b7053SJung-uk Kim {0xC08E, "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
397e71b7053SJung-uk Kim {0xC08F, "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
398e71b7053SJung-uk Kim {0xC090, "TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
399e71b7053SJung-uk Kim {0xC091, "TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
400e71b7053SJung-uk Kim {0xC092, "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"},
401e71b7053SJung-uk Kim {0xC093, "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"},
402e71b7053SJung-uk Kim {0xC094, "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
403e71b7053SJung-uk Kim {0xC095, "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
404e71b7053SJung-uk Kim {0xC096, "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
405e71b7053SJung-uk Kim {0xC097, "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
406e71b7053SJung-uk Kim {0xC098, "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
407e71b7053SJung-uk Kim {0xC099, "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
408e71b7053SJung-uk Kim {0xC09A, "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"},
409e71b7053SJung-uk Kim {0xC09B, "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"},
410e71b7053SJung-uk Kim {0xC09C, "TLS_RSA_WITH_AES_128_CCM"},
411e71b7053SJung-uk Kim {0xC09D, "TLS_RSA_WITH_AES_256_CCM"},
412e71b7053SJung-uk Kim {0xC09E, "TLS_DHE_RSA_WITH_AES_128_CCM"},
413e71b7053SJung-uk Kim {0xC09F, "TLS_DHE_RSA_WITH_AES_256_CCM"},
414e71b7053SJung-uk Kim {0xC0A0, "TLS_RSA_WITH_AES_128_CCM_8"},
415e71b7053SJung-uk Kim {0xC0A1, "TLS_RSA_WITH_AES_256_CCM_8"},
416e71b7053SJung-uk Kim {0xC0A2, "TLS_DHE_RSA_WITH_AES_128_CCM_8"},
417e71b7053SJung-uk Kim {0xC0A3, "TLS_DHE_RSA_WITH_AES_256_CCM_8"},
418e71b7053SJung-uk Kim {0xC0A4, "TLS_PSK_WITH_AES_128_CCM"},
419e71b7053SJung-uk Kim {0xC0A5, "TLS_PSK_WITH_AES_256_CCM"},
420e71b7053SJung-uk Kim {0xC0A6, "TLS_DHE_PSK_WITH_AES_128_CCM"},
421e71b7053SJung-uk Kim {0xC0A7, "TLS_DHE_PSK_WITH_AES_256_CCM"},
422e71b7053SJung-uk Kim {0xC0A8, "TLS_PSK_WITH_AES_128_CCM_8"},
423e71b7053SJung-uk Kim {0xC0A9, "TLS_PSK_WITH_AES_256_CCM_8"},
424e71b7053SJung-uk Kim {0xC0AA, "TLS_PSK_DHE_WITH_AES_128_CCM_8"},
425e71b7053SJung-uk Kim {0xC0AB, "TLS_PSK_DHE_WITH_AES_256_CCM_8"},
426e71b7053SJung-uk Kim {0xC0AC, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM"},
427e71b7053SJung-uk Kim {0xC0AD, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM"},
428e71b7053SJung-uk Kim {0xC0AE, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8"},
429e71b7053SJung-uk Kim {0xC0AF, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8"},
430*b077aed3SPierre Pronchery {0xC102, "IANA-GOST2012-GOST8912-GOST8912"},
431e71b7053SJung-uk Kim {0xCCA8, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
432e71b7053SJung-uk Kim {0xCCA9, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"},
433e71b7053SJung-uk Kim {0xCCAA, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"},
434e71b7053SJung-uk Kim {0xCCAB, "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"},
435e71b7053SJung-uk Kim {0xCCAC, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
436e71b7053SJung-uk Kim {0xCCAD, "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"},
437e71b7053SJung-uk Kim {0xCCAE, "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"},
438e71b7053SJung-uk Kim {0x1301, "TLS_AES_128_GCM_SHA256"},
439e71b7053SJung-uk Kim {0x1302, "TLS_AES_256_GCM_SHA384"},
440e71b7053SJung-uk Kim {0x1303, "TLS_CHACHA20_POLY1305_SHA256"},
441e71b7053SJung-uk Kim {0x1304, "TLS_AES_128_CCM_SHA256"},
442e71b7053SJung-uk Kim {0x1305, "TLS_AES_128_CCM_8_SHA256"},
4437bded2dbSJung-uk Kim {0xFEFE, "SSL_RSA_FIPS_WITH_DES_CBC_SHA"},
4447bded2dbSJung-uk Kim {0xFEFF, "SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA"},
445*b077aed3SPierre Pronchery {0xFF85, "LEGACY-GOST2012-GOST8912-GOST8912"},
446e71b7053SJung-uk Kim {0xFF87, "GOST2012-NULL-GOST12"},
447*b077aed3SPierre Pronchery {0xC100, "GOST2012-KUZNYECHIK-KUZNYECHIKOMAC"},
448*b077aed3SPierre Pronchery {0xC101, "GOST2012-MAGMA-MAGMAOMAC"},
449*b077aed3SPierre Pronchery {0xC102, "GOST2012-GOST8912-IANA"},
4507bded2dbSJung-uk Kim };
4517bded2dbSJung-uk Kim
4527bded2dbSJung-uk Kim /* Compression methods */
453e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_comp_tbl[] = {
4547bded2dbSJung-uk Kim {0x0000, "No Compression"},
4557bded2dbSJung-uk Kim {0x0001, "Zlib Compression"}
4567bded2dbSJung-uk Kim };
4577bded2dbSJung-uk Kim
458e71b7053SJung-uk Kim /* Extensions sorted by ascending id */
459e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_exts_tbl[] = {
4607bded2dbSJung-uk Kim {TLSEXT_TYPE_server_name, "server_name"},
4617bded2dbSJung-uk Kim {TLSEXT_TYPE_max_fragment_length, "max_fragment_length"},
4627bded2dbSJung-uk Kim {TLSEXT_TYPE_client_certificate_url, "client_certificate_url"},
4637bded2dbSJung-uk Kim {TLSEXT_TYPE_trusted_ca_keys, "trusted_ca_keys"},
4647bded2dbSJung-uk Kim {TLSEXT_TYPE_truncated_hmac, "truncated_hmac"},
4657bded2dbSJung-uk Kim {TLSEXT_TYPE_status_request, "status_request"},
4667bded2dbSJung-uk Kim {TLSEXT_TYPE_user_mapping, "user_mapping"},
4677bded2dbSJung-uk Kim {TLSEXT_TYPE_client_authz, "client_authz"},
4687bded2dbSJung-uk Kim {TLSEXT_TYPE_server_authz, "server_authz"},
4697bded2dbSJung-uk Kim {TLSEXT_TYPE_cert_type, "cert_type"},
470e71b7053SJung-uk Kim {TLSEXT_TYPE_supported_groups, "supported_groups"},
4717bded2dbSJung-uk Kim {TLSEXT_TYPE_ec_point_formats, "ec_point_formats"},
4727bded2dbSJung-uk Kim {TLSEXT_TYPE_srp, "srp"},
4737bded2dbSJung-uk Kim {TLSEXT_TYPE_signature_algorithms, "signature_algorithms"},
4747bded2dbSJung-uk Kim {TLSEXT_TYPE_use_srtp, "use_srtp"},
475e71b7053SJung-uk Kim {TLSEXT_TYPE_application_layer_protocol_negotiation,
476e71b7053SJung-uk Kim "application_layer_protocol_negotiation"},
477e71b7053SJung-uk Kim {TLSEXT_TYPE_signed_certificate_timestamp, "signed_certificate_timestamps"},
478e71b7053SJung-uk Kim {TLSEXT_TYPE_padding, "padding"},
479e71b7053SJung-uk Kim {TLSEXT_TYPE_encrypt_then_mac, "encrypt_then_mac"},
480e71b7053SJung-uk Kim {TLSEXT_TYPE_extended_master_secret, "extended_master_secret"},
4817bded2dbSJung-uk Kim {TLSEXT_TYPE_session_ticket, "session_ticket"},
482e71b7053SJung-uk Kim {TLSEXT_TYPE_psk, "psk"},
483e71b7053SJung-uk Kim {TLSEXT_TYPE_early_data, "early_data"},
484e71b7053SJung-uk Kim {TLSEXT_TYPE_supported_versions, "supported_versions"},
485e71b7053SJung-uk Kim {TLSEXT_TYPE_cookie, "cookie_ext"},
486e71b7053SJung-uk Kim {TLSEXT_TYPE_psk_kex_modes, "psk_key_exchange_modes"},
487e71b7053SJung-uk Kim {TLSEXT_TYPE_certificate_authorities, "certificate_authorities"},
488e71b7053SJung-uk Kim {TLSEXT_TYPE_post_handshake_auth, "post_handshake_auth"},
489e71b7053SJung-uk Kim {TLSEXT_TYPE_signature_algorithms_cert, "signature_algorithms_cert"},
490e71b7053SJung-uk Kim {TLSEXT_TYPE_key_share, "key_share"},
4917bded2dbSJung-uk Kim {TLSEXT_TYPE_renegotiate, "renegotiate"},
492e71b7053SJung-uk Kim # ifndef OPENSSL_NO_NEXTPROTONEG
4937bded2dbSJung-uk Kim {TLSEXT_TYPE_next_proto_neg, "next_proto_neg"},
494e71b7053SJung-uk Kim # endif
4957bded2dbSJung-uk Kim };
4967bded2dbSJung-uk Kim
497e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_groups_tbl[] = {
4987bded2dbSJung-uk Kim {1, "sect163k1 (K-163)"},
4997bded2dbSJung-uk Kim {2, "sect163r1"},
5007bded2dbSJung-uk Kim {3, "sect163r2 (B-163)"},
5017bded2dbSJung-uk Kim {4, "sect193r1"},
5027bded2dbSJung-uk Kim {5, "sect193r2"},
5037bded2dbSJung-uk Kim {6, "sect233k1 (K-233)"},
5047bded2dbSJung-uk Kim {7, "sect233r1 (B-233)"},
5057bded2dbSJung-uk Kim {8, "sect239k1"},
5067bded2dbSJung-uk Kim {9, "sect283k1 (K-283)"},
5077bded2dbSJung-uk Kim {10, "sect283r1 (B-283)"},
5087bded2dbSJung-uk Kim {11, "sect409k1 (K-409)"},
5097bded2dbSJung-uk Kim {12, "sect409r1 (B-409)"},
5107bded2dbSJung-uk Kim {13, "sect571k1 (K-571)"},
5117bded2dbSJung-uk Kim {14, "sect571r1 (B-571)"},
5127bded2dbSJung-uk Kim {15, "secp160k1"},
5137bded2dbSJung-uk Kim {16, "secp160r1"},
5147bded2dbSJung-uk Kim {17, "secp160r2"},
5157bded2dbSJung-uk Kim {18, "secp192k1"},
5167bded2dbSJung-uk Kim {19, "secp192r1 (P-192)"},
5177bded2dbSJung-uk Kim {20, "secp224k1"},
5187bded2dbSJung-uk Kim {21, "secp224r1 (P-224)"},
5197bded2dbSJung-uk Kim {22, "secp256k1"},
5207bded2dbSJung-uk Kim {23, "secp256r1 (P-256)"},
5217bded2dbSJung-uk Kim {24, "secp384r1 (P-384)"},
5227bded2dbSJung-uk Kim {25, "secp521r1 (P-521)"},
5237bded2dbSJung-uk Kim {26, "brainpoolP256r1"},
5247bded2dbSJung-uk Kim {27, "brainpoolP384r1"},
5257bded2dbSJung-uk Kim {28, "brainpoolP512r1"},
526e71b7053SJung-uk Kim {29, "ecdh_x25519"},
527e71b7053SJung-uk Kim {30, "ecdh_x448"},
528*b077aed3SPierre Pronchery {34, "GC256A"},
529*b077aed3SPierre Pronchery {35, "GC256B"},
530*b077aed3SPierre Pronchery {36, "GC256C"},
531*b077aed3SPierre Pronchery {37, "GC256D"},
532*b077aed3SPierre Pronchery {38, "GC512A"},
533*b077aed3SPierre Pronchery {39, "GC512B"},
534*b077aed3SPierre Pronchery {40, "GC512C"},
535e71b7053SJung-uk Kim {256, "ffdhe2048"},
536e71b7053SJung-uk Kim {257, "ffdhe3072"},
537e71b7053SJung-uk Kim {258, "ffdhe4096"},
538e71b7053SJung-uk Kim {259, "ffdhe6144"},
539e71b7053SJung-uk Kim {260, "ffdhe8192"},
5407bded2dbSJung-uk Kim {0xFF01, "arbitrary_explicit_prime_curves"},
5417bded2dbSJung-uk Kim {0xFF02, "arbitrary_explicit_char2_curves"}
5427bded2dbSJung-uk Kim };
5437bded2dbSJung-uk Kim
544e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_point_tbl[] = {
5457bded2dbSJung-uk Kim {0, "uncompressed"},
5467bded2dbSJung-uk Kim {1, "ansiX962_compressed_prime"},
5477bded2dbSJung-uk Kim {2, "ansiX962_compressed_char2"}
5487bded2dbSJung-uk Kim };
5497bded2dbSJung-uk Kim
550e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_mfl_tbl[] = {
551e71b7053SJung-uk Kim {0, "disabled"},
552e71b7053SJung-uk Kim {1, "max_fragment_length := 2^9 (512 bytes)"},
553e71b7053SJung-uk Kim {2, "max_fragment_length := 2^10 (1024 bytes)"},
554e71b7053SJung-uk Kim {3, "max_fragment_length := 2^11 (2048 bytes)"},
555e71b7053SJung-uk Kim {4, "max_fragment_length := 2^12 (4096 bytes)"}
5567bded2dbSJung-uk Kim };
5577bded2dbSJung-uk Kim
558e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_sigalg_tbl[] = {
559e71b7053SJung-uk Kim {TLSEXT_SIGALG_ecdsa_secp256r1_sha256, "ecdsa_secp256r1_sha256"},
560e71b7053SJung-uk Kim {TLSEXT_SIGALG_ecdsa_secp384r1_sha384, "ecdsa_secp384r1_sha384"},
561e71b7053SJung-uk Kim {TLSEXT_SIGALG_ecdsa_secp521r1_sha512, "ecdsa_secp521r1_sha512"},
562e71b7053SJung-uk Kim {TLSEXT_SIGALG_ecdsa_sha224, "ecdsa_sha224"},
563e71b7053SJung-uk Kim {TLSEXT_SIGALG_ed25519, "ed25519"},
564e71b7053SJung-uk Kim {TLSEXT_SIGALG_ed448, "ed448"},
565e71b7053SJung-uk Kim {TLSEXT_SIGALG_ecdsa_sha1, "ecdsa_sha1"},
566e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_rsae_sha256, "rsa_pss_rsae_sha256"},
567e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_rsae_sha384, "rsa_pss_rsae_sha384"},
568e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_rsae_sha512, "rsa_pss_rsae_sha512"},
569e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_pss_sha256, "rsa_pss_pss_sha256"},
570e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_pss_sha384, "rsa_pss_pss_sha384"},
571e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pss_pss_sha512, "rsa_pss_pss_sha512"},
572e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pkcs1_sha256, "rsa_pkcs1_sha256"},
573e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pkcs1_sha384, "rsa_pkcs1_sha384"},
574e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pkcs1_sha512, "rsa_pkcs1_sha512"},
575e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pkcs1_sha224, "rsa_pkcs1_sha224"},
576e71b7053SJung-uk Kim {TLSEXT_SIGALG_rsa_pkcs1_sha1, "rsa_pkcs1_sha1"},
577e71b7053SJung-uk Kim {TLSEXT_SIGALG_dsa_sha256, "dsa_sha256"},
578e71b7053SJung-uk Kim {TLSEXT_SIGALG_dsa_sha384, "dsa_sha384"},
579e71b7053SJung-uk Kim {TLSEXT_SIGALG_dsa_sha512, "dsa_sha512"},
580e71b7053SJung-uk Kim {TLSEXT_SIGALG_dsa_sha224, "dsa_sha224"},
581e71b7053SJung-uk Kim {TLSEXT_SIGALG_dsa_sha1, "dsa_sha1"},
582*b077aed3SPierre Pronchery {TLSEXT_SIGALG_gostr34102012_256_intrinsic, "gost2012_256"},
583*b077aed3SPierre Pronchery {TLSEXT_SIGALG_gostr34102012_512_intrinsic, "gost2012_512"},
584e71b7053SJung-uk Kim {TLSEXT_SIGALG_gostr34102012_256_gostr34112012_256, "gost2012_256"},
585e71b7053SJung-uk Kim {TLSEXT_SIGALG_gostr34102012_512_gostr34112012_512, "gost2012_512"},
586e71b7053SJung-uk Kim {TLSEXT_SIGALG_gostr34102001_gostr3411, "gost2001_gost94"},
5877bded2dbSJung-uk Kim };
5887bded2dbSJung-uk Kim
589e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_ctype_tbl[] = {
5907bded2dbSJung-uk Kim {1, "rsa_sign"},
5917bded2dbSJung-uk Kim {2, "dss_sign"},
5927bded2dbSJung-uk Kim {3, "rsa_fixed_dh"},
5937bded2dbSJung-uk Kim {4, "dss_fixed_dh"},
5947bded2dbSJung-uk Kim {5, "rsa_ephemeral_dh"},
5957bded2dbSJung-uk Kim {6, "dss_ephemeral_dh"},
5967bded2dbSJung-uk Kim {20, "fortezza_dms"},
5977bded2dbSJung-uk Kim {64, "ecdsa_sign"},
5987bded2dbSJung-uk Kim {65, "rsa_fixed_ecdh"},
599*b077aed3SPierre Pronchery {66, "ecdsa_fixed_ecdh"},
600*b077aed3SPierre Pronchery {67, "gost_sign256"},
601*b077aed3SPierre Pronchery {68, "gost_sign512"},
6027bded2dbSJung-uk Kim };
6037bded2dbSJung-uk Kim
604e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_psk_kex_modes_tbl[] = {
605e71b7053SJung-uk Kim {TLSEXT_KEX_MODE_KE, "psk_ke"},
606e71b7053SJung-uk Kim {TLSEXT_KEX_MODE_KE_DHE, "psk_dhe_ke"}
607e71b7053SJung-uk Kim };
608e71b7053SJung-uk Kim
609e71b7053SJung-uk Kim static const ssl_trace_tbl ssl_key_update_tbl[] = {
610e71b7053SJung-uk Kim {SSL_KEY_UPDATE_NOT_REQUESTED, "update_not_requested"},
611e71b7053SJung-uk Kim {SSL_KEY_UPDATE_REQUESTED, "update_requested"}
6127bded2dbSJung-uk Kim };
6137bded2dbSJung-uk Kim
ssl_print_hex(BIO * bio,int indent,const char * name,const unsigned char * msg,size_t msglen)6147bded2dbSJung-uk Kim static void ssl_print_hex(BIO *bio, int indent, const char *name,
6157bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
6167bded2dbSJung-uk Kim {
6177bded2dbSJung-uk Kim size_t i;
618e71b7053SJung-uk Kim
6197bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
6207bded2dbSJung-uk Kim BIO_printf(bio, "%s (len=%d): ", name, (int)msglen);
6217bded2dbSJung-uk Kim for (i = 0; i < msglen; i++)
6227bded2dbSJung-uk Kim BIO_printf(bio, "%02X", msg[i]);
6237bded2dbSJung-uk Kim BIO_puts(bio, "\n");
6247bded2dbSJung-uk Kim }
6257bded2dbSJung-uk Kim
ssl_print_hexbuf(BIO * bio,int indent,const char * name,size_t nlen,const unsigned char ** pmsg,size_t * pmsglen)626e71b7053SJung-uk Kim static int ssl_print_hexbuf(BIO *bio, int indent, const char *name, size_t nlen,
6277bded2dbSJung-uk Kim const unsigned char **pmsg, size_t *pmsglen)
6287bded2dbSJung-uk Kim {
6297bded2dbSJung-uk Kim size_t blen;
6307bded2dbSJung-uk Kim const unsigned char *p = *pmsg;
631e71b7053SJung-uk Kim
6327bded2dbSJung-uk Kim if (*pmsglen < nlen)
6337bded2dbSJung-uk Kim return 0;
6347bded2dbSJung-uk Kim blen = p[0];
6357bded2dbSJung-uk Kim if (nlen > 1)
6367bded2dbSJung-uk Kim blen = (blen << 8) | p[1];
6377bded2dbSJung-uk Kim if (*pmsglen < nlen + blen)
6387bded2dbSJung-uk Kim return 0;
6397bded2dbSJung-uk Kim p += nlen;
6407bded2dbSJung-uk Kim ssl_print_hex(bio, indent, name, p, blen);
6417bded2dbSJung-uk Kim *pmsg += blen + nlen;
6427bded2dbSJung-uk Kim *pmsglen -= blen + nlen;
6437bded2dbSJung-uk Kim return 1;
6447bded2dbSJung-uk Kim }
6457bded2dbSJung-uk Kim
ssl_print_version(BIO * bio,int indent,const char * name,const unsigned char ** pmsg,size_t * pmsglen,unsigned int * version)6467bded2dbSJung-uk Kim static int ssl_print_version(BIO *bio, int indent, const char *name,
647e71b7053SJung-uk Kim const unsigned char **pmsg, size_t *pmsglen,
648e71b7053SJung-uk Kim unsigned int *version)
6497bded2dbSJung-uk Kim {
6507bded2dbSJung-uk Kim int vers;
651e71b7053SJung-uk Kim
6527bded2dbSJung-uk Kim if (*pmsglen < 2)
6537bded2dbSJung-uk Kim return 0;
6547bded2dbSJung-uk Kim vers = ((*pmsg)[0] << 8) | (*pmsg)[1];
655e71b7053SJung-uk Kim if (version != NULL)
656e71b7053SJung-uk Kim *version = vers;
6577bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
6587bded2dbSJung-uk Kim BIO_printf(bio, "%s=0x%x (%s)\n",
6597bded2dbSJung-uk Kim name, vers, ssl_trace_str(vers, ssl_version_tbl));
6607bded2dbSJung-uk Kim *pmsg += 2;
6617bded2dbSJung-uk Kim *pmsglen -= 2;
6627bded2dbSJung-uk Kim return 1;
6637bded2dbSJung-uk Kim }
6647bded2dbSJung-uk Kim
ssl_print_random(BIO * bio,int indent,const unsigned char ** pmsg,size_t * pmsglen)6657bded2dbSJung-uk Kim static int ssl_print_random(BIO *bio, int indent,
6667bded2dbSJung-uk Kim const unsigned char **pmsg, size_t *pmsglen)
6677bded2dbSJung-uk Kim {
6687bded2dbSJung-uk Kim unsigned int tm;
6697bded2dbSJung-uk Kim const unsigned char *p = *pmsg;
670e71b7053SJung-uk Kim
6717bded2dbSJung-uk Kim if (*pmsglen < 32)
6727bded2dbSJung-uk Kim return 0;
67358f35182SJung-uk Kim tm = ((unsigned int)p[0] << 24)
67458f35182SJung-uk Kim | ((unsigned int)p[1] << 16)
67558f35182SJung-uk Kim | ((unsigned int)p[2] << 8)
67658f35182SJung-uk Kim | (unsigned int)p[3];
6777bded2dbSJung-uk Kim p += 4;
6787bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
6797bded2dbSJung-uk Kim BIO_puts(bio, "Random:\n");
6807bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
6817bded2dbSJung-uk Kim BIO_printf(bio, "gmt_unix_time=0x%08X\n", tm);
6827bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 2, "random_bytes", p, 28);
6837bded2dbSJung-uk Kim *pmsg += 32;
6847bded2dbSJung-uk Kim *pmsglen -= 32;
6857bded2dbSJung-uk Kim return 1;
6867bded2dbSJung-uk Kim }
6877bded2dbSJung-uk Kim
ssl_print_signature(BIO * bio,int indent,const SSL * ssl,const unsigned char ** pmsg,size_t * pmsglen)688e71b7053SJung-uk Kim static int ssl_print_signature(BIO *bio, int indent, const SSL *ssl,
6897bded2dbSJung-uk Kim const unsigned char **pmsg, size_t *pmsglen)
6907bded2dbSJung-uk Kim {
6917bded2dbSJung-uk Kim if (*pmsglen < 2)
6927bded2dbSJung-uk Kim return 0;
693e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(ssl)) {
6947bded2dbSJung-uk Kim const unsigned char *p = *pmsg;
695e71b7053SJung-uk Kim unsigned int sigalg = (p[0] << 8) | p[1];
696e71b7053SJung-uk Kim
6977bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
698e71b7053SJung-uk Kim BIO_printf(bio, "Signature Algorithm: %s (0x%04x)\n",
699e71b7053SJung-uk Kim ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
7007bded2dbSJung-uk Kim *pmsg += 2;
7017bded2dbSJung-uk Kim *pmsglen -= 2;
7027bded2dbSJung-uk Kim }
7037bded2dbSJung-uk Kim return ssl_print_hexbuf(bio, indent, "Signature", 2, pmsg, pmsglen);
7047bded2dbSJung-uk Kim }
7057bded2dbSJung-uk Kim
ssl_print_extension(BIO * bio,int indent,int server,unsigned char mt,int extype,const unsigned char * ext,size_t extlen)706e71b7053SJung-uk Kim static int ssl_print_extension(BIO *bio, int indent, int server,
707e71b7053SJung-uk Kim unsigned char mt, int extype,
7087bded2dbSJung-uk Kim const unsigned char *ext, size_t extlen)
7097bded2dbSJung-uk Kim {
710e71b7053SJung-uk Kim size_t xlen, share_len;
711e71b7053SJung-uk Kim unsigned int sigalg;
712e71b7053SJung-uk Kim uint32_t max_early_data;
713e71b7053SJung-uk Kim
7147bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
7157bded2dbSJung-uk Kim BIO_printf(bio, "extension_type=%s(%d), length=%d\n",
7167bded2dbSJung-uk Kim ssl_trace_str(extype, ssl_exts_tbl), extype, (int)extlen);
7177bded2dbSJung-uk Kim switch (extype) {
718e71b7053SJung-uk Kim case TLSEXT_TYPE_max_fragment_length:
719e71b7053SJung-uk Kim if (extlen < 1)
720e71b7053SJung-uk Kim return 0;
721e71b7053SJung-uk Kim xlen = extlen;
722e71b7053SJung-uk Kim return ssl_trace_list(bio, indent + 2, ext, xlen, 1, ssl_mfl_tbl);
723e71b7053SJung-uk Kim
7247bded2dbSJung-uk Kim case TLSEXT_TYPE_ec_point_formats:
7257bded2dbSJung-uk Kim if (extlen < 1)
7267bded2dbSJung-uk Kim return 0;
7277bded2dbSJung-uk Kim xlen = ext[0];
7287bded2dbSJung-uk Kim if (extlen != xlen + 1)
7297bded2dbSJung-uk Kim return 0;
730e71b7053SJung-uk Kim return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1, ssl_point_tbl);
7317bded2dbSJung-uk Kim
732e71b7053SJung-uk Kim case TLSEXT_TYPE_supported_groups:
7337bded2dbSJung-uk Kim if (extlen < 2)
7347bded2dbSJung-uk Kim return 0;
7357bded2dbSJung-uk Kim xlen = (ext[0] << 8) | ext[1];
7367bded2dbSJung-uk Kim if (extlen != xlen + 2)
7377bded2dbSJung-uk Kim return 0;
738e71b7053SJung-uk Kim return ssl_trace_list(bio, indent + 2, ext + 2, xlen, 2, ssl_groups_tbl);
739e71b7053SJung-uk Kim case TLSEXT_TYPE_application_layer_protocol_negotiation:
740e71b7053SJung-uk Kim if (extlen < 2)
741e71b7053SJung-uk Kim return 0;
742e71b7053SJung-uk Kim xlen = (ext[0] << 8) | ext[1];
743e71b7053SJung-uk Kim if (extlen != xlen + 2)
744e71b7053SJung-uk Kim return 0;
745e71b7053SJung-uk Kim ext += 2;
746e71b7053SJung-uk Kim while (xlen > 0) {
747e71b7053SJung-uk Kim size_t plen = *ext++;
748e71b7053SJung-uk Kim
749e71b7053SJung-uk Kim if (plen + 1 > xlen)
750e71b7053SJung-uk Kim return 0;
751e71b7053SJung-uk Kim BIO_indent(bio, indent + 2, 80);
752e71b7053SJung-uk Kim BIO_write(bio, ext, plen);
753e71b7053SJung-uk Kim BIO_puts(bio, "\n");
754e71b7053SJung-uk Kim ext += plen;
755e71b7053SJung-uk Kim xlen -= plen + 1;
756e71b7053SJung-uk Kim }
757e71b7053SJung-uk Kim return 1;
7587bded2dbSJung-uk Kim
7597bded2dbSJung-uk Kim case TLSEXT_TYPE_signature_algorithms:
7607bded2dbSJung-uk Kim
7617bded2dbSJung-uk Kim if (extlen < 2)
7627bded2dbSJung-uk Kim return 0;
7637bded2dbSJung-uk Kim xlen = (ext[0] << 8) | ext[1];
7647bded2dbSJung-uk Kim if (extlen != xlen + 2)
7657bded2dbSJung-uk Kim return 0;
7667bded2dbSJung-uk Kim if (xlen & 1)
7677bded2dbSJung-uk Kim return 0;
7687bded2dbSJung-uk Kim ext += 2;
7697bded2dbSJung-uk Kim while (xlen > 0) {
7707bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
771e71b7053SJung-uk Kim sigalg = (ext[0] << 8) | ext[1];
772e71b7053SJung-uk Kim BIO_printf(bio, "%s (0x%04x)\n",
773e71b7053SJung-uk Kim ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
7747bded2dbSJung-uk Kim xlen -= 2;
7757bded2dbSJung-uk Kim ext += 2;
7767bded2dbSJung-uk Kim }
7777bded2dbSJung-uk Kim break;
7787bded2dbSJung-uk Kim
7797bded2dbSJung-uk Kim case TLSEXT_TYPE_renegotiate:
7807bded2dbSJung-uk Kim if (extlen < 1)
7817bded2dbSJung-uk Kim return 0;
7827bded2dbSJung-uk Kim xlen = ext[0];
7837bded2dbSJung-uk Kim if (xlen + 1 != extlen)
7847bded2dbSJung-uk Kim return 0;
7857bded2dbSJung-uk Kim ext++;
7867bded2dbSJung-uk Kim if (xlen) {
7877bded2dbSJung-uk Kim if (server) {
7887bded2dbSJung-uk Kim if (xlen & 1)
7897bded2dbSJung-uk Kim return 0;
7907bded2dbSJung-uk Kim xlen >>= 1;
7917bded2dbSJung-uk Kim }
7927bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 4, "client_verify_data", ext, xlen);
7937bded2dbSJung-uk Kim if (server) {
7947bded2dbSJung-uk Kim ext += xlen;
795e71b7053SJung-uk Kim ssl_print_hex(bio, indent + 4, "server_verify_data", ext, xlen);
7967bded2dbSJung-uk Kim }
7977bded2dbSJung-uk Kim } else {
7987bded2dbSJung-uk Kim BIO_indent(bio, indent + 4, 80);
7997bded2dbSJung-uk Kim BIO_puts(bio, "<EMPTY>\n");
8007bded2dbSJung-uk Kim }
8017bded2dbSJung-uk Kim break;
8027bded2dbSJung-uk Kim
8037bded2dbSJung-uk Kim case TLSEXT_TYPE_session_ticket:
8047bded2dbSJung-uk Kim if (extlen != 0)
8057bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 4, "ticket", ext, extlen);
8067bded2dbSJung-uk Kim break;
8077bded2dbSJung-uk Kim
808e71b7053SJung-uk Kim case TLSEXT_TYPE_key_share:
809e71b7053SJung-uk Kim if (server && extlen == 2) {
810e71b7053SJung-uk Kim int group_id;
811e71b7053SJung-uk Kim
812e71b7053SJung-uk Kim /* We assume this is an HRR, otherwise this is an invalid key_share */
813e71b7053SJung-uk Kim group_id = (ext[0] << 8) | ext[1];
814e71b7053SJung-uk Kim BIO_indent(bio, indent + 4, 80);
815e71b7053SJung-uk Kim BIO_printf(bio, "NamedGroup: %s (%d)\n",
816e71b7053SJung-uk Kim ssl_trace_str(group_id, ssl_groups_tbl), group_id);
817e71b7053SJung-uk Kim break;
818e71b7053SJung-uk Kim }
819e71b7053SJung-uk Kim if (extlen < 2)
820e71b7053SJung-uk Kim return 0;
821e71b7053SJung-uk Kim if (server) {
822e71b7053SJung-uk Kim xlen = extlen;
823e71b7053SJung-uk Kim } else {
824e71b7053SJung-uk Kim xlen = (ext[0] << 8) | ext[1];
825e71b7053SJung-uk Kim if (extlen != xlen + 2)
826e71b7053SJung-uk Kim return 0;
827e71b7053SJung-uk Kim ext += 2;
828e71b7053SJung-uk Kim }
829e71b7053SJung-uk Kim for (; xlen > 0; ext += share_len, xlen -= share_len) {
830e71b7053SJung-uk Kim int group_id;
831e71b7053SJung-uk Kim
832e71b7053SJung-uk Kim if (xlen < 4)
833e71b7053SJung-uk Kim return 0;
834e71b7053SJung-uk Kim group_id = (ext[0] << 8) | ext[1];
835e71b7053SJung-uk Kim share_len = (ext[2] << 8) | ext[3];
836e71b7053SJung-uk Kim ext += 4;
837e71b7053SJung-uk Kim xlen -= 4;
838e71b7053SJung-uk Kim if (xlen < share_len)
839e71b7053SJung-uk Kim return 0;
840e71b7053SJung-uk Kim BIO_indent(bio, indent + 4, 80);
841e71b7053SJung-uk Kim BIO_printf(bio, "NamedGroup: %s (%d)\n",
842e71b7053SJung-uk Kim ssl_trace_str(group_id, ssl_groups_tbl), group_id);
843e71b7053SJung-uk Kim ssl_print_hex(bio, indent + 4, "key_exchange: ", ext, share_len);
844e71b7053SJung-uk Kim }
845e71b7053SJung-uk Kim break;
846e71b7053SJung-uk Kim
847e71b7053SJung-uk Kim case TLSEXT_TYPE_supported_versions:
848e71b7053SJung-uk Kim if (server) {
849e71b7053SJung-uk Kim int version;
850e71b7053SJung-uk Kim
851e71b7053SJung-uk Kim if (extlen != 2)
852e71b7053SJung-uk Kim return 0;
853e71b7053SJung-uk Kim version = (ext[0] << 8) | ext[1];
854e71b7053SJung-uk Kim BIO_indent(bio, indent + 4, 80);
855e71b7053SJung-uk Kim BIO_printf(bio, "%s (%d)\n",
856e71b7053SJung-uk Kim ssl_trace_str(version, ssl_version_tbl), version);
857e71b7053SJung-uk Kim break;
858e71b7053SJung-uk Kim }
859e71b7053SJung-uk Kim if (extlen < 1)
860e71b7053SJung-uk Kim return 0;
861e71b7053SJung-uk Kim xlen = ext[0];
862e71b7053SJung-uk Kim if (extlen != xlen + 1)
863e71b7053SJung-uk Kim return 0;
864e71b7053SJung-uk Kim return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 2,
865e71b7053SJung-uk Kim ssl_version_tbl);
866e71b7053SJung-uk Kim
867e71b7053SJung-uk Kim case TLSEXT_TYPE_psk_kex_modes:
868e71b7053SJung-uk Kim if (extlen < 1)
869e71b7053SJung-uk Kim return 0;
870e71b7053SJung-uk Kim xlen = ext[0];
871e71b7053SJung-uk Kim if (extlen != xlen + 1)
872e71b7053SJung-uk Kim return 0;
873e71b7053SJung-uk Kim return ssl_trace_list(bio, indent + 2, ext + 1, xlen, 1,
874e71b7053SJung-uk Kim ssl_psk_kex_modes_tbl);
875e71b7053SJung-uk Kim
876e71b7053SJung-uk Kim case TLSEXT_TYPE_early_data:
877e71b7053SJung-uk Kim if (mt != SSL3_MT_NEWSESSION_TICKET)
878e71b7053SJung-uk Kim break;
879e71b7053SJung-uk Kim if (extlen != 4)
880e71b7053SJung-uk Kim return 0;
88158f35182SJung-uk Kim max_early_data = ((unsigned int)ext[0] << 24)
88258f35182SJung-uk Kim | ((unsigned int)ext[1] << 16)
88358f35182SJung-uk Kim | ((unsigned int)ext[2] << 8)
88458f35182SJung-uk Kim | (unsigned int)ext[3];
885e71b7053SJung-uk Kim BIO_indent(bio, indent + 2, 80);
886e71b7053SJung-uk Kim BIO_printf(bio, "max_early_data=%u\n", max_early_data);
887e71b7053SJung-uk Kim break;
888e71b7053SJung-uk Kim
8897bded2dbSJung-uk Kim default:
890e71b7053SJung-uk Kim BIO_dump_indent(bio, (const char *)ext, extlen, indent + 2);
8917bded2dbSJung-uk Kim }
8927bded2dbSJung-uk Kim return 1;
8937bded2dbSJung-uk Kim }
8947bded2dbSJung-uk Kim
ssl_print_extensions(BIO * bio,int indent,int server,unsigned char mt,const unsigned char ** msgin,size_t * msginlen)8957bded2dbSJung-uk Kim static int ssl_print_extensions(BIO *bio, int indent, int server,
896e71b7053SJung-uk Kim unsigned char mt, const unsigned char **msgin,
897e71b7053SJung-uk Kim size_t *msginlen)
8987bded2dbSJung-uk Kim {
899e71b7053SJung-uk Kim size_t extslen, msglen = *msginlen;
900e71b7053SJung-uk Kim const unsigned char *msg = *msgin;
901e71b7053SJung-uk Kim
9027bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
9037bded2dbSJung-uk Kim if (msglen == 0) {
904e71b7053SJung-uk Kim BIO_puts(bio, "No extensions\n");
9057bded2dbSJung-uk Kim return 1;
9067bded2dbSJung-uk Kim }
907dea77ea6SJung-uk Kim if (msglen < 2)
908dea77ea6SJung-uk Kim return 0;
9097bded2dbSJung-uk Kim extslen = (msg[0] << 8) | msg[1];
910e71b7053SJung-uk Kim msglen -= 2;
9117bded2dbSJung-uk Kim msg += 2;
912e71b7053SJung-uk Kim if (extslen == 0) {
913e71b7053SJung-uk Kim BIO_puts(bio, "No extensions\n");
914e71b7053SJung-uk Kim *msgin = msg;
915e71b7053SJung-uk Kim *msginlen = msglen;
916e71b7053SJung-uk Kim return 1;
917e71b7053SJung-uk Kim }
918e71b7053SJung-uk Kim if (extslen > msglen)
919e71b7053SJung-uk Kim return 0;
920e71b7053SJung-uk Kim BIO_printf(bio, "extensions, length = %d\n", (int)extslen);
921e71b7053SJung-uk Kim msglen -= extslen;
922e71b7053SJung-uk Kim while (extslen > 0) {
9237bded2dbSJung-uk Kim int extype;
9247bded2dbSJung-uk Kim size_t extlen;
925e71b7053SJung-uk Kim if (extslen < 4)
9267bded2dbSJung-uk Kim return 0;
9277bded2dbSJung-uk Kim extype = (msg[0] << 8) | msg[1];
9287bded2dbSJung-uk Kim extlen = (msg[2] << 8) | msg[3];
929e71b7053SJung-uk Kim if (extslen < extlen + 4) {
930e71b7053SJung-uk Kim BIO_printf(bio, "extensions, extype = %d, extlen = %d\n", extype,
931e71b7053SJung-uk Kim (int)extlen);
932e71b7053SJung-uk Kim BIO_dump_indent(bio, (const char *)msg, extslen, indent + 2);
9337bded2dbSJung-uk Kim return 0;
934e71b7053SJung-uk Kim }
9357bded2dbSJung-uk Kim msg += 4;
936e71b7053SJung-uk Kim if (!ssl_print_extension(bio, indent + 2, server, mt, extype, msg,
937e71b7053SJung-uk Kim extlen))
9387bded2dbSJung-uk Kim return 0;
9397bded2dbSJung-uk Kim msg += extlen;
940e71b7053SJung-uk Kim extslen -= extlen + 4;
9417bded2dbSJung-uk Kim }
942e71b7053SJung-uk Kim
943e71b7053SJung-uk Kim *msgin = msg;
944e71b7053SJung-uk Kim *msginlen = msglen;
9457bded2dbSJung-uk Kim return 1;
9467bded2dbSJung-uk Kim }
9477bded2dbSJung-uk Kim
ssl_print_client_hello(BIO * bio,const SSL * ssl,int indent,const unsigned char * msg,size_t msglen)948e71b7053SJung-uk Kim static int ssl_print_client_hello(BIO *bio, const SSL *ssl, int indent,
9497bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
9507bded2dbSJung-uk Kim {
9517bded2dbSJung-uk Kim size_t len;
9527bded2dbSJung-uk Kim unsigned int cs;
953e71b7053SJung-uk Kim
954e71b7053SJung-uk Kim if (!ssl_print_version(bio, indent, "client_version", &msg, &msglen, NULL))
9557bded2dbSJung-uk Kim return 0;
9567bded2dbSJung-uk Kim if (!ssl_print_random(bio, indent, &msg, &msglen))
9577bded2dbSJung-uk Kim return 0;
9587bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
9597bded2dbSJung-uk Kim return 0;
9607bded2dbSJung-uk Kim if (SSL_IS_DTLS(ssl)) {
9617bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
9627bded2dbSJung-uk Kim return 0;
9637bded2dbSJung-uk Kim }
9647bded2dbSJung-uk Kim if (msglen < 2)
9657bded2dbSJung-uk Kim return 0;
9667bded2dbSJung-uk Kim len = (msg[0] << 8) | msg[1];
9677bded2dbSJung-uk Kim msg += 2;
9687bded2dbSJung-uk Kim msglen -= 2;
9697bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
9707bded2dbSJung-uk Kim BIO_printf(bio, "cipher_suites (len=%d)\n", (int)len);
9717bded2dbSJung-uk Kim if (msglen < len || len & 1)
9727bded2dbSJung-uk Kim return 0;
9737bded2dbSJung-uk Kim while (len > 0) {
9747bded2dbSJung-uk Kim cs = (msg[0] << 8) | msg[1];
9757bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
9767bded2dbSJung-uk Kim BIO_printf(bio, "{0x%02X, 0x%02X} %s\n",
9777bded2dbSJung-uk Kim msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
9787bded2dbSJung-uk Kim msg += 2;
9797bded2dbSJung-uk Kim msglen -= 2;
9807bded2dbSJung-uk Kim len -= 2;
9817bded2dbSJung-uk Kim }
9827bded2dbSJung-uk Kim if (msglen < 1)
9837bded2dbSJung-uk Kim return 0;
9847bded2dbSJung-uk Kim len = msg[0];
9857bded2dbSJung-uk Kim msg++;
9867bded2dbSJung-uk Kim msglen--;
9877bded2dbSJung-uk Kim if (msglen < len)
9887bded2dbSJung-uk Kim return 0;
9897bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
9907bded2dbSJung-uk Kim BIO_printf(bio, "compression_methods (len=%d)\n", (int)len);
9917bded2dbSJung-uk Kim while (len > 0) {
9927bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
9937bded2dbSJung-uk Kim BIO_printf(bio, "%s (0x%02X)\n",
9947bded2dbSJung-uk Kim ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
9957bded2dbSJung-uk Kim msg++;
9967bded2dbSJung-uk Kim msglen--;
9977bded2dbSJung-uk Kim len--;
9987bded2dbSJung-uk Kim }
999e71b7053SJung-uk Kim if (!ssl_print_extensions(bio, indent, 0, SSL3_MT_CLIENT_HELLO, &msg,
1000e71b7053SJung-uk Kim &msglen))
10017bded2dbSJung-uk Kim return 0;
10027bded2dbSJung-uk Kim return 1;
10037bded2dbSJung-uk Kim }
10047bded2dbSJung-uk Kim
dtls_print_hello_vfyrequest(BIO * bio,int indent,const unsigned char * msg,size_t msglen)10057bded2dbSJung-uk Kim static int dtls_print_hello_vfyrequest(BIO *bio, int indent,
1006e71b7053SJung-uk Kim const unsigned char *msg, size_t msglen)
10077bded2dbSJung-uk Kim {
1008e71b7053SJung-uk Kim if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, NULL))
10097bded2dbSJung-uk Kim return 0;
10107bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent, "cookie", 1, &msg, &msglen))
10117bded2dbSJung-uk Kim return 0;
10127bded2dbSJung-uk Kim return 1;
10137bded2dbSJung-uk Kim }
10147bded2dbSJung-uk Kim
ssl_print_server_hello(BIO * bio,int indent,const unsigned char * msg,size_t msglen)10157bded2dbSJung-uk Kim static int ssl_print_server_hello(BIO *bio, int indent,
10167bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
10177bded2dbSJung-uk Kim {
10187bded2dbSJung-uk Kim unsigned int cs;
1019e71b7053SJung-uk Kim unsigned int vers;
1020e71b7053SJung-uk Kim
1021e71b7053SJung-uk Kim if (!ssl_print_version(bio, indent, "server_version", &msg, &msglen, &vers))
10227bded2dbSJung-uk Kim return 0;
10237bded2dbSJung-uk Kim if (!ssl_print_random(bio, indent, &msg, &msglen))
10247bded2dbSJung-uk Kim return 0;
1025e71b7053SJung-uk Kim if (vers != TLS1_3_VERSION
1026e71b7053SJung-uk Kim && !ssl_print_hexbuf(bio, indent, "session_id", 1, &msg, &msglen))
10277bded2dbSJung-uk Kim return 0;
10287bded2dbSJung-uk Kim if (msglen < 2)
10297bded2dbSJung-uk Kim return 0;
10307bded2dbSJung-uk Kim cs = (msg[0] << 8) | msg[1];
10317bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
10327bded2dbSJung-uk Kim BIO_printf(bio, "cipher_suite {0x%02X, 0x%02X} %s\n",
10337bded2dbSJung-uk Kim msg[0], msg[1], ssl_trace_str(cs, ssl_ciphers_tbl));
10347bded2dbSJung-uk Kim msg += 2;
10357bded2dbSJung-uk Kim msglen -= 2;
1036e71b7053SJung-uk Kim if (vers != TLS1_3_VERSION) {
10377bded2dbSJung-uk Kim if (msglen < 1)
10387bded2dbSJung-uk Kim return 0;
10397bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
10407bded2dbSJung-uk Kim BIO_printf(bio, "compression_method: %s (0x%02X)\n",
10417bded2dbSJung-uk Kim ssl_trace_str(msg[0], ssl_comp_tbl), msg[0]);
10427bded2dbSJung-uk Kim msg++;
10437bded2dbSJung-uk Kim msglen--;
1044e71b7053SJung-uk Kim }
1045e71b7053SJung-uk Kim if (!ssl_print_extensions(bio, indent, 1, SSL3_MT_SERVER_HELLO, &msg,
1046e71b7053SJung-uk Kim &msglen))
10477bded2dbSJung-uk Kim return 0;
10487bded2dbSJung-uk Kim return 1;
10497bded2dbSJung-uk Kim }
10507bded2dbSJung-uk Kim
ssl_get_keyex(const char ** pname,const SSL * ssl)1051e71b7053SJung-uk Kim static int ssl_get_keyex(const char **pname, const SSL *ssl)
10527bded2dbSJung-uk Kim {
1053*b077aed3SPierre Pronchery unsigned long alg_k = ssl->s3.tmp.new_cipher->algorithm_mkey;
1054e71b7053SJung-uk Kim
10557bded2dbSJung-uk Kim if (alg_k & SSL_kRSA) {
10567bded2dbSJung-uk Kim *pname = "rsa";
10577bded2dbSJung-uk Kim return SSL_kRSA;
10587bded2dbSJung-uk Kim }
1059e71b7053SJung-uk Kim if (alg_k & SSL_kDHE) {
1060e71b7053SJung-uk Kim *pname = "DHE";
1061e71b7053SJung-uk Kim return SSL_kDHE;
10627bded2dbSJung-uk Kim }
1063e71b7053SJung-uk Kim if (alg_k & SSL_kECDHE) {
1064e71b7053SJung-uk Kim *pname = "ECDHE";
1065e71b7053SJung-uk Kim return SSL_kECDHE;
10667bded2dbSJung-uk Kim }
10677bded2dbSJung-uk Kim if (alg_k & SSL_kPSK) {
10687bded2dbSJung-uk Kim *pname = "PSK";
10697bded2dbSJung-uk Kim return SSL_kPSK;
10707bded2dbSJung-uk Kim }
1071e71b7053SJung-uk Kim if (alg_k & SSL_kRSAPSK) {
1072e71b7053SJung-uk Kim *pname = "RSAPSK";
1073e71b7053SJung-uk Kim return SSL_kRSAPSK;
1074e71b7053SJung-uk Kim }
1075e71b7053SJung-uk Kim if (alg_k & SSL_kDHEPSK) {
1076e71b7053SJung-uk Kim *pname = "DHEPSK";
1077e71b7053SJung-uk Kim return SSL_kDHEPSK;
1078e71b7053SJung-uk Kim }
1079e71b7053SJung-uk Kim if (alg_k & SSL_kECDHEPSK) {
1080e71b7053SJung-uk Kim *pname = "ECDHEPSK";
1081e71b7053SJung-uk Kim return SSL_kECDHEPSK;
1082e71b7053SJung-uk Kim }
10837bded2dbSJung-uk Kim if (alg_k & SSL_kSRP) {
10847bded2dbSJung-uk Kim *pname = "SRP";
10857bded2dbSJung-uk Kim return SSL_kSRP;
10867bded2dbSJung-uk Kim }
10877bded2dbSJung-uk Kim if (alg_k & SSL_kGOST) {
10887bded2dbSJung-uk Kim *pname = "GOST";
10897bded2dbSJung-uk Kim return SSL_kGOST;
10907bded2dbSJung-uk Kim }
1091*b077aed3SPierre Pronchery if (alg_k & SSL_kGOST18) {
1092*b077aed3SPierre Pronchery *pname = "GOST18";
1093*b077aed3SPierre Pronchery return SSL_kGOST18;
1094*b077aed3SPierre Pronchery }
10957bded2dbSJung-uk Kim *pname = "UNKNOWN";
10967bded2dbSJung-uk Kim return 0;
10977bded2dbSJung-uk Kim }
10987bded2dbSJung-uk Kim
ssl_print_client_keyex(BIO * bio,int indent,const SSL * ssl,const unsigned char * msg,size_t msglen)1099e71b7053SJung-uk Kim static int ssl_print_client_keyex(BIO *bio, int indent, const SSL *ssl,
11007bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
11017bded2dbSJung-uk Kim {
11027bded2dbSJung-uk Kim const char *algname;
1103e71b7053SJung-uk Kim int id = ssl_get_keyex(&algname, ssl);
1104e71b7053SJung-uk Kim
11057bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
11067bded2dbSJung-uk Kim BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
1107e71b7053SJung-uk Kim if (id & SSL_PSK) {
1108e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2,
1109e71b7053SJung-uk Kim "psk_identity", 2, &msg, &msglen))
1110e71b7053SJung-uk Kim return 0;
1111e71b7053SJung-uk Kim }
11127bded2dbSJung-uk Kim switch (id) {
11137bded2dbSJung-uk Kim
11147bded2dbSJung-uk Kim case SSL_kRSA:
1115e71b7053SJung-uk Kim case SSL_kRSAPSK:
11167bded2dbSJung-uk Kim if (TLS1_get_version(ssl) == SSL3_VERSION) {
11177bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 2,
1118e71b7053SJung-uk Kim "EncryptedPreMasterSecret", msg, msglen);
11197bded2dbSJung-uk Kim } else {
11207bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2,
1121e71b7053SJung-uk Kim "EncryptedPreMasterSecret", 2, &msg, &msglen))
11227bded2dbSJung-uk Kim return 0;
11237bded2dbSJung-uk Kim }
11247bded2dbSJung-uk Kim break;
11257bded2dbSJung-uk Kim
1126e71b7053SJung-uk Kim case SSL_kDHE:
1127e71b7053SJung-uk Kim case SSL_kDHEPSK:
11287bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "dh_Yc", 2, &msg, &msglen))
11297bded2dbSJung-uk Kim return 0;
11307bded2dbSJung-uk Kim break;
11317bded2dbSJung-uk Kim
1132e71b7053SJung-uk Kim case SSL_kECDHE:
1133e71b7053SJung-uk Kim case SSL_kECDHEPSK:
11347bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "ecdh_Yc", 1, &msg, &msglen))
11357bded2dbSJung-uk Kim return 0;
11367bded2dbSJung-uk Kim break;
1137*b077aed3SPierre Pronchery case SSL_kGOST:
1138*b077aed3SPierre Pronchery ssl_print_hex(bio, indent + 2, "GostKeyTransportBlob", msg, msglen);
1139*b077aed3SPierre Pronchery msglen = 0;
1140*b077aed3SPierre Pronchery break;
1141*b077aed3SPierre Pronchery case SSL_kGOST18:
1142*b077aed3SPierre Pronchery ssl_print_hex(bio, indent + 2,
1143*b077aed3SPierre Pronchery "GOST-wrapped PreMasterSecret", msg, msglen);
1144*b077aed3SPierre Pronchery msglen = 0;
1145*b077aed3SPierre Pronchery break;
11467bded2dbSJung-uk Kim }
11477bded2dbSJung-uk Kim
1148e71b7053SJung-uk Kim return !msglen;
11497bded2dbSJung-uk Kim }
11507bded2dbSJung-uk Kim
ssl_print_server_keyex(BIO * bio,int indent,const SSL * ssl,const unsigned char * msg,size_t msglen)1151e71b7053SJung-uk Kim static int ssl_print_server_keyex(BIO *bio, int indent, const SSL *ssl,
11527bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
11537bded2dbSJung-uk Kim {
11547bded2dbSJung-uk Kim const char *algname;
1155e71b7053SJung-uk Kim int id = ssl_get_keyex(&algname, ssl);
1156e71b7053SJung-uk Kim
11577bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
11587bded2dbSJung-uk Kim BIO_printf(bio, "KeyExchangeAlgorithm=%s\n", algname);
1159e71b7053SJung-uk Kim if (id & SSL_PSK) {
1160e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2,
1161e71b7053SJung-uk Kim "psk_identity_hint", 2, &msg, &msglen))
1162e71b7053SJung-uk Kim return 0;
1163e71b7053SJung-uk Kim }
11647bded2dbSJung-uk Kim switch (id) {
11657bded2dbSJung-uk Kim case SSL_kRSA:
11667bded2dbSJung-uk Kim
1167e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "rsa_modulus", 2, &msg, &msglen))
11687bded2dbSJung-uk Kim return 0;
11697bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "rsa_exponent", 2,
11707bded2dbSJung-uk Kim &msg, &msglen))
11717bded2dbSJung-uk Kim return 0;
11727bded2dbSJung-uk Kim break;
11737bded2dbSJung-uk Kim
1174e71b7053SJung-uk Kim case SSL_kDHE:
1175e71b7053SJung-uk Kim case SSL_kDHEPSK:
11767bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "dh_p", 2, &msg, &msglen))
11777bded2dbSJung-uk Kim return 0;
11787bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "dh_g", 2, &msg, &msglen))
11797bded2dbSJung-uk Kim return 0;
11807bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "dh_Ys", 2, &msg, &msglen))
11817bded2dbSJung-uk Kim return 0;
11827bded2dbSJung-uk Kim break;
11837bded2dbSJung-uk Kim
1184e71b7053SJung-uk Kim case SSL_kECDHE:
1185e71b7053SJung-uk Kim case SSL_kECDHEPSK:
11867bded2dbSJung-uk Kim if (msglen < 1)
11877bded2dbSJung-uk Kim return 0;
11887bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
11897bded2dbSJung-uk Kim if (msg[0] == EXPLICIT_PRIME_CURVE_TYPE)
11907bded2dbSJung-uk Kim BIO_puts(bio, "explicit_prime\n");
11917bded2dbSJung-uk Kim else if (msg[0] == EXPLICIT_CHAR2_CURVE_TYPE)
11927bded2dbSJung-uk Kim BIO_puts(bio, "explicit_char2\n");
11937bded2dbSJung-uk Kim else if (msg[0] == NAMED_CURVE_TYPE) {
11947bded2dbSJung-uk Kim int curve;
11957bded2dbSJung-uk Kim if (msglen < 3)
11967bded2dbSJung-uk Kim return 0;
11977bded2dbSJung-uk Kim curve = (msg[1] << 8) | msg[2];
11987bded2dbSJung-uk Kim BIO_printf(bio, "named_curve: %s (%d)\n",
1199e71b7053SJung-uk Kim ssl_trace_str(curve, ssl_groups_tbl), curve);
12007bded2dbSJung-uk Kim msg += 3;
12017bded2dbSJung-uk Kim msglen -= 3;
12027bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "point", 1, &msg, &msglen))
12037bded2dbSJung-uk Kim return 0;
1204e71b7053SJung-uk Kim } else {
1205e71b7053SJung-uk Kim BIO_printf(bio, "UNKNOWN CURVE PARAMETER TYPE %d\n", msg[0]);
1206e71b7053SJung-uk Kim return 0;
12077bded2dbSJung-uk Kim }
12087bded2dbSJung-uk Kim break;
1209e71b7053SJung-uk Kim
1210e71b7053SJung-uk Kim case SSL_kPSK:
1211e71b7053SJung-uk Kim case SSL_kRSAPSK:
1212e71b7053SJung-uk Kim break;
12137bded2dbSJung-uk Kim }
1214e71b7053SJung-uk Kim if (!(id & SSL_PSK))
1215e71b7053SJung-uk Kim ssl_print_signature(bio, indent, ssl, &msg, &msglen);
1216e71b7053SJung-uk Kim return !msglen;
12177bded2dbSJung-uk Kim }
12187bded2dbSJung-uk Kim
ssl_print_certificate(BIO * bio,int indent,const unsigned char ** pmsg,size_t * pmsglen)12197bded2dbSJung-uk Kim static int ssl_print_certificate(BIO *bio, int indent,
12207bded2dbSJung-uk Kim const unsigned char **pmsg, size_t *pmsglen)
12217bded2dbSJung-uk Kim {
12227bded2dbSJung-uk Kim size_t msglen = *pmsglen;
12237bded2dbSJung-uk Kim size_t clen;
12247bded2dbSJung-uk Kim X509 *x;
12257bded2dbSJung-uk Kim const unsigned char *p = *pmsg, *q;
1226e71b7053SJung-uk Kim
12277bded2dbSJung-uk Kim if (msglen < 3)
12287bded2dbSJung-uk Kim return 0;
12297bded2dbSJung-uk Kim clen = (p[0] << 16) | (p[1] << 8) | p[2];
12307bded2dbSJung-uk Kim if (msglen < clen + 3)
12317bded2dbSJung-uk Kim return 0;
12327bded2dbSJung-uk Kim q = p + 3;
12337bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
12347bded2dbSJung-uk Kim BIO_printf(bio, "ASN.1Cert, length=%d", (int)clen);
12357bded2dbSJung-uk Kim x = d2i_X509(NULL, &q, clen);
12367bded2dbSJung-uk Kim if (!x)
12377bded2dbSJung-uk Kim BIO_puts(bio, "<UNPARSEABLE CERTIFICATE>\n");
12387bded2dbSJung-uk Kim else {
12397bded2dbSJung-uk Kim BIO_puts(bio, "\n------details-----\n");
12407bded2dbSJung-uk Kim X509_print_ex(bio, x, XN_FLAG_ONELINE, 0);
12417bded2dbSJung-uk Kim PEM_write_bio_X509(bio, x);
12427bded2dbSJung-uk Kim /* Print certificate stuff */
12437bded2dbSJung-uk Kim BIO_puts(bio, "------------------\n");
12447bded2dbSJung-uk Kim X509_free(x);
12457bded2dbSJung-uk Kim }
12467bded2dbSJung-uk Kim if (q != p + 3 + clen) {
12477bded2dbSJung-uk Kim BIO_puts(bio, "<TRAILING GARBAGE AFTER CERTIFICATE>\n");
12487bded2dbSJung-uk Kim }
12497bded2dbSJung-uk Kim *pmsg += clen + 3;
12507bded2dbSJung-uk Kim *pmsglen -= clen + 3;
12517bded2dbSJung-uk Kim return 1;
12527bded2dbSJung-uk Kim }
12537bded2dbSJung-uk Kim
ssl_print_certificates(BIO * bio,const SSL * ssl,int server,int indent,const unsigned char * msg,size_t msglen)1254e71b7053SJung-uk Kim static int ssl_print_certificates(BIO *bio, const SSL *ssl, int server,
1255e71b7053SJung-uk Kim int indent, const unsigned char *msg,
1256e71b7053SJung-uk Kim size_t msglen)
12577bded2dbSJung-uk Kim {
12587bded2dbSJung-uk Kim size_t clen;
1259e71b7053SJung-uk Kim
1260e71b7053SJung-uk Kim if (SSL_IS_TLS13(ssl)
1261e71b7053SJung-uk Kim && !ssl_print_hexbuf(bio, indent, "context", 1, &msg, &msglen))
1262e71b7053SJung-uk Kim return 0;
1263e71b7053SJung-uk Kim
12647bded2dbSJung-uk Kim if (msglen < 3)
12657bded2dbSJung-uk Kim return 0;
12667bded2dbSJung-uk Kim clen = (msg[0] << 16) | (msg[1] << 8) | msg[2];
12677bded2dbSJung-uk Kim if (msglen != clen + 3)
12687bded2dbSJung-uk Kim return 0;
12697bded2dbSJung-uk Kim msg += 3;
12707bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
12717bded2dbSJung-uk Kim BIO_printf(bio, "certificate_list, length=%d\n", (int)clen);
12727bded2dbSJung-uk Kim while (clen > 0) {
12737bded2dbSJung-uk Kim if (!ssl_print_certificate(bio, indent + 2, &msg, &clen))
12747bded2dbSJung-uk Kim return 0;
127517f01e99SJung-uk Kim if (SSL_IS_TLS13(ssl)
127617f01e99SJung-uk Kim && !ssl_print_extensions(bio, indent + 2, server,
127717f01e99SJung-uk Kim SSL3_MT_CERTIFICATE, &msg, &clen))
1278e71b7053SJung-uk Kim return 0;
1279e71b7053SJung-uk Kim
12807bded2dbSJung-uk Kim }
12817bded2dbSJung-uk Kim return 1;
12827bded2dbSJung-uk Kim }
12837bded2dbSJung-uk Kim
ssl_print_cert_request(BIO * bio,int indent,const SSL * ssl,const unsigned char * msg,size_t msglen)1284e71b7053SJung-uk Kim static int ssl_print_cert_request(BIO *bio, int indent, const SSL *ssl,
12857bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
12867bded2dbSJung-uk Kim {
12877bded2dbSJung-uk Kim size_t xlen;
1288e71b7053SJung-uk Kim unsigned int sigalg;
1289e71b7053SJung-uk Kim
1290e71b7053SJung-uk Kim if (SSL_IS_TLS13(ssl)) {
1291e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent, "request_context", 1, &msg, &msglen))
1292e71b7053SJung-uk Kim return 0;
1293e71b7053SJung-uk Kim if (!ssl_print_extensions(bio, indent, 1,
1294e71b7053SJung-uk Kim SSL3_MT_CERTIFICATE_REQUEST, &msg, &msglen))
1295e71b7053SJung-uk Kim return 0;
1296e71b7053SJung-uk Kim return 1;
1297e71b7053SJung-uk Kim } else {
12987bded2dbSJung-uk Kim if (msglen < 1)
12997bded2dbSJung-uk Kim return 0;
13007bded2dbSJung-uk Kim xlen = msg[0];
13017bded2dbSJung-uk Kim if (msglen < xlen + 1)
13027bded2dbSJung-uk Kim return 0;
13037bded2dbSJung-uk Kim msg++;
13047bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
13057bded2dbSJung-uk Kim BIO_printf(bio, "certificate_types (len=%d)\n", (int)xlen);
13067bded2dbSJung-uk Kim if (!ssl_trace_list(bio, indent + 2, msg, xlen, 1, ssl_ctype_tbl))
13077bded2dbSJung-uk Kim return 0;
13087bded2dbSJung-uk Kim msg += xlen;
13097bded2dbSJung-uk Kim msglen -= xlen + 1;
1310e71b7053SJung-uk Kim }
1311e71b7053SJung-uk Kim if (SSL_USE_SIGALGS(ssl)) {
13127bded2dbSJung-uk Kim if (msglen < 2)
13137bded2dbSJung-uk Kim return 0;
13147bded2dbSJung-uk Kim xlen = (msg[0] << 8) | msg[1];
13157bded2dbSJung-uk Kim if (msglen < xlen + 2 || (xlen & 1))
13167bded2dbSJung-uk Kim return 0;
13177bded2dbSJung-uk Kim msg += 2;
1318e71b7053SJung-uk Kim msglen -= xlen + 2;
13197bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
13207bded2dbSJung-uk Kim BIO_printf(bio, "signature_algorithms (len=%d)\n", (int)xlen);
13217bded2dbSJung-uk Kim while (xlen > 0) {
13227bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
1323e71b7053SJung-uk Kim sigalg = (msg[0] << 8) | msg[1];
1324e71b7053SJung-uk Kim BIO_printf(bio, "%s (0x%04x)\n",
1325e71b7053SJung-uk Kim ssl_trace_str(sigalg, ssl_sigalg_tbl), sigalg);
13267bded2dbSJung-uk Kim xlen -= 2;
13277bded2dbSJung-uk Kim msg += 2;
13287bded2dbSJung-uk Kim }
13297bded2dbSJung-uk Kim msg += xlen;
1330e71b7053SJung-uk Kim }
13317bded2dbSJung-uk Kim
1332dea77ea6SJung-uk Kim if (msglen < 2)
1333dea77ea6SJung-uk Kim return 0;
13347bded2dbSJung-uk Kim xlen = (msg[0] << 8) | msg[1];
13357bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
13367bded2dbSJung-uk Kim if (msglen < xlen + 2)
13377bded2dbSJung-uk Kim return 0;
13387bded2dbSJung-uk Kim msg += 2;
1339e71b7053SJung-uk Kim msglen -= 2 + xlen;
13407bded2dbSJung-uk Kim BIO_printf(bio, "certificate_authorities (len=%d)\n", (int)xlen);
13417bded2dbSJung-uk Kim while (xlen > 0) {
13427bded2dbSJung-uk Kim size_t dlen;
13437bded2dbSJung-uk Kim X509_NAME *nm;
13447bded2dbSJung-uk Kim const unsigned char *p;
13457bded2dbSJung-uk Kim if (xlen < 2)
13467bded2dbSJung-uk Kim return 0;
13477bded2dbSJung-uk Kim dlen = (msg[0] << 8) | msg[1];
13487bded2dbSJung-uk Kim if (xlen < dlen + 2)
13497bded2dbSJung-uk Kim return 0;
13507bded2dbSJung-uk Kim msg += 2;
13517bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
13527bded2dbSJung-uk Kim BIO_printf(bio, "DistinguishedName (len=%d): ", (int)dlen);
13537bded2dbSJung-uk Kim p = msg;
13547bded2dbSJung-uk Kim nm = d2i_X509_NAME(NULL, &p, dlen);
13557bded2dbSJung-uk Kim if (!nm) {
13567bded2dbSJung-uk Kim BIO_puts(bio, "<UNPARSEABLE DN>\n");
13577bded2dbSJung-uk Kim } else {
13587bded2dbSJung-uk Kim X509_NAME_print_ex(bio, nm, 0, XN_FLAG_ONELINE);
13597bded2dbSJung-uk Kim BIO_puts(bio, "\n");
13607bded2dbSJung-uk Kim X509_NAME_free(nm);
13617bded2dbSJung-uk Kim }
13627bded2dbSJung-uk Kim xlen -= dlen + 2;
13637bded2dbSJung-uk Kim msg += dlen;
13647bded2dbSJung-uk Kim }
1365e71b7053SJung-uk Kim if (SSL_IS_TLS13(ssl)) {
1366e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent, "request_extensions", 2,
1367e71b7053SJung-uk Kim &msg, &msglen))
1368e71b7053SJung-uk Kim return 0;
1369e71b7053SJung-uk Kim }
1370e71b7053SJung-uk Kim return msglen == 0;
13717bded2dbSJung-uk Kim }
13727bded2dbSJung-uk Kim
ssl_print_ticket(BIO * bio,int indent,const SSL * ssl,const unsigned char * msg,size_t msglen)1373e71b7053SJung-uk Kim static int ssl_print_ticket(BIO *bio, int indent, const SSL *ssl,
13747bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen)
13757bded2dbSJung-uk Kim {
13767bded2dbSJung-uk Kim unsigned int tick_life;
1377e71b7053SJung-uk Kim
13787bded2dbSJung-uk Kim if (msglen == 0) {
13797bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
13807bded2dbSJung-uk Kim BIO_puts(bio, "No Ticket\n");
13817bded2dbSJung-uk Kim return 1;
13827bded2dbSJung-uk Kim }
13837bded2dbSJung-uk Kim if (msglen < 4)
13847bded2dbSJung-uk Kim return 0;
138558f35182SJung-uk Kim tick_life = ((unsigned int)msg[0] << 24)
138658f35182SJung-uk Kim | ((unsigned int)msg[1] << 16)
138758f35182SJung-uk Kim | ((unsigned int)msg[2] << 8)
138858f35182SJung-uk Kim | (unsigned int)msg[3];
13897bded2dbSJung-uk Kim msglen -= 4;
13907bded2dbSJung-uk Kim msg += 4;
13917bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
13927bded2dbSJung-uk Kim BIO_printf(bio, "ticket_lifetime_hint=%u\n", tick_life);
1393e71b7053SJung-uk Kim if (SSL_IS_TLS13(ssl)) {
1394e71b7053SJung-uk Kim unsigned int ticket_age_add;
1395e71b7053SJung-uk Kim
1396e71b7053SJung-uk Kim if (msglen < 4)
1397e71b7053SJung-uk Kim return 0;
1398e71b7053SJung-uk Kim ticket_age_add =
139958f35182SJung-uk Kim ((unsigned int)msg[0] << 24)
140058f35182SJung-uk Kim | ((unsigned int)msg[1] << 16)
140158f35182SJung-uk Kim | ((unsigned int)msg[2] << 8)
140258f35182SJung-uk Kim | (unsigned int)msg[3];
1403e71b7053SJung-uk Kim msglen -= 4;
1404e71b7053SJung-uk Kim msg += 4;
1405e71b7053SJung-uk Kim BIO_indent(bio, indent + 2, 80);
1406e71b7053SJung-uk Kim BIO_printf(bio, "ticket_age_add=%u\n", ticket_age_add);
1407e71b7053SJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "ticket_nonce", 1, &msg,
1408e71b7053SJung-uk Kim &msglen))
1409e71b7053SJung-uk Kim return 0;
1410e71b7053SJung-uk Kim }
14117bded2dbSJung-uk Kim if (!ssl_print_hexbuf(bio, indent + 2, "ticket", 2, &msg, &msglen))
14127bded2dbSJung-uk Kim return 0;
1413e71b7053SJung-uk Kim if (SSL_IS_TLS13(ssl)
1414e71b7053SJung-uk Kim && !ssl_print_extensions(bio, indent + 2, 0,
1415e71b7053SJung-uk Kim SSL3_MT_NEWSESSION_TICKET, &msg, &msglen))
1416e71b7053SJung-uk Kim return 0;
14177bded2dbSJung-uk Kim if (msglen)
14187bded2dbSJung-uk Kim return 0;
14197bded2dbSJung-uk Kim return 1;
14207bded2dbSJung-uk Kim }
14217bded2dbSJung-uk Kim
ssl_print_handshake(BIO * bio,const SSL * ssl,int server,const unsigned char * msg,size_t msglen,int indent)1422e71b7053SJung-uk Kim static int ssl_print_handshake(BIO *bio, const SSL *ssl, int server,
14237bded2dbSJung-uk Kim const unsigned char *msg, size_t msglen,
14247bded2dbSJung-uk Kim int indent)
14257bded2dbSJung-uk Kim {
14267bded2dbSJung-uk Kim size_t hlen;
14277bded2dbSJung-uk Kim unsigned char htype;
1428e71b7053SJung-uk Kim
14297bded2dbSJung-uk Kim if (msglen < 4)
14307bded2dbSJung-uk Kim return 0;
14317bded2dbSJung-uk Kim htype = msg[0];
14327bded2dbSJung-uk Kim hlen = (msg[1] << 16) | (msg[2] << 8) | msg[3];
14337bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
14347bded2dbSJung-uk Kim BIO_printf(bio, "%s, Length=%d\n",
14357bded2dbSJung-uk Kim ssl_trace_str(htype, ssl_handshake_tbl), (int)hlen);
14367bded2dbSJung-uk Kim msg += 4;
14377bded2dbSJung-uk Kim msglen -= 4;
14387bded2dbSJung-uk Kim if (SSL_IS_DTLS(ssl)) {
14397bded2dbSJung-uk Kim if (msglen < 8)
14407bded2dbSJung-uk Kim return 0;
14417bded2dbSJung-uk Kim BIO_indent(bio, indent, 80);
14427bded2dbSJung-uk Kim BIO_printf(bio, "message_seq=%d, fragment_offset=%d, "
14437bded2dbSJung-uk Kim "fragment_length=%d\n",
14447bded2dbSJung-uk Kim (msg[0] << 8) | msg[1],
14457bded2dbSJung-uk Kim (msg[2] << 16) | (msg[3] << 8) | msg[4],
14467bded2dbSJung-uk Kim (msg[5] << 16) | (msg[6] << 8) | msg[7]);
14477bded2dbSJung-uk Kim msg += 8;
14487bded2dbSJung-uk Kim msglen -= 8;
14497bded2dbSJung-uk Kim }
14507bded2dbSJung-uk Kim if (msglen < hlen)
14517bded2dbSJung-uk Kim return 0;
14527bded2dbSJung-uk Kim switch (htype) {
14537bded2dbSJung-uk Kim case SSL3_MT_CLIENT_HELLO:
14547bded2dbSJung-uk Kim if (!ssl_print_client_hello(bio, ssl, indent + 2, msg, msglen))
14557bded2dbSJung-uk Kim return 0;
14567bded2dbSJung-uk Kim break;
14577bded2dbSJung-uk Kim
14587bded2dbSJung-uk Kim case DTLS1_MT_HELLO_VERIFY_REQUEST:
14597bded2dbSJung-uk Kim if (!dtls_print_hello_vfyrequest(bio, indent + 2, msg, msglen))
14607bded2dbSJung-uk Kim return 0;
14617bded2dbSJung-uk Kim break;
14627bded2dbSJung-uk Kim
14637bded2dbSJung-uk Kim case SSL3_MT_SERVER_HELLO:
14647bded2dbSJung-uk Kim if (!ssl_print_server_hello(bio, indent + 2, msg, msglen))
14657bded2dbSJung-uk Kim return 0;
14667bded2dbSJung-uk Kim break;
14677bded2dbSJung-uk Kim
14687bded2dbSJung-uk Kim case SSL3_MT_SERVER_KEY_EXCHANGE:
14697bded2dbSJung-uk Kim if (!ssl_print_server_keyex(bio, indent + 2, ssl, msg, msglen))
14707bded2dbSJung-uk Kim return 0;
14717bded2dbSJung-uk Kim break;
14727bded2dbSJung-uk Kim
14737bded2dbSJung-uk Kim case SSL3_MT_CLIENT_KEY_EXCHANGE:
14747bded2dbSJung-uk Kim if (!ssl_print_client_keyex(bio, indent + 2, ssl, msg, msglen))
14757bded2dbSJung-uk Kim return 0;
14767bded2dbSJung-uk Kim break;
14777bded2dbSJung-uk Kim
14787bded2dbSJung-uk Kim case SSL3_MT_CERTIFICATE:
1479e71b7053SJung-uk Kim if (!ssl_print_certificates(bio, ssl, server, indent + 2, msg, msglen))
14807bded2dbSJung-uk Kim return 0;
14817bded2dbSJung-uk Kim break;
14827bded2dbSJung-uk Kim
14837bded2dbSJung-uk Kim case SSL3_MT_CERTIFICATE_VERIFY:
14847bded2dbSJung-uk Kim if (!ssl_print_signature(bio, indent + 2, ssl, &msg, &msglen))
14857bded2dbSJung-uk Kim return 0;
14867bded2dbSJung-uk Kim break;
14877bded2dbSJung-uk Kim
14887bded2dbSJung-uk Kim case SSL3_MT_CERTIFICATE_REQUEST:
14897bded2dbSJung-uk Kim if (!ssl_print_cert_request(bio, indent + 2, ssl, msg, msglen))
14907bded2dbSJung-uk Kim return 0;
14917bded2dbSJung-uk Kim break;
14927bded2dbSJung-uk Kim
14937bded2dbSJung-uk Kim case SSL3_MT_FINISHED:
14947bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 2, "verify_data", msg, msglen);
14957bded2dbSJung-uk Kim break;
14967bded2dbSJung-uk Kim
14977bded2dbSJung-uk Kim case SSL3_MT_SERVER_DONE:
14987bded2dbSJung-uk Kim if (msglen != 0)
14997bded2dbSJung-uk Kim ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
15007bded2dbSJung-uk Kim break;
15017bded2dbSJung-uk Kim
15027bded2dbSJung-uk Kim case SSL3_MT_NEWSESSION_TICKET:
1503e71b7053SJung-uk Kim if (!ssl_print_ticket(bio, indent + 2, ssl, msg, msglen))
1504e71b7053SJung-uk Kim return 0;
1505e71b7053SJung-uk Kim break;
1506e71b7053SJung-uk Kim
1507e71b7053SJung-uk Kim case SSL3_MT_ENCRYPTED_EXTENSIONS:
1508e71b7053SJung-uk Kim if (!ssl_print_extensions(bio, indent + 2, 1,
1509e71b7053SJung-uk Kim SSL3_MT_ENCRYPTED_EXTENSIONS, &msg, &msglen))
1510e71b7053SJung-uk Kim return 0;
1511e71b7053SJung-uk Kim break;
1512e71b7053SJung-uk Kim
1513e71b7053SJung-uk Kim case SSL3_MT_KEY_UPDATE:
1514e71b7053SJung-uk Kim if (msglen != 1) {
1515e71b7053SJung-uk Kim ssl_print_hex(bio, indent + 2, "unexpected value", msg, msglen);
1516e71b7053SJung-uk Kim return 0;
1517e71b7053SJung-uk Kim }
1518e71b7053SJung-uk Kim if (!ssl_trace_list(bio, indent + 2, msg, msglen, 1,
1519e71b7053SJung-uk Kim ssl_key_update_tbl))
15207bded2dbSJung-uk Kim return 0;
15217bded2dbSJung-uk Kim break;
15227bded2dbSJung-uk Kim
15237bded2dbSJung-uk Kim default:
15247bded2dbSJung-uk Kim BIO_indent(bio, indent + 2, 80);
15257bded2dbSJung-uk Kim BIO_puts(bio, "Unsupported, hex dump follows:\n");
1526e71b7053SJung-uk Kim BIO_dump_indent(bio, (const char *)msg, msglen, indent + 4);
15277bded2dbSJung-uk Kim }
15287bded2dbSJung-uk Kim return 1;
15297bded2dbSJung-uk Kim }
15307bded2dbSJung-uk Kim
SSL_trace(int write_p,int version,int content_type,const void * buf,size_t msglen,SSL * ssl,void * arg)15317bded2dbSJung-uk Kim void SSL_trace(int write_p, int version, int content_type,
15327bded2dbSJung-uk Kim const void *buf, size_t msglen, SSL *ssl, void *arg)
15337bded2dbSJung-uk Kim {
15347bded2dbSJung-uk Kim const unsigned char *msg = buf;
15357bded2dbSJung-uk Kim BIO *bio = arg;
15367bded2dbSJung-uk Kim
15377bded2dbSJung-uk Kim switch (content_type) {
15387bded2dbSJung-uk Kim case SSL3_RT_HEADER:
15397bded2dbSJung-uk Kim {
1540dea77ea6SJung-uk Kim int hvers;
1541dea77ea6SJung-uk Kim
1542dea77ea6SJung-uk Kim /* avoid overlapping with length at the end of buffer */
1543e71b7053SJung-uk Kim if (msglen < (size_t)(SSL_IS_DTLS(ssl) ?
1544e71b7053SJung-uk Kim DTLS1_RT_HEADER_LENGTH : SSL3_RT_HEADER_LENGTH)) {
1545dea77ea6SJung-uk Kim BIO_puts(bio, write_p ? "Sent" : "Received");
1546dea77ea6SJung-uk Kim ssl_print_hex(bio, 0, " too short message", msg, msglen);
1547dea77ea6SJung-uk Kim break;
1548dea77ea6SJung-uk Kim }
1549dea77ea6SJung-uk Kim hvers = msg[1] << 8 | msg[2];
15507bded2dbSJung-uk Kim BIO_puts(bio, write_p ? "Sent" : "Received");
15517bded2dbSJung-uk Kim BIO_printf(bio, " Record\nHeader:\n Version = %s (0x%x)\n",
15527bded2dbSJung-uk Kim ssl_trace_str(hvers, ssl_version_tbl), hvers);
15537bded2dbSJung-uk Kim if (SSL_IS_DTLS(ssl)) {
15547bded2dbSJung-uk Kim BIO_printf(bio,
15557bded2dbSJung-uk Kim " epoch=%d, sequence_number=%04x%04x%04x\n",
15567bded2dbSJung-uk Kim (msg[3] << 8 | msg[4]),
15577bded2dbSJung-uk Kim (msg[5] << 8 | msg[6]),
15587bded2dbSJung-uk Kim (msg[7] << 8 | msg[8]), (msg[9] << 8 | msg[10]));
15597bded2dbSJung-uk Kim }
15607bded2dbSJung-uk Kim
15617bded2dbSJung-uk Kim BIO_printf(bio, " Content Type = %s (%d)\n Length = %d",
15627bded2dbSJung-uk Kim ssl_trace_str(msg[0], ssl_content_tbl), msg[0],
15637bded2dbSJung-uk Kim msg[msglen - 2] << 8 | msg[msglen - 1]);
15647bded2dbSJung-uk Kim }
15657bded2dbSJung-uk Kim break;
1566e71b7053SJung-uk Kim
1567e71b7053SJung-uk Kim case SSL3_RT_INNER_CONTENT_TYPE:
1568e71b7053SJung-uk Kim BIO_printf(bio, " Inner Content Type = %s (%d)",
1569e71b7053SJung-uk Kim ssl_trace_str(msg[0], ssl_content_tbl), msg[0]);
1570e71b7053SJung-uk Kim break;
1571e71b7053SJung-uk Kim
15727bded2dbSJung-uk Kim case SSL3_RT_HANDSHAKE:
1573e71b7053SJung-uk Kim if (!ssl_print_handshake(bio, ssl, ssl->server ? write_p : !write_p,
1574e71b7053SJung-uk Kim msg, msglen, 4))
15757bded2dbSJung-uk Kim BIO_printf(bio, "Message length parse error!\n");
15767bded2dbSJung-uk Kim break;
15777bded2dbSJung-uk Kim
15787bded2dbSJung-uk Kim case SSL3_RT_CHANGE_CIPHER_SPEC:
15797bded2dbSJung-uk Kim if (msglen == 1 && msg[0] == 1)
15807bded2dbSJung-uk Kim BIO_puts(bio, " change_cipher_spec (1)\n");
15817bded2dbSJung-uk Kim else
15827bded2dbSJung-uk Kim ssl_print_hex(bio, 4, "unknown value", msg, msglen);
15837bded2dbSJung-uk Kim break;
15847bded2dbSJung-uk Kim
15857bded2dbSJung-uk Kim case SSL3_RT_ALERT:
1586e71b7053SJung-uk Kim if (msglen != 2)
15877bded2dbSJung-uk Kim BIO_puts(bio, " Illegal Alert Length\n");
1588e71b7053SJung-uk Kim else {
15897bded2dbSJung-uk Kim BIO_printf(bio, " Level=%s(%d), description=%s(%d)\n",
15907bded2dbSJung-uk Kim SSL_alert_type_string_long(msg[0] << 8),
15917bded2dbSJung-uk Kim msg[0], SSL_alert_desc_string_long(msg[1]), msg[1]);
15927bded2dbSJung-uk Kim }
15937bded2dbSJung-uk Kim
15947bded2dbSJung-uk Kim }
15957bded2dbSJung-uk Kim
15967bded2dbSJung-uk Kim BIO_puts(bio, "\n");
15977bded2dbSJung-uk Kim }
15987bded2dbSJung-uk Kim
15997bded2dbSJung-uk Kim #endif
1600