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