xref: /openbsd/usr.bin/openssl/s_cb.c (revision 23cc9d40)
1 /* $OpenBSD: s_cb.c,v 1.22 2025/01/02 13:10:03 tb Exp $ */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 /* ====================================================================
59  * Copyright (c) 1998-2006 The OpenSSL Project.  All rights reserved.
60  *
61  * Redistribution and use in source and binary forms, with or without
62  * modification, are permitted provided that the following conditions
63  * are met:
64  *
65  * 1. Redistributions of source code must retain the above copyright
66  *    notice, this list of conditions and the following disclaimer.
67  *
68  * 2. Redistributions in binary form must reproduce the above copyright
69  *    notice, this list of conditions and the following disclaimer in
70  *    the documentation and/or other materials provided with the
71  *    distribution.
72  *
73  * 3. All advertising materials mentioning features or use of this
74  *    software must display the following acknowledgment:
75  *    "This product includes software developed by the OpenSSL Project
76  *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77  *
78  * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79  *    endorse or promote products derived from this software without
80  *    prior written permission. For written permission, please contact
81  *    openssl-core@openssl.org.
82  *
83  * 5. Products derived from this software may not be called "OpenSSL"
84  *    nor may "OpenSSL" appear in their names without prior written
85  *    permission of the OpenSSL Project.
86  *
87  * 6. Redistributions of any form whatsoever must retain the following
88  *    acknowledgment:
89  *    "This product includes software developed by the OpenSSL Project
90  *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91  *
92  * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93  * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96  * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103  * OF THE POSSIBILITY OF SUCH DAMAGE.
104  * ====================================================================
105  *
106  * This product includes cryptographic software written by Eric Young
107  * (eay@cryptsoft.com).  This product includes software written by Tim
108  * Hudson (tjh@cryptsoft.com).
109  *
110  */
111 
112 #include <sys/socket.h>
113 
114 #include <netinet/in.h>
115 
116 #include <netdb.h>
117 #include <stdio.h>
118 #include <stdlib.h>
119 #include <string.h>
120 
121 #include "apps.h"
122 
123 #include <openssl/err.h>
124 #include <openssl/ssl.h>
125 #include <openssl/x509.h>
126 
127 #define	COOKIE_SECRET_LENGTH	16
128 
129 int verify_depth = 0;
130 int verify_return_error = 0;
131 unsigned char cookie_secret[COOKIE_SECRET_LENGTH];
132 int cookie_initialized = 0;
133 
134 int
verify_callback(int ok,X509_STORE_CTX * ctx)135 verify_callback(int ok, X509_STORE_CTX * ctx)
136 {
137 	X509 *err_cert;
138 	int err, depth;
139 
140 	err_cert = X509_STORE_CTX_get_current_cert(ctx);
141 	err = X509_STORE_CTX_get_error(ctx);
142 	depth = X509_STORE_CTX_get_error_depth(ctx);
143 
144 	BIO_printf(bio_err, "depth=%d ", depth);
145 	if (err_cert) {
146 		X509_NAME_print_ex(bio_err, X509_get_subject_name(err_cert),
147 		    0, XN_FLAG_ONELINE);
148 		BIO_puts(bio_err, "\n");
149 	} else
150 		BIO_puts(bio_err, "<no cert>\n");
151 	if (!ok) {
152 		BIO_printf(bio_err, "verify error:num=%d:%s\n", err,
153 		    X509_verify_cert_error_string(err));
154 		if (verify_depth >= depth) {
155 			if (!verify_return_error)
156 				ok = 1;
157 		} else {
158 			ok = 0;
159 		}
160 	}
161 	switch (err) {
162 	case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
163 		BIO_puts(bio_err, "issuer= ");
164 		if (err_cert == NULL)
165 			BIO_puts(bio_err, "<error getting cert>");
166 		else
167 			X509_NAME_print_ex(bio_err,
168 			    X509_get_issuer_name(err_cert), 0, XN_FLAG_ONELINE);
169 		BIO_puts(bio_err, "\n");
170 		break;
171 	case X509_V_ERR_CERT_NOT_YET_VALID:
172 	case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
173 		BIO_printf(bio_err, "notBefore=");
174 		if (err_cert == NULL)
175 			BIO_printf(bio_err, " <error getting cert>");
176 		else
177 			ASN1_TIME_print(bio_err, X509_get_notBefore(err_cert));
178 		BIO_printf(bio_err, "\n");
179 		break;
180 	case X509_V_ERR_CERT_HAS_EXPIRED:
181 	case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
182 		BIO_printf(bio_err, "notAfter=");
183 		if (err_cert == NULL)
184 			BIO_printf(bio_err, " <error getting cert>");
185 		else
186 			ASN1_TIME_print(bio_err, X509_get_notAfter(err_cert));
187 		BIO_printf(bio_err, "\n");
188 		break;
189 	case X509_V_ERR_NO_EXPLICIT_POLICY:
190 		break;
191 	}
192 
193 	BIO_printf(bio_err, "verify return:%d\n", ok);
194 	return (ok);
195 }
196 
197 int
set_cert_stuff(SSL_CTX * ctx,char * cert_file,char * key_file)198 set_cert_stuff(SSL_CTX * ctx, char *cert_file, char *key_file)
199 {
200 	if (cert_file == NULL)
201 		return 1;
202 
203 	if (key_file == NULL)
204 		key_file = cert_file;
205 
206 	if (SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) {
207 		BIO_printf(bio_err,
208 		    "unable to get certificate from '%s'\n", cert_file);
209 		ERR_print_errors(bio_err);
210 		return 0;
211 	}
212 	if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) {
213 		BIO_printf(bio_err, "unable to get private key from '%s'\n",
214 		    key_file);
215 		ERR_print_errors(bio_err);
216 		return 0;
217 	}
218 
219 	/* Now we know that a key and cert have been set against the context. */
220 	if (!SSL_CTX_check_private_key(ctx)) {
221 		BIO_printf(bio_err,
222 		    "Private key does not match the certificate public key\n");
223 		return 0;
224 	}
225 
226 	return 1;
227 }
228 
229 int
set_cert_key_stuff(SSL_CTX * ctx,X509 * cert,EVP_PKEY * key)230 set_cert_key_stuff(SSL_CTX * ctx, X509 * cert, EVP_PKEY * key)
231 {
232 	if (cert == NULL)
233 		return 1;
234 	if (SSL_CTX_use_certificate(ctx, cert) <= 0) {
235 		BIO_printf(bio_err, "error setting certificate\n");
236 		ERR_print_errors(bio_err);
237 		return 0;
238 	}
239 	if (SSL_CTX_use_PrivateKey(ctx, key) <= 0) {
240 		BIO_printf(bio_err, "error setting private key\n");
241 		ERR_print_errors(bio_err);
242 		return 0;
243 	}
244 	/*
245 	 * Now we know that a key and cert have been set against the SSL
246 	 * context
247 	 */
248 	if (!SSL_CTX_check_private_key(ctx)) {
249 		BIO_printf(bio_err,
250 		    "Private key does not match the certificate public key\n");
251 		return 0;
252 	}
253 	return 1;
254 }
255 
256 int
ssl_print_tmp_key(BIO * out,SSL * s)257 ssl_print_tmp_key(BIO *out, SSL *s)
258 {
259 	const char *cname;
260 	EVP_PKEY *pkey;
261 	EC_KEY *ec;
262 	const EC_GROUP *group;
263 	int nid;
264 
265 	if (!SSL_get_server_tmp_key(s, &pkey))
266 		return 0;
267 
268 	BIO_puts(out, "Server Temp Key: ");
269 	switch (EVP_PKEY_id(pkey)) {
270 	case EVP_PKEY_DH:
271 		BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(pkey));
272 		break;
273 
274 	case EVP_PKEY_EC:
275 		if ((ec = EVP_PKEY_get0_EC_KEY(pkey)) == NULL)
276 			goto err;
277 		if ((group = EC_KEY_get0_group(ec)) == NULL)
278 			goto err;
279 
280 		nid = EC_GROUP_get_curve_name(group);
281 
282 		if ((cname = EC_curve_nid2nist(nid)) == NULL)
283 			cname = OBJ_nid2sn(nid);
284 
285 		BIO_printf(out, "ECDH, %s, %d bits\n", cname, EVP_PKEY_bits(pkey));
286 		break;
287 
288 	default:
289 		BIO_printf(out, "%s, %d bits\n", OBJ_nid2sn(EVP_PKEY_id(pkey)),
290 		    EVP_PKEY_bits(pkey));
291 	}
292 
293  err:
294 	EVP_PKEY_free(pkey);
295 	return 1;
296 }
297 
298 long
bio_dump_callback(BIO * bio,int cmd,const char * argp,int argi,long argl,long ret)299 bio_dump_callback(BIO * bio, int cmd, const char *argp,
300     int argi, long argl, long ret)
301 {
302 	BIO *out;
303 
304 	out = (BIO *) BIO_get_callback_arg(bio);
305 	if (out == NULL)
306 		return (ret);
307 
308 	if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) {
309 		BIO_printf(out,
310 		    "read from %p [%p] (%lu bytes => %ld (0x%lX))\n",
311 		    (void *) bio, argp, (unsigned long) argi, ret, ret);
312 		BIO_dump(out, argp, (int) ret);
313 		return (ret);
314 	} else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) {
315 		BIO_printf(out,
316 		    "write to %p [%p] (%lu bytes => %ld (0x%lX))\n",
317 		    (void *) bio, argp, (unsigned long) argi, ret, ret);
318 		BIO_dump(out, argp, (int) ret);
319 	}
320 	return (ret);
321 }
322 
323 void
apps_ssl_info_callback(const SSL * s,int where,int ret)324 apps_ssl_info_callback(const SSL * s, int where, int ret)
325 {
326 	const char *str;
327 	int w;
328 
329 	w = where & ~SSL_ST_MASK;
330 
331 	if (w & SSL_ST_CONNECT)
332 		str = "SSL_connect";
333 	else if (w & SSL_ST_ACCEPT)
334 		str = "SSL_accept";
335 	else
336 		str = "undefined";
337 
338 	if (where & SSL_CB_LOOP) {
339 		BIO_printf(bio_err, "%s:%s\n", str, SSL_state_string_long(s));
340 	} else if (where & SSL_CB_ALERT) {
341 		str = (where & SSL_CB_READ) ? "read" : "write";
342 		BIO_printf(bio_err, "SSL3 alert %s:%s:%s\n", str,
343 		    SSL_alert_type_string_long(ret),
344 		    SSL_alert_desc_string_long(ret));
345 	} else if (where & SSL_CB_EXIT) {
346 		if (ret == 0)
347 			BIO_printf(bio_err, "%s:failed in %s\n",
348 			    str, SSL_state_string_long(s));
349 		else if (ret < 0) {
350 			BIO_printf(bio_err, "%s:error in %s\n",
351 			    str, SSL_state_string_long(s));
352 		}
353 	}
354 }
355 
356 
357 void
msg_cb(int write_p,int version,int content_type,const void * buf,size_t len,SSL * ssl,void * arg)358 msg_cb(int write_p, int version, int content_type, const void *buf, size_t len, SSL * ssl, void *arg)
359 {
360 	BIO *bio = arg;
361 	const char *str_write_p, *str_version, *str_content_type = "",
362 	    *str_details1 = "", *str_details2 = "";
363 
364 	str_write_p = write_p ? ">>>" : "<<<";
365 
366 	/* XXX convert to using ssl_get_version */
367 	switch (version) {
368 	case SSL2_VERSION:
369 		str_version = "SSL 2.0";
370 		break;
371 	case SSL3_VERSION:
372 		str_version = "SSL 3.0 ";
373 		break;
374 	case TLS1_VERSION:
375 		str_version = "TLS 1.0 ";
376 		break;
377 	case TLS1_1_VERSION:
378 		str_version = "TLS 1.1 ";
379 		break;
380 	case TLS1_2_VERSION:
381 		str_version = "TLS 1.2 ";
382 		break;
383 	case TLS1_3_VERSION:
384 		str_version = "TLS 1.3 ";
385 		break;
386 	case DTLS1_VERSION:
387 		str_version = "DTLS 1.0 ";
388 		break;
389 	case DTLS1_2_VERSION:
390 		str_version = "DTLS 1.2 ";
391 		break;
392 	default:
393 		str_version = "???";
394 	}
395 
396 	if (version == SSL2_VERSION) {
397 		str_details1 = "???";
398 
399 		if (len > 0) {
400 			/* XXX magic numbers */
401 			switch (((const unsigned char *) buf)[0]) {
402 			case 0:
403 				str_details1 = ", ERROR:";
404 				str_details2 = " ???";
405 				if (len >= 3) {
406 					unsigned err = (((const unsigned char *) buf)[1] << 8) + ((const unsigned char *) buf)[2];
407 
408 					switch (err) {
409 					case 0x0001:
410 						str_details2 = " NO-CIPHER-ERROR";
411 						break;
412 					case 0x0002:
413 						str_details2 = " NO-CERTIFICATE-ERROR";
414 						break;
415 					case 0x0004:
416 						str_details2 = " BAD-CERTIFICATE-ERROR";
417 						break;
418 					case 0x0006:
419 						str_details2 = " UNSUPPORTED-CERTIFICATE-TYPE-ERROR";
420 						break;
421 					}
422 				}
423 				break;
424 			case 1:
425 				str_details1 = ", CLIENT-HELLO";
426 				break;
427 			case 2:
428 				str_details1 = ", CLIENT-MASTER-KEY";
429 				break;
430 			case 3:
431 				str_details1 = ", CLIENT-FINISHED";
432 				break;
433 			case 4:
434 				str_details1 = ", SERVER-HELLO";
435 				break;
436 			case 5:
437 				str_details1 = ", SERVER-VERIFY";
438 				break;
439 			case 6:
440 				str_details1 = ", SERVER-FINISHED";
441 				break;
442 			case 7:
443 				str_details1 = ", REQUEST-CERTIFICATE";
444 				break;
445 			case 8:
446 				str_details1 = ", CLIENT-CERTIFICATE";
447 				break;
448 			}
449 		}
450 	}
451 	if (version == SSL3_VERSION || version == TLS1_VERSION ||
452 	    version == TLS1_1_VERSION || version == TLS1_2_VERSION ||
453 	    version == TLS1_3_VERSION || version == DTLS1_VERSION ||
454 	    version == DTLS1_2_VERSION) {
455 		/* XXX magic numbers are in ssl3.h */
456 		switch (content_type) {
457 		case 20:
458 			str_content_type = "ChangeCipherSpec";
459 			break;
460 		case 21:
461 			str_content_type = "Alert";
462 			break;
463 		case 22:
464 			str_content_type = "Handshake";
465 			break;
466 		}
467 
468 		if (content_type == 21) {	/* Alert */
469 			str_details1 = ", ???";
470 
471 			if (len == 2) {
472 				switch (((const unsigned char *) buf)[0]) {
473 				case 1:
474 					str_details1 = ", warning";
475 					break;
476 				case 2:
477 					str_details1 = ", fatal";
478 					break;
479 				}
480 
481 				str_details2 = " ???";
482 				switch (((const unsigned char *) buf)[1]) {
483 				case 0:
484 					str_details2 = " close_notify";
485 					break;
486 				case 10:
487 					str_details2 = " unexpected_message";
488 					break;
489 				case 20:
490 					str_details2 = " bad_record_mac";
491 					break;
492 				case 21:
493 					str_details2 = " decryption_failed";
494 					break;
495 				case 22:
496 					str_details2 = " record_overflow";
497 					break;
498 				case 30:
499 					str_details2 = " decompression_failure";
500 					break;
501 				case 40:
502 					str_details2 = " handshake_failure";
503 					break;
504 				case 42:
505 					str_details2 = " bad_certificate";
506 					break;
507 				case 43:
508 					str_details2 = " unsupported_certificate";
509 					break;
510 				case 44:
511 					str_details2 = " certificate_revoked";
512 					break;
513 				case 45:
514 					str_details2 = " certificate_expired";
515 					break;
516 				case 46:
517 					str_details2 = " certificate_unknown";
518 					break;
519 				case 47:
520 					str_details2 = " illegal_parameter";
521 					break;
522 				case 48:
523 					str_details2 = " unknown_ca";
524 					break;
525 				case 49:
526 					str_details2 = " access_denied";
527 					break;
528 				case 50:
529 					str_details2 = " decode_error";
530 					break;
531 				case 51:
532 					str_details2 = " decrypt_error";
533 					break;
534 				case 60:
535 					str_details2 = " export_restriction";
536 					break;
537 				case 70:
538 					str_details2 = " protocol_version";
539 					break;
540 				case 71:
541 					str_details2 = " insufficient_security";
542 					break;
543 				case 80:
544 					str_details2 = " internal_error";
545 					break;
546 				case 90:
547 					str_details2 = " user_canceled";
548 					break;
549 				case 100:
550 					str_details2 = " no_renegotiation";
551 					break;
552 				case 110:
553 					str_details2 = " unsupported_extension";
554 					break;
555 				case 111:
556 					str_details2 = " certificate_unobtainable";
557 					break;
558 				case 112:
559 					str_details2 = " unrecognized_name";
560 					break;
561 				case 113:
562 					str_details2 = " bad_certificate_status_response";
563 					break;
564 				case 114:
565 					str_details2 = " bad_certificate_hash_value";
566 					break;
567 				case 115:
568 					str_details2 = " unknown_psk_identity";
569 					break;
570 				}
571 			}
572 		}
573 		if (content_type == 22) {	/* Handshake */
574 			str_details1 = "???";
575 
576 			if (len > 0) {
577 				switch (((const unsigned char *) buf)[0]) {
578 				case 0:
579 					str_details1 = ", HelloRequest";
580 					break;
581 				case 1:
582 					str_details1 = ", ClientHello";
583 					break;
584 				case 2:
585 					str_details1 = ", ServerHello";
586 					break;
587 				case 3:
588 					str_details1 = ", HelloVerifyRequest";
589 					break;
590 				case 4:
591 					str_details1 = ", NewSessionTicket";
592 					break;
593 				case 5:
594 					str_details1 = ", EndOfEarlyData";
595 					break;
596 				case 8:
597 					str_details1 = ", EncryptedExtensions";
598 					break;
599 				case 11:
600 					str_details1 = ", Certificate";
601 					break;
602 				case 12:
603 					str_details1 = ", ServerKeyExchange";
604 					break;
605 				case 13:
606 					str_details1 = ", CertificateRequest";
607 					break;
608 				case 14:
609 					str_details1 = ", ServerHelloDone";
610 					break;
611 				case 15:
612 					str_details1 = ", CertificateVerify";
613 					break;
614 				case 16:
615 					str_details1 = ", ClientKeyExchange";
616 					break;
617 				case 20:
618 					str_details1 = ", Finished";
619 					break;
620 				case 24:
621 					str_details1 = ", KeyUpdate";
622 					break;
623 				}
624 			}
625 		}
626 	}
627 	BIO_printf(bio, "%s %s%s [length %04lx]%s%s\n", str_write_p,
628 	    str_version, str_content_type, (unsigned long) len,
629 	    str_details1, str_details2);
630 
631 	if (len > 0) {
632 		size_t num, i;
633 
634 		BIO_printf(bio, "   ");
635 		num = len;
636 
637 		for (i = 0; i < num; i++) {
638 			if (i % 16 == 0 && i > 0)
639 				BIO_printf(bio, "\n   ");
640 			BIO_printf(bio, " %02x",
641 			    ((const unsigned char *) buf)[i]);
642 		}
643 		if (i < len)
644 			BIO_printf(bio, " ...");
645 		BIO_printf(bio, "\n");
646 	}
647 	(void) BIO_flush(bio);
648 }
649 
650 void
tlsext_cb(SSL * s,int client_server,int type,unsigned char * data,int len,void * arg)651 tlsext_cb(SSL * s, int client_server, int type, unsigned char *data, int len,
652     void *arg)
653 {
654 	BIO *bio = arg;
655 	char *extname;
656 
657 	switch (type) {
658 	case TLSEXT_TYPE_server_name:
659 		extname = "server name";
660 		break;
661 
662 	case TLSEXT_TYPE_max_fragment_length:
663 		extname = "max fragment length";
664 		break;
665 
666 	case TLSEXT_TYPE_client_certificate_url:
667 		extname = "client certificate URL";
668 		break;
669 
670 	case TLSEXT_TYPE_trusted_ca_keys:
671 		extname = "trusted CA keys";
672 		break;
673 
674 	case TLSEXT_TYPE_truncated_hmac:
675 		extname = "truncated HMAC";
676 		break;
677 
678 	case TLSEXT_TYPE_status_request:
679 		extname = "status request";
680 		break;
681 
682 	case TLSEXT_TYPE_user_mapping:
683 		extname = "user mapping";
684 		break;
685 
686 	case TLSEXT_TYPE_client_authz:
687 		extname = "client authz";
688 		break;
689 
690 	case TLSEXT_TYPE_server_authz:
691 		extname = "server authz";
692 		break;
693 
694 	case TLSEXT_TYPE_cert_type:
695 		extname = "cert type";
696 		break;
697 
698 	case TLSEXT_TYPE_supported_groups:
699 		extname = "supported groups";
700 		break;
701 
702 	case TLSEXT_TYPE_ec_point_formats:
703 		extname = "EC point formats";
704 		break;
705 
706 	case TLSEXT_TYPE_srp:
707 		extname = "SRP";
708 		break;
709 
710 	case TLSEXT_TYPE_signature_algorithms:
711 		extname = "signature algorithms";
712 		break;
713 
714 	case TLSEXT_TYPE_use_srtp:
715 		extname = "use SRTP";
716 		break;
717 
718 	case TLSEXT_TYPE_heartbeat:
719 		extname = "heartbeat";
720 		break;
721 
722 	case TLSEXT_TYPE_application_layer_protocol_negotiation:
723 		extname = "application layer protocol negotiation";
724 		break;
725 
726 	case TLSEXT_TYPE_padding:
727 		extname = "TLS padding";
728 		break;
729 
730 	case TLSEXT_TYPE_session_ticket:
731 		extname = "session ticket";
732 		break;
733 
734 #if defined(LIBRESSL_HAS_TLS1_3) || defined(LIBRESSL_INTERNAL)
735 	case TLSEXT_TYPE_pre_shared_key:
736 		extname = "pre shared key";
737 		break;
738 
739 	case TLSEXT_TYPE_early_data:
740 		extname = "early data";
741 		break;
742 
743 	case TLSEXT_TYPE_supported_versions:
744 		extname = "supported versions";
745 		break;
746 
747 	case TLSEXT_TYPE_cookie:
748 		extname = "cookie";
749 		break;
750 
751 	case TLSEXT_TYPE_psk_key_exchange_modes:
752 		extname = "PSK key exchange modes";
753 		break;
754 
755 	case TLSEXT_TYPE_certificate_authorities:
756 		extname = "certificate authorities";
757 		break;
758 
759 	case TLSEXT_TYPE_oid_filters:
760 		extname = "OID filters";
761 		break;
762 
763 	case TLSEXT_TYPE_post_handshake_auth:
764 		extname = "post handshake auth";
765 		break;
766 
767 	case TLSEXT_TYPE_signature_algorithms_cert:
768 		extname = "signature algorithms cert";
769 		break;
770 
771 	case TLSEXT_TYPE_key_share:
772 		extname = "key share";
773 		break;
774 #endif
775 
776 	case TLSEXT_TYPE_renegotiate:
777 		extname = "renegotiation info";
778 		break;
779 
780 	default:
781 		extname = "unknown";
782 		break;
783 
784 	}
785 
786 	BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n",
787 	    client_server ? "server" : "client", extname, type, len);
788 	BIO_dump(bio, (char *) data, len);
789 	(void) BIO_flush(bio);
790 }
791 
792 int
generate_cookie_callback(SSL * ssl,unsigned char * cookie,unsigned int * cookie_len)793 generate_cookie_callback(SSL * ssl, unsigned char *cookie,
794     unsigned int *cookie_len)
795 {
796 	unsigned char *buffer, result[EVP_MAX_MD_SIZE];
797 	unsigned int length, resultlength;
798 	union {
799 		struct sockaddr sa;
800 		struct sockaddr_in s4;
801 		struct sockaddr_in6 s6;
802 	} peer;
803 
804 	/* Initialize a random secret */
805 	if (!cookie_initialized) {
806 		arc4random_buf(cookie_secret, COOKIE_SECRET_LENGTH);
807 		cookie_initialized = 1;
808 	}
809 	/* Read peer information */
810 	(void) BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer);
811 
812 	/* Create buffer with peer's address and port */
813 	length = 0;
814 	switch (peer.sa.sa_family) {
815 	case AF_INET:
816 		length += sizeof(struct in_addr);
817 		length += sizeof(peer.s4.sin_port);
818 		break;
819 	case AF_INET6:
820 		length += sizeof(struct in6_addr);
821 		length += sizeof(peer.s6.sin6_port);
822 		break;
823 	default:
824 		OPENSSL_assert(0);
825 		break;
826 	}
827 	buffer = malloc(length);
828 
829 	if (buffer == NULL) {
830 		BIO_printf(bio_err, "out of memory\n");
831 		return 0;
832 	}
833 	switch (peer.sa.sa_family) {
834 	case AF_INET:
835 		memcpy(buffer, &peer.s4.sin_port, sizeof(peer.s4.sin_port));
836 		memcpy(buffer + sizeof(peer.s4.sin_port),
837 		    &peer.s4.sin_addr, sizeof(struct in_addr));
838 		break;
839 	case AF_INET6:
840 		memcpy(buffer, &peer.s6.sin6_port, sizeof(peer.s6.sin6_port));
841 		memcpy(buffer + sizeof(peer.s6.sin6_port),
842 		    &peer.s6.sin6_addr, sizeof(struct in6_addr));
843 		break;
844 	default:
845 		OPENSSL_assert(0);
846 		break;
847 	}
848 
849 	/* Calculate HMAC of buffer using the secret */
850 	HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH,
851 	    buffer, length, result, &resultlength);
852 	free(buffer);
853 
854 	memcpy(cookie, result, resultlength);
855 	*cookie_len = resultlength;
856 
857 	return 1;
858 }
859 
860 int
verify_cookie_callback(SSL * ssl,const unsigned char * cookie,unsigned int cookie_len)861 verify_cookie_callback(SSL * ssl, const unsigned char *cookie,
862     unsigned int cookie_len)
863 {
864 	unsigned char *buffer, result[EVP_MAX_MD_SIZE];
865 	unsigned int length, resultlength;
866 	union {
867 		struct sockaddr sa;
868 		struct sockaddr_in s4;
869 		struct sockaddr_in6 s6;
870 	} peer;
871 
872 	/* If secret isn't initialized yet, the cookie can't be valid */
873 	if (!cookie_initialized)
874 		return 0;
875 
876 	/* Read peer information */
877 	(void) BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer);
878 
879 	/* Create buffer with peer's address and port */
880 	length = 0;
881 	switch (peer.sa.sa_family) {
882 	case AF_INET:
883 		length += sizeof(struct in_addr);
884 		length += sizeof(peer.s4.sin_port);
885 		break;
886 	case AF_INET6:
887 		length += sizeof(struct in6_addr);
888 		length += sizeof(peer.s6.sin6_port);
889 		break;
890 	default:
891 		OPENSSL_assert(0);
892 		break;
893 	}
894 	buffer = malloc(length);
895 
896 	if (buffer == NULL) {
897 		BIO_printf(bio_err, "out of memory\n");
898 		return 0;
899 	}
900 	switch (peer.sa.sa_family) {
901 	case AF_INET:
902 		memcpy(buffer, &peer.s4.sin_port, sizeof(peer.s4.sin_port));
903 		memcpy(buffer + sizeof(peer.s4.sin_port),
904 		    &peer.s4.sin_addr, sizeof(struct in_addr));
905 		break;
906 	case AF_INET6:
907 		memcpy(buffer, &peer.s6.sin6_port, sizeof(peer.s6.sin6_port));
908 		memcpy(buffer + sizeof(peer.s6.sin6_port),
909 		    &peer.s6.sin6_addr, sizeof(struct in6_addr));
910 		break;
911 	default:
912 		OPENSSL_assert(0);
913 		break;
914 	}
915 
916 	/* Calculate HMAC of buffer using the secret */
917 	if (HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH,
918 	    buffer, length, result, &resultlength) == NULL) {
919 		free(buffer);
920 		return 0;
921 	}
922 
923 	free(buffer);
924 
925 	if (cookie_len == resultlength &&
926 	    memcmp(result, cookie, resultlength) == 0)
927 		return 1;
928 
929 	return 0;
930 }
931