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