Fix hostname validation in the command-line tool to honour negative return values.
[openssl.git] / apps / s_cb.c
1 /* apps/s_cb.c - callback functions used by s_client, s_server, and s_time */
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 <stdio.h>
113 #include <stdlib.h>
114 #define USE_SOCKETS
115 #define NON_MAIN
116 #include "apps.h"
117 #undef NON_MAIN
118 #undef USE_SOCKETS
119 #include <openssl/err.h>
120 #include <openssl/rand.h>
121 #include <openssl/x509.h>
122 #include <openssl/ssl.h>
123 #include "s_apps.h"
124
125 #define COOKIE_SECRET_LENGTH    16
126
127 int verify_depth = 0;
128 int verify_quiet = 0;
129 int verify_error = X509_V_OK;
130 int verify_return_error = 0;
131 unsigned char cookie_secret[COOKIE_SECRET_LENGTH];
132 int cookie_initialized = 0;
133
134 int MS_CALLBACK verify_callback(int ok, X509_STORE_CTX *ctx)
135 {
136     X509 *err_cert;
137     int err, depth;
138
139     err_cert = X509_STORE_CTX_get_current_cert(ctx);
140     err = X509_STORE_CTX_get_error(ctx);
141     depth = X509_STORE_CTX_get_error_depth(ctx);
142
143     if (!verify_quiet || !ok) {
144         BIO_printf(bio_err, "depth=%d ", depth);
145         if (err_cert) {
146             X509_NAME_print_ex(bio_err,
147                                X509_get_subject_name(err_cert),
148                                0, XN_FLAG_ONELINE);
149             BIO_puts(bio_err, "\n");
150         } else
151             BIO_puts(bio_err, "<no cert>\n");
152     }
153     if (!ok) {
154         BIO_printf(bio_err, "verify error:num=%d:%s\n", err,
155                    X509_verify_cert_error_string(err));
156         if (verify_depth >= depth) {
157             if (!verify_return_error)
158                 ok = 1;
159             verify_error = X509_V_OK;
160         } else {
161             ok = 0;
162             verify_error = X509_V_ERR_CERT_CHAIN_TOO_LONG;
163         }
164     }
165     switch (err) {
166     case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
167         BIO_puts(bio_err, "issuer= ");
168         X509_NAME_print_ex(bio_err, X509_get_issuer_name(err_cert),
169                            0, XN_FLAG_ONELINE);
170         BIO_puts(bio_err, "\n");
171         break;
172     case X509_V_ERR_CERT_NOT_YET_VALID:
173     case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
174         BIO_printf(bio_err, "notBefore=");
175         ASN1_TIME_print(bio_err, X509_get_notBefore(err_cert));
176         BIO_printf(bio_err, "\n");
177         break;
178     case X509_V_ERR_CERT_HAS_EXPIRED:
179     case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
180         BIO_printf(bio_err, "notAfter=");
181         ASN1_TIME_print(bio_err, X509_get_notAfter(err_cert));
182         BIO_printf(bio_err, "\n");
183         break;
184     case X509_V_ERR_NO_EXPLICIT_POLICY:
185         if (!verify_quiet)
186             policies_print(bio_err, ctx);
187         break;
188     }
189     if (err == X509_V_OK && ok == 2 && !verify_quiet)
190         policies_print(bio_err, ctx);
191     if (ok && !verify_quiet)
192         BIO_printf(bio_err, "verify return:%d\n", ok);
193     return (ok);
194 }
195
196 int set_cert_stuff(SSL_CTX *ctx, char *cert_file, char *key_file)
197 {
198     if (cert_file != NULL) {
199         /*-
200         SSL *ssl;
201         X509 *x509;
202         */
203
204         if (SSL_CTX_use_certificate_file(ctx, cert_file,
205                                          SSL_FILETYPE_PEM) <= 0) {
206             BIO_printf(bio_err, "unable to get certificate from '%s'\n",
207                        cert_file);
208             ERR_print_errors(bio_err);
209             return (0);
210         }
211         if (key_file == NULL)
212             key_file = cert_file;
213         if (SSL_CTX_use_PrivateKey_file(ctx, key_file, SSL_FILETYPE_PEM) <= 0) {
214             BIO_printf(bio_err, "unable to get private key from '%s'\n",
215                        key_file);
216             ERR_print_errors(bio_err);
217             return (0);
218         }
219
220         /*-
221         In theory this is no longer needed
222         ssl=SSL_new(ctx);
223         x509=SSL_get_certificate(ssl);
224
225         if (x509 != NULL) {
226                 EVP_PKEY *pktmp;
227                 pktmp = X509_get_pubkey(x509);
228                 EVP_PKEY_copy_parameters(pktmp,
229                                         SSL_get_privatekey(ssl));
230                 EVP_PKEY_free(pktmp);
231         }
232         SSL_free(ssl);
233         */
234
235         /*
236          * If we are using DSA, we can copy the parameters from the private
237          * key
238          */
239
240         /*
241          * Now we know that a key and cert have been set against the SSL
242          * context
243          */
244         if (!SSL_CTX_check_private_key(ctx)) {
245             BIO_printf(bio_err,
246                        "Private key does not match the certificate public key\n");
247             return (0);
248         }
249     }
250     return (1);
251 }
252
253 int set_cert_key_stuff(SSL_CTX *ctx, X509 *cert, EVP_PKEY *key,
254                        STACK_OF(X509) *chain, int build_chain)
255 {
256     int chflags = chain ? SSL_BUILD_CHAIN_FLAG_CHECK : 0;
257     if (cert == NULL)
258         return 1;
259     if (SSL_CTX_use_certificate(ctx, cert) <= 0) {
260         BIO_printf(bio_err, "error setting certificate\n");
261         ERR_print_errors(bio_err);
262         return 0;
263     }
264
265     if (SSL_CTX_use_PrivateKey(ctx, key) <= 0) {
266         BIO_printf(bio_err, "error setting private key\n");
267         ERR_print_errors(bio_err);
268         return 0;
269     }
270
271     /*
272      * Now we know that a key and cert have been set against the SSL context
273      */
274     if (!SSL_CTX_check_private_key(ctx)) {
275         BIO_printf(bio_err,
276                    "Private key does not match the certificate public key\n");
277         return 0;
278     }
279     if (chain && !SSL_CTX_set1_chain(ctx, chain)) {
280         BIO_printf(bio_err, "error setting certificate chain\n");
281         ERR_print_errors(bio_err);
282         return 0;
283     }
284     if (build_chain && !SSL_CTX_build_cert_chain(ctx, chflags)) {
285         BIO_printf(bio_err, "error building certificate chain\n");
286         ERR_print_errors(bio_err);
287         return 0;
288     }
289     return 1;
290 }
291
292 static void ssl_print_client_cert_types(BIO *bio, SSL *s)
293 {
294     const unsigned char *p;
295     int i;
296     int cert_type_num = SSL_get0_certificate_types(s, &p);
297     if (!cert_type_num)
298         return;
299     BIO_puts(bio, "Client Certificate Types: ");
300     for (i = 0; i < cert_type_num; i++) {
301         unsigned char cert_type = p[i];
302         char *cname;
303         switch (cert_type) {
304         case TLS_CT_RSA_SIGN:
305             cname = "RSA sign";
306             break;
307
308         case TLS_CT_DSS_SIGN:
309             cname = "DSA sign";
310             break;
311
312         case TLS_CT_RSA_FIXED_DH:
313             cname = "RSA fixed DH";
314             break;
315
316         case TLS_CT_DSS_FIXED_DH:
317             cname = "DSS fixed DH";
318             break;
319
320         case TLS_CT_ECDSA_SIGN:
321             cname = "ECDSA sign";
322             break;
323
324         case TLS_CT_RSA_FIXED_ECDH:
325             cname = "RSA fixed ECDH";
326             break;
327
328         case TLS_CT_ECDSA_FIXED_ECDH:
329             cname = "ECDSA fixed ECDH";
330             break;
331
332         case TLS_CT_GOST94_SIGN:
333             cname = "GOST94 Sign";
334             break;
335
336         case TLS_CT_GOST01_SIGN:
337             cname = "GOST01 Sign";
338             break;
339
340         default:
341             cname = NULL;
342         }
343
344         if (i)
345             BIO_puts(bio, ", ");
346
347         if (cname)
348             BIO_puts(bio, cname);
349         else
350             BIO_printf(bio, "UNKNOWN (%d),", cert_type);
351     }
352     BIO_puts(bio, "\n");
353 }
354
355 static int do_print_sigalgs(BIO *out, SSL *s, int shared)
356 {
357     int i, nsig, client;
358     client = SSL_is_server(s) ? 0 : 1;
359     if (shared)
360         nsig = SSL_get_shared_sigalgs(s, -1, NULL, NULL, NULL, NULL, NULL);
361     else
362         nsig = SSL_get_sigalgs(s, -1, NULL, NULL, NULL, NULL, NULL);
363     if (nsig == 0)
364         return 1;
365
366     if (shared)
367         BIO_puts(out, "Shared ");
368
369     if (client)
370         BIO_puts(out, "Requested ");
371     BIO_puts(out, "Signature Algorithms: ");
372     for (i = 0; i < nsig; i++) {
373         int hash_nid, sign_nid;
374         unsigned char rhash, rsign;
375         const char *sstr = NULL;
376         if (shared)
377             SSL_get_shared_sigalgs(s, i, &sign_nid, &hash_nid, NULL,
378                                    &rsign, &rhash);
379         else
380             SSL_get_sigalgs(s, i, &sign_nid, &hash_nid, NULL, &rsign, &rhash);
381         if (i)
382             BIO_puts(out, ":");
383         if (sign_nid == EVP_PKEY_RSA)
384             sstr = "RSA";
385         else if (sign_nid == EVP_PKEY_DSA)
386             sstr = "DSA";
387         else if (sign_nid == EVP_PKEY_EC)
388             sstr = "ECDSA";
389         if (sstr)
390             BIO_printf(out, "%s+", sstr);
391         else
392             BIO_printf(out, "0x%02X+", (int)rsign);
393         if (hash_nid != NID_undef)
394             BIO_printf(out, "%s", OBJ_nid2sn(hash_nid));
395         else
396             BIO_printf(out, "0x%02X", (int)rhash);
397     }
398     BIO_puts(out, "\n");
399     return 1;
400 }
401
402 int ssl_print_sigalgs(BIO *out, SSL *s)
403 {
404     int mdnid;
405     if (!SSL_is_server(s))
406         ssl_print_client_cert_types(out, s);
407     do_print_sigalgs(out, s, 0);
408     do_print_sigalgs(out, s, 1);
409     if (SSL_get_peer_signature_nid(s, &mdnid))
410         BIO_printf(out, "Peer signing digest: %s\n", OBJ_nid2sn(mdnid));
411     return 1;
412 }
413
414 #ifndef OPENSSL_NO_EC
415 int ssl_print_point_formats(BIO *out, SSL *s)
416 {
417     int i, nformats;
418     const char *pformats;
419     nformats = SSL_get0_ec_point_formats(s, &pformats);
420     if (nformats <= 0)
421         return 1;
422     BIO_puts(out, "Supported Elliptic Curve Point Formats: ");
423     for (i = 0; i < nformats; i++, pformats++) {
424         if (i)
425             BIO_puts(out, ":");
426         switch (*pformats) {
427         case TLSEXT_ECPOINTFORMAT_uncompressed:
428             BIO_puts(out, "uncompressed");
429             break;
430
431         case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_prime:
432             BIO_puts(out, "ansiX962_compressed_prime");
433             break;
434
435         case TLSEXT_ECPOINTFORMAT_ansiX962_compressed_char2:
436             BIO_puts(out, "ansiX962_compressed_char2");
437             break;
438
439         default:
440             BIO_printf(out, "unknown(%d)", (int)*pformats);
441             break;
442
443         }
444     }
445     if (nformats <= 0)
446         BIO_puts(out, "NONE");
447     BIO_puts(out, "\n");
448     return 1;
449 }
450
451 int ssl_print_curves(BIO *out, SSL *s, int noshared)
452 {
453     int i, ncurves, *curves, nid;
454     const char *cname;
455     ncurves = SSL_get1_curves(s, NULL);
456     if (ncurves <= 0)
457         return 1;
458     curves = OPENSSL_malloc(ncurves * sizeof(int));
459     SSL_get1_curves(s, curves);
460
461     BIO_puts(out, "Supported Elliptic Curves: ");
462     for (i = 0; i < ncurves; i++) {
463         if (i)
464             BIO_puts(out, ":");
465         nid = curves[i];
466         /* If unrecognised print out hex version */
467         if (nid & TLSEXT_nid_unknown)
468             BIO_printf(out, "0x%04X", nid & 0xFFFF);
469         else {
470             /* Use NIST name for curve if it exists */
471             cname = EC_curve_nid2nist(nid);
472             if (!cname)
473                 cname = OBJ_nid2sn(nid);
474             BIO_printf(out, "%s", cname);
475         }
476     }
477     if (ncurves == 0)
478         BIO_puts(out, "NONE");
479     OPENSSL_free(curves);
480     if (noshared) {
481         BIO_puts(out, "\n");
482         return 1;
483     }
484     BIO_puts(out, "\nShared Elliptic curves: ");
485     ncurves = SSL_get_shared_curve(s, -1);
486     for (i = 0; i < ncurves; i++) {
487         if (i)
488             BIO_puts(out, ":");
489         nid = SSL_get_shared_curve(s, i);
490         cname = EC_curve_nid2nist(nid);
491         if (!cname)
492             cname = OBJ_nid2sn(nid);
493         BIO_printf(out, "%s", cname);
494     }
495     if (ncurves == 0)
496         BIO_puts(out, "NONE");
497     BIO_puts(out, "\n");
498     return 1;
499 }
500 #endif
501 int ssl_print_tmp_key(BIO *out, SSL *s)
502 {
503     EVP_PKEY *key;
504     if (!SSL_get_server_tmp_key(s, &key))
505         return 1;
506     BIO_puts(out, "Server Temp Key: ");
507     switch (EVP_PKEY_id(key)) {
508     case EVP_PKEY_RSA:
509         BIO_printf(out, "RSA, %d bits\n", EVP_PKEY_bits(key));
510         break;
511
512     case EVP_PKEY_DH:
513         BIO_printf(out, "DH, %d bits\n", EVP_PKEY_bits(key));
514         break;
515 #ifndef OPENSSL_NO_ECDH
516     case EVP_PKEY_EC:
517         {
518             EC_KEY *ec = EVP_PKEY_get1_EC_KEY(key);
519             int nid;
520             const char *cname;
521             nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(ec));
522             EC_KEY_free(ec);
523             cname = EC_curve_nid2nist(nid);
524             if (!cname)
525                 cname = OBJ_nid2sn(nid);
526             BIO_printf(out, "ECDH, %s, %d bits\n", cname, EVP_PKEY_bits(key));
527         }
528 #endif
529     }
530     EVP_PKEY_free(key);
531     return 1;
532 }
533
534 long MS_CALLBACK bio_dump_callback(BIO *bio, int cmd, const char *argp,
535                                    int argi, long argl, long ret)
536 {
537     BIO *out;
538
539     out = (BIO *)BIO_get_callback_arg(bio);
540     if (out == NULL)
541         return (ret);
542
543     if (cmd == (BIO_CB_READ | BIO_CB_RETURN)) {
544         BIO_printf(out, "read from %p [%p] (%lu bytes => %ld (0x%lX))\n",
545                    (void *)bio, argp, (unsigned long)argi, ret, ret);
546         BIO_dump(out, argp, (int)ret);
547         return (ret);
548     } else if (cmd == (BIO_CB_WRITE | BIO_CB_RETURN)) {
549         BIO_printf(out, "write to %p [%p] (%lu bytes => %ld (0x%lX))\n",
550                    (void *)bio, argp, (unsigned long)argi, ret, ret);
551         BIO_dump(out, argp, (int)ret);
552     }
553     return (ret);
554 }
555
556 void MS_CALLBACK apps_ssl_info_callback(const SSL *s, int where, int ret)
557 {
558     const char *str;
559     int w;
560
561     w = where & ~SSL_ST_MASK;
562
563     if (w & SSL_ST_CONNECT)
564         str = "SSL_connect";
565     else if (w & SSL_ST_ACCEPT)
566         str = "SSL_accept";
567     else
568         str = "undefined";
569
570     if (where & SSL_CB_LOOP) {
571         BIO_printf(bio_err, "%s:%s\n", str, SSL_state_string_long(s));
572     } else if (where & SSL_CB_ALERT) {
573         str = (where & SSL_CB_READ) ? "read" : "write";
574         BIO_printf(bio_err, "SSL3 alert %s:%s:%s\n",
575                    str,
576                    SSL_alert_type_string_long(ret),
577                    SSL_alert_desc_string_long(ret));
578     } else if (where & SSL_CB_EXIT) {
579         if (ret == 0)
580             BIO_printf(bio_err, "%s:failed in %s\n",
581                        str, SSL_state_string_long(s));
582         else if (ret < 0) {
583             BIO_printf(bio_err, "%s:error in %s\n",
584                        str, SSL_state_string_long(s));
585         }
586     }
587 }
588
589 void MS_CALLBACK msg_cb(int write_p, int version, int content_type,
590                         const void *buf, size_t len, SSL *ssl, void *arg)
591 {
592     BIO *bio = arg;
593     const char *str_write_p, *str_version, *str_content_type =
594         "", *str_details1 = "", *str_details2 = "";
595
596     str_write_p = write_p ? ">>>" : "<<<";
597
598     switch (version) {
599     case SSL2_VERSION:
600         str_version = "SSL 2.0";
601         break;
602     case SSL3_VERSION:
603         str_version = "SSL 3.0 ";
604         break;
605     case TLS1_VERSION:
606         str_version = "TLS 1.0 ";
607         break;
608     case TLS1_1_VERSION:
609         str_version = "TLS 1.1 ";
610         break;
611     case TLS1_2_VERSION:
612         str_version = "TLS 1.2 ";
613         break;
614     case DTLS1_VERSION:
615         str_version = "DTLS 1.0 ";
616         break;
617     case DTLS1_BAD_VER:
618         str_version = "DTLS 1.0 (bad) ";
619         break;
620     default:
621         str_version = "???";
622     }
623
624     if (version == SSL2_VERSION) {
625         str_details1 = "???";
626
627         if (len > 0) {
628             switch (((const unsigned char *)buf)[0]) {
629             case 0:
630                 str_details1 = ", ERROR:";
631                 str_details2 = " ???";
632                 if (len >= 3) {
633                     unsigned err =
634                         (((const unsigned char *)buf)[1] << 8) +
635                         ((const unsigned char *)buf)[2];
636
637                     switch (err) {
638                     case 0x0001:
639                         str_details2 = " NO-CIPHER-ERROR";
640                         break;
641                     case 0x0002:
642                         str_details2 = " NO-CERTIFICATE-ERROR";
643                         break;
644                     case 0x0004:
645                         str_details2 = " BAD-CERTIFICATE-ERROR";
646                         break;
647                     case 0x0006:
648                         str_details2 = " UNSUPPORTED-CERTIFICATE-TYPE-ERROR";
649                         break;
650                     }
651                 }
652
653                 break;
654             case 1:
655                 str_details1 = ", CLIENT-HELLO";
656                 break;
657             case 2:
658                 str_details1 = ", CLIENT-MASTER-KEY";
659                 break;
660             case 3:
661                 str_details1 = ", CLIENT-FINISHED";
662                 break;
663             case 4:
664                 str_details1 = ", SERVER-HELLO";
665                 break;
666             case 5:
667                 str_details1 = ", SERVER-VERIFY";
668                 break;
669             case 6:
670                 str_details1 = ", SERVER-FINISHED";
671                 break;
672             case 7:
673                 str_details1 = ", REQUEST-CERTIFICATE";
674                 break;
675             case 8:
676                 str_details1 = ", CLIENT-CERTIFICATE";
677                 break;
678             }
679         }
680     }
681
682     if (version == SSL3_VERSION ||
683         version == TLS1_VERSION ||
684         version == TLS1_1_VERSION ||
685         version == TLS1_2_VERSION ||
686         version == DTLS1_VERSION || version == DTLS1_BAD_VER) {
687         switch (content_type) {
688         case 20:
689             str_content_type = "ChangeCipherSpec";
690             break;
691         case 21:
692             str_content_type = "Alert";
693             break;
694         case 22:
695             str_content_type = "Handshake";
696             break;
697         }
698
699         if (content_type == 21) { /* Alert */
700             str_details1 = ", ???";
701
702             if (len == 2) {
703                 switch (((const unsigned char *)buf)[0]) {
704                 case 1:
705                     str_details1 = ", warning";
706                     break;
707                 case 2:
708                     str_details1 = ", fatal";
709                     break;
710                 }
711
712                 str_details2 = " ???";
713                 switch (((const unsigned char *)buf)[1]) {
714                 case 0:
715                     str_details2 = " close_notify";
716                     break;
717                 case 10:
718                     str_details2 = " unexpected_message";
719                     break;
720                 case 20:
721                     str_details2 = " bad_record_mac";
722                     break;
723                 case 21:
724                     str_details2 = " decryption_failed";
725                     break;
726                 case 22:
727                     str_details2 = " record_overflow";
728                     break;
729                 case 30:
730                     str_details2 = " decompression_failure";
731                     break;
732                 case 40:
733                     str_details2 = " handshake_failure";
734                     break;
735                 case 42:
736                     str_details2 = " bad_certificate";
737                     break;
738                 case 43:
739                     str_details2 = " unsupported_certificate";
740                     break;
741                 case 44:
742                     str_details2 = " certificate_revoked";
743                     break;
744                 case 45:
745                     str_details2 = " certificate_expired";
746                     break;
747                 case 46:
748                     str_details2 = " certificate_unknown";
749                     break;
750                 case 47:
751                     str_details2 = " illegal_parameter";
752                     break;
753                 case 48:
754                     str_details2 = " unknown_ca";
755                     break;
756                 case 49:
757                     str_details2 = " access_denied";
758                     break;
759                 case 50:
760                     str_details2 = " decode_error";
761                     break;
762                 case 51:
763                     str_details2 = " decrypt_error";
764                     break;
765                 case 60:
766                     str_details2 = " export_restriction";
767                     break;
768                 case 70:
769                     str_details2 = " protocol_version";
770                     break;
771                 case 71:
772                     str_details2 = " insufficient_security";
773                     break;
774                 case 80:
775                     str_details2 = " internal_error";
776                     break;
777                 case 90:
778                     str_details2 = " user_canceled";
779                     break;
780                 case 100:
781                     str_details2 = " no_renegotiation";
782                     break;
783                 case 110:
784                     str_details2 = " unsupported_extension";
785                     break;
786                 case 111:
787                     str_details2 = " certificate_unobtainable";
788                     break;
789                 case 112:
790                     str_details2 = " unrecognized_name";
791                     break;
792                 case 113:
793                     str_details2 = " bad_certificate_status_response";
794                     break;
795                 case 114:
796                     str_details2 = " bad_certificate_hash_value";
797                     break;
798                 case 115:
799                     str_details2 = " unknown_psk_identity";
800                     break;
801                 }
802             }
803         }
804
805         if (content_type == 22) { /* Handshake */
806             str_details1 = "???";
807
808             if (len > 0) {
809                 switch (((const unsigned char *)buf)[0]) {
810                 case 0:
811                     str_details1 = ", HelloRequest";
812                     break;
813                 case 1:
814                     str_details1 = ", ClientHello";
815                     break;
816                 case 2:
817                     str_details1 = ", ServerHello";
818                     break;
819                 case 3:
820                     str_details1 = ", HelloVerifyRequest";
821                     break;
822                 case 11:
823                     str_details1 = ", Certificate";
824                     break;
825                 case 12:
826                     str_details1 = ", ServerKeyExchange";
827                     break;
828                 case 13:
829                     str_details1 = ", CertificateRequest";
830                     break;
831                 case 14:
832                     str_details1 = ", ServerHelloDone";
833                     break;
834                 case 15:
835                     str_details1 = ", CertificateVerify";
836                     break;
837                 case 16:
838                     str_details1 = ", ClientKeyExchange";
839                     break;
840                 case 20:
841                     str_details1 = ", Finished";
842                     break;
843                 }
844             }
845         }
846 #ifndef OPENSSL_NO_HEARTBEATS
847         if (content_type == 24) { /* Heartbeat */
848             str_details1 = ", Heartbeat";
849
850             if (len > 0) {
851                 switch (((const unsigned char *)buf)[0]) {
852                 case 1:
853                     str_details1 = ", HeartbeatRequest";
854                     break;
855                 case 2:
856                     str_details1 = ", HeartbeatResponse";
857                     break;
858                 }
859             }
860         }
861 #endif
862     }
863
864     BIO_printf(bio, "%s %s%s [length %04lx]%s%s\n", str_write_p, str_version,
865                str_content_type, (unsigned long)len, str_details1,
866                str_details2);
867
868     if (len > 0) {
869         size_t num, i;
870
871         BIO_printf(bio, "   ");
872         num = len;
873 #if 0
874         if (num > 16)
875             num = 16;
876 #endif
877         for (i = 0; i < num; i++) {
878             if (i % 16 == 0 && i > 0)
879                 BIO_printf(bio, "\n   ");
880             BIO_printf(bio, " %02x", ((const unsigned char *)buf)[i]);
881         }
882         if (i < len)
883             BIO_printf(bio, " ...");
884         BIO_printf(bio, "\n");
885     }
886     (void)BIO_flush(bio);
887 }
888
889 void MS_CALLBACK tlsext_cb(SSL *s, int client_server, int type,
890                            unsigned char *data, int len, void *arg)
891 {
892     BIO *bio = arg;
893     char *extname;
894
895     switch (type) {
896     case TLSEXT_TYPE_server_name:
897         extname = "server name";
898         break;
899
900     case TLSEXT_TYPE_max_fragment_length:
901         extname = "max fragment length";
902         break;
903
904     case TLSEXT_TYPE_client_certificate_url:
905         extname = "client certificate URL";
906         break;
907
908     case TLSEXT_TYPE_trusted_ca_keys:
909         extname = "trusted CA keys";
910         break;
911
912     case TLSEXT_TYPE_truncated_hmac:
913         extname = "truncated HMAC";
914         break;
915
916     case TLSEXT_TYPE_status_request:
917         extname = "status request";
918         break;
919
920     case TLSEXT_TYPE_user_mapping:
921         extname = "user mapping";
922         break;
923
924     case TLSEXT_TYPE_client_authz:
925         extname = "client authz";
926         break;
927
928     case TLSEXT_TYPE_server_authz:
929         extname = "server authz";
930         break;
931
932     case TLSEXT_TYPE_cert_type:
933         extname = "cert type";
934         break;
935
936     case TLSEXT_TYPE_elliptic_curves:
937         extname = "elliptic curves";
938         break;
939
940     case TLSEXT_TYPE_ec_point_formats:
941         extname = "EC point formats";
942         break;
943
944     case TLSEXT_TYPE_srp:
945         extname = "SRP";
946         break;
947
948     case TLSEXT_TYPE_signature_algorithms:
949         extname = "signature algorithms";
950         break;
951
952     case TLSEXT_TYPE_use_srtp:
953         extname = "use SRTP";
954         break;
955
956     case TLSEXT_TYPE_heartbeat:
957         extname = "heartbeat";
958         break;
959
960     case TLSEXT_TYPE_session_ticket:
961         extname = "session ticket";
962         break;
963
964     case TLSEXT_TYPE_renegotiate:
965         extname = "renegotiation info";
966         break;
967
968 #ifdef TLSEXT_TYPE_opaque_prf_input
969     case TLSEXT_TYPE_opaque_prf_input:
970         extname = "opaque PRF input";
971         break;
972 #endif
973 #ifdef TLSEXT_TYPE_next_proto_neg
974     case TLSEXT_TYPE_next_proto_neg:
975         extname = "next protocol";
976         break;
977 #endif
978
979     case TLSEXT_TYPE_padding:
980         extname = "TLS padding";
981         break;
982
983     default:
984         extname = "unknown";
985         break;
986
987     }
988
989     BIO_printf(bio, "TLS %s extension \"%s\" (id=%d), len=%d\n",
990                client_server ? "server" : "client", extname, type, len);
991     BIO_dump(bio, (char *)data, len);
992     (void)BIO_flush(bio);
993 }
994
995 int MS_CALLBACK generate_cookie_callback(SSL *ssl, unsigned char *cookie,
996                                          unsigned int *cookie_len)
997 {
998     unsigned char *buffer, result[EVP_MAX_MD_SIZE];
999     unsigned int length, resultlength;
1000     union {
1001         struct sockaddr sa;
1002         struct sockaddr_in s4;
1003 #if OPENSSL_USE_IPV6
1004         struct sockaddr_in6 s6;
1005 #endif
1006     } peer;
1007
1008     /* Initialize a random secret */
1009     if (!cookie_initialized) {
1010         if (!RAND_bytes(cookie_secret, COOKIE_SECRET_LENGTH)) {
1011             BIO_printf(bio_err, "error setting random cookie secret\n");
1012             return 0;
1013         }
1014         cookie_initialized = 1;
1015     }
1016
1017     /* Read peer information */
1018     (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer);
1019
1020     /* Create buffer with peer's address and port */
1021     length = 0;
1022     switch (peer.sa.sa_family) {
1023     case AF_INET:
1024         length += sizeof(struct in_addr);
1025         length += sizeof(peer.s4.sin_port);
1026         break;
1027 #if OPENSSL_USE_IPV6
1028     case AF_INET6:
1029         length += sizeof(struct in6_addr);
1030         length += sizeof(peer.s6.sin6_port);
1031         break;
1032 #endif
1033     default:
1034         OPENSSL_assert(0);
1035         break;
1036     }
1037     buffer = OPENSSL_malloc(length);
1038
1039     if (buffer == NULL) {
1040         BIO_printf(bio_err, "out of memory\n");
1041         return 0;
1042     }
1043
1044     switch (peer.sa.sa_family) {
1045     case AF_INET:
1046         memcpy(buffer, &peer.s4.sin_port, sizeof(peer.s4.sin_port));
1047         memcpy(buffer + sizeof(peer.s4.sin_port),
1048                &peer.s4.sin_addr, sizeof(struct in_addr));
1049         break;
1050 #if OPENSSL_USE_IPV6
1051     case AF_INET6:
1052         memcpy(buffer, &peer.s6.sin6_port, sizeof(peer.s6.sin6_port));
1053         memcpy(buffer + sizeof(peer.s6.sin6_port),
1054                &peer.s6.sin6_addr, sizeof(struct in6_addr));
1055         break;
1056 #endif
1057     default:
1058         OPENSSL_assert(0);
1059         break;
1060     }
1061
1062     /* Calculate HMAC of buffer using the secret */
1063     HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH,
1064          buffer, length, result, &resultlength);
1065     OPENSSL_free(buffer);
1066
1067     memcpy(cookie, result, resultlength);
1068     *cookie_len = resultlength;
1069
1070     return 1;
1071 }
1072
1073 int MS_CALLBACK verify_cookie_callback(SSL *ssl, unsigned char *cookie,
1074                                        unsigned int cookie_len)
1075 {
1076     unsigned char *buffer, result[EVP_MAX_MD_SIZE];
1077     unsigned int length, resultlength;
1078     union {
1079         struct sockaddr sa;
1080         struct sockaddr_in s4;
1081 #if OPENSSL_USE_IPV6
1082         struct sockaddr_in6 s6;
1083 #endif
1084     } peer;
1085
1086     /* If secret isn't initialized yet, the cookie can't be valid */
1087     if (!cookie_initialized)
1088         return 0;
1089
1090     /* Read peer information */
1091     (void)BIO_dgram_get_peer(SSL_get_rbio(ssl), &peer);
1092
1093     /* Create buffer with peer's address and port */
1094     length = 0;
1095     switch (peer.sa.sa_family) {
1096     case AF_INET:
1097         length += sizeof(struct in_addr);
1098         length += sizeof(peer.s4.sin_port);
1099         break;
1100 #if OPENSSL_USE_IPV6
1101     case AF_INET6:
1102         length += sizeof(struct in6_addr);
1103         length += sizeof(peer.s6.sin6_port);
1104         break;
1105 #endif
1106     default:
1107         OPENSSL_assert(0);
1108         break;
1109     }
1110     buffer = OPENSSL_malloc(length);
1111
1112     if (buffer == NULL) {
1113         BIO_printf(bio_err, "out of memory\n");
1114         return 0;
1115     }
1116
1117     switch (peer.sa.sa_family) {
1118     case AF_INET:
1119         memcpy(buffer, &peer.s4.sin_port, sizeof(peer.s4.sin_port));
1120         memcpy(buffer + sizeof(peer.s4.sin_port),
1121                &peer.s4.sin_addr, sizeof(struct in_addr));
1122         break;
1123 #if OPENSSL_USE_IPV6
1124     case AF_INET6:
1125         memcpy(buffer, &peer.s6.sin6_port, sizeof(peer.s6.sin6_port));
1126         memcpy(buffer + sizeof(peer.s6.sin6_port),
1127                &peer.s6.sin6_addr, sizeof(struct in6_addr));
1128         break;
1129 #endif
1130     default:
1131         OPENSSL_assert(0);
1132         break;
1133     }
1134
1135     /* Calculate HMAC of buffer using the secret */
1136     HMAC(EVP_sha1(), cookie_secret, COOKIE_SECRET_LENGTH,
1137          buffer, length, result, &resultlength);
1138     OPENSSL_free(buffer);
1139
1140     if (cookie_len == resultlength
1141         && memcmp(result, cookie, resultlength) == 0)
1142         return 1;
1143
1144     return 0;
1145 }
1146
1147 /*
1148  * Example of extended certificate handling. Where the standard support of
1149  * one certificate per algorithm is not sufficient an application can decide
1150  * which certificate(s) to use at runtime based on whatever criteria it deems
1151  * appropriate.
1152  */
1153
1154 /* Linked list of certificates, keys and chains */
1155 struct ssl_excert_st {
1156     int certform;
1157     const char *certfile;
1158     int keyform;
1159     const char *keyfile;
1160     const char *chainfile;
1161     X509 *cert;
1162     EVP_PKEY *key;
1163     STACK_OF(X509) *chain;
1164     int build_chain;
1165     struct ssl_excert_st *next, *prev;
1166 };
1167
1168 struct chain_flags {
1169     int flag;
1170     const char *name;
1171 };
1172
1173 struct chain_flags chain_flags_list[] = {
1174     {CERT_PKEY_VALID, "Overall Validity"},
1175     {CERT_PKEY_SIGN, "Sign with EE key"},
1176     {CERT_PKEY_EE_SIGNATURE, "EE signature"},
1177     {CERT_PKEY_CA_SIGNATURE, "CA signature"},
1178     {CERT_PKEY_EE_PARAM, "EE key parameters"},
1179     {CERT_PKEY_CA_PARAM, "CA key parameters"},
1180     {CERT_PKEY_EXPLICIT_SIGN, "Explicity sign with EE key"},
1181     {CERT_PKEY_ISSUER_NAME, "Issuer Name"},
1182     {CERT_PKEY_CERT_TYPE, "Certificate Type"},
1183     {0, NULL}
1184 };
1185
1186 static void print_chain_flags(BIO *out, SSL *s, int flags)
1187 {
1188     struct chain_flags *ctmp = chain_flags_list;
1189     while (ctmp->name) {
1190         BIO_printf(out, "\t%s: %s\n", ctmp->name,
1191                    flags & ctmp->flag ? "OK" : "NOT OK");
1192         ctmp++;
1193     }
1194     BIO_printf(out, "\tSuite B: ");
1195     if (SSL_set_cert_flags(s, 0) & SSL_CERT_FLAG_SUITEB_128_LOS)
1196         BIO_puts(out, flags & CERT_PKEY_SUITEB ? "OK\n" : "NOT OK\n");
1197     else
1198         BIO_printf(out, "not tested\n");
1199 }
1200
1201 /*
1202  * Very basic selection callback: just use any certificate chain reported as
1203  * valid. More sophisticated could prioritise according to local policy.
1204  */
1205 static int set_cert_cb(SSL *ssl, void *arg)
1206 {
1207     int i, rv;
1208     SSL_EXCERT *exc = arg;
1209 #ifdef CERT_CB_TEST_RETRY
1210     static int retry_cnt;
1211     if (retry_cnt < 5) {
1212         retry_cnt++;
1213         fprintf(stderr, "Certificate callback retry test: count %d\n",
1214                 retry_cnt);
1215         return -1;
1216     }
1217 #endif
1218     SSL_certs_clear(ssl);
1219
1220     if (!exc)
1221         return 1;
1222
1223     /*
1224      * Go to end of list and traverse backwards since we prepend newer
1225      * entries this retains the original order.
1226      */
1227     while (exc->next)
1228         exc = exc->next;
1229
1230     i = 0;
1231
1232     while (exc) {
1233         i++;
1234         rv = SSL_check_chain(ssl, exc->cert, exc->key, exc->chain);
1235         BIO_printf(bio_err, "Checking cert chain %d:\nSubject: ", i);
1236         X509_NAME_print_ex(bio_err, X509_get_subject_name(exc->cert), 0,
1237                            XN_FLAG_ONELINE);
1238         BIO_puts(bio_err, "\n");
1239
1240         print_chain_flags(bio_err, ssl, rv);
1241         if (rv & CERT_PKEY_VALID) {
1242             SSL_use_certificate(ssl, exc->cert);
1243             SSL_use_PrivateKey(ssl, exc->key);
1244             /*
1245              * NB: we wouldn't normally do this as it is not efficient
1246              * building chains on each connection better to cache the chain
1247              * in advance.
1248              */
1249             if (exc->build_chain) {
1250                 if (!SSL_build_cert_chain(ssl, 0))
1251                     return 0;
1252             } else if (exc->chain)
1253                 SSL_set1_chain(ssl, exc->chain);
1254         }
1255         exc = exc->prev;
1256     }
1257     return 1;
1258 }
1259
1260 void ssl_ctx_set_excert(SSL_CTX *ctx, SSL_EXCERT *exc)
1261 {
1262     SSL_CTX_set_cert_cb(ctx, set_cert_cb, exc);
1263 }
1264
1265 static int ssl_excert_prepend(SSL_EXCERT **pexc)
1266 {
1267     SSL_EXCERT *exc;
1268     exc = OPENSSL_malloc(sizeof(SSL_EXCERT));
1269     if (!exc)
1270         return 0;
1271     exc->certfile = NULL;
1272     exc->keyfile = NULL;
1273     exc->chainfile = NULL;
1274     exc->cert = NULL;
1275     exc->key = NULL;
1276     exc->chain = NULL;
1277     exc->prev = NULL;
1278     exc->build_chain = 0;
1279
1280     exc->next = *pexc;
1281     *pexc = exc;
1282
1283     if (exc->next) {
1284         exc->certform = exc->next->certform;
1285         exc->keyform = exc->next->keyform;
1286         exc->next->prev = exc;
1287     } else {
1288         exc->certform = FORMAT_PEM;
1289         exc->keyform = FORMAT_PEM;
1290     }
1291     return 1;
1292
1293 }
1294
1295 void ssl_excert_free(SSL_EXCERT *exc)
1296 {
1297     SSL_EXCERT *curr;
1298     while (exc) {
1299         if (exc->cert)
1300             X509_free(exc->cert);
1301         if (exc->key)
1302             EVP_PKEY_free(exc->key);
1303         if (exc->chain)
1304             sk_X509_pop_free(exc->chain, X509_free);
1305         curr = exc;
1306         exc = exc->next;
1307         OPENSSL_free(curr);
1308     }
1309 }
1310
1311 int load_excert(SSL_EXCERT **pexc, BIO *err)
1312 {
1313     SSL_EXCERT *exc = *pexc;
1314     if (!exc)
1315         return 1;
1316     /* If nothing in list, free and set to NULL */
1317     if (!exc->certfile && !exc->next) {
1318         ssl_excert_free(exc);
1319         *pexc = NULL;
1320         return 1;
1321     }
1322     for (; exc; exc = exc->next) {
1323         if (!exc->certfile) {
1324             BIO_printf(err, "Missing filename\n");
1325             return 0;
1326         }
1327         exc->cert = load_cert(err, exc->certfile, exc->certform,
1328                               NULL, NULL, "Server Certificate");
1329         if (!exc->cert)
1330             return 0;
1331         if (exc->keyfile) {
1332             exc->key = load_key(err, exc->keyfile, exc->keyform,
1333                                 0, NULL, NULL, "Server Key");
1334         } else {
1335             exc->key = load_key(err, exc->certfile, exc->certform,
1336                                 0, NULL, NULL, "Server Key");
1337         }
1338         if (!exc->key)
1339             return 0;
1340         if (exc->chainfile) {
1341             exc->chain = load_certs(err,
1342                                     exc->chainfile, FORMAT_PEM,
1343                                     NULL, NULL, "Server Chain");
1344             if (!exc->chain)
1345                 return 0;
1346         }
1347     }
1348     return 1;
1349 }
1350
1351 int args_excert(char ***pargs, int *pargc,
1352                 int *badarg, BIO *err, SSL_EXCERT **pexc)
1353 {
1354     char *arg = **pargs, *argn = (*pargs)[1];
1355     SSL_EXCERT *exc = *pexc;
1356     int narg = 2;
1357     if (!exc) {
1358         if (ssl_excert_prepend(&exc))
1359             *pexc = exc;
1360         else {
1361             BIO_printf(err, "Error initialising xcert\n");
1362             *badarg = 1;
1363             goto err;
1364         }
1365     }
1366     if (strcmp(arg, "-xcert") == 0) {
1367         if (!argn) {
1368             *badarg = 1;
1369             return 1;
1370         }
1371         if (exc->certfile && !ssl_excert_prepend(&exc)) {
1372             BIO_printf(err, "Error adding xcert\n");
1373             *badarg = 1;
1374             goto err;
1375         }
1376         exc->certfile = argn;
1377     } else if (strcmp(arg, "-xkey") == 0) {
1378         if (!argn) {
1379             *badarg = 1;
1380             return 1;
1381         }
1382         if (exc->keyfile) {
1383             BIO_printf(err, "Key already specified\n");
1384             *badarg = 1;
1385             return 1;
1386         }
1387         exc->keyfile = argn;
1388     } else if (strcmp(arg, "-xchain") == 0) {
1389         if (!argn) {
1390             *badarg = 1;
1391             return 1;
1392         }
1393         if (exc->chainfile) {
1394             BIO_printf(err, "Chain already specified\n");
1395             *badarg = 1;
1396             return 1;
1397         }
1398         exc->chainfile = argn;
1399     } else if (strcmp(arg, "-xchain_build") == 0) {
1400         narg = 1;
1401         exc->build_chain = 1;
1402     } else if (strcmp(arg, "-xcertform") == 0) {
1403         if (!argn) {
1404             *badarg = 1;
1405             goto err;
1406         }
1407         exc->certform = str2fmt(argn);
1408     } else if (strcmp(arg, "-xkeyform") == 0) {
1409         if (!argn) {
1410             *badarg = 1;
1411             goto err;
1412         }
1413         exc->keyform = str2fmt(argn);
1414     } else
1415         return 0;
1416
1417     (*pargs) += narg;
1418
1419     if (pargc)
1420         *pargc -= narg;
1421
1422     *pexc = exc;
1423
1424     return 1;
1425
1426  err:
1427     ERR_print_errors(err);
1428     ssl_excert_free(exc);
1429     *pexc = NULL;
1430     return 1;
1431 }
1432
1433 static void print_raw_cipherlist(BIO *bio, SSL *s)
1434 {
1435     const unsigned char *rlist;
1436     static const unsigned char scsv_id[] = { 0, 0, 0xFF };
1437     size_t i, rlistlen, num;
1438     if (!SSL_is_server(s))
1439         return;
1440     num = SSL_get0_raw_cipherlist(s, NULL);
1441     rlistlen = SSL_get0_raw_cipherlist(s, &rlist);
1442     BIO_puts(bio, "Client cipher list: ");
1443     for (i = 0; i < rlistlen; i += num, rlist += num) {
1444         const SSL_CIPHER *c = SSL_CIPHER_find(s, rlist);
1445         if (i)
1446             BIO_puts(bio, ":");
1447         if (c)
1448             BIO_puts(bio, SSL_CIPHER_get_name(c));
1449         else if (!memcmp(rlist, scsv_id - num + 3, num))
1450             BIO_puts(bio, "SCSV");
1451         else {
1452             size_t j;
1453             BIO_puts(bio, "0x");
1454             for (j = 0; j < num; j++)
1455                 BIO_printf(bio, "%02X", rlist[j]);
1456         }
1457     }
1458     BIO_puts(bio, "\n");
1459 }
1460
1461 void print_ssl_summary(BIO *bio, SSL *s)
1462 {
1463     const SSL_CIPHER *c;
1464     X509 *peer;
1465     /*
1466      * const char *pnam = SSL_is_server(s) ? "client" : "server";
1467      */
1468     BIO_printf(bio, "Protocol version: %s\n", SSL_get_version(s));
1469     print_raw_cipherlist(bio, s);
1470     c = SSL_get_current_cipher(s);
1471     BIO_printf(bio, "Ciphersuite: %s\n", SSL_CIPHER_get_name(c));
1472     do_print_sigalgs(bio, s, 0);
1473     peer = SSL_get_peer_certificate(s);
1474     if (peer) {
1475         int nid;
1476         BIO_puts(bio, "Peer certificate: ");
1477         X509_NAME_print_ex(bio, X509_get_subject_name(peer),
1478                            0, XN_FLAG_ONELINE);
1479         BIO_puts(bio, "\n");
1480         if (SSL_get_peer_signature_nid(s, &nid))
1481             BIO_printf(bio, "Hash used: %s\n", OBJ_nid2sn(nid));
1482     } else
1483         BIO_puts(bio, "No peer certificate\n");
1484     if (peer)
1485         X509_free(peer);
1486 #ifndef OPENSSL_NO_EC
1487     ssl_print_point_formats(bio, s);
1488     if (SSL_is_server(s))
1489         ssl_print_curves(bio, s, 1);
1490     else
1491         ssl_print_tmp_key(bio, s);
1492 #else
1493     if (!SSL_is_server(s))
1494         ssl_print_tmp_key(bio, s);
1495 #endif
1496 }
1497
1498 int args_ssl(char ***pargs, int *pargc, SSL_CONF_CTX *cctx,
1499              int *badarg, BIO *err, STACK_OF(OPENSSL_STRING) **pstr)
1500 {
1501     char *arg = **pargs, *argn = (*pargs)[1];
1502     int rv;
1503
1504     /* Attempt to run SSL configuration command */
1505     rv = SSL_CONF_cmd_argv(cctx, pargc, pargs);
1506     /* If parameter not recognised just return */
1507     if (rv == 0)
1508         return 0;
1509     /* see if missing argument error */
1510     if (rv == -3) {
1511         BIO_printf(err, "%s needs an argument\n", arg);
1512         *badarg = 1;
1513         goto end;
1514     }
1515     /* Check for some other error */
1516     if (rv < 0) {
1517         BIO_printf(err, "Error with command: \"%s %s\"\n",
1518                    arg, argn ? argn : "");
1519         *badarg = 1;
1520         goto end;
1521     }
1522     /* Store command and argument */
1523     /* If only one argument processed store value as NULL */
1524     if (rv == 1)
1525         argn = NULL;
1526     if (!*pstr)
1527         *pstr = sk_OPENSSL_STRING_new_null();
1528     if (!*pstr || !sk_OPENSSL_STRING_push(*pstr, arg) ||
1529         !sk_OPENSSL_STRING_push(*pstr, argn)) {
1530         BIO_puts(err, "Memory allocation failure\n");
1531         goto end;
1532     }
1533
1534  end:
1535     if (*badarg)
1536         ERR_print_errors(err);
1537
1538     return 1;
1539 }
1540
1541 int args_ssl_call(SSL_CTX *ctx, BIO *err, SSL_CONF_CTX *cctx,
1542                   STACK_OF(OPENSSL_STRING) *str, int no_ecdhe, int no_jpake)
1543 {
1544     int i;
1545     SSL_CONF_CTX_set_ssl_ctx(cctx, ctx);
1546     for (i = 0; i < sk_OPENSSL_STRING_num(str); i += 2) {
1547         const char *param = sk_OPENSSL_STRING_value(str, i);
1548         const char *value = sk_OPENSSL_STRING_value(str, i + 1);
1549         /*
1550          * If no_ecdhe or named curve already specified don't need a default.
1551          */
1552         if (!no_ecdhe && !strcmp(param, "-named_curve"))
1553             no_ecdhe = 1;
1554 #ifndef OPENSSL_NO_JPAKE
1555         if (!no_jpake && !strcmp(param, "-cipher")) {
1556             BIO_puts(err, "JPAKE sets cipher to PSK\n");
1557             return 0;
1558         }
1559 #endif
1560         if (SSL_CONF_cmd(cctx, param, value) <= 0) {
1561             BIO_printf(err, "Error with command: \"%s %s\"\n",
1562                        param, value ? value : "");
1563             ERR_print_errors(err);
1564             return 0;
1565         }
1566     }
1567     /*
1568      * This is a special case to keep existing s_server functionality: if we
1569      * don't have any curve specified *and* we haven't disabled ECDHE then
1570      * use P-256.
1571      */
1572     if (!no_ecdhe) {
1573         if (SSL_CONF_cmd(cctx, "-named_curve", "P-256") <= 0) {
1574             BIO_puts(err, "Error setting EC curve\n");
1575             ERR_print_errors(err);
1576             return 0;
1577         }
1578     }
1579 #ifndef OPENSSL_NO_JPAKE
1580     if (!no_jpake) {
1581         if (SSL_CONF_cmd(cctx, "-cipher", "PSK") <= 0) {
1582             BIO_puts(err, "Error setting cipher to PSK\n");
1583             ERR_print_errors(err);
1584             return 0;
1585         }
1586     }
1587 #endif
1588     if (!SSL_CONF_CTX_finish(cctx)) {
1589         BIO_puts(err, "Error finishing context\n");
1590         ERR_print_errors(err);
1591         return 0;
1592     }
1593     return 1;
1594 }
1595
1596 static int add_crls_store(X509_STORE *st, STACK_OF(X509_CRL) *crls)
1597 {
1598     X509_CRL *crl;
1599     int i;
1600     for (i = 0; i < sk_X509_CRL_num(crls); i++) {
1601         crl = sk_X509_CRL_value(crls, i);
1602         X509_STORE_add_crl(st, crl);
1603     }
1604     return 1;
1605 }
1606
1607 int ssl_ctx_add_crls(SSL_CTX *ctx, STACK_OF(X509_CRL) *crls, int crl_download)
1608 {
1609     X509_STORE *st;
1610     st = SSL_CTX_get_cert_store(ctx);
1611     add_crls_store(st, crls);
1612     if (crl_download)
1613         store_setup_crl_download(st);
1614     return 1;
1615 }
1616
1617 int ssl_load_stores(SSL_CTX *ctx,
1618                     const char *vfyCApath, const char *vfyCAfile,
1619                     const char *chCApath, const char *chCAfile,
1620                     STACK_OF(X509_CRL) *crls, int crl_download)
1621 {
1622     X509_STORE *vfy = NULL, *ch = NULL;
1623     int rv = 0;
1624     if (vfyCApath || vfyCAfile) {
1625         vfy = X509_STORE_new();
1626         if (!X509_STORE_load_locations(vfy, vfyCAfile, vfyCApath))
1627             goto err;
1628         add_crls_store(vfy, crls);
1629         SSL_CTX_set1_verify_cert_store(ctx, vfy);
1630         if (crl_download)
1631             store_setup_crl_download(vfy);
1632     }
1633     if (chCApath || chCAfile) {
1634         ch = X509_STORE_new();
1635         if (!X509_STORE_load_locations(ch, chCAfile, chCApath))
1636             goto err;
1637         SSL_CTX_set1_chain_cert_store(ctx, ch);
1638     }
1639     rv = 1;
1640  err:
1641     if (vfy)
1642         X509_STORE_free(vfy);
1643     if (ch)
1644         X509_STORE_free(ch);
1645     return rv;
1646 }