fix style issues
[openssl.git] / apps / s_cb.c
1 /*
2  * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
3  *
4  * Licensed under the OpenSSL license (the "License").  You may not use
5  * this file except in compliance with the License.  You can obtain a copy
6  * in the file LICENSE in the source distribution or at
7  * https://www.openssl.org/source/license.html
8  */
9
10 /* callback functions used by s_client, s_server, and s_time */
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h> /* for memcpy() and strcmp() */
14 #define USE_SOCKETS
15 #include "apps.h"
16 #undef USE_SOCKETS
17 #include <openssl/err.h>
18 #include <openssl/rand.h>
19 #include <openssl/x509.h>
20 #include <openssl/ssl.h>
21 #include <openssl/bn.h>
22 #ifndef OPENSSL_NO_DH
23 # include <openssl/dh.h>
24 #endif
25 #include "s_apps.h"
26
27 #define COOKIE_SECRET_LENGTH    16
28
29 VERIFY_CB_ARGS verify_args = { 0, 0, X509_V_OK, 0 };
30
31 #ifndef OPENSSL_NO_SOCK
32 static unsigned char cookie_secret[COOKIE_SECRET_LENGTH];
33 static int cookie_initialized = 0;
34 #endif
35
36 static const char *lookup(int val, const STRINT_PAIR* list, const char* def)
37 {
38     for ( ; list->name; ++list)
39         if (list->retval == val)
40             return list->name;
41     return def;
42 }
43
44 int verify_callback(int ok, X509_STORE_CTX *ctx)
45 {
46     X509 *err_cert;
47     int err, depth;
48
49     err_cert = X509_STORE_CTX_get_current_cert(ctx);
50     err = X509_STORE_CTX_get_error(ctx);
51     depth = X509_STORE_CTX_get_error_depth(ctx);
52
53     if (!verify_args.quiet || !ok) {
54         BIO_printf(bio_err, "depth=%d ", depth);
55         if (err_cert) {
56             X509_NAME_print_ex(bio_err,
57                                X509_get_subject_name(err_cert),
58                                0, XN_FLAG_ONELINE);
59             BIO_puts(bio_err, "\n");
60         } else
61             BIO_puts(bio_err, "<no cert>\n");
62     }
63     if (!ok) {
64         BIO_printf(bio_err, "verify error:num=%d:%s\n", err,
65                    X509_verify_cert_error_string(err));
66         if (verify_args.depth >= depth) {
67             if (!verify_args.return_error)
68                 ok = 1;
69             verify_args.error = err;
70         } else {
71             ok = 0;
72             verify_args.error = X509_V_ERR_CERT_CHAIN_TOO_LONG;
73         }
74     }
75     switch (err) {
76     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
77         BIO_puts(bio_err, "issuer= ");
78         X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert),
79                            0, XN_FLAG_ONELINE);
80         BIO_puts(bio_err, "\n");
81         break;
82     case X509_V_ERR_CERT_NOT_YET_VALID:
83     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
84         BIO_printf(bio_err, "notBefore=");
85         ASN1_TIME_print(bio_err, X509_get0_notBefore(err_cert));
86         BIO_printf(bio_err, "\n");
87         break;
88     case X509_V_ERR_CERT_HAS_EXPIRED:
89     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
90         BIO_printf(bio_err, "notAfter=");
91         ASN1_TIME_print(bio_err, X509_get0_notAfter(err_cert));
92         BIO_printf(bio_err, "\n");
93         break;
94     case X509_V_ERR_NO_EXPLICIT_POLICY:
95         if (!verify_args.quiet)
96             policies_print(ctx);
97         break;
98     }
99     if (err == X509_V_OK && ok == 2 && !verify_args.quiet)
100         policies_print(ctx);
101     if (ok && !verify_args.quiet)
102         BIO_printf(bio_err, "verify return:%d\n", ok);
103     return (ok);
104 }
105
106 int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file)
107 {
108     if (cert_file != NULL) {
109         if (SSL_CTX_use_certificate_file(ctx, cert_file,
110                                          SSL_FILETYPE_PEM) <= 0) {
111             BIO_printf(bio_err, "unable to get certificate from '%s'\n",
112                        cert_file);
113             ERR_print_errors(bio_err);
114             return (0);
115         }
116         if (key_file == NULL)
117             key_file = cert_file;
118         if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) {
119             BIO_printf(bio_err, "unable to get private key from '%s'\n",
120                        key_file);
121             ERR_print_errors(bio_err);
122             return (0);
123         }
124
125         /*
126          * If we are using DSA, we can copy the parameters from the private
127          * key
128          */
129
130         /*
131          * Now we know that a key and cert have been set against the SSL
132          * context
133          */
134         if (!SSL_CTX_check_private_key(ctx)) {
135             BIO_printf(bio_err,
136                        "Private key does not match the certificate public key\n");
137             return (0);
138         }
139     }
140     return (1);
141 }
142
143 int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key,
144                        STACK_OF(X509) *chain, int build_chain)
145 {
146     int chflags = chain ? SSL_BUILD_CHAIN_FLAG_CHECK : 0;
147     if (cert == NULL)
148         return 1;
149     if (SSL_CTX_use_certificate(ctx, cert) <= 0) {
150         BIO_printf(bio_err, "error setting certificate\n");
151         ERR_print_errors(bio_err);
152         return 0;
153     }
154
155     if (SSL_CTX_use_PrivateKey(ctx, key) <= 0) {
156         BIO_printf(bio_err, "error setting private key\n");
157         ERR_print_errors(bio_err);
158         return 0;
159     }
160
161     /*
162      * Now we know that a key and cert have been set against the SSL context
163      */
164     if (!SSL_CTX_check_private_key(ctx)) {
165         BIO_printf(bio_err,
166                    "Private key does not match the certificate public key\n");
167         return 0;
168     }
169     if (chain && !SSL_CTX_set1_chain(ctx, chain)) {
170         BIO_printf(bio_err, "error setting certificate chain\n");
171         ERR_print_errors(bio_err);
172         return 0;
173     }
174     if (build_chain && !SSL_CTX_build_cert_chain(ctx, chflags)) {
175         BIO_printf(bio_err, "error building certificate chain\n");
176         ERR_print_errors(bio_err);
177         return 0;
178     }
179     return 1;
180 }
181
182 static STRINT_PAIR cert_type_list[] = {
183     {"RSA sign", TLS_CT_RSA_SIGN},
184     {"DSA sign", TLS_CT_DSS_SIGN},
185     {"RSA fixed DH", TLS_CT_RSA_FIXED_DH},
186     {"DSS fixed DH", TLS_CT_DSS_FIXED_DH},
187     {"ECDSA sign", TLS_CT_ECDSA_SIGN},
188     {"RSA fixed ECDH", TLS_CT_RSA_FIXED_ECDH},
189     {"ECDSA fixed ECDH", TLS_CT_ECDSA_FIXED_ECDH},
190     {"GOST01 Sign", TLS_CT_GOST01_SIGN},
191     {NULL}
192 };
193
194 static void ssl_print_client_cert_types(BIO *bio, SSL *s)
195 {
196     const unsigned char *p;
197     int i;
198     int cert_type_num = SSL_get0_certificate_types(s, &p);
199     if (!cert_type_num)
200         return;
201     BIO_puts(bio, "Client Certificate Types: ");
202     for (i = 0; i < cert_type_num; i++) {
203         unsigned char cert_type = p[i];
204         const char *cname = lookup((int)cert_type, cert_type_list, NULL);
205
206         if (i)
207             BIO_puts(bio, ", ");
208         if (cname)
209             BIO_puts(bio, cname);
210         else
211             BIO_printf(bio, "UNKNOWN (%d),", cert_type);
212     }
213     BIO_puts(bio, "\n");
214 }
215
216 static const char *get_sigtype(int nid)
217 {
218     switch (nid) {
219     case EVP_PKEY_RSA:
220         return "RSA";
221
222     case EVP_PKEY_RSA_PSS:
223         return "RSA-PSS";
224
225     case EVP_PKEY_DSA:
226         return "DSA";
227
228      case EVP_PKEY_EC:
229         return "ECDSA";
230
231     default:
232         return NULL;
233     }
234 }
235
236 static int do_print_sigalgs(BIO *out, SSL *s, int shared)
237 {
238     int i, nsig, client;
239     client = SSL_is_server(s) ? 0 : 1;
240     if (shared)
241         nsig = SSL_get_shared_sigalgs(s, -1, NULL, NULL, NULL, NULL, NULL);
242     else
243         nsig = SSL_get_sigalgs(s, -1, NULL, NULL, NULL, NULL, NULL);
244     if (nsig == 0)
245         return 1;
246
247     if (shared)
248         BIO_puts(out, "Shared ");
249
250     if (client)
251         BIO_puts(out, "Requested ");
252     BIO_puts(out, "Signature Algorithms: ");
253     for (i = 0; i < nsig; i++) {
254         int hash_nid, sign_nid;
255         unsigned char rhash, rsign;
256         const char *sstr = NULL;
257         if (shared)
258             SSL_get_shared_sigalgs(s, i, &sign_nid, &hash_nid, NULL,
259                                    &rsign, &rhash);
260         else
261             SSL_get_sigalgs(s, i, &sign_nid, &hash_nid, NULL, &rsign, &rhash);
262         if (i)
263             BIO_puts(out, ":");
264         sstr = get_sigtype(sign_nid);
265         if (sstr)
266             BIO_printf(out, "%s+", sstr);
267         else
268             BIO_printf(out, "0x%02X+", (int)rsign);
269         if (hash_nid != NID_undef)
270             BIO_printf(out, "%s", OBJ_nid2sn(hash_nid));
271         else
272             BIO_printf(out, "0x%02X", (int)rhash);
273     }
274     BIO_puts(out, "\n");
275     return 1;
276 }
277
278 int ssl_print_sigalgs(BIO *out, SSL *s)
279 {
280     int nid;
281     if (!SSL_is_server(s))
282         ssl_print_client_cert_types(out, s);
283     do_print_sigalgs(out, s, 0);
284     do_print_sigalgs(out, s, 1);
285     if (SSL_get_peer_signature_nid(s, &nid))
286         BIO_printf(out, "Peer signing digest: %s\n", OBJ_nid2sn(nid));
287     if (SSL_get_peer_signature_type_nid(s, &nid))
288         BIO_printf(bio_err, "Peer signature type: %s\n", get_sigtype(nid));
289     return 1;
290 }
291
292 #ifndef OPENSSL_NO_EC
293 int ssl_print_point_formats(BIO *out, SSL *s)
294 {
295     int i, nformats;
296     const char *pformats;
297     nformats = SSL_get0_ec_point_formats(s, &pformats);
298     if (nformats <= 0)
299         return 1;
300     BIO_puts(out, "Supported Elliptic Curve Point Formats: ");
301     for (i = 0; i < nformats; i++, pformats++) {
302         if (i)
303             BIO_puts(out, ":");
304         switch (*pformats) {
305         case TLSEXT_ECPOINTFORMAT_uncompressed:
306             BIO_puts(out, "uncompressed");
307             break;
308
309         case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime:
310             BIO_puts(out, "ansiX962_compressed_prime");
311             break;
312
313         case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2:
314             BIO_puts(out, "ansiX962_compressed_char2");
315             break;
316
317         default:
318             BIO_printf(out, "unknown(%d)", (int)*pformats);
319             break;
320
321         }
322     }
323     BIO_puts(out, "\n");
324     return 1;
325 }
326
327 int ssl_print_groups(BIO *out, SSL *s, int noshared)
328 {
329     int i, ngroups, *groups, nid;
330     const char *gname;
331
332     ngroups = SSL_get1_groups(s, NULL);
333     if (ngroups <= 0)
334         return 1;
335     groups = app_malloc(ngroups * sizeof(int), "groups to print");
336     SSL_get1_groups(s, groups);
337
338     BIO_puts(out, "Supported Elliptic Groups: ");
339     for (i = 0; i < ngroups; i++) {
340         if (i)
341             BIO_puts(out, ":");
342         nid = groups[i];
343         /* If unrecognised print out hex version */
344         if (nid & TLSEXT_nid_unknown)
345             BIO_printf(out, "0x%04X", nid & 0xFFFF);
346         else {
347             /* TODO(TLS1.3): Get group name here */
348             /* Use NIST name for curve if it exists */
349             gname = EC_curve_nid2nist(nid);
350             if (!gname)
351                 gname = OBJ_nid2sn(nid);
352             BIO_printf(out, "%s", gname);
353         }
354     }
355     OPENSSL_free(groups);
356     if (noshared) {
357         BIO_puts(out, "\n");
358         return 1;
359     }
360     BIO_puts(out, "\nShared Elliptic groups: ");
361     ngroups = SSL_get_shared_group(s, -1);
362     for (i = 0; i < ngroups; i++) {
363         if (i)
364             BIO_puts(out, ":");
365         nid = SSL_get_shared_group(s, i);
366         /* TODO(TLS1.3): Convert for DH groups */
367         gname = EC_curve_nid2nist(nid);
368         if (!gname)
369             gname = OBJ_nid2sn(nid);
370         BIO_printf(out, "%s", gname);
371     }
372     if (ngroups == 0)
373         BIO_puts(out, "NONE");
374     BIO_puts(out, "\n");
375     return 1;
376 }
377 #endif
378 int ssl_print_tmp_key(BIO *out, SSL *s)
379 {
380     EVP_PKEY *key;
381     if (!SSL_get_server_tmp_key(s, &key))
382         return 1;
383     BIO_puts(out, "Server Temp Key: ");
384     switch (EVP_PKEY_id(key)) {
385     case EVP_PKEY_RSA:
386         BIO_printf(out, "RSA, %d bits\n", EVP_PKEY_bits(key));
387         break;
388
389     case EVP_PKEY_DH:
390         BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key));
391         break;
392 #ifndef OPENSSL_NO_EC
393     case EVP_PKEY_EC:
394         {
395             EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
396             int nid;
397             const char *cname;
398             nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
399             EC_KEY_free(ec);
400             cname = EC_curve_nid2nist(nid);
401             if (!cname)
402                 cname = OBJ_nid2sn(nid);
403             BIO_printf(out, "ECDH, %s, %d bits\n", cname, EVP_PKEY_bits(key));
404         }
405     break;
406 #endif
407     default:
408         BIO_printf(out, "%s, %d bits\n", OBJ_nid2sn(EVP_PKEY_id(key)),
409                    EVP_PKEY_bits(key));
410     }
411     EVP_PKEY_free(key);
412     return 1;
413 }
414
415 long bio_dump_callback(BIO *bio, int cmd, const char *argp,
416                        int argi, long argl, long ret)
417 {
418     BIO *out;
419
420     out = (BIO *)BIO_get_callback_arg(bio);
421     if (out == NULL)
422         return (ret);
423
424     if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) {
425         BIO_printf(out, "read from %p [%p] (%lu bytes => %ld (0x%lX))\n",
426                    (void *)bio, (void *)argp, (unsigned long)argi, ret, ret);
427         BIO_dump(out, argp, (int)ret);
428         return (ret);
429     } else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) {
430         BIO_printf(out, "write to %p [%p] (%lu bytes => %ld (0x%lX))\n",
431                    (void *)bio, (void *)argp, (unsigned long)argi, ret, ret);
432         BIO_dump(out, argp, (int)ret);
433     }
434     return (ret);
435 }
436
437 void apps_ssl_info_callback(const SSL *s, int where, int ret)
438 {
439     const char *str;
440     int w;
441
442     w = where & ~SSL_ST_MASK;
443
444     if (w & SSL_ST_CONNECT)
445         str = "SSL_connect";
446     else if (w & SSL_ST_ACCEPT)
447         str = "SSL_accept";
448     else
449         str = "undefined";
450
451     if (where & SSL_CB_LOOP) {
452         BIO_printf(bio_err, "%s:%s\n", str, SSL_state_string_long(s));
453     } else if (where & SSL_CB_ALERT) {
454         str = (where & SSL_CB_READ) ? "read" : "write";
455         BIO_printf(bio_err, "SSL3 alert %s:%s:%s\n",
456                    str,
457                    SSL_alert_type_string_long(ret),
458                    SSL_alert_desc_string_long(ret));
459     } else if (where & SSL_CB_EXIT) {
460         if (ret == 0)
461             BIO_printf(bio_err, "%s:failed in %s\n",
462                        str, SSL_state_string_long(s));
463         else if (ret < 0) {
464             BIO_printf(bio_err, "%s:error in %s\n",
465                        str, SSL_state_string_long(s));
466         }
467     }
468 }
469
470 static STRINT_PAIR ssl_versions[] = {
471     {"SSL 3.0", SSL3_VERSION},
472     {"TLS 1.0", TLS1_VERSION},
473     {"TLS 1.1", TLS1_1_VERSION},
474     {"TLS 1.2", TLS1_2_VERSION},
475     {"TLS 1.3", TLS1_3_VERSION},
476     {"DTLS 1.0", DTLS1_VERSION},
477     {"DTLS 1.0 (bad)", DTLS1_BAD_VER},
478     {NULL}
479 };
480 static STRINT_PAIR alert_types[] = {
481     {" close_notify", 0},
482     {" unexpected_message", 10},
483     {" bad_record_mac", 20},
484     {" decryption_failed", 21},
485     {" record_overflow", 22},
486     {" decompression_failure", 30},
487     {" handshake_failure", 40},
488     {" bad_certificate", 42},
489     {" unsupported_certificate", 43},
490     {" certificate_revoked", 44},
491     {" certificate_expired", 45},
492     {" certificate_unknown", 46},
493     {" illegal_parameter", 47},
494     {" unknown_ca", 48},
495     {" access_denied", 49},
496     {" decode_error", 50},
497     {" decrypt_error", 51},
498     {" export_restriction", 60},
499     {" protocol_version", 70},
500     {" insufficient_security", 71},
501     {" internal_error", 80},
502     {" user_canceled", 90},
503     {" no_renegotiation", 100},
504     {" unsupported_extension", 110},
505     {" certificate_unobtainable", 111},
506     {" unrecognized_name", 112},
507     {" bad_certificate_status_response", 113},
508     {" bad_certificate_hash_value", 114},
509     {" unknown_psk_identity", 115},
510     {NULL}
511 };
512
513 static STRINT_PAIR handshakes[] = {
514     {", HelloRequest", 0},
515     {", ClientHello", 1},
516     {", ServerHello", 2},
517     {", HelloVerifyRequest", 3},
518     {", NewSessionTicket", 4},
519     {", Certificate", 11},
520     {", ServerKeyExchange", 12},
521     {", CertificateRequest", 13},
522     {", ServerHelloDone", 14},
523     {", CertificateVerify", 15},
524     {", ClientKeyExchange", 16},
525     {", Finished", 20},
526     {", CertificateUrl", 21},
527     {", CertificateStatus", 22},
528     {", SupplementalData", 23},
529     {NULL}
530 };
531
532 void msg_cb(int write_p, int version, int content_type, const void *buf,
533             size_t len, SSL *ssl, void *arg)
534 {
535     BIO *bio = arg;
536     const char *str_write_p = write_p ? ">>>" : "<<<";
537     const char *str_version = lookup(version, ssl_versions, "???");
538     const char *str_content_type = "", *str_details1 = "", *str_details2 = "";
539     const unsigned char* bp = buf;
540
541     if (version == SSL3_VERSION ||
542         version == TLS1_VERSION ||
543         version == TLS1_1_VERSION ||
544         version == TLS1_2_VERSION ||
545         version == TLS1_3_VERSION ||
546         version == DTLS1_VERSION || version == DTLS1_BAD_VER) {
547         switch (content_type) {
548         case 20:
549             str_content_type = "ChangeCipherSpec";
550             break;
551         case 21:
552             str_content_type = "Alert";
553             str_details1 = ", ???";
554             if (len == 2) {
555                 switch (bp[0]) {
556                 case 1:
557                     str_details1 = ", warning";
558                     break;
559                 case 2:
560                     str_details1 = ", fatal";
561                     break;
562                 }
563                 str_details2 = lookup((int)bp[1], alert_types, " ???");
564             }
565             break;
566         case 22:
567             str_content_type = "Handshake";
568             str_details1 = "???";
569             if (len > 0)
570                 str_details1 = lookup((int)bp[0], handshakes, "???");
571             break;
572         case 23:
573             str_content_type = "ApplicationData";
574             break;
575 #ifndef OPENSSL_NO_HEARTBEATS
576         case 24:
577             str_details1 = ", Heartbeat";
578
579             if (len > 0) {
580                 switch (bp[0]) {
581                 case 1:
582                     str_details1 = ", HeartbeatRequest";
583                     break;
584                 case 2:
585                     str_details1 = ", HeartbeatResponse";
586                     break;
587                 }
588             }
589             break;
590 #endif
591         }
592     }
593
594     BIO_printf(bio, "%s %s%s [length %04lx]%s%s\n", str_write_p, str_version,
595                str_content_type, (unsigned long)len, str_details1,
596                str_details2);
597
598     if (len > 0) {
599         size_t num, i;
600
601         BIO_printf(bio, "   ");
602         num = len;
603         for (i = 0; i < num; i++) {
604             if (i % 16 == 0 && i > 0)
605                 BIO_printf(bio, "\n   ");
606             BIO_printf(bio, " %02x", ((const unsigned char *)buf)[i]);
607         }
608         if (i < len)
609             BIO_printf(bio, " ...");
610         BIO_printf(bio, "\n");
611     }
612     (void)BIO_flush(bio);
613 }
614
615 static STRINT_PAIR tlsext_types[] = {
616     {"server name", TLSEXT_TYPE_server_name},
617     {"max fragment length", TLSEXT_TYPE_max_fragment_length},
618     {"client certificate URL", TLSEXT_TYPE_client_certificate_url},
619     {"trusted CA keys", TLSEXT_TYPE_trusted_ca_keys},
620     {"truncated HMAC", TLSEXT_TYPE_truncated_hmac},
621     {"status request", TLSEXT_TYPE_status_request},
622     {"user mapping", TLSEXT_TYPE_user_mapping},
623     {"client authz", TLSEXT_TYPE_client_authz},
624     {"server authz", TLSEXT_TYPE_server_authz},
625     {"cert type", TLSEXT_TYPE_cert_type},
626     {"supported_groups", TLSEXT_TYPE_supported_groups},
627     {"EC point formats", TLSEXT_TYPE_ec_point_formats},
628     {"SRP", TLSEXT_TYPE_srp},
629     {"signature algorithms", TLSEXT_TYPE_signature_algorithms},
630     {"use SRTP", TLSEXT_TYPE_use_srtp},
631     {"heartbeat", TLSEXT_TYPE_heartbeat},
632     {"session ticket", TLSEXT_TYPE_session_ticket},
633     {"renegotiation info", TLSEXT_TYPE_renegotiate},
634     {"signed certificate timestamps", TLSEXT_TYPE_signed_certificate_timestamp},
635     {"TLS padding", TLSEXT_TYPE_padding},
636 #ifdef TLSEXT_TYPE_next_proto_neg
637     {"next protocol", TLSEXT_TYPE_next_proto_neg},
638 #endif
639 #ifdef TLSEXT_TYPE_encrypt_then_mac
640     {"encrypt-then-mac", TLSEXT_TYPE_encrypt_then_mac},
641 #endif
642 #ifdef TLSEXT_TYPE_application_layer_protocol_negotiation
643     {"application layer protocol negotiation",
644      TLSEXT_TYPE_application_layer_protocol_negotiation},
645 #endif
646 #ifdef TLSEXT_TYPE_extended_master_secret
647     {"extended master secret", TLSEXT_TYPE_extended_master_secret},
648 #endif
649     {NULL}
650 };
651
652 void tlsext_cb(SSL *s, int client_server, int type,
653                const unsigned char *data, int len, void *arg)
654 {
655     BIO *bio = arg;
656     const char *extname = lookup(type, tlsext_types, "unknown");
657
658     BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n",
659                client_server ? "server" : "client", extname, type, len);
660     BIO_dump(bio, (const char *)data, len);
661     (void)BIO_flush(bio);
662 }
663
664 #ifndef OPENSSL_NO_SOCK
665 int generate_cookie_callback(SSL *ssl, unsigned char *cookie,
666                              unsigned int *cookie_len)
667 {
668     unsigned char *buffer;
669     size_t length;
670     unsigned short port;
671     BIO_ADDR *peer = NULL;
672
673     /* Initialize a random secret */
674     if (!cookie_initialized) {
675         if (RAND_bytes(cookie_secret, COOKIE_SECRET_LENGTH) <= 0) {
676             BIO_printf(bio_err, "error setting random cookie secret\n");
677             return 0;
678         }
679         cookie_initialized = 1;
680     }
681
682     peer = BIO_ADDR_new();
683     if (peer == NULL) {
684         BIO_printf(bio_err, "memory full\n");
685         return 0;
686     }
687
688     /* Read peer information */
689     (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), peer);
690
691     /* Create buffer with peer's address and port */
692     BIO_ADDR_rawaddress(peer, NULL, &length);
693     OPENSSL_assert(length != 0);
694     port = BIO_ADDR_rawport(peer);
695     length += sizeof(port);
696     buffer = app_malloc(length, "cookie generate buffer");
697
698     memcpy(buffer, &port, sizeof(port));
699     BIO_ADDR_rawaddress(peer, buffer + sizeof(port), NULL);
700
701     /* Calculate HMAC of buffer using the secret */
702     HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH,
703          buffer, length, cookie, cookie_len);
704
705     OPENSSL_free(buffer);
706     BIO_ADDR_free(peer);
707
708     return 1;
709 }
710
711 int verify_cookie_callback(SSL *ssl, const unsigned char *cookie,
712                            unsigned int cookie_len)
713 {
714     unsigned char result[EVP_MAX_MD_SIZE];
715     unsigned int resultlength;
716
717     /* Note: we check cookie_initialized because if it's not,
718      * it cannot be valid */
719     if (cookie_initialized
720         && generate_cookie_callback(ssl, result, &resultlength)
721         && cookie_len == resultlength
722         && memcmp(result, cookie, resultlength) == 0)
723         return 1;
724
725     return 0;
726 }
727 #endif
728
729 /*
730  * Example of extended certificate handling. Where the standard support of
731  * one certificate per algorithm is not sufficient an application can decide
732  * which certificate(s) to use at runtime based on whatever criteria it deems
733  * appropriate.
734  */
735
736 /* Linked list of certificates, keys and chains */
737 struct ssl_excert_st {
738     int certform;
739     const char *certfile;
740     int keyform;
741     const char *keyfile;
742     const char *chainfile;
743     X509 *cert;
744     EVP_PKEY *key;
745     STACK_OF(X509) *chain;
746     int build_chain;
747     struct ssl_excert_st *next, *prev;
748 };
749
750 static STRINT_PAIR chain_flags[] = {
751     {"Overall Validity", CERT_PKEY_VALID},
752     {"Sign with EE key", CERT_PKEY_SIGN},
753     {"EE signature", CERT_PKEY_EE_SIGNATURE},
754     {"CA signature", CERT_PKEY_CA_SIGNATURE},
755     {"EE key parameters", CERT_PKEY_EE_PARAM},
756     {"CA key parameters", CERT_PKEY_CA_PARAM},
757     {"Explicitly sign with EE key", CERT_PKEY_EXPLICIT_SIGN},
758     {"Issuer Name", CERT_PKEY_ISSUER_NAME},
759     {"Certificate Type", CERT_PKEY_CERT_TYPE},
760     {NULL}
761 };
762
763 static void print_chain_flags(SSL *s, int flags)
764 {
765     STRINT_PAIR *pp;
766
767     for (pp = chain_flags; pp->name; ++pp)
768         BIO_printf(bio_err, "\t%s: %s\n",
769                    pp->name,
770                    (flags & pp->retval) ? "OK" : "NOT OK");
771     BIO_printf(bio_err, "\tSuite B: ");
772     if (SSL_set_cert_flags(s, 0) & SSL_CERT_FLAG_SUITEB_128_LOS)
773         BIO_puts(bio_err, flags & CERT_PKEY_SUITEB ? "OK\n" : "NOT OK\n");
774     else
775         BIO_printf(bio_err, "not tested\n");
776 }
777
778 /*
779  * Very basic selection callback: just use any certificate chain reported as
780  * valid. More sophisticated could prioritise according to local policy.
781  */
782 static int set_cert_cb(SSL *ssl, void *arg)
783 {
784     int i, rv;
785     SSL_EXCERT *exc = arg;
786 #ifdef CERT_CB_TEST_RETRY
787     static int retry_cnt;
788     if (retry_cnt < 5) {
789         retry_cnt++;
790         BIO_printf(bio_err,
791                    "Certificate callback retry test: count %d\n",
792                    retry_cnt);
793         return -1;
794     }
795 #endif
796     SSL_certs_clear(ssl);
797
798     if (!exc)
799         return 1;
800
801     /*
802      * Go to end of list and traverse backwards since we prepend newer
803      * entries this retains the original order.
804      */
805     while (exc->next)
806         exc = exc->next;
807
808     i = 0;
809
810     while (exc) {
811         i++;
812         rv = SSL_check_chain(ssl, exc->cert, exc->key, exc->chain);
813         BIO_printf(bio_err, "Checking cert chain %d:\nSubject: ", i);
814         X509_NAME_print_ex(bio_err, X509_get_subject_name(exc->cert), 0,
815                            XN_FLAG_ONELINE);
816         BIO_puts(bio_err, "\n");
817         print_chain_flags(ssl, rv);
818         if (rv & CERT_PKEY_VALID) {
819             if (!SSL_use_certificate(ssl, exc->cert)
820                     || !SSL_use_PrivateKey(ssl, exc->key)) {
821                 return 0;
822             }
823             /*
824              * NB: we wouldn't normally do this as it is not efficient
825              * building chains on each connection better to cache the chain
826              * in advance.
827              */
828             if (exc->build_chain) {
829                 if (!SSL_build_cert_chain(ssl, 0))
830                     return 0;
831             } else if (exc->chain)
832                 SSL_set1_chain(ssl, exc->chain);
833         }
834         exc = exc->prev;
835     }
836     return 1;
837 }
838
839 void ssl_ctx_set_excert(SSL_CTX *ctx, SSL_EXCERT *exc)
840 {
841     SSL_CTX_set_cert_cb(ctx, set_cert_cb, exc);
842 }
843
844 static int ssl_excert_prepend(SSL_EXCERT **pexc)
845 {
846     SSL_EXCERT *exc = app_malloc(sizeof(*exc), "prepend cert");
847
848     memset(exc, 0, sizeof(*exc));
849
850     exc->next = *pexc;
851     *pexc = exc;
852
853     if (exc->next) {
854         exc->certform = exc->next->certform;
855         exc->keyform = exc->next->keyform;
856         exc->next->prev = exc;
857     } else {
858         exc->certform = FORMAT_PEM;
859         exc->keyform = FORMAT_PEM;
860     }
861     return 1;
862
863 }
864
865 void ssl_excert_free(SSL_EXCERT *exc)
866 {
867     SSL_EXCERT *curr;
868
869     if (!exc)
870         return;
871     while (exc) {
872         X509_free(exc->cert);
873         EVP_PKEY_free(exc->key);
874         sk_X509_pop_free(exc->chain, X509_free);
875         curr = exc;
876         exc = exc->next;
877         OPENSSL_free(curr);
878     }
879 }
880
881 int load_excert(SSL_EXCERT **pexc)
882 {
883     SSL_EXCERT *exc = *pexc;
884     if (!exc)
885         return 1;
886     /* If nothing in list, free and set to NULL */
887     if (!exc->certfile && !exc->next) {
888         ssl_excert_free(exc);
889         *pexc = NULL;
890         return 1;
891     }
892     for (; exc; exc = exc->next) {
893         if (!exc->certfile) {
894             BIO_printf(bio_err, "Missing filename\n");
895             return 0;
896         }
897         exc->cert = load_cert(exc->certfile, exc->certform,
898                               "Server Certificate");
899         if (!exc->cert)
900             return 0;
901         if (exc->keyfile) {
902             exc->key = load_key(exc->keyfile, exc->keyform,
903                                 0, NULL, NULL, "Server Key");
904         } else {
905             exc->key = load_key(exc->certfile, exc->certform,
906                                 0, NULL, NULL, "Server Key");
907         }
908         if (!exc->key)
909             return 0;
910         if (exc->chainfile) {
911             if (!load_certs(exc->chainfile, &exc->chain, FORMAT_PEM, NULL,
912                             "Server Chain"))
913                 return 0;
914         }
915     }
916     return 1;
917 }
918
919 enum range { OPT_X_ENUM };
920
921 int args_excert(int opt, SSL_EXCERT **pexc)
922 {
923     SSL_EXCERT *exc = *pexc;
924
925     assert(opt > OPT_X__FIRST);
926     assert(opt < OPT_X__LAST);
927
928     if (exc == NULL) {
929         if (!ssl_excert_prepend(&exc)) {
930             BIO_printf(bio_err, " %s: Error initialising xcert\n",
931                        opt_getprog());
932             goto err;
933         }
934         *pexc = exc;
935     }
936
937     switch ((enum range)opt) {
938     case OPT_X__FIRST:
939     case OPT_X__LAST:
940         return 0;
941     case OPT_X_CERT:
942         if (exc->certfile && !ssl_excert_prepend(&exc)) {
943             BIO_printf(bio_err, "%s: Error adding xcert\n", opt_getprog());
944             goto err;
945         }
946         exc->certfile = opt_arg();
947         break;
948     case OPT_X_KEY:
949         if (exc->keyfile) {
950             BIO_printf(bio_err, "%s: Key already specified\n", opt_getprog());
951             goto err;
952         }
953         exc->keyfile = opt_arg();
954         break;
955     case OPT_X_CHAIN:
956         if (exc->chainfile) {
957             BIO_printf(bio_err, "%s: Chain already specified\n",
958                        opt_getprog());
959             goto err;
960         }
961         exc->chainfile = opt_arg();
962         break;
963     case OPT_X_CHAIN_BUILD:
964         exc->build_chain = 1;
965         break;
966     case OPT_X_CERTFORM:
967         if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->certform))
968             return 0;
969         break;
970     case OPT_X_KEYFORM:
971         if (!opt_format(opt_arg(), OPT_FMT_PEMDER, &exc->keyform))
972             return 0;
973         break;
974     }
975     return 1;
976
977  err:
978     ERR_print_errors(bio_err);
979     ssl_excert_free(exc);
980     *pexc = NULL;
981     return 0;
982 }
983
984 static void print_raw_cipherlist(SSL *s)
985 {
986     const unsigned char *rlist;
987     static const unsigned char scsv_id[] = { 0, 0xFF };
988     size_t i, rlistlen, num;
989     if (!SSL_is_server(s))
990         return;
991     num = SSL_get0_raw_cipherlist(s, NULL);
992     OPENSSL_assert(num == 2);
993     rlistlen = SSL_get0_raw_cipherlist(s, &rlist);
994     BIO_puts(bio_err, "Client cipher list: ");
995     for (i = 0; i < rlistlen; i += num, rlist += num) {
996         const SSL_CIPHER *c = SSL_CIPHER_find(s, rlist);
997         if (i)
998             BIO_puts(bio_err, ":");
999         if (c)
1000             BIO_puts(bio_err, SSL_CIPHER_get_name(c));
1001         else if (!memcmp(rlist, scsv_id, num))
1002             BIO_puts(bio_err, "SCSV");
1003         else {
1004             size_t j;
1005             BIO_puts(bio_err, "0x");
1006             for (j = 0; j < num; j++)
1007                 BIO_printf(bio_err, "%02X", rlist[j]);
1008         }
1009     }
1010     BIO_puts(bio_err, "\n");
1011 }
1012
1013 /*
1014  * Hex encoder for TLSA RRdata, not ':' delimited.
1015  */
1016 static char *hexencode(const unsigned char *data, size_t len)
1017 {
1018     static const char *hex = "0123456789abcdef";
1019     char *out;
1020     char *cp;
1021     size_t outlen = 2 * len + 1;
1022     int ilen = (int) outlen;
1023
1024     if (outlen < len || ilen < 0 || outlen != (size_t)ilen) {
1025         BIO_printf(bio_err, "%s: %" PRIu64 "-byte buffer too large to hexencode\n",
1026                    opt_getprog(), (uint64_t)len);
1027         exit(1);
1028     }
1029     cp = out = app_malloc(ilen, "TLSA hex data buffer");
1030
1031     while (len-- > 0) {
1032         *cp++ = hex[(*data >> 4) & 0x0f];
1033         *cp++ = hex[*data++ & 0x0f];
1034     }
1035     *cp = '\0';
1036     return out;
1037 }
1038
1039 void print_verify_detail(SSL *s, BIO *bio)
1040 {
1041     int mdpth;
1042     EVP_PKEY *mspki;
1043     long verify_err = SSL_get_verify_result(s);
1044
1045     if (verify_err == X509_V_OK) {
1046         const char *peername = SSL_get0_peername(s);
1047
1048         BIO_printf(bio, "Verification: OK\n");
1049         if (peername != NULL)
1050             BIO_printf(bio, "Verified peername: %s\n", peername);
1051     } else {
1052         const char *reason = X509_verify_cert_error_string(verify_err);
1053
1054         BIO_printf(bio, "Verification error: %s\n", reason);
1055     }
1056
1057     if ((mdpth = SSL_get0_dane_authority(s, NULL, &mspki)) >= 0) {
1058         uint8_t usage, selector, mtype;
1059         const unsigned char *data = NULL;
1060         size_t dlen = 0;
1061         char *hexdata;
1062
1063         mdpth = SSL_get0_dane_tlsa(s, &usage, &selector, &mtype, &data, &dlen);
1064
1065         /*
1066          * The TLSA data field can be quite long when it is a certificate,
1067          * public key or even a SHA2-512 digest.  Because the initial octets of
1068          * ASN.1 certificates and public keys contain mostly boilerplate OIDs
1069          * and lengths, we show the last 12 bytes of the data instead, as these
1070          * are more likely to distinguish distinct TLSA records.
1071          */
1072 #define TLSA_TAIL_SIZE 12
1073         if (dlen > TLSA_TAIL_SIZE)
1074             hexdata = hexencode(data + dlen - TLSA_TAIL_SIZE, TLSA_TAIL_SIZE);
1075         else
1076             hexdata = hexencode(data, dlen);
1077         BIO_printf(bio, "DANE TLSA %d %d %d %s%s %s at depth %d\n",
1078                    usage, selector, mtype,
1079                    (dlen > TLSA_TAIL_SIZE) ? "..." : "", hexdata,
1080                    (mspki != NULL) ? "signed the certificate" :
1081                    mdpth ? "matched TA certificate" : "matched EE certificate",
1082                    mdpth);
1083         OPENSSL_free(hexdata);
1084     }
1085 }
1086
1087 void print_ssl_summary(SSL *s)
1088 {
1089     const SSL_CIPHER *c;
1090     X509 *peer;
1091     /* const char *pnam = SSL_is_server(s) ? "client" : "server"; */
1092
1093     BIO_printf(bio_err, "Protocol version: %s\n", SSL_get_version(s));
1094     print_raw_cipherlist(s);
1095     c = SSL_get_current_cipher(s);
1096     BIO_printf(bio_err, "Ciphersuite: %s\n", SSL_CIPHER_get_name(c));
1097     do_print_sigalgs(bio_err, s, 0);
1098     peer = SSL_get_peer_certificate(s);
1099     if (peer) {
1100         int nid;
1101
1102         BIO_puts(bio_err, "Peer certificate: ");
1103         X509_NAME_print_ex(bio_err, X509_get_subject_name(peer),
1104                            0, XN_FLAG_ONELINE);
1105         BIO_puts(bio_err, "\n");
1106         if (SSL_get_peer_signature_nid(s, &nid))
1107             BIO_printf(bio_err, "Hash used: %s\n", OBJ_nid2sn(nid));
1108         if (SSL_get_peer_signature_type_nid(s, &nid))
1109             BIO_printf(bio_err, "Signature type: %s\n", get_sigtype(nid));
1110         print_verify_detail(s, bio_err);
1111     } else
1112         BIO_puts(bio_err, "No peer certificate\n");
1113     X509_free(peer);
1114 #ifndef OPENSSL_NO_EC
1115     ssl_print_point_formats(bio_err, s);
1116     if (SSL_is_server(s))
1117         ssl_print_groups(bio_err, s, 1);
1118     else
1119         ssl_print_tmp_key(bio_err, s);
1120 #else
1121     if (!SSL_is_server(s))
1122         ssl_print_tmp_key(bio_err, s);
1123 #endif
1124 }
1125
1126 int config_ctx(SSL_CONF_CTX *cctx, STACK_OF(OPENSSL_STRING) *str,
1127                SSL_CTX *ctx)
1128 {
1129     int i;
1130
1131     SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
1132     for (i = 0; i < sk_OPENSSL_STRING_num(str); i += 2) {
1133         const char *flag = sk_OPENSSL_STRING_value(str, i);
1134         const char *arg = sk_OPENSSL_STRING_value(str, i + 1);
1135         if (SSL_CONF_cmd(cctx, flag, arg) <= 0) {
1136             if (arg)
1137                 BIO_printf(bio_err, "Error with command: \"%s %s\"\n",
1138                            flag, arg);
1139             else
1140                 BIO_printf(bio_err, "Error with command: \"%s\"\n", flag);
1141             ERR_print_errors(bio_err);
1142             return 0;
1143         }
1144     }
1145     if (!SSL_CONF_CTX_finish(cctx)) {
1146         BIO_puts(bio_err, "Error finishing context\n");
1147         ERR_print_errors(bio_err);
1148         return 0;
1149     }
1150     return 1;
1151 }
1152
1153 static int add_crls_store(X509_STORE *st, STACK_OF(X509_CRL) *crls)
1154 {
1155     X509_CRL *crl;
1156     int i;
1157     for (i = 0; i < sk_X509_CRL_num(crls); i++) {
1158         crl = sk_X509_CRL_value(crls, i);
1159         X509_STORE_add_crl(st, crl);
1160     }
1161     return 1;
1162 }
1163
1164 int ssl_ctx_add_crls(SSL_CTX *ctx, STACK_OF(X509_CRL) *crls, int crl_download)
1165 {
1166     X509_STORE *st;
1167     st = SSL_CTX_get_cert_store(ctx);
1168     add_crls_store(st, crls);
1169     if (crl_download)
1170         store_setup_crl_download(st);
1171     return 1;
1172 }
1173
1174 int ssl_load_stores(SSL_CTX *ctx,
1175                     const char *vfyCApath, const char *vfyCAfile,
1176                     const char *chCApath, const char *chCAfile,
1177                     STACK_OF(X509_CRL) *crls, int crl_download)
1178 {
1179     X509_STORE *vfy = NULL, *ch = NULL;
1180     int rv = 0;
1181     if (vfyCApath != NULL || vfyCAfile != NULL) {
1182         vfy = X509_STORE_new();
1183         if (vfy == NULL)
1184             goto err;
1185         if (!X509_STORE_load_locations(vfy, vfyCAfile, vfyCApath))
1186             goto err;
1187         add_crls_store(vfy, crls);
1188         SSL_CTX_set1_verify_cert_store(ctx, vfy);
1189         if (crl_download)
1190             store_setup_crl_download(vfy);
1191     }
1192     if (chCApath != NULL || chCAfile != NULL) {
1193         ch = X509_STORE_new();
1194         if (ch == NULL)
1195             goto err;
1196         if (!X509_STORE_load_locations(ch, chCAfile, chCApath))
1197             goto err;
1198         SSL_CTX_set1_chain_cert_store(ctx, ch);
1199     }
1200     rv = 1;
1201  err:
1202     X509_STORE_free(vfy);
1203     X509_STORE_free(ch);
1204     return rv;
1205 }
1206
1207 /* Verbose print out of security callback */
1208
1209 typedef struct {
1210     BIO *out;
1211     int verbose;
1212     int (*old_cb) (const SSL *s, const SSL_CTX *ctx, int op, int bits, int nid,
1213                    void *other, void *ex);
1214 } security_debug_ex;
1215
1216 static STRINT_PAIR callback_types[] = {
1217     {"Supported Ciphersuite", SSL_SECOP_CIPHER_SUPPORTED},
1218     {"Shared Ciphersuite", SSL_SECOP_CIPHER_SHARED},
1219     {"Check Ciphersuite", SSL_SECOP_CIPHER_CHECK},
1220 #ifndef OPENSSL_NO_DH
1221     {"Temp DH key bits", SSL_SECOP_TMP_DH},
1222 #endif
1223     {"Supported Curve", SSL_SECOP_CURVE_SUPPORTED},
1224     {"Shared Curve", SSL_SECOP_CURVE_SHARED},
1225     {"Check Curve", SSL_SECOP_CURVE_CHECK},
1226     {"Supported Signature Algorithm digest", SSL_SECOP_SIGALG_SUPPORTED},
1227     {"Shared Signature Algorithm digest", SSL_SECOP_SIGALG_SHARED},
1228     {"Check Signature Algorithm digest", SSL_SECOP_SIGALG_CHECK},
1229     {"Signature Algorithm mask", SSL_SECOP_SIGALG_MASK},
1230     {"Certificate chain EE key", SSL_SECOP_EE_KEY},
1231     {"Certificate chain CA key", SSL_SECOP_CA_KEY},
1232     {"Peer Chain EE key", SSL_SECOP_PEER_EE_KEY},
1233     {"Peer Chain CA key", SSL_SECOP_PEER_CA_KEY},
1234     {"Certificate chain CA digest", SSL_SECOP_CA_MD},
1235     {"Peer chain CA digest", SSL_SECOP_PEER_CA_MD},
1236     {"SSL compression", SSL_SECOP_COMPRESSION},
1237     {"Session ticket", SSL_SECOP_TICKET},
1238     {NULL}
1239 };
1240
1241 static int security_callback_debug(const SSL *s, const SSL_CTX *ctx,
1242                                    int op, int bits, int nid,
1243                                    void *other, void *ex)
1244 {
1245     security_debug_ex *sdb = ex;
1246     int rv, show_bits = 1, cert_md = 0;
1247     const char *nm;
1248     rv = sdb->old_cb(s, ctx, op, bits, nid, other, ex);
1249     if (rv == 1 && sdb->verbose < 2)
1250         return 1;
1251     BIO_puts(sdb->out, "Security callback: ");
1252
1253     nm = lookup(op, callback_types, NULL);
1254     switch (op) {
1255     case SSL_SECOP_TICKET:
1256     case SSL_SECOP_COMPRESSION:
1257         show_bits = 0;
1258         nm = NULL;
1259         break;
1260     case SSL_SECOP_VERSION:
1261         BIO_printf(sdb->out, "Version=%s", lookup(nid, ssl_versions, "???"));
1262         show_bits = 0;
1263         nm = NULL;
1264         break;
1265     case SSL_SECOP_CA_MD:
1266     case SSL_SECOP_PEER_CA_MD:
1267         cert_md = 1;
1268         break;
1269     }
1270     if (nm)
1271         BIO_printf(sdb->out, "%s=", nm);
1272
1273     switch (op & SSL_SECOP_OTHER_TYPE) {
1274
1275     case SSL_SECOP_OTHER_CIPHER:
1276         BIO_puts(sdb->out, SSL_CIPHER_get_name(other));
1277         break;
1278
1279 #ifndef OPENSSL_NO_EC
1280     case SSL_SECOP_OTHER_CURVE:
1281         {
1282             const char *cname;
1283             cname = EC_curve_nid2nist(nid);
1284             if (cname == NULL)
1285                 cname = OBJ_nid2sn(nid);
1286             BIO_puts(sdb->out, cname);
1287         }
1288         break;
1289 #endif
1290 #ifndef OPENSSL_NO_DH
1291     case SSL_SECOP_OTHER_DH:
1292         {
1293             DH *dh = other;
1294             BIO_printf(sdb->out, "%d", DH_bits(dh));
1295             break;
1296         }
1297 #endif
1298     case SSL_SECOP_OTHER_CERT:
1299         {
1300             if (cert_md) {
1301                 int sig_nid = X509_get_signature_nid(other);
1302                 BIO_puts(sdb->out, OBJ_nid2sn(sig_nid));
1303             } else {
1304                 EVP_PKEY *pkey = X509_get0_pubkey(other);
1305                 const char *algname = "";
1306                 EVP_PKEY_asn1_get0_info(NULL, NULL, NULL, NULL,
1307                                         &algname, EVP_PKEY_get0_asn1(pkey));
1308                 BIO_printf(sdb->out, "%s, bits=%d",
1309                            algname, EVP_PKEY_bits(pkey));
1310             }
1311             break;
1312         }
1313     case SSL_SECOP_OTHER_SIGALG:
1314         {
1315             const unsigned char *salg = other;
1316             const char *sname = NULL;
1317             switch (salg[1]) {
1318             case TLSEXT_signature_anonymous:
1319                 sname = "anonymous";
1320                 break;
1321             case TLSEXT_signature_rsa:
1322                 sname = "RSA";
1323                 break;
1324             case TLSEXT_signature_dsa:
1325                 sname = "DSA";
1326                 break;
1327             case TLSEXT_signature_ecdsa:
1328                 sname = "ECDSA";
1329                 break;
1330             }
1331
1332             BIO_puts(sdb->out, OBJ_nid2sn(nid));
1333             if (sname)
1334                 BIO_printf(sdb->out, ", algorithm=%s", sname);
1335             else
1336                 BIO_printf(sdb->out, ", algid=%d", salg[1]);
1337             break;
1338         }
1339
1340     }
1341
1342     if (show_bits)
1343         BIO_printf(sdb->out, ", security bits=%d", bits);
1344     BIO_printf(sdb->out, ": %s\n", rv ? "yes" : "no");
1345     return rv;
1346 }
1347
1348 void ssl_ctx_security_debug(SSL_CTX *ctx, int verbose)
1349 {
1350     static security_debug_ex sdb;
1351
1352     sdb.out = bio_err;
1353     sdb.verbose = verbose;
1354     sdb.old_cb = SSL_CTX_get_security_callback(ctx);
1355     SSL_CTX_set_security_callback(ctx, security_callback_debug);
1356     SSL_CTX_set0_security_ex_data(ctx, &sdb);
1357 }