70ee5c341fe4e65b6b56645a8f30ede8d05174cb
[openssl.git] / apps / s_server.c
1 /* apps/s_server.c */
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  * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
113  * ECC cipher suite support in OpenSSL originally developed by
114  * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
115  */
116 /* ====================================================================
117  * Copyright 2005 Nokia. All rights reserved.
118  *
119  * The portions of the attached software ("Contribution") is developed by
120  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
121  * license.
122  *
123  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
124  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
125  * support (see RFC 4279) to OpenSSL.
126  *
127  * No patent licenses or other rights except those expressly stated in
128  * the OpenSSL open source license shall be deemed granted or received
129  * expressly, by implication, estoppel, or otherwise.
130  *
131  * No assurances are provided by Nokia that the Contribution does not
132  * infringe the patent or other intellectual property rights of any third
133  * party or that the license provides you with all the necessary rights
134  * to make use of the Contribution.
135  *
136  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
137  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
138  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
139  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
140  * OTHERWISE.
141  */
142
143 /*
144  * Until the key-gen callbacks are modified to use newer prototypes, we allow
145  * deprecated functions for openssl-internal code
146  */
147 #ifdef OPENSSL_NO_DEPRECATED
148 # undef OPENSSL_NO_DEPRECATED
149 #endif
150
151 #include <assert.h>
152 #include <ctype.h>
153 #include <stdio.h>
154 #include <stdlib.h>
155 #include <string.h>
156
157 #include <openssl/e_os2.h>
158 #ifdef OPENSSL_NO_STDIO
159 # define APPS_WIN16
160 #endif
161
162 /* conflicts with winsock2 stuff on netware */
163 #if !defined(OPENSSL_SYS_NETWARE)
164 # include <sys/types.h>
165 #endif
166
167 /*
168  * With IPv6, it looks like Digital has mixed up the proper order of
169  * recursive header file inclusion, resulting in the compiler complaining
170  * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
171  * needed to have fileno() declared correctly...  So let's define u_int
172  */
173 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
174 # define __U_INT
175 typedef unsigned int u_int;
176 #endif
177
178 #include <openssl/lhash.h>
179 #include <openssl/bn.h>
180 #define USE_SOCKETS
181 #include "apps.h"
182 #include <openssl/err.h>
183 #include <openssl/pem.h>
184 #include <openssl/x509.h>
185 #include <openssl/ssl.h>
186 #include <openssl/rand.h>
187 #include <openssl/ocsp.h>
188 #ifndef OPENSSL_NO_DH
189 # include <openssl/dh.h>
190 #endif
191 #ifndef OPENSSL_NO_RSA
192 # include <openssl/rsa.h>
193 #endif
194 #ifndef OPENSSL_NO_SRP
195 # include <openssl/srp.h>
196 #endif
197 #include "s_apps.h"
198 #include "timeouts.h"
199
200 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
201 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
202 # undef FIONBIO
203 #endif
204
205 #if defined(OPENSSL_SYS_BEOS_R5)
206 # include <fcntl.h>
207 #endif
208
209 #ifndef OPENSSL_NO_RSA
210 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
211 #endif
212 static int sv_body(char *hostname, int s, unsigned char *context);
213 static int www_body(char *hostname, int s, unsigned char *context);
214 static void close_accept_socket(void);
215 static void sv_usage(void);
216 static int init_ssl_connection(SSL *s);
217 static void print_stats(BIO *bp, SSL_CTX *ctx);
218 static int generate_session_id(const SSL *ssl, unsigned char *id,
219                                unsigned int *id_len);
220 #ifndef OPENSSL_NO_DH
221 static DH *load_dh_param(const char *dhfile);
222 static DH *get_dh512(void);
223 #endif
224
225 #ifdef MONOLITH
226 static void s_server_init(void);
227 #endif
228
229 #ifndef OPENSSL_NO_DH
230 static unsigned char dh512_p[] = {
231     0xDA, 0x58, 0x3C, 0x16, 0xD9, 0x85, 0x22, 0x89, 0xD0, 0xE4, 0xAF, 0x75,
232     0x6F, 0x4C, 0xCA, 0x92, 0xDD, 0x4B, 0xE5, 0x33, 0xB8, 0x04, 0xFB, 0x0F,
233     0xED, 0x94, 0xEF, 0x9C, 0x8A, 0x44, 0x03, 0xED, 0x57, 0x46, 0x50, 0xD3,
234     0x69, 0x99, 0xDB, 0x29, 0xD7, 0x76, 0x27, 0x6B, 0xA2, 0xD3, 0xD4, 0x12,
235     0xE2, 0x18, 0xF4, 0xDD, 0x1E, 0x08, 0x4C, 0xF6, 0xD8, 0x00, 0x3E, 0x7C,
236     0x47, 0x74, 0xE8, 0x33,
237 };
238
239 static unsigned char dh512_g[] = {
240     0x02,
241 };
242
243 static DH *get_dh512(void)
244 {
245     DH *dh = NULL;
246
247     if ((dh = DH_new()) == NULL)
248         return (NULL);
249     dh->p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
250     dh->g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
251     if ((dh->p == NULL) || (dh->g == NULL))
252         return (NULL);
253     return (dh);
254 }
255 #endif
256
257 /* static int load_CA(SSL_CTX *ctx, char *file);*/
258
259 #undef BUFSIZZ
260 #define BUFSIZZ 16*1024
261 static int bufsize = BUFSIZZ;
262 static int accept_socket = -1;
263
264 #define TEST_CERT       "server.pem"
265 #ifndef OPENSSL_NO_TLSEXT
266 # define TEST_CERT2      "server2.pem"
267 #endif
268 #undef PROG
269 #define PROG            s_server_main
270
271 extern int verify_depth, verify_return_error;
272
273 static char *cipher = NULL;
274 static int s_server_verify = SSL_VERIFY_NONE;
275 static int s_server_session_id_context = 1; /* anything will do */
276 static const char *s_cert_file = TEST_CERT, *s_key_file = NULL;
277 #ifndef OPENSSL_NO_TLSEXT
278 static const char *s_cert_file2 = TEST_CERT2, *s_key_file2 = NULL;
279 #endif
280 static char *s_dcert_file = NULL, *s_dkey_file = NULL;
281 #ifdef FIONBIO
282 static int s_nbio = 0;
283 #endif
284 static int s_nbio_test = 0;
285 int s_crlf = 0;
286 static SSL_CTX *ctx = NULL;
287 #ifndef OPENSSL_NO_TLSEXT
288 static SSL_CTX *ctx2 = NULL;
289 #endif
290 static int www = 0;
291
292 static BIO *bio_s_out = NULL;
293 static int s_debug = 0;
294 #ifndef OPENSSL_NO_TLSEXT
295 static int s_tlsextdebug = 0;
296 static int s_tlsextstatus = 0;
297 static int cert_status_cb(SSL *s, void *arg);
298 #endif
299 static int s_msg = 0;
300 static int s_quiet = 0;
301
302 static char *keymatexportlabel = NULL;
303 static int keymatexportlen = 20;
304
305 static int hack = 0;
306 #ifndef OPENSSL_NO_ENGINE
307 static char *engine_id = NULL;
308 #endif
309 static const char *session_id_prefix = NULL;
310
311 static int enable_timeouts = 0;
312 static long socket_mtu;
313 #ifndef OPENSSL_NO_DTLS1
314 static int cert_chain = 0;
315 #endif
316
317 #ifndef OPENSSL_NO_PSK
318 static char *psk_identity = "Client_identity";
319 char *psk_key = NULL;           /* by default PSK is not used */
320
321 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
322                                   unsigned char *psk,
323                                   unsigned int max_psk_len)
324 {
325     unsigned int psk_len = 0;
326     int ret;
327     BIGNUM *bn = NULL;
328
329     if (s_debug)
330         BIO_printf(bio_s_out, "psk_server_cb\n");
331     if (!identity) {
332         BIO_printf(bio_err, "Error: client did not send PSK identity\n");
333         goto out_err;
334     }
335     if (s_debug)
336         BIO_printf(bio_s_out, "identity_len=%d identity=%s\n",
337                    identity ? (int)strlen(identity) : 0, identity);
338
339     /* here we could lookup the given identity e.g. from a database */
340     if (strcmp(identity, psk_identity) != 0) {
341         BIO_printf(bio_s_out, "PSK error: client identity not found"
342                    " (got '%s' expected '%s')\n", identity, psk_identity);
343         goto out_err;
344     }
345     if (s_debug)
346         BIO_printf(bio_s_out, "PSK client identity found\n");
347
348     /* convert the PSK key to binary */
349     ret = BN_hex2bn(&bn, psk_key);
350     if (!ret) {
351         BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
352                    psk_key);
353         if (bn)
354             BN_free(bn);
355         return 0;
356     }
357     if (BN_num_bytes(bn) > (int)max_psk_len) {
358         BIO_printf(bio_err,
359                    "psk buffer of callback is too small (%d) for key (%d)\n",
360                    max_psk_len, BN_num_bytes(bn));
361         BN_free(bn);
362         return 0;
363     }
364
365     ret = BN_bn2bin(bn, psk);
366     BN_free(bn);
367
368     if (ret < 0)
369         goto out_err;
370     psk_len = (unsigned int)ret;
371
372     if (s_debug)
373         BIO_printf(bio_s_out, "fetched PSK len=%d\n", psk_len);
374     return psk_len;
375  out_err:
376     if (s_debug)
377         BIO_printf(bio_err, "Error in PSK server callback\n");
378     return 0;
379 }
380 #endif
381
382 #ifndef OPENSSL_NO_SRP
383 /* This is a context that we pass to callbacks */
384 typedef struct srpsrvparm_st {
385     char *login;
386     SRP_VBASE *vb;
387     SRP_user_pwd *user;
388 } srpsrvparm;
389
390 /*
391  * This callback pretends to require some asynchronous logic in order to
392  * obtain a verifier. When the callback is called for a new connection we
393  * return with a negative value. This will provoke the accept etc to return
394  * with an LOOKUP_X509. The main logic of the reinvokes the suspended call
395  * (which would normally occur after a worker has finished) and we set the
396  * user parameters.
397  */
398 static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
399 {
400     srpsrvparm *p = (srpsrvparm *) arg;
401     if (p->login == NULL && p->user == NULL) {
402         p->login = SSL_get_srp_username(s);
403         BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login);
404         return (-1);
405     }
406
407     if (p->user == NULL) {
408         BIO_printf(bio_err, "User %s doesn't exist\n", p->login);
409         return SSL3_AL_FATAL;
410     }
411     if (SSL_set_srp_server_param
412         (s, p->user->N, p->user->g, p->user->s, p->user->v,
413          p->user->info) < 0) {
414         *ad = SSL_AD_INTERNAL_ERROR;
415         return SSL3_AL_FATAL;
416     }
417     BIO_printf(bio_err,
418                "SRP parameters set: username = \"%s\" info=\"%s\" \n",
419                p->login, p->user->info);
420     /* need to check whether there are memory leaks */
421     p->user = NULL;
422     p->login = NULL;
423     return SSL_ERROR_NONE;
424 }
425
426 #endif
427
428 #ifdef MONOLITH
429 static void s_server_init(void)
430 {
431     accept_socket = -1;
432     cipher = NULL;
433     s_server_verify = SSL_VERIFY_NONE;
434     s_dcert_file = NULL;
435     s_dkey_file = NULL;
436     s_cert_file = TEST_CERT;
437     s_key_file = NULL;
438 # ifndef OPENSSL_NO_TLSEXT
439     s_cert_file2 = TEST_CERT2;
440     s_key_file2 = NULL;
441     ctx2 = NULL;
442 # endif
443 # ifdef FIONBIO
444     s_nbio = 0;
445 # endif
446     s_nbio_test = 0;
447     ctx = NULL;
448     www = 0;
449
450     bio_s_out = NULL;
451     s_debug = 0;
452     s_msg = 0;
453     s_quiet = 0;
454     hack = 0;
455 # ifndef OPENSSL_NO_ENGINE
456     engine_id = NULL;
457 # endif
458 }
459 #endif
460
461 static void sv_usage(void)
462 {
463     BIO_printf(bio_err, "usage: s_server [args ...]\n");
464     BIO_printf(bio_err, "\n");
465     BIO_printf(bio_err,
466                " -accept arg   - port to accept on (default is %d)\n", PORT);
467     BIO_printf(bio_err, " -context arg  - set session ID context\n");
468     BIO_printf(bio_err,
469                " -verify arg   - turn on peer certificate verification\n");
470     BIO_printf(bio_err,
471                " -Verify arg   - turn on peer certificate verification, must have a cert.\n");
472     BIO_printf(bio_err,
473                " -verify_return_error - return verification errors\n");
474     BIO_printf(bio_err, " -cert arg     - certificate file to use\n");
475     BIO_printf(bio_err, "                 (default is %s)\n", TEST_CERT);
476     BIO_printf(bio_err,
477                " -crl_check    - check the peer certificate has not been revoked by its CA.\n"
478                "                 The CRL(s) are appended to the certificate file\n");
479     BIO_printf(bio_err,
480                " -crl_check_all - check the peer certificate has not been revoked by its CA\n"
481                "                 or any other CRL in the CA chain. CRL(s) are appened to the\n"
482                "                 the certificate file.\n");
483     BIO_printf(bio_err,
484                " -certform arg - certificate format (PEM or DER) PEM default\n");
485     BIO_printf(bio_err,
486                " -key arg      - Private Key file to use, in cert file if\n");
487     BIO_printf(bio_err, "                 not specified (default is %s)\n",
488                TEST_CERT);
489     BIO_printf(bio_err,
490                " -keyform arg  - key format (PEM, DER or ENGINE) PEM default\n");
491     BIO_printf(bio_err,
492                " -pass arg     - private key file pass phrase source\n");
493     BIO_printf(bio_err,
494                " -dcert arg    - second certificate file to use (usually for DSA)\n");
495     BIO_printf(bio_err,
496                " -dcertform x  - second certificate format (PEM or DER) PEM default\n");
497     BIO_printf(bio_err,
498                " -dkey arg     - second private key file to use (usually for DSA)\n");
499     BIO_printf(bio_err,
500                " -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
501     BIO_printf(bio_err,
502                " -dpass arg    - second private key file pass phrase source\n");
503     BIO_printf(bio_err,
504                " -dhparam arg  - DH parameter file to use, in cert file if not specified\n");
505     BIO_printf(bio_err,
506                "                 or a default set of parameters is used\n");
507 #ifndef OPENSSL_NO_ECDH
508     BIO_printf(bio_err,
509                " -named_curve arg  - Elliptic curve name to use for ephemeral ECDH keys.\n"
510                "                 Use \"openssl ecparam -list_curves\" for all names\n"
511                "                 (default is nistp256).\n");
512 #endif
513 #ifdef FIONBIO
514     BIO_printf(bio_err, " -nbio         - Run with non-blocking IO\n");
515 #endif
516     BIO_printf(bio_err,
517                " -nbio_test    - test with the non-blocking test bio\n");
518     BIO_printf(bio_err,
519                " -crlf         - convert LF from terminal into CRLF\n");
520     BIO_printf(bio_err, " -debug        - Print more output\n");
521     BIO_printf(bio_err, " -msg          - Show protocol messages\n");
522     BIO_printf(bio_err, " -state        - Print the SSL states\n");
523     BIO_printf(bio_err, " -CApath arg   - PEM format directory of CA's\n");
524     BIO_printf(bio_err, " -CAfile arg   - PEM format file of CA's\n");
525     BIO_printf(bio_err,
526                " -nocert       - Don't use any certificates (Anon-DH)\n");
527     BIO_printf(bio_err,
528                " -cipher arg   - play with 'openssl ciphers' to see what goes here\n");
529     BIO_printf(bio_err, " -serverpref   - Use server's cipher preferences\n");
530     BIO_printf(bio_err, " -quiet        - No server output\n");
531     BIO_printf(bio_err, " -no_tmp_rsa   - Do not generate a tmp RSA key\n");
532 #ifndef OPENSSL_NO_PSK
533     BIO_printf(bio_err, " -psk_hint arg - PSK identity hint to use\n");
534     BIO_printf(bio_err, " -psk arg      - PSK in hex (without 0x)\n");
535 # ifndef OPENSSL_NO_JPAKE
536     BIO_printf(bio_err, " -jpake arg    - JPAKE secret to use\n");
537 # endif
538 #endif
539 #ifndef OPENSSL_NO_SRP
540     BIO_printf(bio_err, " -srpvfile file      - The verifier file for SRP\n");
541     BIO_printf(bio_err,
542                " -srpuserseed string - A seed string for a default user salt.\n");
543 #endif
544     BIO_printf(bio_err, " -ssl2         - Just talk SSLv2\n");
545 #ifndef OPENSSL_NO_SSL3_METHOD
546     BIO_printf(bio_err, " -ssl3         - Just talk SSLv3\n");
547 #endif
548     BIO_printf(bio_err, " -tls1_2       - Just talk TLSv1.2\n");
549     BIO_printf(bio_err, " -tls1_1       - Just talk TLSv1.1\n");
550     BIO_printf(bio_err, " -tls1         - Just talk TLSv1\n");
551     BIO_printf(bio_err, " -dtls1        - Just talk DTLSv1\n");
552     BIO_printf(bio_err, " -timeout      - Enable timeouts\n");
553     BIO_printf(bio_err, " -mtu          - Set link layer MTU\n");
554     BIO_printf(bio_err, " -chain        - Read a certificate chain\n");
555     BIO_printf(bio_err, " -no_ssl2      - Just disable SSLv2\n");
556     BIO_printf(bio_err, " -no_ssl3      - Just disable SSLv3\n");
557     BIO_printf(bio_err, " -no_tls1      - Just disable TLSv1\n");
558     BIO_printf(bio_err, " -no_tls1_1    - Just disable TLSv1.1\n");
559     BIO_printf(bio_err, " -no_tls1_2    - Just disable TLSv1.2\n");
560 #ifndef OPENSSL_NO_DH
561     BIO_printf(bio_err, " -no_dhe       - Disable ephemeral DH\n");
562 #endif
563 #ifndef OPENSSL_NO_ECDH
564     BIO_printf(bio_err, " -no_ecdhe     - Disable ephemeral ECDH\n");
565 #endif
566     BIO_printf(bio_err, " -bugs         - Turn on SSL bug compatibility\n");
567     BIO_printf(bio_err,
568                " -hack         - workaround for early Netscape code\n");
569     BIO_printf(bio_err,
570                " -www          - Respond to a 'GET /' with a status page\n");
571     BIO_printf(bio_err,
572                " -WWW          - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
573     BIO_printf(bio_err,
574                " -HTTP         - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
575     BIO_printf(bio_err,
576                "                 with the assumption it contains a complete HTTP response.\n");
577 #ifndef OPENSSL_NO_ENGINE
578     BIO_printf(bio_err,
579                " -engine id    - Initialise and use the specified engine\n");
580 #endif
581     BIO_printf(bio_err,
582                " -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
583     BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
584                LIST_SEPARATOR_CHAR);
585 #ifndef OPENSSL_NO_TLSEXT
586     BIO_printf(bio_err,
587                " -servername host - servername for HostName TLS extension\n");
588     BIO_printf(bio_err,
589                " -servername_fatal - on mismatch send fatal alert (default warning alert)\n");
590     BIO_printf(bio_err,
591                " -cert2 arg    - certificate file to use for servername\n");
592     BIO_printf(bio_err, "                 (default is %s)\n", TEST_CERT2);
593     BIO_printf(bio_err,
594                " -key2 arg     - Private Key file to use for servername, in cert file if\n");
595     BIO_printf(bio_err, "                 not specified (default is %s)\n",
596                TEST_CERT2);
597     BIO_printf(bio_err,
598                " -tlsextdebug  - hex dump of all TLS extensions received\n");
599     BIO_printf(bio_err,
600                " -no_ticket    - disable use of RFC4507bis session tickets\n");
601     BIO_printf(bio_err,
602                " -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
603 # ifndef OPENSSL_NO_NEXTPROTONEG
604     BIO_printf(bio_err,
605                " -nextprotoneg arg - set the advertised protocols for the NPN extension (comma-separated list)\n");
606 # endif
607 # ifndef OPENSSL_NO_SRTP
608     BIO_printf(bio_err,
609                " -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
610 # endif
611 #endif
612     BIO_printf(bio_err,
613                " -keymatexport label   - Export keying material using label\n");
614     BIO_printf(bio_err,
615                " -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
616     BIO_printf(bio_err,
617                " -status           - respond to certificate status requests\n");
618     BIO_printf(bio_err,
619                " -status_verbose   - enable status request verbose printout\n");
620     BIO_printf(bio_err,
621                " -status_timeout n - status request responder timeout\n");
622     BIO_printf(bio_err, " -status_url URL   - status request fallback URL\n");
623 }
624
625 static int local_argc = 0;
626 static char **local_argv;
627
628 #ifdef CHARSET_EBCDIC
629 static int ebcdic_new(BIO *bi);
630 static int ebcdic_free(BIO *a);
631 static int ebcdic_read(BIO *b, char *out, int outl);
632 static int ebcdic_write(BIO *b, const char *in, int inl);
633 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
634 static int ebcdic_gets(BIO *bp, char *buf, int size);
635 static int ebcdic_puts(BIO *bp, const char *str);
636
637 # define BIO_TYPE_EBCDIC_FILTER  (18|0x0200)
638 static BIO_METHOD methods_ebcdic = {
639     BIO_TYPE_EBCDIC_FILTER,
640     "EBCDIC/ASCII filter",
641     ebcdic_write,
642     ebcdic_read,
643     ebcdic_puts,
644     ebcdic_gets,
645     ebcdic_ctrl,
646     ebcdic_new,
647     ebcdic_free,
648 };
649
650 typedef struct {
651     size_t alloced;
652     char buff[1];
653 } EBCDIC_OUTBUFF;
654
655 BIO_METHOD *BIO_f_ebcdic_filter()
656 {
657     return (&methods_ebcdic);
658 }
659
660 static int ebcdic_new(BIO *bi)
661 {
662     EBCDIC_OUTBUFF *wbuf;
663
664     wbuf = (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
665     wbuf->alloced = 1024;
666     wbuf->buff[0] = '\0';
667
668     bi->ptr = (char *)wbuf;
669     bi->init = 1;
670     bi->flags = 0;
671     return (1);
672 }
673
674 static int ebcdic_free(BIO *a)
675 {
676     if (a == NULL)
677         return (0);
678     if (a->ptr != NULL)
679         OPENSSL_free(a->ptr);
680     a->ptr = NULL;
681     a->init = 0;
682     a->flags = 0;
683     return (1);
684 }
685
686 static int ebcdic_read(BIO *b, char *out, int outl)
687 {
688     int ret = 0;
689
690     if (out == NULL || outl == 0)
691         return (0);
692     if (b->next_bio == NULL)
693         return (0);
694
695     ret = BIO_read(b->next_bio, out, outl);
696     if (ret > 0)
697         ascii2ebcdic(out, out, ret);
698     return (ret);
699 }
700
701 static int ebcdic_write(BIO *b, const char *in, int inl)
702 {
703     EBCDIC_OUTBUFF *wbuf;
704     int ret = 0;
705     int num;
706     unsigned char n;
707
708     if ((in == NULL) || (inl <= 0))
709         return (0);
710     if (b->next_bio == NULL)
711         return (0);
712
713     wbuf = (EBCDIC_OUTBUFF *) b->ptr;
714
715     if (inl > (num = wbuf->alloced)) {
716         num = num + num;        /* double the size */
717         if (num < inl)
718             num = inl;
719         OPENSSL_free(wbuf);
720         wbuf =
721             (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
722
723         wbuf->alloced = num;
724         wbuf->buff[0] = '\0';
725
726         b->ptr = (char *)wbuf;
727     }
728
729     ebcdic2ascii(wbuf->buff, in, inl);
730
731     ret = BIO_write(b->next_bio, wbuf->buff, inl);
732
733     return (ret);
734 }
735
736 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
737 {
738     long ret;
739
740     if (b->next_bio == NULL)
741         return (0);
742     switch (cmd) {
743     case BIO_CTRL_DUP:
744         ret = 0L;
745         break;
746     default:
747         ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
748         break;
749     }
750     return (ret);
751 }
752
753 static int ebcdic_gets(BIO *bp, char *buf, int size)
754 {
755     int i, ret = 0;
756     if (bp->next_bio == NULL)
757         return (0);
758 /*      return(BIO_gets(bp->next_bio,buf,size));*/
759     for (i = 0; i < size - 1; ++i) {
760         ret = ebcdic_read(bp, &buf[i], 1);
761         if (ret <= 0)
762             break;
763         else if (buf[i] == '\n') {
764             ++i;
765             break;
766         }
767     }
768     if (i < size)
769         buf[i] = '\0';
770     return (ret < 0 && i == 0) ? ret : i;
771 }
772
773 static int ebcdic_puts(BIO *bp, const char *str)
774 {
775     if (bp->next_bio == NULL)
776         return (0);
777     return ebcdic_write(bp, str, strlen(str));
778 }
779 #endif
780
781 #ifndef OPENSSL_NO_TLSEXT
782
783 /* This is a context that we pass to callbacks */
784 typedef struct tlsextctx_st {
785     char *servername;
786     BIO *biodebug;
787     int extension_error;
788 } tlsextctx;
789
790 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
791 {
792     tlsextctx *p = (tlsextctx *) arg;
793     const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
794     if (servername && p->biodebug)
795         BIO_printf(p->biodebug, "Hostname in TLS extension: \"%s\"\n",
796                    servername);
797
798     if (!p->servername)
799         return SSL_TLSEXT_ERR_NOACK;
800
801     if (servername) {
802         if (strcasecmp(servername, p->servername))
803             return p->extension_error;
804         if (ctx2) {
805             BIO_printf(p->biodebug, "Switching server context.\n");
806             SSL_set_SSL_CTX(s, ctx2);
807         }
808     }
809     return SSL_TLSEXT_ERR_OK;
810 }
811
812 /* Structure passed to cert status callback */
813
814 typedef struct tlsextstatusctx_st {
815     /* Default responder to use */
816     char *host, *path, *port;
817     int use_ssl;
818     int timeout;
819     BIO *err;
820     int verbose;
821 } tlsextstatusctx;
822
823 static tlsextstatusctx tlscstatp = { NULL, NULL, NULL, 0, -1, NULL, 0 };
824
825 /*
826  * Certificate Status callback. This is called when a client includes a
827  * certificate status request extension. This is a simplified version. It
828  * examines certificates each time and makes one OCSP responder query for
829  * each request. A full version would store details such as the OCSP
830  * certificate IDs and minimise the number of OCSP responses by caching them
831  * until they were considered "expired".
832  */
833
834 static int cert_status_cb(SSL *s, void *arg)
835 {
836     tlsextstatusctx *srctx = arg;
837     BIO *err = srctx->err;
838     char *host, *port, *path;
839     int use_ssl;
840     unsigned char *rspder = NULL;
841     int rspderlen;
842     STACK_OF(OPENSSL_STRING) *aia = NULL;
843     X509 *x = NULL;
844     X509_STORE_CTX inctx;
845     X509_OBJECT obj;
846     OCSP_REQUEST *req = NULL;
847     OCSP_RESPONSE *resp = NULL;
848     OCSP_CERTID *id = NULL;
849     STACK_OF(X509_EXTENSION) *exts;
850     int ret = SSL_TLSEXT_ERR_NOACK;
851     int i;
852 # if 0
853     STACK_OF(OCSP_RESPID) *ids;
854     SSL_get_tlsext_status_ids(s, &ids);
855     BIO_printf(err, "cert_status: received %d ids\n",
856                sk_OCSP_RESPID_num(ids));
857 # endif
858     if (srctx->verbose)
859         BIO_puts(err, "cert_status: callback called\n");
860     /* Build up OCSP query from server certificate */
861     x = SSL_get_certificate(s);
862     aia = X509_get1_ocsp(x);
863     if (aia) {
864         if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0),
865                             &host, &port, &path, &use_ssl)) {
866             BIO_puts(err, "cert_status: can't parse AIA URL\n");
867             goto err;
868         }
869         if (srctx->verbose)
870             BIO_printf(err, "cert_status: AIA URL: %s\n",
871                        sk_OPENSSL_STRING_value(aia, 0));
872     } else {
873         if (!srctx->host) {
874             BIO_puts(srctx->err,
875                      "cert_status: no AIA and no default responder URL\n");
876             goto done;
877         }
878         host = srctx->host;
879         path = srctx->path;
880         port = srctx->port;
881         use_ssl = srctx->use_ssl;
882     }
883
884     if (!X509_STORE_CTX_init(&inctx,
885                              SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)),
886                              NULL, NULL))
887         goto err;
888     if (X509_STORE_get_by_subject(&inctx, X509_LU_X509,
889                                   X509_get_issuer_name(x), &obj) <= 0) {
890         BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n");
891         X509_STORE_CTX_cleanup(&inctx);
892         goto done;
893     }
894     req = OCSP_REQUEST_new();
895     if (!req)
896         goto err;
897     id = OCSP_cert_to_id(NULL, x, obj.data.x509);
898     X509_free(obj.data.x509);
899     X509_STORE_CTX_cleanup(&inctx);
900     if (!id)
901         goto err;
902     if (!OCSP_request_add0_id(req, id))
903         goto err;
904     id = NULL;
905     /* Add any extensions to the request */
906     SSL_get_tlsext_status_exts(s, &exts);
907     for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
908         X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
909         if (!OCSP_REQUEST_add_ext(req, ext, -1))
910             goto err;
911     }
912     resp = process_responder(err, req, host, path, port, use_ssl, NULL,
913                              srctx->timeout);
914     if (!resp) {
915         BIO_puts(err, "cert_status: error querying responder\n");
916         goto done;
917     }
918     rspderlen = i2d_OCSP_RESPONSE(resp, &rspder);
919     if (rspderlen <= 0)
920         goto err;
921     SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen);
922     if (srctx->verbose) {
923         BIO_puts(err, "cert_status: ocsp response sent:\n");
924         OCSP_RESPONSE_print(err, resp, 2);
925     }
926     ret = SSL_TLSEXT_ERR_OK;
927  done:
928     if (ret != SSL_TLSEXT_ERR_OK)
929         ERR_print_errors(err);
930     if (aia) {
931         OPENSSL_free(host);
932         OPENSSL_free(path);
933         OPENSSL_free(port);
934         X509_email_free(aia);
935     }
936     if (id)
937         OCSP_CERTID_free(id);
938     if (req)
939         OCSP_REQUEST_free(req);
940     if (resp)
941         OCSP_RESPONSE_free(resp);
942     return ret;
943  err:
944     ret = SSL_TLSEXT_ERR_ALERT_FATAL;
945     goto done;
946 }
947
948 # ifndef OPENSSL_NO_NEXTPROTONEG
949 /* This is the context that we pass to next_proto_cb */
950 typedef struct tlsextnextprotoctx_st {
951     unsigned char *data;
952     unsigned int len;
953 } tlsextnextprotoctx;
954
955 static int next_proto_cb(SSL *s, const unsigned char **data,
956                          unsigned int *len, void *arg)
957 {
958     tlsextnextprotoctx *next_proto = arg;
959
960     *data = next_proto->data;
961     *len = next_proto->len;
962
963     return SSL_TLSEXT_ERR_OK;
964 }
965 # endif                         /* ndef OPENSSL_NO_NEXTPROTONEG */
966
967 #endif
968
969 int MAIN(int, char **);
970
971 #ifndef OPENSSL_NO_JPAKE
972 static char *jpake_secret = NULL;
973 #endif
974 #ifndef OPENSSL_NO_SRP
975 static srpsrvparm srp_callback_parm;
976 #endif
977 #ifndef OPENSSL_NO_SRTP
978 static char *srtp_profiles = NULL;
979 #endif
980
981 int MAIN(int argc, char *argv[])
982 {
983     X509_VERIFY_PARAM *vpm = NULL;
984     int badarg = 0;
985     short port = PORT;
986     char *CApath = NULL, *CAfile = NULL;
987     unsigned char *context = NULL;
988     char *dhfile = NULL;
989 #ifndef OPENSSL_NO_ECDH
990     char *named_curve = NULL;
991 #endif
992     int badop = 0, bugs = 0;
993     int ret = 1;
994     int off = 0;
995     int no_tmp_rsa = 0, no_dhe = 0, no_ecdhe = 0, nocert = 0;
996     int state = 0;
997     const SSL_METHOD *meth = NULL;
998     int socket_type = SOCK_STREAM;
999     ENGINE *e = NULL;
1000     char *inrand = NULL;
1001     int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
1002     char *passarg = NULL, *pass = NULL;
1003     char *dpassarg = NULL, *dpass = NULL;
1004     int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
1005     X509 *s_cert = NULL, *s_dcert = NULL;
1006     EVP_PKEY *s_key = NULL, *s_dkey = NULL;
1007     int no_cache = 0;
1008 #ifndef OPENSSL_NO_TLSEXT
1009     EVP_PKEY *s_key2 = NULL;
1010     X509 *s_cert2 = NULL;
1011     tlsextctx tlsextcbp = { NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING };
1012 # ifndef OPENSSL_NO_NEXTPROTONEG
1013     const char *next_proto_neg_in = NULL;
1014     tlsextnextprotoctx next_proto;
1015 # endif
1016 #endif
1017 #ifndef OPENSSL_NO_PSK
1018     /* by default do not send a PSK identity hint */
1019     static char *psk_identity_hint = NULL;
1020 #endif
1021 #ifndef OPENSSL_NO_SRP
1022     char *srpuserseed = NULL;
1023     char *srp_verifier_file = NULL;
1024 #endif
1025     meth = SSLv23_server_method();
1026
1027     local_argc = argc;
1028     local_argv = argv;
1029
1030     apps_startup();
1031 #ifdef MONOLITH
1032     s_server_init();
1033 #endif
1034
1035     if (bio_err == NULL)
1036         bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
1037
1038     if (!load_config(bio_err, NULL))
1039         goto end;
1040
1041     verify_depth = 0;
1042 #ifdef FIONBIO
1043     s_nbio = 0;
1044 #endif
1045     s_nbio_test = 0;
1046
1047     argc--;
1048     argv++;
1049
1050     while (argc >= 1) {
1051         if ((strcmp(*argv, "-port") == 0) || (strcmp(*argv, "-accept") == 0)) {
1052             if (--argc < 1)
1053                 goto bad;
1054             if (!extract_port(*(++argv), &port))
1055                 goto bad;
1056         } else if (strcmp(*argv, "-verify") == 0) {
1057             s_server_verify = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
1058             if (--argc < 1)
1059                 goto bad;
1060             verify_depth = atoi(*(++argv));
1061             BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
1062         } else if (strcmp(*argv, "-Verify") == 0) {
1063             s_server_verify =
1064                 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT |
1065                 SSL_VERIFY_CLIENT_ONCE;
1066             if (--argc < 1)
1067                 goto bad;
1068             verify_depth = atoi(*(++argv));
1069             BIO_printf(bio_err,
1070                        "verify depth is %d, must return a certificate\n",
1071                        verify_depth);
1072         } else if (strcmp(*argv, "-context") == 0) {
1073             if (--argc < 1)
1074                 goto bad;
1075             context = (unsigned char *)*(++argv);
1076         } else if (strcmp(*argv, "-cert") == 0) {
1077             if (--argc < 1)
1078                 goto bad;
1079             s_cert_file = *(++argv);
1080         } else if (strcmp(*argv, "-certform") == 0) {
1081             if (--argc < 1)
1082                 goto bad;
1083             s_cert_format = str2fmt(*(++argv));
1084         } else if (strcmp(*argv, "-key") == 0) {
1085             if (--argc < 1)
1086                 goto bad;
1087             s_key_file = *(++argv);
1088         } else if (strcmp(*argv, "-keyform") == 0) {
1089             if (--argc < 1)
1090                 goto bad;
1091             s_key_format = str2fmt(*(++argv));
1092         } else if (strcmp(*argv, "-pass") == 0) {
1093             if (--argc < 1)
1094                 goto bad;
1095             passarg = *(++argv);
1096         } else if (strcmp(*argv, "-dhparam") == 0) {
1097             if (--argc < 1)
1098                 goto bad;
1099             dhfile = *(++argv);
1100         }
1101 #ifndef OPENSSL_NO_ECDH
1102         else if (strcmp(*argv, "-named_curve") == 0) {
1103             if (--argc < 1)
1104                 goto bad;
1105             named_curve = *(++argv);
1106         }
1107 #endif
1108         else if (strcmp(*argv, "-dcertform") == 0) {
1109             if (--argc < 1)
1110                 goto bad;
1111             s_dcert_format = str2fmt(*(++argv));
1112         } else if (strcmp(*argv, "-dcert") == 0) {
1113             if (--argc < 1)
1114                 goto bad;
1115             s_dcert_file = *(++argv);
1116         } else if (strcmp(*argv, "-dkeyform") == 0) {
1117             if (--argc < 1)
1118                 goto bad;
1119             s_dkey_format = str2fmt(*(++argv));
1120         } else if (strcmp(*argv, "-dpass") == 0) {
1121             if (--argc < 1)
1122                 goto bad;
1123             dpassarg = *(++argv);
1124         } else if (strcmp(*argv, "-dkey") == 0) {
1125             if (--argc < 1)
1126                 goto bad;
1127             s_dkey_file = *(++argv);
1128         } else if (strcmp(*argv, "-nocert") == 0) {
1129             nocert = 1;
1130         } else if (strcmp(*argv, "-CApath") == 0) {
1131             if (--argc < 1)
1132                 goto bad;
1133             CApath = *(++argv);
1134         } else if (strcmp(*argv, "-no_cache") == 0)
1135             no_cache = 1;
1136         else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm)) {
1137             if (badarg)
1138                 goto bad;
1139             continue;
1140         } else if (strcmp(*argv, "-verify_return_error") == 0)
1141             verify_return_error = 1;
1142         else if (strcmp(*argv, "-serverpref") == 0) {
1143             off |= SSL_OP_CIPHER_SERVER_PREFERENCE;
1144         } else if (strcmp(*argv, "-legacy_renegotiation") == 0)
1145             off |= SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
1146         else if (strcmp(*argv, "-cipher") == 0) {
1147             if (--argc < 1)
1148                 goto bad;
1149             cipher = *(++argv);
1150         } else if (strcmp(*argv, "-CAfile") == 0) {
1151             if (--argc < 1)
1152                 goto bad;
1153             CAfile = *(++argv);
1154         }
1155 #ifdef FIONBIO
1156         else if (strcmp(*argv, "-nbio") == 0) {
1157             s_nbio = 1;
1158         }
1159 #endif
1160         else if (strcmp(*argv, "-nbio_test") == 0) {
1161 #ifdef FIONBIO
1162             s_nbio = 1;
1163 #endif
1164             s_nbio_test = 1;
1165         } else if (strcmp(*argv, "-debug") == 0) {
1166             s_debug = 1;
1167         }
1168 #ifndef OPENSSL_NO_TLSEXT
1169         else if (strcmp(*argv, "-tlsextdebug") == 0)
1170             s_tlsextdebug = 1;
1171         else if (strcmp(*argv, "-status") == 0)
1172             s_tlsextstatus = 1;
1173         else if (strcmp(*argv, "-status_verbose") == 0) {
1174             s_tlsextstatus = 1;
1175             tlscstatp.verbose = 1;
1176         } else if (!strcmp(*argv, "-status_timeout")) {
1177             s_tlsextstatus = 1;
1178             if (--argc < 1)
1179                 goto bad;
1180             tlscstatp.timeout = atoi(*(++argv));
1181         } else if (!strcmp(*argv, "-status_url")) {
1182             s_tlsextstatus = 1;
1183             if (--argc < 1)
1184                 goto bad;
1185             if (!OCSP_parse_url(*(++argv),
1186                                 &tlscstatp.host,
1187                                 &tlscstatp.port,
1188                                 &tlscstatp.path, &tlscstatp.use_ssl)) {
1189                 BIO_printf(bio_err, "Error parsing URL\n");
1190                 goto bad;
1191             }
1192         }
1193 #endif
1194         else if (strcmp(*argv, "-msg") == 0) {
1195             s_msg = 1;
1196         } else if (strcmp(*argv, "-hack") == 0) {
1197             hack = 1;
1198         } else if (strcmp(*argv, "-state") == 0) {
1199             state = 1;
1200         } else if (strcmp(*argv, "-crlf") == 0) {
1201             s_crlf = 1;
1202         } else if (strcmp(*argv, "-quiet") == 0) {
1203             s_quiet = 1;
1204         } else if (strcmp(*argv, "-bugs") == 0) {
1205             bugs = 1;
1206         } else if (strcmp(*argv, "-no_tmp_rsa") == 0) {
1207             no_tmp_rsa = 1;
1208         } else if (strcmp(*argv, "-no_dhe") == 0) {
1209             no_dhe = 1;
1210         } else if (strcmp(*argv, "-no_ecdhe") == 0) {
1211             no_ecdhe = 1;
1212         }
1213 #ifndef OPENSSL_NO_PSK
1214         else if (strcmp(*argv, "-psk_hint") == 0) {
1215             if (--argc < 1)
1216                 goto bad;
1217             psk_identity_hint = *(++argv);
1218         } else if (strcmp(*argv, "-psk") == 0) {
1219             size_t i;
1220
1221             if (--argc < 1)
1222                 goto bad;
1223             psk_key = *(++argv);
1224             for (i = 0; i < strlen(psk_key); i++) {
1225                 if (isxdigit((unsigned char)psk_key[i]))
1226                     continue;
1227                 BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
1228                 goto bad;
1229             }
1230         }
1231 #endif
1232 #ifndef OPENSSL_NO_SRP
1233         else if (strcmp(*argv, "-srpvfile") == 0) {
1234             if (--argc < 1)
1235                 goto bad;
1236             srp_verifier_file = *(++argv);
1237             meth = TLSv1_server_method();
1238         } else if (strcmp(*argv, "-srpuserseed") == 0) {
1239             if (--argc < 1)
1240                 goto bad;
1241             srpuserseed = *(++argv);
1242             meth = TLSv1_server_method();
1243         }
1244 #endif
1245         else if (strcmp(*argv, "-www") == 0) {
1246             www = 1;
1247         } else if (strcmp(*argv, "-WWW") == 0) {
1248             www = 2;
1249         } else if (strcmp(*argv, "-HTTP") == 0) {
1250             www = 3;
1251         } else if (strcmp(*argv, "-no_ssl2") == 0) {
1252             off |= SSL_OP_NO_SSLv2;
1253         } else if (strcmp(*argv, "-no_ssl3") == 0) {
1254             off |= SSL_OP_NO_SSLv3;
1255         } else if (strcmp(*argv, "-no_tls1") == 0) {
1256             off |= SSL_OP_NO_TLSv1;
1257         } else if (strcmp(*argv, "-no_tls1_1") == 0) {
1258             off |= SSL_OP_NO_TLSv1_1;
1259         } else if (strcmp(*argv, "-no_tls1_2") == 0) {
1260             off |= SSL_OP_NO_TLSv1_2;
1261         } else if (strcmp(*argv, "-no_comp") == 0) {
1262             off |= SSL_OP_NO_COMPRESSION;
1263         }
1264 #ifndef OPENSSL_NO_TLSEXT
1265         else if (strcmp(*argv, "-no_ticket") == 0) {
1266             off |= SSL_OP_NO_TICKET;
1267         }
1268 #endif
1269 #ifndef OPENSSL_NO_SSL2
1270         else if (strcmp(*argv, "-ssl2") == 0) {
1271             meth = SSLv2_server_method();
1272         }
1273 #endif
1274 #ifndef OPENSSL_NO_SSL3_METHOD
1275         else if (strcmp(*argv, "-ssl3") == 0) {
1276             meth = SSLv3_server_method();
1277         }
1278 #endif
1279 #ifndef OPENSSL_NO_TLS1
1280         else if (strcmp(*argv, "-tls1") == 0) {
1281             meth = TLSv1_server_method();
1282         } else if (strcmp(*argv, "-tls1_1") == 0) {
1283             meth = TLSv1_1_server_method();
1284         } else if (strcmp(*argv, "-tls1_2") == 0) {
1285             meth = TLSv1_2_server_method();
1286         }
1287 #endif
1288 #ifndef OPENSSL_NO_DTLS1
1289         else if (strcmp(*argv, "-dtls1") == 0) {
1290             meth = DTLSv1_server_method();
1291             socket_type = SOCK_DGRAM;
1292         } else if (strcmp(*argv, "-timeout") == 0)
1293             enable_timeouts = 1;
1294         else if (strcmp(*argv, "-mtu") == 0) {
1295             if (--argc < 1)
1296                 goto bad;
1297             socket_mtu = atol(*(++argv));
1298         } else if (strcmp(*argv, "-chain") == 0)
1299             cert_chain = 1;
1300 #endif
1301         else if (strcmp(*argv, "-id_prefix") == 0) {
1302             if (--argc < 1)
1303                 goto bad;
1304             session_id_prefix = *(++argv);
1305         }
1306 #ifndef OPENSSL_NO_ENGINE
1307         else if (strcmp(*argv, "-engine") == 0) {
1308             if (--argc < 1)
1309                 goto bad;
1310             engine_id = *(++argv);
1311         }
1312 #endif
1313         else if (strcmp(*argv, "-rand") == 0) {
1314             if (--argc < 1)
1315                 goto bad;
1316             inrand = *(++argv);
1317         }
1318 #ifndef OPENSSL_NO_TLSEXT
1319         else if (strcmp(*argv, "-servername") == 0) {
1320             if (--argc < 1)
1321                 goto bad;
1322             tlsextcbp.servername = *(++argv);
1323         } else if (strcmp(*argv, "-servername_fatal") == 0) {
1324             tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL;
1325         } else if (strcmp(*argv, "-cert2") == 0) {
1326             if (--argc < 1)
1327                 goto bad;
1328             s_cert_file2 = *(++argv);
1329         } else if (strcmp(*argv, "-key2") == 0) {
1330             if (--argc < 1)
1331                 goto bad;
1332             s_key_file2 = *(++argv);
1333         }
1334 # ifndef OPENSSL_NO_NEXTPROTONEG
1335         else if (strcmp(*argv, "-nextprotoneg") == 0) {
1336             if (--argc < 1)
1337                 goto bad;
1338             next_proto_neg_in = *(++argv);
1339         }
1340 # endif
1341 #endif
1342 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1343         else if (strcmp(*argv, "-jpake") == 0) {
1344             if (--argc < 1)
1345                 goto bad;
1346             jpake_secret = *(++argv);
1347         }
1348 #endif
1349 #ifndef OPENSSL_NO_SRTP
1350         else if (strcmp(*argv, "-use_srtp") == 0) {
1351             if (--argc < 1)
1352                 goto bad;
1353             srtp_profiles = *(++argv);
1354         }
1355 #endif
1356         else if (strcmp(*argv, "-keymatexport") == 0) {
1357             if (--argc < 1)
1358                 goto bad;
1359             keymatexportlabel = *(++argv);
1360         } else if (strcmp(*argv, "-keymatexportlen") == 0) {
1361             if (--argc < 1)
1362                 goto bad;
1363             keymatexportlen = atoi(*(++argv));
1364             if (keymatexportlen == 0)
1365                 goto bad;
1366         } else {
1367             BIO_printf(bio_err, "unknown option %s\n", *argv);
1368             badop = 1;
1369             break;
1370         }
1371         argc--;
1372         argv++;
1373     }
1374     if (badop) {
1375  bad:
1376         sv_usage();
1377         goto end;
1378     }
1379 #ifndef OPENSSL_NO_DTLS1
1380     if (www && socket_type == SOCK_DGRAM) {
1381         BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n");
1382         goto end;
1383     }
1384 #endif
1385
1386 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1387     if (jpake_secret) {
1388         if (psk_key) {
1389             BIO_printf(bio_err, "Can't use JPAKE and PSK together\n");
1390             goto end;
1391         }
1392         psk_identity = "JPAKE";
1393         if (cipher) {
1394             BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1395             goto end;
1396         }
1397         cipher = "PSK";
1398     }
1399 #endif
1400
1401     SSL_load_error_strings();
1402     OpenSSL_add_ssl_algorithms();
1403
1404 #ifndef OPENSSL_NO_ENGINE
1405     e = setup_engine(bio_err, engine_id, 1);
1406 #endif
1407
1408     if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass)) {
1409         BIO_printf(bio_err, "Error getting password\n");
1410         goto end;
1411     }
1412
1413     if (s_key_file == NULL)
1414         s_key_file = s_cert_file;
1415 #ifndef OPENSSL_NO_TLSEXT
1416     if (s_key_file2 == NULL)
1417         s_key_file2 = s_cert_file2;
1418 #endif
1419
1420     if (nocert == 0) {
1421         s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
1422                          "server certificate private key file");
1423         if (!s_key) {
1424             ERR_print_errors(bio_err);
1425             goto end;
1426         }
1427
1428         s_cert = load_cert(bio_err, s_cert_file, s_cert_format,
1429                            NULL, e, "server certificate file");
1430
1431         if (!s_cert) {
1432             ERR_print_errors(bio_err);
1433             goto end;
1434         }
1435 #ifndef OPENSSL_NO_TLSEXT
1436         if (tlsextcbp.servername) {
1437             s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
1438                               "second server certificate private key file");
1439             if (!s_key2) {
1440                 ERR_print_errors(bio_err);
1441                 goto end;
1442             }
1443
1444             s_cert2 = load_cert(bio_err, s_cert_file2, s_cert_format,
1445                                 NULL, e, "second server certificate file");
1446
1447             if (!s_cert2) {
1448                 ERR_print_errors(bio_err);
1449                 goto end;
1450             }
1451         }
1452 #endif
1453     }
1454 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1455     if (next_proto_neg_in) {
1456         unsigned short len;
1457         next_proto.data = next_protos_parse(&len, next_proto_neg_in);
1458         if (next_proto.data == NULL)
1459             goto end;
1460         next_proto.len = len;
1461     } else {
1462         next_proto.data = NULL;
1463     }
1464 #endif
1465
1466     if (s_dcert_file) {
1467
1468         if (s_dkey_file == NULL)
1469             s_dkey_file = s_dcert_file;
1470
1471         s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
1472                           0, dpass, e, "second certificate private key file");
1473         if (!s_dkey) {
1474             ERR_print_errors(bio_err);
1475             goto end;
1476         }
1477
1478         s_dcert = load_cert(bio_err, s_dcert_file, s_dcert_format,
1479                             NULL, e, "second server certificate file");
1480
1481         if (!s_dcert) {
1482             ERR_print_errors(bio_err);
1483             goto end;
1484         }
1485
1486     }
1487
1488     if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1489         && !RAND_status()) {
1490         BIO_printf(bio_err,
1491                    "warning, not much extra random data, consider using the -rand option\n");
1492     }
1493     if (inrand != NULL)
1494         BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
1495                    app_RAND_load_files(inrand));
1496
1497     if (bio_s_out == NULL) {
1498         if (s_quiet && !s_debug && !s_msg) {
1499             bio_s_out = BIO_new(BIO_s_null());
1500         } else {
1501             if (bio_s_out == NULL)
1502                 bio_s_out = BIO_new_fp(stdout, BIO_NOCLOSE);
1503         }
1504     }
1505 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
1506     if (nocert)
1507 #endif
1508     {
1509         s_cert_file = NULL;
1510         s_key_file = NULL;
1511         s_dcert_file = NULL;
1512         s_dkey_file = NULL;
1513 #ifndef OPENSSL_NO_TLSEXT
1514         s_cert_file2 = NULL;
1515         s_key_file2 = NULL;
1516 #endif
1517     }
1518
1519     ctx = SSL_CTX_new(meth);
1520     if (ctx == NULL) {
1521         ERR_print_errors(bio_err);
1522         goto end;
1523     }
1524     if (session_id_prefix) {
1525         if (strlen(session_id_prefix) >= 32)
1526             BIO_printf(bio_err,
1527                        "warning: id_prefix is too long, only one new session will be possible\n");
1528         else if (strlen(session_id_prefix) >= 16)
1529             BIO_printf(bio_err,
1530                        "warning: id_prefix is too long if you use SSLv2\n");
1531         if (!SSL_CTX_set_generate_session_id(ctx, generate_session_id)) {
1532             BIO_printf(bio_err, "error setting 'id_prefix'\n");
1533             ERR_print_errors(bio_err);
1534             goto end;
1535         }
1536         BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
1537     }
1538     SSL_CTX_set_quiet_shutdown(ctx, 1);
1539     if (bugs)
1540         SSL_CTX_set_options(ctx, SSL_OP_ALL);
1541     if (hack)
1542         SSL_CTX_set_options(ctx, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1543     SSL_CTX_set_options(ctx, off);
1544
1545     if (state)
1546         SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
1547     if (no_cache)
1548         SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
1549     else
1550         SSL_CTX_sess_set_cache_size(ctx, 128);
1551
1552 #ifndef OPENSSL_NO_SRTP
1553     if (srtp_profiles != NULL)
1554         SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1555 #endif
1556
1557 #if 0
1558     if (cipher == NULL)
1559         cipher = getenv("SSL_CIPHER");
1560 #endif
1561
1562 #if 0
1563     if (s_cert_file == NULL) {
1564         BIO_printf(bio_err,
1565                    "You must specify a certificate file for the server to use\n");
1566         goto end;
1567     }
1568 #endif
1569
1570     if ((!SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) ||
1571         (!SSL_CTX_set_default_verify_paths(ctx))) {
1572         /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
1573         ERR_print_errors(bio_err);
1574         /* goto end; */
1575     }
1576     if (vpm)
1577         SSL_CTX_set1_param(ctx, vpm);
1578
1579 #ifndef OPENSSL_NO_TLSEXT
1580     if (s_cert2) {
1581         ctx2 = SSL_CTX_new(meth);
1582         if (ctx2 == NULL) {
1583             ERR_print_errors(bio_err);
1584             goto end;
1585         }
1586     }
1587
1588     if (ctx2) {
1589         BIO_printf(bio_s_out, "Setting secondary ctx parameters\n");
1590
1591         if (session_id_prefix) {
1592             if (strlen(session_id_prefix) >= 32)
1593                 BIO_printf(bio_err,
1594                            "warning: id_prefix is too long, only one new session will be possible\n");
1595             else if (strlen(session_id_prefix) >= 16)
1596                 BIO_printf(bio_err,
1597                            "warning: id_prefix is too long if you use SSLv2\n");
1598             if (!SSL_CTX_set_generate_session_id(ctx2, generate_session_id)) {
1599                 BIO_printf(bio_err, "error setting 'id_prefix'\n");
1600                 ERR_print_errors(bio_err);
1601                 goto end;
1602             }
1603             BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
1604         }
1605         SSL_CTX_set_quiet_shutdown(ctx2, 1);
1606         if (bugs)
1607             SSL_CTX_set_options(ctx2, SSL_OP_ALL);
1608         if (hack)
1609             SSL_CTX_set_options(ctx2, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1610         SSL_CTX_set_options(ctx2, off);
1611
1612         if (state)
1613             SSL_CTX_set_info_callback(ctx2, apps_ssl_info_callback);
1614
1615         if (no_cache)
1616             SSL_CTX_set_session_cache_mode(ctx2, SSL_SESS_CACHE_OFF);
1617         else
1618             SSL_CTX_sess_set_cache_size(ctx2, 128);
1619
1620         if ((!SSL_CTX_load_verify_locations(ctx2, CAfile, CApath)) ||
1621             (!SSL_CTX_set_default_verify_paths(ctx2))) {
1622             ERR_print_errors(bio_err);
1623         }
1624         if (vpm)
1625             SSL_CTX_set1_param(ctx2, vpm);
1626     }
1627 # ifndef OPENSSL_NO_NEXTPROTONEG
1628     if (next_proto.data)
1629         SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb,
1630                                               &next_proto);
1631 # endif
1632 #endif
1633
1634 #ifndef OPENSSL_NO_DH
1635     if (!no_dhe) {
1636         DH *dh = NULL;
1637
1638         if (dhfile)
1639             dh = load_dh_param(dhfile);
1640         else if (s_cert_file)
1641             dh = load_dh_param(s_cert_file);
1642
1643         if (dh != NULL) {
1644             BIO_printf(bio_s_out, "Setting temp DH parameters\n");
1645         } else {
1646             BIO_printf(bio_s_out, "Using default temp DH parameters\n");
1647             dh = get_dh512();
1648         }
1649         (void)BIO_flush(bio_s_out);
1650
1651         SSL_CTX_set_tmp_dh(ctx, dh);
1652 # ifndef OPENSSL_NO_TLSEXT
1653         if (ctx2) {
1654             if (!dhfile) {
1655                 DH *dh2 = load_dh_param(s_cert_file2);
1656                 if (dh2 != NULL) {
1657                     BIO_printf(bio_s_out, "Setting temp DH parameters\n");
1658                     (void)BIO_flush(bio_s_out);
1659
1660                     DH_free(dh);
1661                     dh = dh2;
1662                 }
1663             }
1664             SSL_CTX_set_tmp_dh(ctx2, dh);
1665         }
1666 # endif
1667         DH_free(dh);
1668     }
1669 #endif
1670
1671 #ifndef OPENSSL_NO_ECDH
1672     if (!no_ecdhe) {
1673         EC_KEY *ecdh = NULL;
1674
1675         if (named_curve) {
1676             int nid = OBJ_sn2nid(named_curve);
1677
1678             if (nid == 0) {
1679                 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1680                 goto end;
1681             }
1682             ecdh = EC_KEY_new_by_curve_name(nid);
1683             if (ecdh == NULL) {
1684                 BIO_printf(bio_err, "unable to create curve (%s)\n",
1685                            named_curve);
1686                 goto end;
1687             }
1688         }
1689
1690         if (ecdh != NULL) {
1691             BIO_printf(bio_s_out, "Setting temp ECDH parameters\n");
1692         } else {
1693             BIO_printf(bio_s_out, "Using default temp ECDH parameters\n");
1694             ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1695             if (ecdh == NULL) {
1696                 BIO_printf(bio_err, "unable to create curve (nistp256)\n");
1697                 goto end;
1698             }
1699         }
1700         (void)BIO_flush(bio_s_out);
1701
1702         SSL_CTX_set_tmp_ecdh(ctx, ecdh);
1703 # ifndef OPENSSL_NO_TLSEXT
1704         if (ctx2)
1705             SSL_CTX_set_tmp_ecdh(ctx2, ecdh);
1706 # endif
1707         EC_KEY_free(ecdh);
1708     }
1709 #endif
1710
1711     if (!set_cert_key_stuff(ctx, s_cert, s_key))
1712         goto end;
1713 #ifndef OPENSSL_NO_TLSEXT
1714     if (ctx2 && !set_cert_key_stuff(ctx2, s_cert2, s_key2))
1715         goto end;
1716 #endif
1717     if (s_dcert != NULL) {
1718         if (!set_cert_key_stuff(ctx, s_dcert, s_dkey))
1719             goto end;
1720     }
1721 #ifndef OPENSSL_NO_RSA
1722 # if 1
1723     if (!no_tmp_rsa) {
1724         SSL_CTX_set_tmp_rsa_callback(ctx, tmp_rsa_cb);
1725 #  ifndef OPENSSL_NO_TLSEXT
1726         if (ctx2)
1727             SSL_CTX_set_tmp_rsa_callback(ctx2, tmp_rsa_cb);
1728 #  endif
1729     }
1730 # else
1731     if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx)) {
1732         RSA *rsa;
1733
1734         BIO_printf(bio_s_out, "Generating temp (512 bit) RSA key...");
1735         BIO_flush(bio_s_out);
1736
1737         rsa = RSA_generate_key(512, RSA_F4, NULL);
1738
1739         if (!SSL_CTX_set_tmp_rsa(ctx, rsa)) {
1740             ERR_print_errors(bio_err);
1741             goto end;
1742         }
1743 #  ifndef OPENSSL_NO_TLSEXT
1744         if (ctx2) {
1745             if (!SSL_CTX_set_tmp_rsa(ctx2, rsa)) {
1746                 ERR_print_errors(bio_err);
1747                 goto end;
1748             }
1749         }
1750 #  endif
1751         RSA_free(rsa);
1752         BIO_printf(bio_s_out, "\n");
1753     }
1754 # endif
1755 #endif
1756
1757 #ifndef OPENSSL_NO_PSK
1758 # ifdef OPENSSL_NO_JPAKE
1759     if (psk_key != NULL)
1760 # else
1761     if (psk_key != NULL || jpake_secret)
1762 # endif
1763     {
1764         if (s_debug)
1765             BIO_printf(bio_s_out,
1766                        "PSK key given or JPAKE in use, setting server callback\n");
1767         SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
1768     }
1769
1770     if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint)) {
1771         BIO_printf(bio_err, "error setting PSK identity hint to context\n");
1772         ERR_print_errors(bio_err);
1773         goto end;
1774     }
1775 #endif
1776
1777     if (cipher != NULL) {
1778         if (!SSL_CTX_set_cipher_list(ctx, cipher)) {
1779             BIO_printf(bio_err, "error setting cipher list\n");
1780             ERR_print_errors(bio_err);
1781             goto end;
1782         }
1783 #ifndef OPENSSL_NO_TLSEXT
1784         if (ctx2 && !SSL_CTX_set_cipher_list(ctx2, cipher)) {
1785             BIO_printf(bio_err, "error setting cipher list\n");
1786             ERR_print_errors(bio_err);
1787             goto end;
1788         }
1789 #endif
1790     }
1791     SSL_CTX_set_verify(ctx, s_server_verify, verify_callback);
1792     SSL_CTX_set_session_id_context(ctx, (void *)&s_server_session_id_context,
1793                                    sizeof s_server_session_id_context);
1794
1795     /* Set DTLS cookie generation and verification callbacks */
1796     SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback);
1797     SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback);
1798
1799 #ifndef OPENSSL_NO_TLSEXT
1800     if (ctx2) {
1801         SSL_CTX_set_verify(ctx2, s_server_verify, verify_callback);
1802         SSL_CTX_set_session_id_context(ctx2,
1803                                        (void *)&s_server_session_id_context,
1804                                        sizeof s_server_session_id_context);
1805
1806         tlsextcbp.biodebug = bio_s_out;
1807         SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
1808         SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
1809         SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1810         SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1811     }
1812 #endif
1813
1814 #ifndef OPENSSL_NO_SRP
1815     if (srp_verifier_file != NULL) {
1816         srp_callback_parm.vb = SRP_VBASE_new(srpuserseed);
1817         srp_callback_parm.user = NULL;
1818         srp_callback_parm.login = NULL;
1819         if ((ret =
1820              SRP_VBASE_init(srp_callback_parm.vb,
1821                             srp_verifier_file)) != SRP_NO_ERROR) {
1822             BIO_printf(bio_err,
1823                        "Cannot initialize SRP verifier file \"%s\":ret=%d\n",
1824                        srp_verifier_file, ret);
1825             goto end;
1826         }
1827         SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, verify_callback);
1828         SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm);
1829         SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb);
1830     } else
1831 #endif
1832     if (CAfile != NULL) {
1833         SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile));
1834 #ifndef OPENSSL_NO_TLSEXT
1835         if (ctx2)
1836             SSL_CTX_set_client_CA_list(ctx2, SSL_load_client_CA_file(CAfile));
1837 #endif
1838     }
1839
1840     BIO_printf(bio_s_out, "ACCEPT\n");
1841     (void)BIO_flush(bio_s_out);
1842     if (www)
1843         do_server(port, socket_type, &accept_socket, www_body, context);
1844     else
1845         do_server(port, socket_type, &accept_socket, sv_body, context);
1846     print_stats(bio_s_out, ctx);
1847     ret = 0;
1848  end:
1849     if (ctx != NULL)
1850         SSL_CTX_free(ctx);
1851     if (s_cert)
1852         X509_free(s_cert);
1853     if (s_dcert)
1854         X509_free(s_dcert);
1855     if (s_key)
1856         EVP_PKEY_free(s_key);
1857     if (s_dkey)
1858         EVP_PKEY_free(s_dkey);
1859     if (pass)
1860         OPENSSL_free(pass);
1861     if (dpass)
1862         OPENSSL_free(dpass);
1863     if (vpm)
1864         X509_VERIFY_PARAM_free(vpm);
1865 #ifndef OPENSSL_NO_TLSEXT
1866     if (tlscstatp.host)
1867         OPENSSL_free(tlscstatp.host);
1868     if (tlscstatp.port)
1869         OPENSSL_free(tlscstatp.port);
1870     if (tlscstatp.path)
1871         OPENSSL_free(tlscstatp.path);
1872     if (ctx2 != NULL)
1873         SSL_CTX_free(ctx2);
1874     if (s_cert2)
1875         X509_free(s_cert2);
1876     if (s_key2)
1877         EVP_PKEY_free(s_key2);
1878 #endif
1879     if (bio_s_out != NULL) {
1880         BIO_free(bio_s_out);
1881         bio_s_out = NULL;
1882     }
1883     apps_shutdown();
1884     OPENSSL_EXIT(ret);
1885 }
1886
1887 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
1888 {
1889     BIO_printf(bio, "%4ld items in the session cache\n",
1890                SSL_CTX_sess_number(ssl_ctx));
1891     BIO_printf(bio, "%4ld client connects (SSL_connect())\n",
1892                SSL_CTX_sess_connect(ssl_ctx));
1893     BIO_printf(bio, "%4ld client renegotiates (SSL_connect())\n",
1894                SSL_CTX_sess_connect_renegotiate(ssl_ctx));
1895     BIO_printf(bio, "%4ld client connects that finished\n",
1896                SSL_CTX_sess_connect_good(ssl_ctx));
1897     BIO_printf(bio, "%4ld server accepts (SSL_accept())\n",
1898                SSL_CTX_sess_accept(ssl_ctx));
1899     BIO_printf(bio, "%4ld server renegotiates (SSL_accept())\n",
1900                SSL_CTX_sess_accept_renegotiate(ssl_ctx));
1901     BIO_printf(bio, "%4ld server accepts that finished\n",
1902                SSL_CTX_sess_accept_good(ssl_ctx));
1903     BIO_printf(bio, "%4ld session cache hits\n", SSL_CTX_sess_hits(ssl_ctx));
1904     BIO_printf(bio, "%4ld session cache misses\n",
1905                SSL_CTX_sess_misses(ssl_ctx));
1906     BIO_printf(bio, "%4ld session cache timeouts\n",
1907                SSL_CTX_sess_timeouts(ssl_ctx));
1908     BIO_printf(bio, "%4ld callback cache hits\n",
1909                SSL_CTX_sess_cb_hits(ssl_ctx));
1910     BIO_printf(bio, "%4ld cache full overflows (%ld allowed)\n",
1911                SSL_CTX_sess_cache_full(ssl_ctx),
1912                SSL_CTX_sess_get_cache_size(ssl_ctx));
1913 }
1914
1915 static int sv_body(char *hostname, int s, unsigned char *context)
1916 {
1917     char *buf = NULL;
1918     fd_set readfds;
1919     int ret = 1, width;
1920     int k, i;
1921     unsigned long l;
1922     SSL *con = NULL;
1923     BIO *sbio;
1924 #ifndef OPENSSL_NO_KRB5
1925     KSSL_CTX *kctx;
1926 #endif
1927     struct timeval timeout;
1928 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1929     struct timeval tv;
1930 #else
1931     struct timeval *timeoutp;
1932 #endif
1933
1934     if ((buf = OPENSSL_malloc(bufsize)) == NULL) {
1935         BIO_printf(bio_err, "out of memory\n");
1936         goto err;
1937     }
1938 #ifdef FIONBIO
1939     if (s_nbio) {
1940         unsigned long sl = 1;
1941
1942         if (!s_quiet)
1943             BIO_printf(bio_err, "turning on non blocking io\n");
1944         if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
1945             ERR_print_errors(bio_err);
1946     }
1947 #endif
1948
1949     if (con == NULL) {
1950         con = SSL_new(ctx);
1951 #ifndef OPENSSL_NO_TLSEXT
1952         if (s_tlsextdebug) {
1953             SSL_set_tlsext_debug_callback(con, tlsext_cb);
1954             SSL_set_tlsext_debug_arg(con, bio_s_out);
1955         }
1956         if (s_tlsextstatus) {
1957             SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb);
1958             tlscstatp.err = bio_err;
1959             SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp);
1960         }
1961 #endif
1962 #ifndef OPENSSL_NO_KRB5
1963         if ((kctx = kssl_ctx_new()) != NULL) {
1964             SSL_set0_kssl_ctx(con, kctx);
1965             kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
1966             kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
1967         }
1968 #endif                          /* OPENSSL_NO_KRB5 */
1969         if (context)
1970             SSL_set_session_id_context(con, context, strlen((char *)context));
1971     }
1972     SSL_clear(con);
1973 #if 0
1974 # ifdef TLSEXT_TYPE_opaque_prf_input
1975     SSL_set_tlsext_opaque_prf_input(con, "Test server", 11);
1976 # endif
1977 #endif
1978
1979     if (SSL_version(con) == DTLS1_VERSION) {
1980
1981         sbio = BIO_new_dgram(s, BIO_NOCLOSE);
1982
1983         if (enable_timeouts) {
1984             timeout.tv_sec = 0;
1985             timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1986             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1987
1988             timeout.tv_sec = 0;
1989             timeout.tv_usec = DGRAM_SND_TIMEOUT;
1990             BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1991         }
1992
1993         if (socket_mtu) {
1994             if (socket_mtu < DTLS_get_link_min_mtu(con)) {
1995                 BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
1996                            DTLS_get_link_min_mtu(con));
1997                 ret = -1;
1998                 BIO_free(sbio);
1999                 goto err;
2000             }
2001             SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
2002             if (!DTLS_set_link_mtu(con, socket_mtu)) {
2003                 BIO_printf(bio_err, "Failed to set MTU\n");
2004                 ret = -1;
2005                 BIO_free(sbio);
2006                 goto err;
2007             }
2008         } else
2009             /* want to do MTU discovery */
2010             BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
2011
2012         /* turn on cookie exchange */
2013         SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
2014     } else
2015         sbio = BIO_new_socket(s, BIO_NOCLOSE);
2016
2017     if (s_nbio_test) {
2018         BIO *test;
2019
2020         test = BIO_new(BIO_f_nbio_test());
2021         sbio = BIO_push(test, sbio);
2022     }
2023 #ifndef OPENSSL_NO_JPAKE
2024     if (jpake_secret)
2025         jpake_server_auth(bio_s_out, sbio, jpake_secret);
2026 #endif
2027
2028     SSL_set_bio(con, sbio, sbio);
2029     SSL_set_accept_state(con);
2030     /* SSL_set_fd(con,s); */
2031
2032     if (s_debug) {
2033         SSL_set_debug(con, 1);
2034         BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
2035         BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
2036     }
2037     if (s_msg) {
2038         SSL_set_msg_callback(con, msg_cb);
2039         SSL_set_msg_callback_arg(con, bio_s_out);
2040     }
2041 #ifndef OPENSSL_NO_TLSEXT
2042     if (s_tlsextdebug) {
2043         SSL_set_tlsext_debug_callback(con, tlsext_cb);
2044         SSL_set_tlsext_debug_arg(con, bio_s_out);
2045     }
2046 #endif
2047
2048     width = s + 1;
2049     for (;;) {
2050         int read_from_terminal;
2051         int read_from_sslcon;
2052
2053         read_from_terminal = 0;
2054         read_from_sslcon = SSL_pending(con);
2055
2056         if (!read_from_sslcon) {
2057             FD_ZERO(&readfds);
2058 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
2059             openssl_fdset(fileno(stdin), &readfds);
2060 #endif
2061             openssl_fdset(s, &readfds);
2062             /*
2063              * Note: under VMS with SOCKETSHR the second parameter is
2064              * currently of type (int *) whereas under other systems it is
2065              * (void *) if you don't have a cast it will choke the compiler:
2066              * if you do have a cast then you can either go for (int *) or
2067              * (void *).
2068              */
2069 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
2070             /*
2071              * Under DOS (non-djgpp) and Windows we can't select on stdin:
2072              * only on sockets. As a workaround we timeout the select every
2073              * second and check for any keypress. In a proper Windows
2074              * application we wouldn't do this because it is inefficient.
2075              */
2076             tv.tv_sec = 1;
2077             tv.tv_usec = 0;
2078             i = select(width, (void *)&readfds, NULL, NULL, &tv);
2079             if ((i < 0) || (!i && !_kbhit()))
2080                 continue;
2081             if (_kbhit())
2082                 read_from_terminal = 1;
2083 #elif defined(OPENSSL_SYS_BEOS_R5)
2084             /* Under BeOS-R5 the situation is similar to DOS */
2085             tv.tv_sec = 1;
2086             tv.tv_usec = 0;
2087             (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
2088             i = select(width, (void *)&readfds, NULL, NULL, &tv);
2089             if ((i < 0) || (!i && read(fileno(stdin), buf, 0) < 0))
2090                 continue;
2091             if (read(fileno(stdin), buf, 0) >= 0)
2092                 read_from_terminal = 1;
2093             (void)fcntl(fileno(stdin), F_SETFL, 0);
2094 #else
2095             if ((SSL_version(con) == DTLS1_VERSION) &&
2096                 DTLSv1_get_timeout(con, &timeout))
2097                 timeoutp = &timeout;
2098             else
2099                 timeoutp = NULL;
2100
2101             i = select(width, (void *)&readfds, NULL, NULL, timeoutp);
2102
2103             if ((SSL_version(con) == DTLS1_VERSION)
2104                 && DTLSv1_handle_timeout(con) > 0) {
2105                 BIO_printf(bio_err, "TIMEOUT occured\n");
2106             }
2107
2108             if (i <= 0)
2109                 continue;
2110             if (FD_ISSET(fileno(stdin), &readfds))
2111                 read_from_terminal = 1;
2112 #endif
2113             if (FD_ISSET(s, &readfds))
2114                 read_from_sslcon = 1;
2115         }
2116         if (read_from_terminal) {
2117             if (s_crlf) {
2118                 int j, lf_num;
2119
2120                 i = raw_read_stdin(buf, bufsize / 2);
2121                 lf_num = 0;
2122                 /* both loops are skipped when i <= 0 */
2123                 for (j = 0; j < i; j++)
2124                     if (buf[j] == '\n')
2125                         lf_num++;
2126                 for (j = i - 1; j >= 0; j--) {
2127                     buf[j + lf_num] = buf[j];
2128                     if (buf[j] == '\n') {
2129                         lf_num--;
2130                         i++;
2131                         buf[j + lf_num] = '\r';
2132                     }
2133                 }
2134                 assert(lf_num == 0);
2135             } else
2136                 i = raw_read_stdin(buf, bufsize);
2137             if (!s_quiet) {
2138                 if ((i <= 0) || (buf[0] == 'Q')) {
2139                     BIO_printf(bio_s_out, "DONE\n");
2140                     SHUTDOWN(s);
2141                     close_accept_socket();
2142                     ret = -11;
2143                     goto err;
2144                 }
2145                 if ((i <= 0) || (buf[0] == 'q')) {
2146                     BIO_printf(bio_s_out, "DONE\n");
2147                     if (SSL_version(con) != DTLS1_VERSION)
2148                         SHUTDOWN(s);
2149                     /*
2150                      * close_accept_socket(); ret= -11;
2151                      */
2152                     goto err;
2153                 }
2154 #ifndef OPENSSL_NO_HEARTBEATS
2155                 if ((buf[0] == 'B') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
2156                     BIO_printf(bio_err, "HEARTBEATING\n");
2157                     SSL_heartbeat(con);
2158                     i = 0;
2159                     continue;
2160                 }
2161 #endif
2162                 if ((buf[0] == 'r') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
2163                     SSL_renegotiate(con);
2164                     i = SSL_do_handshake(con);
2165                     printf("SSL_do_handshake -> %d\n", i);
2166                     i = 0;      /* 13; */
2167                     continue;
2168                     /*
2169                      * strcpy(buf,"server side RE-NEGOTIATE\n");
2170                      */
2171                 }
2172                 if ((buf[0] == 'R') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
2173                     SSL_set_verify(con,
2174                                    SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE,
2175                                    NULL);
2176                     SSL_renegotiate(con);
2177                     i = SSL_do_handshake(con);
2178                     printf("SSL_do_handshake -> %d\n", i);
2179                     i = 0;      /* 13; */
2180                     continue;
2181                     /*
2182                      * strcpy(buf,"server side RE-NEGOTIATE asking for client
2183                      * cert\n");
2184                      */
2185                 }
2186                 if (buf[0] == 'P') {
2187                     static const char *str = "Lets print some clear text\n";
2188                     BIO_write(SSL_get_wbio(con), str, strlen(str));
2189                 }
2190                 if (buf[0] == 'S') {
2191                     print_stats(bio_s_out, SSL_get_SSL_CTX(con));
2192                 }
2193             }
2194 #ifdef CHARSET_EBCDIC
2195             ebcdic2ascii(buf, buf, i);
2196 #endif
2197             l = k = 0;
2198             for (;;) {
2199                 /* should do a select for the write */
2200 #ifdef RENEG
2201                 {
2202                     static count = 0;
2203                     if (++count == 100) {
2204                         count = 0;
2205                         SSL_renegotiate(con);
2206                     }
2207                 }
2208 #endif
2209                 k = SSL_write(con, &(buf[l]), (unsigned int)i);
2210 #ifndef OPENSSL_NO_SRP
2211                 while (SSL_get_error(con, k) == SSL_ERROR_WANT_X509_LOOKUP) {
2212                     BIO_printf(bio_s_out, "LOOKUP renego during write\n");
2213                     srp_callback_parm.user =
2214                         SRP_VBASE_get_by_user(srp_callback_parm.vb,
2215                                               srp_callback_parm.login);
2216                     if (srp_callback_parm.user)
2217                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
2218                                    srp_callback_parm.user->info);
2219                     else
2220                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
2221                     k = SSL_write(con, &(buf[l]), (unsigned int)i);
2222                 }
2223 #endif
2224                 switch (SSL_get_error(con, k)) {
2225                 case SSL_ERROR_NONE:
2226                     break;
2227                 case SSL_ERROR_WANT_WRITE:
2228                 case SSL_ERROR_WANT_READ:
2229                 case SSL_ERROR_WANT_X509_LOOKUP:
2230                     BIO_printf(bio_s_out, "Write BLOCK\n");
2231                     break;
2232                 case SSL_ERROR_SYSCALL:
2233                 case SSL_ERROR_SSL:
2234                     BIO_printf(bio_s_out, "ERROR\n");
2235                     ERR_print_errors(bio_err);
2236                     ret = 1;
2237                     goto err;
2238                     /* break; */
2239                 case SSL_ERROR_ZERO_RETURN:
2240                     BIO_printf(bio_s_out, "DONE\n");
2241                     ret = 1;
2242                     goto err;
2243                 }
2244                 l += k;
2245                 i -= k;
2246                 if (i <= 0)
2247                     break;
2248             }
2249         }
2250         if (read_from_sslcon) {
2251             if (!SSL_is_init_finished(con)) {
2252                 i = init_ssl_connection(con);
2253
2254                 if (i < 0) {
2255                     ret = 0;
2256                     goto err;
2257                 } else if (i == 0) {
2258                     ret = 1;
2259                     goto err;
2260                 }
2261             } else {
2262  again:
2263                 i = SSL_read(con, (char *)buf, bufsize);
2264 #ifndef OPENSSL_NO_SRP
2265                 while (SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
2266                     BIO_printf(bio_s_out, "LOOKUP renego during read\n");
2267                     srp_callback_parm.user =
2268                         SRP_VBASE_get_by_user(srp_callback_parm.vb,
2269                                               srp_callback_parm.login);
2270                     if (srp_callback_parm.user)
2271                         BIO_printf(bio_s_out, "LOOKUP done %s\n",
2272                                    srp_callback_parm.user->info);
2273                     else
2274                         BIO_printf(bio_s_out, "LOOKUP not successful\n");
2275                     i = SSL_read(con, (char *)buf, bufsize);
2276                 }
2277 #endif
2278                 switch (SSL_get_error(con, i)) {
2279                 case SSL_ERROR_NONE:
2280 #ifdef CHARSET_EBCDIC
2281                     ascii2ebcdic(buf, buf, i);
2282 #endif
2283                     raw_write_stdout(buf, (unsigned int)i);
2284                     if (SSL_pending(con))
2285                         goto again;
2286                     break;
2287                 case SSL_ERROR_WANT_WRITE:
2288                 case SSL_ERROR_WANT_READ:
2289                     BIO_printf(bio_s_out, "Read BLOCK\n");
2290                     break;
2291                 case SSL_ERROR_SYSCALL:
2292                 case SSL_ERROR_SSL:
2293                     BIO_printf(bio_s_out, "ERROR\n");
2294                     ERR_print_errors(bio_err);
2295                     ret = 1;
2296                     goto err;
2297                 case SSL_ERROR_ZERO_RETURN:
2298                     BIO_printf(bio_s_out, "DONE\n");
2299                     ret = 1;
2300                     goto err;
2301                 }
2302             }
2303         }
2304     }
2305  err:
2306     if (con != NULL) {
2307         BIO_printf(bio_s_out, "shutting down SSL\n");
2308 #if 1
2309         SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2310 #else
2311         SSL_shutdown(con);
2312 #endif
2313         SSL_free(con);
2314     }
2315     BIO_printf(bio_s_out, "CONNECTION CLOSED\n");
2316     if (buf != NULL) {
2317         OPENSSL_cleanse(buf, bufsize);
2318         OPENSSL_free(buf);
2319     }
2320     if (ret >= 0)
2321         BIO_printf(bio_s_out, "ACCEPT\n");
2322     return (ret);
2323 }
2324
2325 static void close_accept_socket(void)
2326 {
2327     BIO_printf(bio_err, "shutdown accept socket\n");
2328     if (accept_socket >= 0) {
2329         SHUTDOWN2(accept_socket);
2330     }
2331 }
2332
2333 static int init_ssl_connection(SSL *con)
2334 {
2335     int i;
2336     const char *str;
2337     X509 *peer;
2338     long verify_error;
2339     MS_STATIC char buf[BUFSIZ];
2340 #ifndef OPENSSL_NO_KRB5
2341     char *client_princ;
2342 #endif
2343 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2344     const unsigned char *next_proto_neg;
2345     unsigned next_proto_neg_len;
2346 #endif
2347     unsigned char *exportedkeymat;
2348
2349     i = SSL_accept(con);
2350 #ifndef OPENSSL_NO_SRP
2351     while (i <= 0 && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
2352         BIO_printf(bio_s_out, "LOOKUP during accept %s\n",
2353                    srp_callback_parm.login);
2354         srp_callback_parm.user =
2355             SRP_VBASE_get_by_user(srp_callback_parm.vb,
2356                                   srp_callback_parm.login);
2357         if (srp_callback_parm.user)
2358             BIO_printf(bio_s_out, "LOOKUP done %s\n",
2359                        srp_callback_parm.user->info);
2360         else
2361             BIO_printf(bio_s_out, "LOOKUP not successful\n");
2362         i = SSL_accept(con);
2363     }
2364 #endif
2365     if (i <= 0) {
2366         if (BIO_sock_should_retry(i)) {
2367             BIO_printf(bio_s_out, "DELAY\n");
2368             return (1);
2369         }
2370
2371         BIO_printf(bio_err, "ERROR\n");
2372         verify_error = SSL_get_verify_result(con);
2373         if (verify_error != X509_V_OK) {
2374             BIO_printf(bio_err, "verify error:%s\n",
2375                        X509_verify_cert_error_string(verify_error));
2376         } else
2377             ERR_print_errors(bio_err);
2378         return (0);
2379     }
2380
2381     PEM_write_bio_SSL_SESSION(bio_s_out, SSL_get_session(con));
2382
2383     peer = SSL_get_peer_certificate(con);
2384     if (peer != NULL) {
2385         BIO_printf(bio_s_out, "Client certificate\n");
2386         PEM_write_bio_X509(bio_s_out, peer);
2387         X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof buf);
2388         BIO_printf(bio_s_out, "subject=%s\n", buf);
2389         X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof buf);
2390         BIO_printf(bio_s_out, "issuer=%s\n", buf);
2391         X509_free(peer);
2392     }
2393
2394     if (SSL_get_shared_ciphers(con, buf, sizeof buf) != NULL)
2395         BIO_printf(bio_s_out, "Shared ciphers:%s\n", buf);
2396     str = SSL_CIPHER_get_name(SSL_get_current_cipher(con));
2397     BIO_printf(bio_s_out, "CIPHER is %s\n", (str != NULL) ? str : "(NONE)");
2398
2399 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2400     SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len);
2401     if (next_proto_neg) {
2402         BIO_printf(bio_s_out, "NEXTPROTO is ");
2403         BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len);
2404         BIO_printf(bio_s_out, "\n");
2405     }
2406 #endif
2407 #ifndef OPENSSL_NO_SRTP
2408     {
2409         SRTP_PROTECTION_PROFILE *srtp_profile
2410             = SSL_get_selected_srtp_profile(con);
2411
2412         if (srtp_profile)
2413             BIO_printf(bio_s_out, "SRTP Extension negotiated, profile=%s\n",
2414                        srtp_profile->name);
2415     }
2416 #endif
2417     if (SSL_cache_hit(con))
2418         BIO_printf(bio_s_out, "Reused session-id\n");
2419     if (SSL_ctrl(con, SSL_CTRL_GET_FLAGS, 0, NULL) &
2420         TLS1_FLAGS_TLS_PADDING_BUG)
2421         BIO_printf(bio_s_out, "Peer has incorrect TLSv1 block padding\n");
2422 #ifndef OPENSSL_NO_KRB5
2423     client_princ = kssl_ctx_get0_client_princ(SSL_get0_kssl_ctx(con));
2424     if (client_princ != NULL) {
2425         BIO_printf(bio_s_out, "Kerberos peer principal is %s\n",
2426                    client_princ);
2427     }
2428 #endif                          /* OPENSSL_NO_KRB5 */
2429     BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n",
2430                SSL_get_secure_renegotiation_support(con) ? "" : " NOT");
2431     if (keymatexportlabel != NULL) {
2432         BIO_printf(bio_s_out, "Keying material exporter:\n");
2433         BIO_printf(bio_s_out, "    Label: '%s'\n", keymatexportlabel);
2434         BIO_printf(bio_s_out, "    Length: %i bytes\n", keymatexportlen);
2435         exportedkeymat = OPENSSL_malloc(keymatexportlen);
2436         if (exportedkeymat != NULL) {
2437             if (!SSL_export_keying_material(con, exportedkeymat,
2438                                             keymatexportlen,
2439                                             keymatexportlabel,
2440                                             strlen(keymatexportlabel),
2441                                             NULL, 0, 0)) {
2442                 BIO_printf(bio_s_out, "    Error\n");
2443             } else {
2444                 BIO_printf(bio_s_out, "    Keying material: ");
2445                 for (i = 0; i < keymatexportlen; i++)
2446                     BIO_printf(bio_s_out, "%02X", exportedkeymat[i]);
2447                 BIO_printf(bio_s_out, "\n");
2448             }
2449             OPENSSL_free(exportedkeymat);
2450         }
2451     }
2452
2453     return (1);
2454 }
2455
2456 #ifndef OPENSSL_NO_DH
2457 static DH *load_dh_param(const char *dhfile)
2458 {
2459     DH *ret = NULL;
2460     BIO *bio;
2461
2462     if ((bio = BIO_new_file(dhfile, "r")) == NULL)
2463         goto err;
2464     ret = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
2465  err:
2466     if (bio != NULL)
2467         BIO_free(bio);
2468     return (ret);
2469 }
2470 #endif
2471 #ifndef OPENSSL_NO_KRB5
2472 char *client_princ;
2473 #endif
2474
2475 #if 0
2476 static int load_CA(SSL_CTX *ctx, char *file)
2477 {
2478     FILE *in;
2479     X509 *x = NULL;
2480
2481     if ((in = fopen(file, "r")) == NULL)
2482         return (0);
2483
2484     for (;;) {
2485         if (PEM_read_X509(in, &x, NULL) == NULL)
2486             break;
2487         SSL_CTX_add_client_CA(ctx, x);
2488     }
2489     if (x != NULL)
2490         X509_free(x);
2491     fclose(in);
2492     return (1);
2493 }
2494 #endif
2495
2496 static int www_body(char *hostname, int s, unsigned char *context)
2497 {
2498     char *buf = NULL;
2499     int ret = 1;
2500     int i, j, k, dot;
2501     SSL *con;
2502     const SSL_CIPHER *c;
2503     BIO *io, *ssl_bio, *sbio;
2504 #ifndef OPENSSL_NO_KRB5
2505     KSSL_CTX *kctx;
2506 #endif
2507
2508     buf = OPENSSL_malloc(bufsize);
2509     if (buf == NULL)
2510         return (0);
2511     io = BIO_new(BIO_f_buffer());
2512     ssl_bio = BIO_new(BIO_f_ssl());
2513     if ((io == NULL) || (ssl_bio == NULL))
2514         goto err;
2515
2516 #ifdef FIONBIO
2517     if (s_nbio) {
2518         unsigned long sl = 1;
2519
2520         if (!s_quiet)
2521             BIO_printf(bio_err, "turning on non blocking io\n");
2522         if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
2523             ERR_print_errors(bio_err);
2524     }
2525 #endif
2526
2527     /* lets make the output buffer a reasonable size */
2528     if (!BIO_set_write_buffer_size(io, bufsize))
2529         goto err;
2530
2531     if ((con = SSL_new(ctx)) == NULL)
2532         goto err;
2533 #ifndef OPENSSL_NO_TLSEXT
2534     if (s_tlsextdebug) {
2535         SSL_set_tlsext_debug_callback(con, tlsext_cb);
2536         SSL_set_tlsext_debug_arg(con, bio_s_out);
2537     }
2538 #endif
2539 #ifndef OPENSSL_NO_KRB5
2540     if ((kctx = kssl_ctx_new()) != NULL) {
2541         kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
2542         kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
2543     }
2544 #endif                          /* OPENSSL_NO_KRB5 */
2545     if (context)
2546         SSL_set_session_id_context(con, context, strlen((char *)context));
2547
2548     sbio = BIO_new_socket(s, BIO_NOCLOSE);
2549     if (s_nbio_test) {
2550         BIO *test;
2551
2552         test = BIO_new(BIO_f_nbio_test());
2553         sbio = BIO_push(test, sbio);
2554     }
2555     SSL_set_bio(con, sbio, sbio);
2556     SSL_set_accept_state(con);
2557
2558     /* SSL_set_fd(con,s); */
2559     BIO_set_ssl(ssl_bio, con, BIO_CLOSE);
2560     BIO_push(io, ssl_bio);
2561 #ifdef CHARSET_EBCDIC
2562     io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io);
2563 #endif
2564
2565     if (s_debug) {
2566         SSL_set_debug(con, 1);
2567         BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
2568         BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
2569     }
2570     if (s_msg) {
2571         SSL_set_msg_callback(con, msg_cb);
2572         SSL_set_msg_callback_arg(con, bio_s_out);
2573     }
2574
2575     for (;;) {
2576         if (hack) {
2577             i = SSL_accept(con);
2578 #ifndef OPENSSL_NO_SRP
2579             while (i <= 0
2580                    && SSL_get_error(con, i) == SSL_ERROR_WANT_X509_LOOKUP) {
2581                 BIO_printf(bio_s_out, "LOOKUP during accept %s\n",
2582                            srp_callback_parm.login);
2583                 srp_callback_parm.user =
2584                     SRP_VBASE_get_by_user(srp_callback_parm.vb,
2585                                           srp_callback_parm.login);
2586                 if (srp_callback_parm.user)
2587                     BIO_printf(bio_s_out, "LOOKUP done %s\n",
2588                                srp_callback_parm.user->info);
2589                 else
2590                     BIO_printf(bio_s_out, "LOOKUP not successful\n");
2591                 i = SSL_accept(con);
2592             }
2593 #endif
2594             switch (SSL_get_error(con, i)) {
2595             case SSL_ERROR_NONE:
2596                 break;
2597             case SSL_ERROR_WANT_WRITE:
2598             case SSL_ERROR_WANT_READ:
2599             case SSL_ERROR_WANT_X509_LOOKUP:
2600                 continue;
2601             case SSL_ERROR_SYSCALL:
2602             case SSL_ERROR_SSL:
2603             case SSL_ERROR_ZERO_RETURN:
2604                 ret = 1;
2605                 goto err;
2606                 /* break; */
2607             }
2608
2609             SSL_renegotiate(con);
2610             SSL_write(con, NULL, 0);
2611         }
2612
2613         i = BIO_gets(io, buf, bufsize - 1);
2614         if (i < 0) {            /* error */
2615             if (!BIO_should_retry(io)) {
2616                 if (!s_quiet)
2617                     ERR_print_errors(bio_err);
2618                 goto err;
2619             } else {
2620                 BIO_printf(bio_s_out, "read R BLOCK\n");
2621 #if defined(OPENSSL_SYS_NETWARE)
2622                 delay(1000);
2623 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
2624                 sleep(1);
2625 #endif
2626                 continue;
2627             }
2628         } else if (i == 0) {    /* end of input */
2629             ret = 1;
2630             goto end;
2631         }
2632
2633         /* else we have data */
2634         if (((www == 1) && (strncmp("GET ", buf, 4) == 0)) ||
2635             ((www == 2) && (strncmp("GET /stats ", buf, 10) == 0))) {
2636             char *p;
2637             X509 *peer;
2638             STACK_OF(SSL_CIPHER) *sk;
2639             static const char *space = "                          ";
2640
2641             BIO_puts(io,
2642                      "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2643             BIO_puts(io, "<HTML><BODY BGCOLOR=\"#ffffff\">\n");
2644             BIO_puts(io, "<pre>\n");
2645 /*                      BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
2646             BIO_puts(io, "\n");
2647             for (i = 0; i < local_argc; i++) {
2648                 BIO_puts(io, local_argv[i]);
2649                 BIO_write(io, " ", 1);
2650             }
2651             BIO_puts(io, "\n");
2652
2653             BIO_printf(io,
2654                        "Secure Renegotiation IS%s supported\n",
2655                        SSL_get_secure_renegotiation_support(con) ?
2656                        "" : " NOT");
2657
2658             /*
2659              * The following is evil and should not really be done
2660              */
2661             BIO_printf(io, "Ciphers supported in s_server binary\n");
2662             sk = SSL_get_ciphers(con);
2663             j = sk_SSL_CIPHER_num(sk);
2664             for (i = 0; i < j; i++) {
2665                 c = sk_SSL_CIPHER_value(sk, i);
2666                 BIO_printf(io, "%-11s:%-25s",
2667                            SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2668                 if ((((i + 1) % 2) == 0) && (i + 1 != j))
2669                     BIO_puts(io, "\n");
2670             }
2671             BIO_puts(io, "\n");
2672             p = SSL_get_shared_ciphers(con, buf, bufsize);
2673             if (p != NULL) {
2674                 BIO_printf(io,
2675                            "---\nCiphers common between both SSL end points:\n");
2676                 j = i = 0;
2677                 while (*p) {
2678                     if (*p == ':') {
2679                         BIO_write(io, space, 26 - j);
2680                         i++;
2681                         j = 0;
2682                         BIO_write(io, ((i % 3) ? " " : "\n"), 1);
2683                     } else {
2684                         BIO_write(io, p, 1);
2685                         j++;
2686                     }
2687                     p++;
2688                 }
2689                 BIO_puts(io, "\n");
2690             }
2691             BIO_printf(io, (SSL_cache_hit(con)
2692                             ? "---\nReused, " : "---\nNew, "));
2693             c = SSL_get_current_cipher(con);
2694             BIO_printf(io, "%s, Cipher is %s\n",
2695                        SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2696             SSL_SESSION_print(io, SSL_get_session(con));
2697             BIO_printf(io, "---\n");
2698             print_stats(io, SSL_get_SSL_CTX(con));
2699             BIO_printf(io, "---\n");
2700             peer = SSL_get_peer_certificate(con);
2701             if (peer != NULL) {
2702                 BIO_printf(io, "Client certificate\n");
2703                 X509_print(io, peer);
2704                 PEM_write_bio_X509(io, peer);
2705             } else
2706                 BIO_puts(io, "no client certificate available\n");
2707             BIO_puts(io, "</BODY></HTML>\r\n\r\n");
2708             break;
2709         } else if ((www == 2 || www == 3)
2710                    && (strncmp("GET /", buf, 5) == 0)) {
2711             BIO *file;
2712             char *p, *e;
2713             static const char *text =
2714                 "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
2715
2716             /* skip the '/' */
2717             p = &(buf[5]);
2718
2719             dot = 1;
2720             for (e = p; *e != '\0'; e++) {
2721                 if (e[0] == ' ')
2722                     break;
2723
2724                 switch (dot) {
2725                 case 1:
2726                     dot = (e[0] == '.') ? 2 : 0;
2727                     break;
2728                 case 2:
2729                     dot = (e[0] == '.') ? 3 : 0;
2730                     break;
2731                 case 3:
2732                     dot = (e[0] == '/') ? -1 : 0;
2733                     break;
2734                 }
2735                 if (dot == 0)
2736                     dot = (e[0] == '/') ? 1 : 0;
2737             }
2738             dot = (dot == 3) || (dot == -1); /* filename contains ".."
2739                                               * component */
2740
2741             if (*e == '\0') {
2742                 BIO_puts(io, text);
2743                 BIO_printf(io, "'%s' is an invalid file name\r\n", p);
2744                 break;
2745             }
2746             *e = '\0';
2747
2748             if (dot) {
2749                 BIO_puts(io, text);
2750                 BIO_printf(io, "'%s' contains '..' reference\r\n", p);
2751                 break;
2752             }
2753
2754             if (*p == '/') {
2755                 BIO_puts(io, text);
2756                 BIO_printf(io, "'%s' is an invalid path\r\n", p);
2757                 break;
2758             }
2759 #if 0
2760             /* append if a directory lookup */
2761             if (e[-1] == '/')
2762                 strcat(p, "index.html");
2763 #endif
2764
2765             /* if a directory, do the index thang */
2766             if (app_isdir(p) > 0) {
2767 #if 0                           /* must check buffer size */
2768                 strcat(p, "/index.html");
2769 #else
2770                 BIO_puts(io, text);
2771                 BIO_printf(io, "'%s' is a directory\r\n", p);
2772                 break;
2773 #endif
2774             }
2775
2776             if ((file = BIO_new_file(p, "r")) == NULL) {
2777                 BIO_puts(io, text);
2778                 BIO_printf(io, "Error opening '%s'\r\n", p);
2779                 ERR_print_errors(io);
2780                 break;
2781             }
2782
2783             if (!s_quiet)
2784                 BIO_printf(bio_err, "FILE:%s\n", p);
2785
2786             if (www == 2) {
2787                 i = strlen(p);
2788                 if (((i > 5) && (strcmp(&(p[i - 5]), ".html") == 0)) ||
2789                     ((i > 4) && (strcmp(&(p[i - 4]), ".php") == 0)) ||
2790                     ((i > 4) && (strcmp(&(p[i - 4]), ".htm") == 0)))
2791                     BIO_puts(io,
2792                              "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2793                 else
2794                     BIO_puts(io,
2795                              "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
2796             }
2797             /* send the file */
2798             for (;;) {
2799                 i = BIO_read(file, buf, bufsize);
2800                 if (i <= 0)
2801                     break;
2802
2803 #ifdef RENEG
2804                 total_bytes += i;
2805                 fprintf(stderr, "%d\n", i);
2806                 if (total_bytes > 3 * 1024) {
2807                     total_bytes = 0;
2808                     fprintf(stderr, "RENEGOTIATE\n");
2809                     SSL_renegotiate(con);
2810                 }
2811 #endif
2812
2813                 for (j = 0; j < i;) {
2814 #ifdef RENEG
2815                     {
2816                         static count = 0;
2817                         if (++count == 13) {
2818                             SSL_renegotiate(con);
2819                         }
2820                     }
2821 #endif
2822                     k = BIO_write(io, &(buf[j]), i - j);
2823                     if (k <= 0) {
2824                         if (!BIO_should_retry(io))
2825                             goto write_error;
2826                         else {
2827                             BIO_printf(bio_s_out, "rwrite W BLOCK\n");
2828                         }
2829                     } else {
2830                         j += k;
2831                     }
2832                 }
2833             }
2834  write_error:
2835             BIO_free(file);
2836             break;
2837         }
2838     }
2839
2840     for (;;) {
2841         i = (int)BIO_flush(io);
2842         if (i <= 0) {
2843             if (!BIO_should_retry(io))
2844                 break;
2845         } else
2846             break;
2847     }
2848  end:
2849 #if 1
2850     /* make sure we re-use sessions */
2851     SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2852 #else
2853     /* This kills performance */
2854     /*
2855      * SSL_shutdown(con); A shutdown gets sent in the BIO_free_all(io)
2856      * procession
2857      */
2858 #endif
2859
2860  err:
2861
2862     if (ret >= 0)
2863         BIO_printf(bio_s_out, "ACCEPT\n");
2864
2865     if (buf != NULL)
2866         OPENSSL_free(buf);
2867     if (io != NULL)
2868         BIO_free_all(io);
2869 /*      if (ssl_bio != NULL) BIO_free(ssl_bio);*/
2870     return (ret);
2871 }
2872
2873 #ifndef OPENSSL_NO_RSA
2874 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
2875 {
2876     BIGNUM *bn = NULL;
2877     static RSA *rsa_tmp = NULL;
2878
2879     if (!rsa_tmp && ((bn = BN_new()) == NULL))
2880         BIO_printf(bio_err, "Allocation error in generating RSA key\n");
2881     if (!rsa_tmp && bn) {
2882         if (!s_quiet) {
2883             BIO_printf(bio_err, "Generating temp (%d bit) RSA key...",
2884                        keylength);
2885             (void)BIO_flush(bio_err);
2886         }
2887         if (!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
2888             !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL)) {
2889             if (rsa_tmp)
2890                 RSA_free(rsa_tmp);
2891             rsa_tmp = NULL;
2892         }
2893         if (!s_quiet) {
2894             BIO_printf(bio_err, "\n");
2895             (void)BIO_flush(bio_err);
2896         }
2897         BN_free(bn);
2898     }
2899     return (rsa_tmp);
2900 }
2901 #endif
2902
2903 #define MAX_SESSION_ID_ATTEMPTS 10
2904 static int generate_session_id(const SSL *ssl, unsigned char *id,
2905                                unsigned int *id_len)
2906 {
2907     unsigned int count = 0;
2908     do {
2909         RAND_pseudo_bytes(id, *id_len);
2910         /*
2911          * Prefix the session_id with the required prefix. NB: If our prefix
2912          * is too long, clip it - but there will be worse effects anyway, eg.
2913          * the server could only possibly create 1 session ID (ie. the
2914          * prefix!) so all future session negotiations will fail due to
2915          * conflicts.
2916          */
2917         memcpy(id, session_id_prefix,
2918                (strlen(session_id_prefix) < *id_len) ?
2919                strlen(session_id_prefix) : *id_len);
2920     }
2921     while (SSL_has_matching_session_id(ssl, id, *id_len) &&
2922            (++count < MAX_SESSION_ID_ATTEMPTS));
2923     if (count >= MAX_SESSION_ID_ATTEMPTS)
2924         return 0;
2925     return 1;
2926 }