Add BeOS support.
[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;
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,"-serverpref") == 0)
846                         { off|=SSL_OP_CIPHER_SERVER_PREFERENCE; }
847                 else if (strcmp(*argv,"-cipher") == 0)
848                         {
849                         if (--argc < 1) goto bad;
850                         cipher= *(++argv);
851                         }
852                 else if (strcmp(*argv,"-CAfile") == 0)
853                         {
854                         if (--argc < 1) goto bad;
855                         CAfile= *(++argv);
856                         }
857 #ifdef FIONBIO  
858                 else if (strcmp(*argv,"-nbio") == 0)
859                         { s_nbio=1; }
860 #endif
861                 else if (strcmp(*argv,"-nbio_test") == 0)
862                         {
863 #ifdef FIONBIO  
864                         s_nbio=1;
865 #endif
866                         s_nbio_test=1;
867                         }
868                 else if (strcmp(*argv,"-debug") == 0)
869                         { s_debug=1; }
870                 else if (strcmp(*argv,"-msg") == 0)
871                         { s_msg=1; }
872                 else if (strcmp(*argv,"-hack") == 0)
873                         { hack=1; }
874                 else if (strcmp(*argv,"-state") == 0)
875                         { state=1; }
876                 else if (strcmp(*argv,"-crlf") == 0)
877                         { s_crlf=1; }
878                 else if (strcmp(*argv,"-quiet") == 0)
879                         { s_quiet=1; }
880                 else if (strcmp(*argv,"-bugs") == 0)
881                         { bugs=1; }
882                 else if (strcmp(*argv,"-no_tmp_rsa") == 0)
883                         { no_tmp_rsa=1; }
884                 else if (strcmp(*argv,"-no_dhe") == 0)
885                         { no_dhe=1; }
886                 else if (strcmp(*argv,"-no_ecdhe") == 0)
887                         { no_ecdhe=1; }
888 #ifndef OPENSSL_NO_PSK
889                 else if (strcmp(*argv,"-psk_hint") == 0)
890                         {
891                         if (--argc < 1) goto bad;
892                         psk_identity_hint= *(++argv);
893                         }
894                 else if (strcmp(*argv,"-psk") == 0)
895                         {
896                         size_t i;
897
898                         if (--argc < 1) goto bad;
899                         psk_key=*(++argv);
900                         for (i=0; i<strlen(psk_key); i++)
901                                 {
902                                 if (isxdigit((int)psk_key[i]))
903                                         continue;
904                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
905                                 goto bad;
906                                 }
907                         }
908 #endif
909                 else if (strcmp(*argv,"-www") == 0)
910                         { www=1; }
911                 else if (strcmp(*argv,"-WWW") == 0)
912                         { www=2; }
913                 else if (strcmp(*argv,"-HTTP") == 0)
914                         { www=3; }
915                 else if (strcmp(*argv,"-no_ssl2") == 0)
916                         { off|=SSL_OP_NO_SSLv2; }
917                 else if (strcmp(*argv,"-no_ssl3") == 0)
918                         { off|=SSL_OP_NO_SSLv3; }
919                 else if (strcmp(*argv,"-no_tls1") == 0)
920                         { off|=SSL_OP_NO_TLSv1; }
921                 else if (strcmp(*argv,"-no_comp") == 0)
922                         { off|=SSL_OP_NO_COMPRESSION; }
923 #ifndef OPENSSL_NO_SSL2
924                 else if (strcmp(*argv,"-ssl2") == 0)
925                         { meth=SSLv2_server_method(); }
926 #endif
927 #ifndef OPENSSL_NO_SSL3
928                 else if (strcmp(*argv,"-ssl3") == 0)
929                         { meth=SSLv3_server_method(); }
930 #endif
931 #ifndef OPENSSL_NO_TLS1
932                 else if (strcmp(*argv,"-tls1") == 0)
933                         { meth=TLSv1_server_method(); }
934 #endif
935 #ifndef OPENSSL_NO_DTLS1
936                 else if (strcmp(*argv,"-dtls1") == 0)
937                         { 
938                         meth=DTLSv1_server_method();
939                         socket_type = SOCK_DGRAM;
940                         }
941                 else if (strcmp(*argv,"-timeout") == 0)
942                         enable_timeouts = 1;
943                 else if (strcmp(*argv,"-mtu") == 0)
944                         {
945                         if (--argc < 1) goto bad;
946                         socket_mtu = atol(*(++argv));
947                         }
948                 else if (strcmp(*argv, "-chain") == 0)
949                         cert_chain = 1;
950 #endif
951                 else if (strcmp(*argv, "-id_prefix") == 0)
952                         {
953                         if (--argc < 1) goto bad;
954                         session_id_prefix = *(++argv);
955                         }
956 #ifndef OPENSSL_NO_ENGINE
957                 else if (strcmp(*argv,"-engine") == 0)
958                         {
959                         if (--argc < 1) goto bad;
960                         engine_id= *(++argv);
961                         }
962 #endif
963                 else if (strcmp(*argv,"-rand") == 0)
964                         {
965                         if (--argc < 1) goto bad;
966                         inrand= *(++argv);
967                         }
968 #ifndef OPENSSL_NO_TLSEXT
969                 else if (strcmp(*argv,"-servername") == 0)
970                         {
971                         if (--argc < 1) goto bad;
972                         tlsextcbp.servername= *(++argv);
973                         }
974                 else if (strcmp(*argv,"-servername_fatal") == 0)
975                         { tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL; }
976                 else if (strcmp(*argv,"-cert2") == 0)
977                         {
978                         if (--argc < 1) goto bad;
979                         s_cert_file2= *(++argv);
980                         }
981                 else if (strcmp(*argv,"-key2") == 0)
982                         {
983                         if (--argc < 1) goto bad;
984                         s_key_file2= *(++argv);
985                         }
986 #endif
987                 else
988                         {
989                         BIO_printf(bio_err,"unknown option %s\n",*argv);
990                         badop=1;
991                         break;
992                         }
993                 argc--;
994                 argv++;
995                 }
996         if (badop)
997                 {
998 bad:
999                 sv_usage();
1000                 goto end;
1001                 }
1002
1003         SSL_load_error_strings();
1004         OpenSSL_add_ssl_algorithms();
1005
1006 #ifndef OPENSSL_NO_ENGINE
1007         e = setup_engine(bio_err, engine_id, 1);
1008 #endif
1009
1010         if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass))
1011                 {
1012                 BIO_printf(bio_err, "Error getting password\n");
1013                 goto end;
1014                 }
1015
1016
1017         if (s_key_file == NULL)
1018                 s_key_file = s_cert_file;
1019 #ifndef OPENSSL_NO_TLSEXT
1020         if (s_key_file2 == NULL)
1021                 s_key_file2 = s_cert_file2;
1022 #endif
1023
1024         if (nocert == 0)
1025                 {
1026                 s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
1027                        "server certificate private key file");
1028                 if (!s_key)
1029                         {
1030                         ERR_print_errors(bio_err);
1031                         goto end;
1032                         }
1033
1034                 s_cert = load_cert(bio_err,s_cert_file,s_cert_format,
1035                         NULL, e, "server certificate file");
1036
1037                 if (!s_cert)
1038                         {
1039                         ERR_print_errors(bio_err);
1040                         goto end;
1041                         }
1042
1043 #ifndef OPENSSL_NO_TLSEXT
1044                 if (tlsextcbp.servername) 
1045                         {
1046                         s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
1047                                 "second server certificate private key file");
1048                         if (!s_key2)
1049                                 {
1050                                 ERR_print_errors(bio_err);
1051                                 goto end;
1052                                 }
1053                         
1054                         s_cert2 = load_cert(bio_err,s_cert_file2,s_cert_format,
1055                                 NULL, e, "second server certificate file");
1056                         
1057                         if (!s_cert2)
1058                                 {
1059                                 ERR_print_errors(bio_err);
1060                                 goto end;
1061                                 }
1062                         }
1063 #endif
1064                 }
1065
1066
1067         if (s_dcert_file)
1068                 {
1069
1070                 if (s_dkey_file == NULL)
1071                         s_dkey_file = s_dcert_file;
1072
1073                 s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
1074                                 0, dpass, e,
1075                                "second certificate private key file");
1076                 if (!s_dkey)
1077                         {
1078                         ERR_print_errors(bio_err);
1079                         goto end;
1080                         }
1081
1082                 s_dcert = load_cert(bio_err,s_dcert_file,s_dcert_format,
1083                                 NULL, e, "second server certificate file");
1084
1085                 if (!s_dcert)
1086                         {
1087                         ERR_print_errors(bio_err);
1088                         goto end;
1089                         }
1090
1091                 }
1092
1093         if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1094                 && !RAND_status())
1095                 {
1096                 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1097                 }
1098         if (inrand != NULL)
1099                 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1100                         app_RAND_load_files(inrand));
1101
1102         if (bio_s_out == NULL)
1103                 {
1104                 if (s_quiet && !s_debug && !s_msg)
1105                         {
1106                         bio_s_out=BIO_new(BIO_s_null());
1107                         }
1108                 else
1109                         {
1110                         if (bio_s_out == NULL)
1111                                 bio_s_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1112                         }
1113                 }
1114
1115 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
1116         if (nocert)
1117 #endif
1118                 {
1119                 s_cert_file=NULL;
1120                 s_key_file=NULL;
1121                 s_dcert_file=NULL;
1122                 s_dkey_file=NULL;
1123 #ifndef OPENSSL_NO_TLSEXT
1124                 s_cert_file2=NULL;
1125                 s_key_file2=NULL;
1126 #endif
1127                 }
1128
1129         ctx=SSL_CTX_new(meth);
1130         if (ctx == NULL)
1131                 {
1132                 ERR_print_errors(bio_err);
1133                 goto end;
1134                 }
1135         if (session_id_prefix)
1136                 {
1137                 if(strlen(session_id_prefix) >= 32)
1138                         BIO_printf(bio_err,
1139 "warning: id_prefix is too long, only one new session will be possible\n");
1140                 else if(strlen(session_id_prefix) >= 16)
1141                         BIO_printf(bio_err,
1142 "warning: id_prefix is too long if you use SSLv2\n");
1143                 if(!SSL_CTX_set_generate_session_id(ctx, generate_session_id))
1144                         {
1145                         BIO_printf(bio_err,"error setting 'id_prefix'\n");
1146                         ERR_print_errors(bio_err);
1147                         goto end;
1148                         }
1149                 BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1150                 }
1151         SSL_CTX_set_quiet_shutdown(ctx,1);
1152         if (bugs) SSL_CTX_set_options(ctx,SSL_OP_ALL);
1153         if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1154         SSL_CTX_set_options(ctx,off);
1155         /* DTLS: partial reads end up discarding unread UDP bytes :-( 
1156          * Setting read ahead solves this problem.
1157          */
1158         if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1159
1160         if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1161
1162         SSL_CTX_sess_set_cache_size(ctx,128);
1163
1164 #if 0
1165         if (cipher == NULL) cipher=getenv("SSL_CIPHER");
1166 #endif
1167
1168 #if 0
1169         if (s_cert_file == NULL)
1170                 {
1171                 BIO_printf(bio_err,"You must specify a certificate file for the server to use\n");
1172                 goto end;
1173                 }
1174 #endif
1175
1176         if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1177                 (!SSL_CTX_set_default_verify_paths(ctx)))
1178                 {
1179                 /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
1180                 ERR_print_errors(bio_err);
1181                 /* goto end; */
1182                 }
1183         store = SSL_CTX_get_cert_store(ctx);
1184         X509_STORE_set_flags(store, vflags);
1185
1186 #ifndef OPENSSL_NO_TLSEXT
1187         if (s_cert2)
1188                 {
1189                 ctx2=SSL_CTX_new(meth);
1190                 if (ctx2 == NULL)
1191                         {
1192                         ERR_print_errors(bio_err);
1193                         goto end;
1194                         }
1195                 }
1196         
1197         if (ctx2)
1198                 {
1199                 BIO_printf(bio_s_out,"Setting secondary ctx parameters\n");
1200
1201                 if (session_id_prefix)
1202                         {
1203                         if(strlen(session_id_prefix) >= 32)
1204                                 BIO_printf(bio_err,
1205                                         "warning: id_prefix is too long, only one new session will be possible\n");
1206                         else if(strlen(session_id_prefix) >= 16)
1207                                 BIO_printf(bio_err,
1208                                         "warning: id_prefix is too long if you use SSLv2\n");
1209                         if(!SSL_CTX_set_generate_session_id(ctx2, generate_session_id))
1210                                 {
1211                                 BIO_printf(bio_err,"error setting 'id_prefix'\n");
1212                                 ERR_print_errors(bio_err);
1213                                 goto end;
1214                                 }
1215                         BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1216                         }
1217                 SSL_CTX_set_quiet_shutdown(ctx2,1);
1218                 if (bugs) SSL_CTX_set_options(ctx2,SSL_OP_ALL);
1219                 if (hack) SSL_CTX_set_options(ctx2,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1220                 SSL_CTX_set_options(ctx2,off);
1221                 /* DTLS: partial reads end up discarding unread UDP bytes :-( 
1222                  * Setting read ahead solves this problem.
1223                  */
1224                 if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx2, 1);
1225
1226                 if (state) SSL_CTX_set_info_callback(ctx2,apps_ssl_info_callback);
1227
1228                 SSL_CTX_sess_set_cache_size(ctx2,128);
1229
1230                 if ((!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) ||
1231                         (!SSL_CTX_set_default_verify_paths(ctx2)))
1232                         {
1233                         ERR_print_errors(bio_err);
1234                         }
1235                 store = SSL_CTX_get_cert_store(ctx2);
1236                 X509_STORE_set_flags(store, vflags);
1237                 }
1238 #endif 
1239
1240 #ifndef OPENSSL_NO_DH
1241         if (!no_dhe)
1242                 {
1243                 DH *dh=NULL;
1244
1245                 if (dhfile)
1246                         dh = load_dh_param(dhfile);
1247                 else if (s_cert_file)
1248                         dh = load_dh_param(s_cert_file);
1249
1250                 if (dh != NULL)
1251                         {
1252                         BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1253                         }
1254                 else
1255                         {
1256                         BIO_printf(bio_s_out,"Using default temp DH parameters\n");
1257                         dh=get_dh512();
1258                         }
1259                 (void)BIO_flush(bio_s_out);
1260
1261                 SSL_CTX_set_tmp_dh(ctx,dh);
1262 #ifndef OPENSSL_NO_TLSEXT
1263                 if (ctx2)
1264                         {
1265                         if (!dhfile)
1266                                 { 
1267                                 DH *dh2=load_dh_param(s_cert_file2);
1268                                 if (dh2 != NULL)
1269                                         {
1270                                         BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1271                                         (void)BIO_flush(bio_s_out);
1272
1273                                         DH_free(dh);
1274                                         dh = dh2;
1275                                         }
1276                                 }
1277                         SSL_CTX_set_tmp_dh(ctx2,dh);
1278                         }
1279 #endif
1280                 DH_free(dh);
1281                 }
1282 #endif
1283
1284 #ifndef OPENSSL_NO_ECDH
1285         if (!no_ecdhe)
1286                 {
1287                 EC_KEY *ecdh=NULL;
1288
1289                 if (named_curve)
1290                         {
1291                         int nid = OBJ_sn2nid(named_curve);
1292
1293                         if (nid == 0)
1294                                 {
1295                                 BIO_printf(bio_err, "unknown curve name (%s)\n", 
1296                                         named_curve);
1297                                 goto end;
1298                                 }
1299                         ecdh = EC_KEY_new_by_curve_name(nid);
1300                         if (ecdh == NULL)
1301                                 {
1302                                 BIO_printf(bio_err, "unable to create curve (%s)\n", 
1303                                         named_curve);
1304                                 goto end;
1305                                 }
1306                         }
1307
1308                 if (ecdh != NULL)
1309                         {
1310                         BIO_printf(bio_s_out,"Setting temp ECDH parameters\n");
1311                         }
1312                 else
1313                         {
1314                         BIO_printf(bio_s_out,"Using default temp ECDH parameters\n");
1315                         ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1316                         if (ecdh == NULL) 
1317                                 {
1318                                 BIO_printf(bio_err, "unable to create curve (nistp256)\n");
1319                                 goto end;
1320                                 }
1321                         }
1322                 (void)BIO_flush(bio_s_out);
1323
1324                 SSL_CTX_set_tmp_ecdh(ctx,ecdh);
1325 #ifndef OPENSSL_NO_TLSEXT
1326                 if (ctx2) 
1327                         SSL_CTX_set_tmp_ecdh(ctx2,ecdh);
1328 #endif
1329                 EC_KEY_free(ecdh);
1330                 }
1331 #endif
1332         
1333         if (!set_cert_key_stuff(ctx,s_cert,s_key))
1334                 goto end;
1335 #ifndef OPENSSL_NO_TLSEXT
1336         if (ctx2 && !set_cert_key_stuff(ctx2,s_cert2,s_key2))
1337                 goto end; 
1338 #endif
1339         if (s_dcert != NULL)
1340                 {
1341                 if (!set_cert_key_stuff(ctx,s_dcert,s_dkey))
1342                         goto end;
1343                 }
1344
1345 #ifndef OPENSSL_NO_RSA
1346 #if 1
1347         if (!no_tmp_rsa)
1348                 {
1349                 SSL_CTX_set_tmp_rsa_callback(ctx,tmp_rsa_cb);
1350 #ifndef OPENSSL_NO_TLSEXT
1351                 if (ctx2) 
1352                         SSL_CTX_set_tmp_rsa_callback(ctx2,tmp_rsa_cb);
1353 #endif          
1354                 }
1355 #else
1356         if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx))
1357                 {
1358                 RSA *rsa;
1359
1360                 BIO_printf(bio_s_out,"Generating temp (512 bit) RSA key...");
1361                 BIO_flush(bio_s_out);
1362
1363                 rsa=RSA_generate_key(512,RSA_F4,NULL);
1364
1365                 if (!SSL_CTX_set_tmp_rsa(ctx,rsa))
1366                         {
1367                         ERR_print_errors(bio_err);
1368                         goto end;
1369                         }
1370 #ifndef OPENSSL_NO_TLSEXT
1371                         if (ctx2)
1372                                 {
1373                                 if (!SSL_CTX_set_tmp_rsa(ctx2,rsa))
1374                                         {
1375                                         ERR_print_errors(bio_err);
1376                                         goto end;
1377                                         }
1378                                 }
1379 #endif
1380                 RSA_free(rsa);
1381                 BIO_printf(bio_s_out,"\n");
1382                 }
1383 #endif
1384 #endif
1385
1386 #ifndef OPENSSL_NO_PSK
1387         if (psk_key != NULL)
1388                 {
1389                 if (s_debug)
1390                         BIO_printf(bio_s_out, "PSK key given, setting server callback\n");
1391                 SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
1392                 }
1393
1394         if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint))
1395                 {
1396                 BIO_printf(bio_err,"error setting PSK identity hint to context\n");
1397                 ERR_print_errors(bio_err);
1398                 goto end;
1399                 }
1400 #endif
1401
1402         if (cipher != NULL)
1403                 {
1404                 if(!SSL_CTX_set_cipher_list(ctx,cipher))
1405                         {
1406                         BIO_printf(bio_err,"error setting cipher list\n");
1407                         ERR_print_errors(bio_err);
1408                         goto end;
1409                         }
1410 #ifndef OPENSSL_NO_TLSEXT
1411                 if (ctx2 && !SSL_CTX_set_cipher_list(ctx2,cipher))
1412                         {
1413                         BIO_printf(bio_err,"error setting cipher list\n");
1414                         ERR_print_errors(bio_err);
1415                         goto end;
1416                         }
1417 #endif
1418                 }
1419         SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
1420         SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,
1421                 sizeof s_server_session_id_context);
1422
1423 #ifndef OPENSSL_NO_TLSEXT
1424         if (ctx2)
1425                 {
1426                 SSL_CTX_set_verify(ctx2,s_server_verify,verify_callback);
1427                 SSL_CTX_set_session_id_context(ctx2,(void*)&s_server_session_id_context,
1428                         sizeof s_server_session_id_context);
1429
1430                 tlsextcbp.biodebug = bio_s_out;
1431                 SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
1432                 SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
1433                 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1434                 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1435                 }
1436 #endif
1437
1438         if (CAfile != NULL)
1439                 {
1440                 SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
1441 #ifndef OPENSSL_NO_TLSEXT
1442                 if (ctx2) 
1443                         SSL_CTX_set_client_CA_list(ctx2,SSL_load_client_CA_file(CAfile));
1444 #endif
1445                 }
1446
1447         BIO_printf(bio_s_out,"ACCEPT\n");
1448         if (www)
1449                 do_server(port,socket_type,&accept_socket,www_body, context);
1450         else
1451                 do_server(port,socket_type,&accept_socket,sv_body, context);
1452         print_stats(bio_s_out,ctx);
1453         ret=0;
1454 end:
1455         if (ctx != NULL) SSL_CTX_free(ctx);
1456         if (s_cert)
1457                 X509_free(s_cert);
1458         if (s_dcert)
1459                 X509_free(s_dcert);
1460         if (s_key)
1461                 EVP_PKEY_free(s_key);
1462         if (s_dkey)
1463                 EVP_PKEY_free(s_dkey);
1464         if (pass)
1465                 OPENSSL_free(pass);
1466         if (dpass)
1467                 OPENSSL_free(dpass);
1468 #ifndef OPENSSL_NO_TLSEXT
1469         if (ctx2 != NULL) SSL_CTX_free(ctx2);
1470         if (s_cert2)
1471                 X509_free(s_cert2);
1472         if (s_key2)
1473                 EVP_PKEY_free(s_key2);
1474 #endif
1475         if (bio_s_out != NULL)
1476                 {
1477         BIO_free(bio_s_out);
1478                 bio_s_out=NULL;
1479                 }
1480         apps_shutdown();
1481         OPENSSL_EXIT(ret);
1482         }
1483
1484 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
1485         {
1486         BIO_printf(bio,"%4ld items in the session cache\n",
1487                 SSL_CTX_sess_number(ssl_ctx));
1488         BIO_printf(bio,"%4ld client connects (SSL_connect())\n",
1489                 SSL_CTX_sess_connect(ssl_ctx));
1490         BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n",
1491                 SSL_CTX_sess_connect_renegotiate(ssl_ctx));
1492         BIO_printf(bio,"%4ld client connects that finished\n",
1493                 SSL_CTX_sess_connect_good(ssl_ctx));
1494         BIO_printf(bio,"%4ld server accepts (SSL_accept())\n",
1495                 SSL_CTX_sess_accept(ssl_ctx));
1496         BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n",
1497                 SSL_CTX_sess_accept_renegotiate(ssl_ctx));
1498         BIO_printf(bio,"%4ld server accepts that finished\n",
1499                 SSL_CTX_sess_accept_good(ssl_ctx));
1500         BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
1501         BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
1502         BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
1503         BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
1504         BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n",
1505                 SSL_CTX_sess_cache_full(ssl_ctx),
1506                 SSL_CTX_sess_get_cache_size(ssl_ctx));
1507         }
1508
1509 static int sv_body(char *hostname, int s, unsigned char *context)
1510         {
1511         char *buf=NULL;
1512         fd_set readfds;
1513         int ret=1,width;
1514         int k,i;
1515         unsigned long l;
1516         SSL *con=NULL;
1517         BIO *sbio;
1518 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1519         struct timeval tv;
1520 #endif
1521
1522         if ((buf=OPENSSL_malloc(bufsize)) == NULL)
1523                 {
1524                 BIO_printf(bio_err,"out of memory\n");
1525                 goto err;
1526                 }
1527 #ifdef FIONBIO  
1528         if (s_nbio)
1529                 {
1530                 unsigned long sl=1;
1531
1532                 if (!s_quiet)
1533                         BIO_printf(bio_err,"turning on non blocking io\n");
1534                 if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
1535                         ERR_print_errors(bio_err);
1536                 }
1537 #endif
1538
1539         if (con == NULL) {
1540                 con=SSL_new(ctx);
1541 #ifndef OPENSSL_NO_KRB5
1542                 if ((con->kssl_ctx = kssl_ctx_new()) != NULL)
1543                         {
1544                         kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE,
1545                                                                 KRB5SVC);
1546                         kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB,
1547                                                                 KRB5KEYTAB);
1548                         }
1549 #endif  /* OPENSSL_NO_KRB5 */
1550                 if(context)
1551                       SSL_set_session_id_context(con, context,
1552                                                  strlen((char *)context));
1553         }
1554         SSL_clear(con);
1555
1556         if (SSL_version(con) == DTLS1_VERSION)
1557                 {
1558                 struct timeval timeout;
1559
1560                 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1561
1562                 if (enable_timeouts)
1563                         {
1564                         timeout.tv_sec = 0;
1565                         timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1566                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1567                         
1568                         timeout.tv_sec = 0;
1569                         timeout.tv_usec = DGRAM_SND_TIMEOUT;
1570                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1571                         }
1572
1573                 if (socket_mtu > 0)
1574                         {
1575                         SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1576                         SSL_set_mtu(con, socket_mtu);
1577                         }
1578                 else
1579                         /* want to do MTU discovery */
1580                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1581
1582         /* turn on cookie exchange */
1583         SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
1584                 }
1585         else
1586                 sbio=BIO_new_socket(s,BIO_NOCLOSE);
1587
1588         if (s_nbio_test)
1589                 {
1590                 BIO *test;
1591
1592                 test=BIO_new(BIO_f_nbio_test());
1593                 sbio=BIO_push(test,sbio);
1594                 }
1595         SSL_set_bio(con,sbio,sbio);
1596         SSL_set_accept_state(con);
1597         /* SSL_set_fd(con,s); */
1598
1599         if (s_debug)
1600                 {
1601                 con->debug=1;
1602                 BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
1603                 BIO_set_callback_arg(SSL_get_rbio(con),bio_s_out);
1604                 }
1605         if (s_msg)
1606                 {
1607                 SSL_set_msg_callback(con, msg_cb);
1608                 SSL_set_msg_callback_arg(con, bio_s_out);
1609                 }
1610
1611         width=s+1;
1612         for (;;)
1613                 {
1614                 int read_from_terminal;
1615                 int read_from_sslcon;
1616
1617                 read_from_terminal = 0;
1618                 read_from_sslcon = SSL_pending(con);
1619
1620                 if (!read_from_sslcon)
1621                         {
1622                         FD_ZERO(&readfds);
1623 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
1624                         FD_SET(fileno(stdin),&readfds);
1625 #endif
1626                         FD_SET(s,&readfds);
1627                         /* Note: under VMS with SOCKETSHR the second parameter is
1628                          * currently of type (int *) whereas under other systems
1629                          * it is (void *) if you don't have a cast it will choke
1630                          * the compiler: if you do have a cast then you can either
1631                          * go for (int *) or (void *).
1632                          */
1633 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
1634                         /* Under DOS (non-djgpp) and Windows we can't select on stdin: only
1635                          * on sockets. As a workaround we timeout the select every
1636                          * second and check for any keypress. In a proper Windows
1637                          * application we wouldn't do this because it is inefficient.
1638                          */
1639                         tv.tv_sec = 1;
1640                         tv.tv_usec = 0;
1641                         i=select(width,(void *)&readfds,NULL,NULL,&tv);
1642                         if((i < 0) || (!i && !_kbhit() ) )continue;
1643                         if(_kbhit())
1644                                 read_from_terminal = 1;
1645 #elif defined(OPENSSL_SYS_BEOS_R5)
1646                         /* Under BeOS-R5 the situation is similar to DOS */
1647                         tv.tv_sec = 1;
1648                         tv.tv_usec = 0;
1649                         (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1650                         i=select(width,(void *)&readfds,NULL,NULL,&tv);
1651                         if ((i < 0) || (!i && read(fileno(stdin), buf, 0) < 0))
1652                                 continue;
1653                         if (read(fileno(stdin), buf, 0) >= 0)
1654                                 read_from_terminal = 1;
1655                         (void)fcntl(fileno(stdin), F_SETFL, 0);
1656 #else
1657                         i=select(width,(void *)&readfds,NULL,NULL,NULL);
1658                         if (i <= 0) continue;
1659                         if (FD_ISSET(fileno(stdin),&readfds))
1660                                 read_from_terminal = 1;
1661 #endif
1662                         if (FD_ISSET(s,&readfds))
1663                                 read_from_sslcon = 1;
1664                         }
1665                 if (read_from_terminal)
1666                         {
1667                         if (s_crlf)
1668                                 {
1669                                 int j, lf_num;
1670
1671                                 i=raw_read_stdin(buf, bufsize/2);
1672                                 lf_num = 0;
1673                                 /* both loops are skipped when i <= 0 */
1674                                 for (j = 0; j < i; j++)
1675                                         if (buf[j] == '\n')
1676                                                 lf_num++;
1677                                 for (j = i-1; j >= 0; j--)
1678                                         {
1679                                         buf[j+lf_num] = buf[j];
1680                                         if (buf[j] == '\n')
1681                                                 {
1682                                                 lf_num--;
1683                                                 i++;
1684                                                 buf[j+lf_num] = '\r';
1685                                                 }
1686                                         }
1687                                 assert(lf_num == 0);
1688                                 }
1689                         else
1690                                 i=raw_read_stdin(buf,bufsize);
1691                         if (!s_quiet)
1692                                 {
1693                                 if ((i <= 0) || (buf[0] == 'Q'))
1694                                         {
1695                                         BIO_printf(bio_s_out,"DONE\n");
1696                                         SHUTDOWN(s);
1697                                         close_accept_socket();
1698                                         ret= -11;
1699                                         goto err;
1700                                         }
1701                                 if ((i <= 0) || (buf[0] == 'q'))
1702                                         {
1703                                         BIO_printf(bio_s_out,"DONE\n");
1704                                         if (SSL_version(con) != DTLS1_VERSION)
1705                         SHUTDOWN(s);
1706         /*                              close_accept_socket();
1707                                         ret= -11;*/
1708                                         goto err;
1709                                         }
1710
1711                                 if ((buf[0] == 'r') && 
1712                                         ((buf[1] == '\n') || (buf[1] == '\r')))
1713                                         {
1714                                         SSL_renegotiate(con);
1715                                         i=SSL_do_handshake(con);
1716                                         printf("SSL_do_handshake -> %d\n",i);
1717                                         i=0; /*13; */
1718                                         continue;
1719                                         /* strcpy(buf,"server side RE-NEGOTIATE\n"); */
1720                                         }
1721                                 if ((buf[0] == 'R') &&
1722                                         ((buf[1] == '\n') || (buf[1] == '\r')))
1723                                         {
1724                                         SSL_set_verify(con,
1725                                                 SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
1726                                         SSL_renegotiate(con);
1727                                         i=SSL_do_handshake(con);
1728                                         printf("SSL_do_handshake -> %d\n",i);
1729                                         i=0; /* 13; */
1730                                         continue;
1731                                         /* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */
1732                                         }
1733                                 if (buf[0] == 'P')
1734                                         {
1735                                         static const char *str="Lets print some clear text\n";
1736                                         BIO_write(SSL_get_wbio(con),str,strlen(str));
1737                                         }
1738                                 if (buf[0] == 'S')
1739                                         {
1740                                         print_stats(bio_s_out,SSL_get_SSL_CTX(con));
1741                                         }
1742                                 }
1743 #ifdef CHARSET_EBCDIC
1744                         ebcdic2ascii(buf,buf,i);
1745 #endif
1746                         l=k=0;
1747                         for (;;)
1748                                 {
1749                                 /* should do a select for the write */
1750 #ifdef RENEG
1751 { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } }
1752 #endif
1753                                 k=SSL_write(con,&(buf[l]),(unsigned int)i);
1754                                 switch (SSL_get_error(con,k))
1755                                         {
1756                                 case SSL_ERROR_NONE:
1757                                         break;
1758                                 case SSL_ERROR_WANT_WRITE:
1759                                 case SSL_ERROR_WANT_READ:
1760                                 case SSL_ERROR_WANT_X509_LOOKUP:
1761                                         BIO_printf(bio_s_out,"Write BLOCK\n");
1762                                         break;
1763                                 case SSL_ERROR_SYSCALL:
1764                                 case SSL_ERROR_SSL:
1765                                         BIO_printf(bio_s_out,"ERROR\n");
1766                                         ERR_print_errors(bio_err);
1767                                         ret=1;
1768                                         goto err;
1769                                         /* break; */
1770                                 case SSL_ERROR_ZERO_RETURN:
1771                                         BIO_printf(bio_s_out,"DONE\n");
1772                                         ret=1;
1773                                         goto err;
1774                                         }
1775                                 l+=k;
1776                                 i-=k;
1777                                 if (i <= 0) break;
1778                                 }
1779                         }
1780                 if (read_from_sslcon)
1781                         {
1782                         if (!SSL_is_init_finished(con))
1783                                 {
1784                                 i=init_ssl_connection(con);
1785                                 
1786                                 if (i < 0)
1787                                         {
1788                                         ret=0;
1789                                         goto err;
1790                                         }
1791                                 else if (i == 0)
1792                                         {
1793                                         ret=1;
1794                                         goto err;
1795                                         }
1796                                 }
1797                         else
1798                                 {
1799 again:  
1800                                 i=SSL_read(con,(char *)buf,bufsize);
1801                                 switch (SSL_get_error(con,i))
1802                                         {
1803                                 case SSL_ERROR_NONE:
1804 #ifdef CHARSET_EBCDIC
1805                                         ascii2ebcdic(buf,buf,i);
1806 #endif
1807                                         raw_write_stdout(buf,
1808                                                 (unsigned int)i);
1809                                         if (SSL_pending(con)) goto again;
1810                                         break;
1811                                 case SSL_ERROR_WANT_WRITE:
1812                                 case SSL_ERROR_WANT_READ:
1813                                 case SSL_ERROR_WANT_X509_LOOKUP:
1814                                         BIO_printf(bio_s_out,"Read BLOCK\n");
1815                                         break;
1816                                 case SSL_ERROR_SYSCALL:
1817                                 case SSL_ERROR_SSL:
1818                                         BIO_printf(bio_s_out,"ERROR\n");
1819                                         ERR_print_errors(bio_err);
1820                                         ret=1;
1821                                         goto err;
1822                                 case SSL_ERROR_ZERO_RETURN:
1823                                         BIO_printf(bio_s_out,"DONE\n");
1824                                         ret=1;
1825                                         goto err;
1826                                         }
1827                                 }
1828                         }
1829                 }
1830 err:
1831         if (con != NULL)
1832                 {
1833                 BIO_printf(bio_s_out,"shutting down SSL\n");
1834 #if 1
1835                 SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
1836 #else
1837                 SSL_shutdown(con);
1838 #endif
1839                 SSL_free(con);
1840                 }
1841         BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
1842         if (buf != NULL)
1843                 {
1844                 OPENSSL_cleanse(buf,bufsize);
1845                 OPENSSL_free(buf);
1846                 }
1847         if (ret >= 0)
1848                 BIO_printf(bio_s_out,"ACCEPT\n");
1849         return(ret);
1850         }
1851
1852 static void close_accept_socket(void)
1853         {
1854         BIO_printf(bio_err,"shutdown accept socket\n");
1855         if (accept_socket >= 0)
1856                 {
1857                 SHUTDOWN2(accept_socket);
1858                 }
1859         }
1860
1861 static int init_ssl_connection(SSL *con)
1862         {
1863         int i;
1864         const char *str;
1865         X509 *peer;
1866         long verify_error;
1867         MS_STATIC char buf[BUFSIZ];
1868
1869         if ((i=SSL_accept(con)) <= 0)
1870                 {
1871                 if (BIO_sock_should_retry(i))
1872                         {
1873                         BIO_printf(bio_s_out,"DELAY\n");
1874                         return(1);
1875                         }
1876
1877                 BIO_printf(bio_err,"ERROR\n");
1878                 verify_error=SSL_get_verify_result(con);
1879                 if (verify_error != X509_V_OK)
1880                         {
1881                         BIO_printf(bio_err,"verify error:%s\n",
1882                                 X509_verify_cert_error_string(verify_error));
1883                         }
1884                 else
1885                         ERR_print_errors(bio_err);
1886                 return(0);
1887                 }
1888
1889         PEM_write_bio_SSL_SESSION(bio_s_out,SSL_get_session(con));
1890
1891         peer=SSL_get_peer_certificate(con);
1892         if (peer != NULL)
1893                 {
1894                 BIO_printf(bio_s_out,"Client certificate\n");
1895                 PEM_write_bio_X509(bio_s_out,peer);
1896                 X509_NAME_oneline(X509_get_subject_name(peer),buf,sizeof buf);
1897                 BIO_printf(bio_s_out,"subject=%s\n",buf);
1898                 X509_NAME_oneline(X509_get_issuer_name(peer),buf,sizeof buf);
1899                 BIO_printf(bio_s_out,"issuer=%s\n",buf);
1900                 X509_free(peer);
1901                 }
1902
1903         if (SSL_get_shared_ciphers(con,buf,sizeof buf) != NULL)
1904                 BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf);
1905         str=SSL_CIPHER_get_name(SSL_get_current_cipher(con));
1906         BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)");
1907         if (con->hit) BIO_printf(bio_s_out,"Reused session-id\n");
1908         if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
1909                 TLS1_FLAGS_TLS_PADDING_BUG)
1910                 BIO_printf(bio_s_out,"Peer has incorrect TLSv1 block padding\n");
1911 #ifndef OPENSSL_NO_KRB5
1912         if (con->kssl_ctx->client_princ != NULL)
1913                 {
1914                 BIO_printf(bio_s_out,"Kerberos peer principal is %s\n",
1915                         con->kssl_ctx->client_princ);
1916                 }
1917 #endif /* OPENSSL_NO_KRB5 */
1918         return(1);
1919         }
1920
1921 #ifndef OPENSSL_NO_DH
1922 static DH *load_dh_param(const char *dhfile)
1923         {
1924         DH *ret=NULL;
1925         BIO *bio;
1926
1927         if ((bio=BIO_new_file(dhfile,"r")) == NULL)
1928                 goto err;
1929         ret=PEM_read_bio_DHparams(bio,NULL,NULL,NULL);
1930 err:
1931         if (bio != NULL) BIO_free(bio);
1932         return(ret);
1933         }
1934 #endif
1935
1936 #if 0
1937 static int load_CA(SSL_CTX *ctx, char *file)
1938         {
1939         FILE *in;
1940         X509 *x=NULL;
1941
1942         if ((in=fopen(file,"r")) == NULL)
1943                 return(0);
1944
1945         for (;;)
1946                 {
1947                 if (PEM_read_X509(in,&x,NULL) == NULL)
1948                         break;
1949                 SSL_CTX_add_client_CA(ctx,x);
1950                 }
1951         if (x != NULL) X509_free(x);
1952         fclose(in);
1953         return(1);
1954         }
1955 #endif
1956
1957 static int www_body(char *hostname, int s, unsigned char *context)
1958         {
1959         char *buf=NULL;
1960         int ret=1;
1961         int i,j,k,blank,dot;
1962         SSL *con;
1963         SSL_CIPHER *c;
1964         BIO *io,*ssl_bio,*sbio;
1965         long total_bytes;
1966
1967         buf=OPENSSL_malloc(bufsize);
1968         if (buf == NULL) return(0);
1969         io=BIO_new(BIO_f_buffer());
1970         ssl_bio=BIO_new(BIO_f_ssl());
1971         if ((io == NULL) || (ssl_bio == NULL)) goto err;
1972
1973 #ifdef FIONBIO  
1974         if (s_nbio)
1975                 {
1976                 unsigned long sl=1;
1977
1978                 if (!s_quiet)
1979                         BIO_printf(bio_err,"turning on non blocking io\n");
1980                 if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
1981                         ERR_print_errors(bio_err);
1982                 }
1983 #endif
1984
1985         /* lets make the output buffer a reasonable size */
1986         if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
1987
1988         if ((con=SSL_new(ctx)) == NULL) goto err;
1989 #ifndef OPENSSL_NO_KRB5
1990         if ((con->kssl_ctx = kssl_ctx_new()) != NULL)
1991                 {
1992                 kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC);
1993                 kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB);
1994                 }
1995 #endif  /* OPENSSL_NO_KRB5 */
1996         if(context) SSL_set_session_id_context(con, context,
1997                                                strlen((char *)context));
1998
1999         sbio=BIO_new_socket(s,BIO_NOCLOSE);
2000         if (s_nbio_test)
2001                 {
2002                 BIO *test;
2003
2004                 test=BIO_new(BIO_f_nbio_test());
2005                 sbio=BIO_push(test,sbio);
2006                 }
2007         SSL_set_bio(con,sbio,sbio);
2008         SSL_set_accept_state(con);
2009
2010         /* SSL_set_fd(con,s); */
2011         BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
2012         BIO_push(io,ssl_bio);
2013 #ifdef CHARSET_EBCDIC
2014         io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
2015 #endif
2016
2017         if (s_debug)
2018                 {
2019                 con->debug=1;
2020                 BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
2021                 BIO_set_callback_arg(SSL_get_rbio(con),bio_s_out);
2022                 }
2023         if (s_msg)
2024                 {
2025                 SSL_set_msg_callback(con, msg_cb);
2026                 SSL_set_msg_callback_arg(con, bio_s_out);
2027                 }
2028
2029         blank=0;
2030         for (;;)
2031                 {
2032                 if (hack)
2033                         {
2034                         i=SSL_accept(con);
2035
2036                         switch (SSL_get_error(con,i))
2037                                 {
2038                         case SSL_ERROR_NONE:
2039                                 break;
2040                         case SSL_ERROR_WANT_WRITE:
2041                         case SSL_ERROR_WANT_READ:
2042                         case SSL_ERROR_WANT_X509_LOOKUP:
2043                                 continue;
2044                         case SSL_ERROR_SYSCALL:
2045                         case SSL_ERROR_SSL:
2046                         case SSL_ERROR_ZERO_RETURN:
2047                                 ret=1;
2048                                 goto err;
2049                                 /* break; */
2050                                 }
2051
2052                         SSL_renegotiate(con);
2053                         SSL_write(con,NULL,0);
2054                         }
2055
2056                 i=BIO_gets(io,buf,bufsize-1);
2057                 if (i < 0) /* error */
2058                         {
2059                         if (!BIO_should_retry(io))
2060                                 {
2061                                 if (!s_quiet)
2062                                         ERR_print_errors(bio_err);
2063                                 goto err;
2064                                 }
2065                         else
2066                                 {
2067                                 BIO_printf(bio_s_out,"read R BLOCK\n");
2068 #if defined(OPENSSL_SYS_NETWARE)
2069             delay(1000);
2070 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
2071                                 sleep(1);
2072 #endif
2073                                 continue;
2074                                 }
2075                         }
2076                 else if (i == 0) /* end of input */
2077                         {
2078                         ret=1;
2079                         goto end;
2080                         }
2081
2082                 /* else we have data */
2083                 if (    ((www == 1) && (strncmp("GET ",buf,4) == 0)) ||
2084                         ((www == 2) && (strncmp("GET /stats ",buf,10) == 0)))
2085                         {
2086                         char *p;
2087                         X509 *peer;
2088                         STACK_OF(SSL_CIPHER) *sk;
2089                         static const char *space="                          ";
2090
2091                         BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2092                         BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n");
2093                         BIO_puts(io,"<pre>\n");
2094 /*                      BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
2095                         BIO_puts(io,"\n");
2096                         for (i=0; i<local_argc; i++)
2097                                 {
2098                                 BIO_puts(io,local_argv[i]);
2099                                 BIO_write(io," ",1);
2100                                 }
2101                         BIO_puts(io,"\n");
2102
2103                         /* The following is evil and should not really
2104                          * be done */
2105                         BIO_printf(io,"Ciphers supported in s_server binary\n");
2106                         sk=SSL_get_ciphers(con);
2107                         j=sk_SSL_CIPHER_num(sk);
2108                         for (i=0; i<j; i++)
2109                                 {
2110                                 c=sk_SSL_CIPHER_value(sk,i);
2111                                 BIO_printf(io,"%-11s:%-25s",
2112                                         SSL_CIPHER_get_version(c),
2113                                         SSL_CIPHER_get_name(c));
2114                                 if ((((i+1)%2) == 0) && (i+1 != j))
2115                                         BIO_puts(io,"\n");
2116                                 }
2117                         BIO_puts(io,"\n");
2118                         p=SSL_get_shared_ciphers(con,buf,bufsize);
2119                         if (p != NULL)
2120                                 {
2121                                 BIO_printf(io,"---\nCiphers common between both SSL end points:\n");
2122                                 j=i=0;
2123                                 while (*p)
2124                                         {
2125                                         if (*p == ':')
2126                                                 {
2127                                                 BIO_write(io,space,26-j);
2128                                                 i++;
2129                                                 j=0;
2130                                                 BIO_write(io,((i%3)?" ":"\n"),1);
2131                                                 }
2132                                         else
2133                                                 {
2134                                                 BIO_write(io,p,1);
2135                                                 j++;
2136                                                 }
2137                                         p++;
2138                                         }
2139                                 BIO_puts(io,"\n");
2140                                 }
2141                         BIO_printf(io,((con->hit)
2142                                 ?"---\nReused, "
2143                                 :"---\nNew, "));
2144                         c=SSL_get_current_cipher(con);
2145                         BIO_printf(io,"%s, Cipher is %s\n",
2146                                 SSL_CIPHER_get_version(c),
2147                                 SSL_CIPHER_get_name(c));
2148                         SSL_SESSION_print(io,SSL_get_session(con));
2149                         BIO_printf(io,"---\n");
2150                         print_stats(io,SSL_get_SSL_CTX(con));
2151                         BIO_printf(io,"---\n");
2152                         peer=SSL_get_peer_certificate(con);
2153                         if (peer != NULL)
2154                                 {
2155                                 BIO_printf(io,"Client certificate\n");
2156                                 X509_print(io,peer);
2157                                 PEM_write_bio_X509(io,peer);
2158                                 }
2159                         else
2160                                 BIO_puts(io,"no client certificate available\n");
2161                         BIO_puts(io,"</BODY></HTML>\r\n\r\n");
2162                         break;
2163                         }
2164                 else if ((www == 2 || www == 3)
2165                          && (strncmp("GET /",buf,5) == 0))
2166                         {
2167                         BIO *file;
2168                         char *p,*e;
2169                         static const char *text="HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
2170
2171                         /* skip the '/' */
2172                         p= &(buf[5]);
2173
2174                         dot = 1;
2175                         for (e=p; *e != '\0'; e++)
2176                                 {
2177                                 if (e[0] == ' ')
2178                                         break;
2179
2180                                 switch (dot)
2181                                         {
2182                                 case 1:
2183                                         dot = (e[0] == '.') ? 2 : 0;
2184                                         break;
2185                                 case 2:
2186                                         dot = (e[0] == '.') ? 3 : 0;
2187                                         break;
2188                                 case 3:
2189                                         dot = (e[0] == '/') ? -1 : 0;
2190                                         break;
2191                                         }
2192                                 if (dot == 0)
2193                                         dot = (e[0] == '/') ? 1 : 0;
2194                                 }
2195                         dot = (dot == 3) || (dot == -1); /* filename contains ".." component */
2196
2197                         if (*e == '\0')
2198                                 {
2199                                 BIO_puts(io,text);
2200                                 BIO_printf(io,"'%s' is an invalid file name\r\n",p);
2201                                 break;
2202                                 }
2203                         *e='\0';
2204
2205                         if (dot)
2206                                 {
2207                                 BIO_puts(io,text);
2208                                 BIO_printf(io,"'%s' contains '..' reference\r\n",p);
2209                                 break;
2210                                 }
2211
2212                         if (*p == '/')
2213                                 {
2214                                 BIO_puts(io,text);
2215                                 BIO_printf(io,"'%s' is an invalid path\r\n",p);
2216                                 break;
2217                                 }
2218
2219 #if 0
2220                         /* append if a directory lookup */
2221                         if (e[-1] == '/')
2222                                 strcat(p,"index.html");
2223 #endif
2224
2225                         /* if a directory, do the index thang */
2226                         if (app_isdir(p)>0)
2227                                 {
2228 #if 0 /* must check buffer size */
2229                                 strcat(p,"/index.html");
2230 #else
2231                                 BIO_puts(io,text);
2232                                 BIO_printf(io,"'%s' is a directory\r\n",p);
2233                                 break;
2234 #endif
2235                                 }
2236
2237                         if ((file=BIO_new_file(p,"r")) == NULL)
2238                                 {
2239                                 BIO_puts(io,text);
2240                                 BIO_printf(io,"Error opening '%s'\r\n",p);
2241                                 ERR_print_errors(io);
2242                                 break;
2243                                 }
2244
2245                         if (!s_quiet)
2246                                 BIO_printf(bio_err,"FILE:%s\n",p);
2247
2248                         if (www == 2)
2249                                 {
2250                                 i=strlen(p);
2251                                 if (    ((i > 5) && (strcmp(&(p[i-5]),".html") == 0)) ||
2252                                         ((i > 4) && (strcmp(&(p[i-4]),".php") == 0)) ||
2253                                         ((i > 4) && (strcmp(&(p[i-4]),".htm") == 0)))
2254                                         BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2255                                 else
2256                                         BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
2257                                 }
2258                         /* send the file */
2259                         total_bytes=0;
2260                         for (;;)
2261                                 {
2262                                 i=BIO_read(file,buf,bufsize);
2263                                 if (i <= 0) break;
2264
2265 #ifdef RENEG
2266                                 total_bytes+=i;
2267                                 fprintf(stderr,"%d\n",i);
2268                                 if (total_bytes > 3*1024)
2269                                         {
2270                                         total_bytes=0;
2271                                         fprintf(stderr,"RENEGOTIATE\n");
2272                                         SSL_renegotiate(con);
2273                                         }
2274 #endif
2275
2276                                 for (j=0; j<i; )
2277                                         {
2278 #ifdef RENEG
2279 { static count=0; if (++count == 13) { SSL_renegotiate(con); } }
2280 #endif
2281                                         k=BIO_write(io,&(buf[j]),i-j);
2282                                         if (k <= 0)
2283                                                 {
2284                                                 if (!BIO_should_retry(io))
2285                                                         goto write_error;
2286                                                 else
2287                                                         {
2288                                                         BIO_printf(bio_s_out,"rwrite W BLOCK\n");
2289                                                         }
2290                                                 }
2291                                         else
2292                                                 {
2293                                                 j+=k;
2294                                                 }
2295                                         }
2296                                 }
2297 write_error:
2298                         BIO_free(file);
2299                         break;
2300                         }
2301                 }
2302
2303         for (;;)
2304                 {
2305                 i=(int)BIO_flush(io);
2306                 if (i <= 0)
2307                         {
2308                         if (!BIO_should_retry(io))
2309                                 break;
2310                         }
2311                 else
2312                         break;
2313                 }
2314 end:
2315 #if 1
2316         /* make sure we re-use sessions */
2317         SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
2318 #else
2319         /* This kills performance */
2320 /*      SSL_shutdown(con); A shutdown gets sent in the
2321  *      BIO_free_all(io) procession */
2322 #endif
2323
2324 err:
2325
2326         if (ret >= 0)
2327                 BIO_printf(bio_s_out,"ACCEPT\n");
2328
2329         if (buf != NULL) OPENSSL_free(buf);
2330         if (io != NULL) BIO_free_all(io);
2331 /*      if (ssl_bio != NULL) BIO_free(ssl_bio);*/
2332         return(ret);
2333         }
2334
2335 #ifndef OPENSSL_NO_RSA
2336 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
2337         {
2338         BIGNUM *bn = NULL;
2339         static RSA *rsa_tmp=NULL;
2340
2341         if (!rsa_tmp && ((bn = BN_new()) == NULL))
2342                 BIO_printf(bio_err,"Allocation error in generating RSA key\n");
2343         if (!rsa_tmp && bn)
2344                 {
2345                 if (!s_quiet)
2346                         {
2347                         BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
2348                         (void)BIO_flush(bio_err);
2349                         }
2350                 if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
2351                                 !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL))
2352                         {
2353                         if(rsa_tmp) RSA_free(rsa_tmp);
2354                         rsa_tmp = NULL;
2355                         }
2356                 if (!s_quiet)
2357                         {
2358                         BIO_printf(bio_err,"\n");
2359                         (void)BIO_flush(bio_err);
2360                         }
2361                 BN_free(bn);
2362                 }
2363         return(rsa_tmp);
2364         }
2365 #endif
2366
2367 #define MAX_SESSION_ID_ATTEMPTS 10
2368 static int generate_session_id(const SSL *ssl, unsigned char *id,
2369                                 unsigned int *id_len)
2370         {
2371         unsigned int count = 0;
2372         do      {
2373                 RAND_pseudo_bytes(id, *id_len);
2374                 /* Prefix the session_id with the required prefix. NB: If our
2375                  * prefix is too long, clip it - but there will be worse effects
2376                  * anyway, eg. the server could only possibly create 1 session
2377                  * ID (ie. the prefix!) so all future session negotiations will
2378                  * fail due to conflicts. */
2379                 memcpy(id, session_id_prefix,
2380                         (strlen(session_id_prefix) < *id_len) ?
2381                         strlen(session_id_prefix) : *id_len);
2382                 }
2383         while(SSL_has_matching_session_id(ssl, id, *id_len) &&
2384                 (++count < MAX_SESSION_ID_ATTEMPTS));
2385         if(count >= MAX_SESSION_ID_ATTEMPTS)
2386                 return 0;
2387         return 1;
2388         }