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