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