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