2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
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.
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).
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.
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions
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)"
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
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.]
58 /* ====================================================================
59 * Copyright (c) 1998-2006 The OpenSSL Project. All rights reserved.
61 * Redistribution and use in source and binary forms, with or without
62 * modification, are permitted provided that the following conditions
65 * 1. Redistributions of source code must retain the above copyright
66 * notice, this list of conditions and the following disclaimer.
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
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/)"
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.
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.
87 * 6. Redistributions of any form whatsoever must retain the following
89 * "This product includes software developed by the OpenSSL Project
90 * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
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 * ====================================================================
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).
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.
116 /* ====================================================================
117 * Copyright 2005 Nokia. All rights reserved.
119 * The portions of the attached software ("Contribution") is developed by
120 * Nokia Corporation and is licensed pursuant to the OpenSSL open source
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.
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.
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.
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
144 * Until the key-gen callbacks are modified to use newer prototypes, we allow
145 * deprecated functions for openssl-internal code
147 #ifdef OPENSSL_NO_DEPRECATED
148 # undef OPENSSL_NO_DEPRECATED
157 #include <openssl/e_os2.h>
158 #ifdef OPENSSL_NO_STDIO
162 /* conflicts with winsock2 stuff on netware */
163 #if !defined(OPENSSL_SYS_NETWARE)
164 # include <sys/types.h>
168 * With IPv6, it looks like Digital has mixed up the proper order of
169 * recursive header file inclusion, resulting in the compiler complaining
170 * that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which is
171 * needed to have fileno() declared correctly... So let's define u_int
173 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
175 typedef unsigned int u_int;
178 #include <openssl/lhash.h>
179 #include <openssl/bn.h>
182 #include <openssl/err.h>
183 #include <openssl/pem.h>
184 #include <openssl/x509.h>
185 #include <openssl/ssl.h>
186 #include <openssl/rand.h>
187 #include <openssl/ocsp.h>
188 #ifndef OPENSSL_NO_DH
189 # include <openssl/dh.h>
191 #ifndef OPENSSL_NO_RSA
192 # include <openssl/rsa.h>
195 #include "timeouts.h"
197 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
198 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
202 #if defined(OPENSSL_SYS_BEOS_R5)
206 #ifndef OPENSSL_NO_RSA
207 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
209 static int sv_body(char *hostname, int s, unsigned char *context);
210 static int www_body(char *hostname, int s, unsigned char *context);
211 static void close_accept_socket(void);
212 static void sv_usage(void);
213 static int init_ssl_connection(SSL *s);
214 static void print_stats(BIO *bp, SSL_CTX *ctx);
215 static int generate_session_id(const SSL *ssl, unsigned char *id,
216 unsigned int *id_len);
217 #ifndef OPENSSL_NO_DH
218 static DH *load_dh_param(const char *dhfile);
219 static DH *get_dh512(void);
223 static void s_server_init(void);
226 #ifndef OPENSSL_NO_DH
227 static unsigned char dh512_p[] = {
228 0xDA, 0x58, 0x3C, 0x16, 0xD9, 0x85, 0x22, 0x89, 0xD0, 0xE4, 0xAF, 0x75,
229 0x6F, 0x4C, 0xCA, 0x92, 0xDD, 0x4B, 0xE5, 0x33, 0xB8, 0x04, 0xFB, 0x0F,
230 0xED, 0x94, 0xEF, 0x9C, 0x8A, 0x44, 0x03, 0xED, 0x57, 0x46, 0x50, 0xD3,
231 0x69, 0x99, 0xDB, 0x29, 0xD7, 0x76, 0x27, 0x6B, 0xA2, 0xD3, 0xD4, 0x12,
232 0xE2, 0x18, 0xF4, 0xDD, 0x1E, 0x08, 0x4C, 0xF6, 0xD8, 0x00, 0x3E, 0x7C,
233 0x47, 0x74, 0xE8, 0x33,
236 static unsigned char dh512_g[] = {
240 static DH *get_dh512(void)
244 if ((dh = DH_new()) == NULL)
246 dh->p = BN_bin2bn(dh512_p, sizeof(dh512_p), NULL);
247 dh->g = BN_bin2bn(dh512_g, sizeof(dh512_g), NULL);
248 if ((dh->p == NULL) || (dh->g == NULL))
254 /* static int load_CA(SSL_CTX *ctx, char *file);*/
257 #define BUFSIZZ 16*1024
258 static int bufsize = BUFSIZZ;
259 static int accept_socket = -1;
261 #define TEST_CERT "server.pem"
262 #ifndef OPENSSL_NO_TLSEXT
263 # define TEST_CERT2 "server2.pem"
266 #define PROG s_server_main
268 extern int verify_depth, verify_return_error;
270 static char *cipher = NULL;
271 static int s_server_verify = SSL_VERIFY_NONE;
272 static int s_server_session_id_context = 1; /* anything will do */
273 static const char *s_cert_file = TEST_CERT, *s_key_file = NULL;
274 #ifndef OPENSSL_NO_TLSEXT
275 static const char *s_cert_file2 = TEST_CERT2, *s_key_file2 = NULL;
277 static char *s_dcert_file = NULL, *s_dkey_file = NULL;
279 static int s_nbio = 0;
281 static int s_nbio_test = 0;
283 static SSL_CTX *ctx = NULL;
284 #ifndef OPENSSL_NO_TLSEXT
285 static SSL_CTX *ctx2 = NULL;
289 static BIO *bio_s_out = NULL;
290 static int s_debug = 0;
291 #ifndef OPENSSL_NO_TLSEXT
292 static int s_tlsextdebug = 0;
293 static int s_tlsextstatus = 0;
294 static int cert_status_cb(SSL *s, void *arg);
296 static int s_msg = 0;
297 static int s_quiet = 0;
300 #ifndef OPENSSL_NO_ENGINE
301 static char *engine_id = NULL;
303 static const char *session_id_prefix = NULL;
305 static int enable_timeouts = 0;
306 static long socket_mtu;
307 #ifndef OPENSSL_NO_DTLS1
308 static int cert_chain = 0;
311 #ifndef OPENSSL_NO_PSK
312 static char *psk_identity = "Client_identity";
313 char *psk_key = NULL; /* by default PSK is not used */
315 static unsigned int psk_server_cb(SSL *ssl, const char *identity,
317 unsigned int max_psk_len)
319 unsigned int psk_len = 0;
324 BIO_printf(bio_s_out, "psk_server_cb\n");
326 BIO_printf(bio_err, "Error: client did not send PSK identity\n");
330 BIO_printf(bio_s_out, "identity_len=%d identity=%s\n",
331 identity ? (int)strlen(identity) : 0, identity);
333 /* here we could lookup the given identity e.g. from a database */
334 if (strcmp(identity, psk_identity) != 0) {
335 BIO_printf(bio_s_out, "PSK error: client identity not found"
336 " (got '%s' expected '%s')\n", identity, psk_identity);
340 BIO_printf(bio_s_out, "PSK client identity found\n");
342 /* convert the PSK key to binary */
343 ret = BN_hex2bn(&bn, psk_key);
345 BIO_printf(bio_err, "Could not convert PSK key '%s' to BIGNUM\n",
351 if (BN_num_bytes(bn) > (int)max_psk_len) {
353 "psk buffer of callback is too small (%d) for key (%d)\n",
354 max_psk_len, BN_num_bytes(bn));
359 ret = BN_bn2bin(bn, psk);
364 psk_len = (unsigned int)ret;
367 BIO_printf(bio_s_out, "fetched PSK len=%d\n", psk_len);
371 BIO_printf(bio_err, "Error in PSK server callback\n");
377 static void s_server_init(void)
381 s_server_verify = SSL_VERIFY_NONE;
384 s_cert_file = TEST_CERT;
386 # ifndef OPENSSL_NO_TLSEXT
387 s_cert_file2 = TEST_CERT2;
403 # ifndef OPENSSL_NO_ENGINE
409 static void sv_usage(void)
411 BIO_printf(bio_err, "usage: s_server [args ...]\n");
412 BIO_printf(bio_err, "\n");
414 " -accept arg - port to accept on (default is %d)\n", PORT);
415 BIO_printf(bio_err, " -context arg - set session ID context\n");
417 " -verify arg - turn on peer certificate verification\n");
419 " -Verify arg - turn on peer certificate verification, must have a cert.\n");
421 " -verify_return_error - return verification errors\n");
422 BIO_printf(bio_err, " -cert arg - certificate file to use\n");
423 BIO_printf(bio_err, " (default is %s)\n", TEST_CERT);
425 " -crl_check - check the peer certificate has not been revoked by its CA.\n"
426 " The CRL(s) are appended to the certificate file\n");
428 " -crl_check_all - check the peer certificate has not been revoked by its CA\n"
429 " or any other CRL in the CA chain. CRL(s) are appened to the\n"
430 " the certificate file.\n");
432 " -certform arg - certificate format (PEM or DER) PEM default\n");
434 " -key arg - Private Key file to use, in cert file if\n");
435 BIO_printf(bio_err, " not specified (default is %s)\n",
438 " -keyform arg - key format (PEM, DER or ENGINE) PEM default\n");
440 " -pass arg - private key file pass phrase source\n");
442 " -dcert arg - second certificate file to use (usually for DSA)\n");
444 " -dcertform x - second certificate format (PEM or DER) PEM default\n");
446 " -dkey arg - second private key file to use (usually for DSA)\n");
448 " -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
450 " -dpass arg - second private key file pass phrase source\n");
452 " -dhparam arg - DH parameter file to use, in cert file if not specified\n");
454 " or a default set of parameters is used\n");
455 #ifndef OPENSSL_NO_ECDH
457 " -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n"
458 " Use \"openssl ecparam -list_curves\" for all names\n"
459 " (default is nistp256).\n");
462 BIO_printf(bio_err, " -nbio - Run with non-blocking IO\n");
465 " -nbio_test - test with the non-blocking test bio\n");
467 " -crlf - convert LF from terminal into CRLF\n");
468 BIO_printf(bio_err, " -debug - Print more output\n");
469 BIO_printf(bio_err, " -msg - Show protocol messages\n");
470 BIO_printf(bio_err, " -state - Print the SSL states\n");
471 BIO_printf(bio_err, " -CApath arg - PEM format directory of CA's\n");
472 BIO_printf(bio_err, " -CAfile arg - PEM format file of CA's\n");
474 " -nocert - Don't use any certificates (Anon-DH)\n");
476 " -cipher arg - play with 'openssl ciphers' to see what goes here\n");
477 BIO_printf(bio_err, " -serverpref - Use server's cipher preferences\n");
478 BIO_printf(bio_err, " -quiet - No server output\n");
479 BIO_printf(bio_err, " -no_tmp_rsa - Do not generate a tmp RSA key\n");
480 #ifndef OPENSSL_NO_PSK
481 BIO_printf(bio_err, " -psk_hint arg - PSK identity hint to use\n");
482 BIO_printf(bio_err, " -psk arg - PSK in hex (without 0x)\n");
483 # ifndef OPENSSL_NO_JPAKE
484 BIO_printf(bio_err, " -jpake arg - JPAKE secret to use\n");
487 BIO_printf(bio_err, " -ssl2 - Just talk SSLv2\n");
488 BIO_printf(bio_err, " -ssl3 - Just talk SSLv3\n");
489 BIO_printf(bio_err, " -tls1 - Just talk TLSv1\n");
490 BIO_printf(bio_err, " -dtls1 - Just talk DTLSv1\n");
491 BIO_printf(bio_err, " -timeout - Enable timeouts\n");
492 BIO_printf(bio_err, " -mtu - Set link layer MTU\n");
493 BIO_printf(bio_err, " -chain - Read a certificate chain\n");
494 BIO_printf(bio_err, " -no_ssl2 - Just disable SSLv2\n");
495 BIO_printf(bio_err, " -no_ssl3 - Just disable SSLv3\n");
496 BIO_printf(bio_err, " -no_tls1 - Just disable TLSv1\n");
497 #ifndef OPENSSL_NO_DH
498 BIO_printf(bio_err, " -no_dhe - Disable ephemeral DH\n");
500 #ifndef OPENSSL_NO_ECDH
501 BIO_printf(bio_err, " -no_ecdhe - Disable ephemeral ECDH\n");
503 BIO_printf(bio_err, " -bugs - Turn on SSL bug compatibility\n");
505 " -hack - workaround for early Netscape code\n");
507 " -www - Respond to a 'GET /' with a status page\n");
509 " -WWW - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
511 " -HTTP - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
513 " with the assumption it contains a complete HTTP response.\n");
514 #ifndef OPENSSL_NO_ENGINE
516 " -engine id - Initialise and use the specified engine\n");
519 " -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
520 BIO_printf(bio_err, " -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR,
521 LIST_SEPARATOR_CHAR);
522 #ifndef OPENSSL_NO_TLSEXT
524 " -servername host - servername for HostName TLS extension\n");
526 " -servername_fatal - on mismatch send fatal alert (default warning alert)\n");
528 " -cert2 arg - certificate file to use for servername\n");
529 BIO_printf(bio_err, " (default is %s)\n", TEST_CERT2);
531 " -key2 arg - Private Key file to use for servername, in cert file if\n");
532 BIO_printf(bio_err, " not specified (default is %s)\n",
535 " -tlsextdebug - hex dump of all TLS extensions received\n");
537 " -no_ticket - disable use of RFC4507bis session tickets\n");
539 " -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
542 " -status - respond to certificate status requests\n");
544 " -status_verbose - enable status request verbose printout\n");
546 " -status_timeout n - status request responder timeout\n");
547 BIO_printf(bio_err, " -status_url URL - status request fallback URL\n");
550 static int local_argc = 0;
551 static char **local_argv;
553 #ifdef CHARSET_EBCDIC
554 static int ebcdic_new(BIO *bi);
555 static int ebcdic_free(BIO *a);
556 static int ebcdic_read(BIO *b, char *out, int outl);
557 static int ebcdic_write(BIO *b, const char *in, int inl);
558 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
559 static int ebcdic_gets(BIO *bp, char *buf, int size);
560 static int ebcdic_puts(BIO *bp, const char *str);
562 # define BIO_TYPE_EBCDIC_FILTER (18|0x0200)
563 static BIO_METHOD methods_ebcdic = {
564 BIO_TYPE_EBCDIC_FILTER,
565 "EBCDIC/ASCII filter",
580 BIO_METHOD *BIO_f_ebcdic_filter()
582 return (&methods_ebcdic);
585 static int ebcdic_new(BIO *bi)
587 EBCDIC_OUTBUFF *wbuf;
589 wbuf = (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
590 wbuf->alloced = 1024;
591 wbuf->buff[0] = '\0';
593 bi->ptr = (char *)wbuf;
599 static int ebcdic_free(BIO *a)
604 OPENSSL_free(a->ptr);
611 static int ebcdic_read(BIO *b, char *out, int outl)
615 if (out == NULL || outl == 0)
617 if (b->next_bio == NULL)
620 ret = BIO_read(b->next_bio, out, outl);
622 ascii2ebcdic(out, out, ret);
626 static int ebcdic_write(BIO *b, const char *in, int inl)
628 EBCDIC_OUTBUFF *wbuf;
633 if ((in == NULL) || (inl <= 0))
635 if (b->next_bio == NULL)
638 wbuf = (EBCDIC_OUTBUFF *) b->ptr;
640 if (inl > (num = wbuf->alloced)) {
641 num = num + num; /* double the size */
646 (EBCDIC_OUTBUFF *) OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
649 wbuf->buff[0] = '\0';
651 b->ptr = (char *)wbuf;
654 ebcdic2ascii(wbuf->buff, in, inl);
656 ret = BIO_write(b->next_bio, wbuf->buff, inl);
661 static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
665 if (b->next_bio == NULL)
672 ret = BIO_ctrl(b->next_bio, cmd, num, ptr);
678 static int ebcdic_gets(BIO *bp, char *buf, int size)
681 if (bp->next_bio == NULL)
683 /* return(BIO_gets(bp->next_bio,buf,size));*/
684 for (i = 0; i < size - 1; ++i) {
685 ret = ebcdic_read(bp, &buf[i], 1);
688 else if (buf[i] == '\n') {
695 return (ret < 0 && i == 0) ? ret : i;
698 static int ebcdic_puts(BIO *bp, const char *str)
700 if (bp->next_bio == NULL)
702 return ebcdic_write(bp, str, strlen(str));
706 #ifndef OPENSSL_NO_TLSEXT
708 /* This is a context that we pass to callbacks */
709 typedef struct tlsextctx_st {
715 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
717 tlsextctx *p = (tlsextctx *) arg;
718 const char *servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
719 if (servername && p->biodebug)
720 BIO_printf(p->biodebug, "Hostname in TLS extension: \"%s\"\n",
724 return SSL_TLSEXT_ERR_NOACK;
727 if (strcasecmp(servername, p->servername))
728 return p->extension_error;
730 BIO_printf(p->biodebug, "Switching server context.\n");
731 SSL_set_SSL_CTX(s, ctx2);
734 return SSL_TLSEXT_ERR_OK;
737 /* Structure passed to cert status callback */
739 typedef struct tlsextstatusctx_st {
740 /* Default responder to use */
741 char *host, *path, *port;
748 static tlsextstatusctx tlscstatp = { NULL, NULL, NULL, 0, -1, NULL, 0 };
751 * Certificate Status callback. This is called when a client includes a
752 * certificate status request extension. This is a simplified version. It
753 * examines certificates each time and makes one OCSP responder query for
754 * each request. A full version would store details such as the OCSP
755 * certificate IDs and minimise the number of OCSP responses by caching them
756 * until they were considered "expired".
759 static int cert_status_cb(SSL *s, void *arg)
761 tlsextstatusctx *srctx = arg;
762 BIO *err = srctx->err;
763 char *host, *port, *path;
765 unsigned char *rspder = NULL;
767 STACK_OF(OPENSSL_STRING) *aia = NULL;
769 X509_STORE_CTX inctx;
771 OCSP_REQUEST *req = NULL;
772 OCSP_RESPONSE *resp = NULL;
773 OCSP_CERTID *id = NULL;
774 STACK_OF(X509_EXTENSION) *exts;
775 int ret = SSL_TLSEXT_ERR_NOACK;
778 STACK_OF(OCSP_RESPID) *ids;
779 SSL_get_tlsext_status_ids(s, &ids);
780 BIO_printf(err, "cert_status: received %d ids\n",
781 sk_OCSP_RESPID_num(ids));
784 BIO_puts(err, "cert_status: callback called\n");
785 /* Build up OCSP query from server certificate */
786 x = SSL_get_certificate(s);
787 aia = X509_get1_ocsp(x);
789 if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0),
790 &host, &port, &path, &use_ssl)) {
791 BIO_puts(err, "cert_status: can't parse AIA URL\n");
795 BIO_printf(err, "cert_status: AIA URL: %s\n",
796 sk_OPENSSL_STRING_value(aia, 0));
800 "cert_status: no AIA and no default responder URL\n");
806 use_ssl = srctx->use_ssl;
809 if (!X509_STORE_CTX_init(&inctx,
810 SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)),
813 if (X509_STORE_get_by_subject(&inctx, X509_LU_X509,
814 X509_get_issuer_name(x), &obj) <= 0) {
815 BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n");
816 X509_STORE_CTX_cleanup(&inctx);
819 req = OCSP_REQUEST_new();
822 id = OCSP_cert_to_id(NULL, x, obj.data.x509);
823 X509_free(obj.data.x509);
824 X509_STORE_CTX_cleanup(&inctx);
827 if (!OCSP_request_add0_id(req, id))
830 /* Add any extensions to the request */
831 SSL_get_tlsext_status_exts(s, &exts);
832 for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
833 X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
834 if (!OCSP_REQUEST_add_ext(req, ext, -1))
837 resp = process_responder(err, req, host, path, port, use_ssl, NULL,
840 BIO_puts(err, "cert_status: error querying responder\n");
843 rspderlen = i2d_OCSP_RESPONSE(resp, &rspder);
846 SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen);
847 if (srctx->verbose) {
848 BIO_puts(err, "cert_status: ocsp response sent:\n");
849 OCSP_RESPONSE_print(err, resp, 2);
851 ret = SSL_TLSEXT_ERR_OK;
853 if (ret != SSL_TLSEXT_ERR_OK)
854 ERR_print_errors(err);
859 X509_email_free(aia);
862 OCSP_CERTID_free(id);
864 OCSP_REQUEST_free(req);
866 OCSP_RESPONSE_free(resp);
869 ret = SSL_TLSEXT_ERR_ALERT_FATAL;
874 int MAIN(int, char **);
876 #ifndef OPENSSL_NO_JPAKE
877 static char *jpake_secret = NULL;
880 int MAIN(int argc, char *argv[])
882 X509_VERIFY_PARAM *vpm = NULL;
885 char *CApath = NULL, *CAfile = NULL;
886 unsigned char *context = NULL;
888 #ifndef OPENSSL_NO_ECDH
889 char *named_curve = NULL;
891 int badop = 0, bugs = 0;
894 int no_tmp_rsa = 0, no_dhe = 0, no_ecdhe = 0, nocert = 0;
896 const SSL_METHOD *meth = NULL;
897 int socket_type = SOCK_STREAM;
900 int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
901 char *passarg = NULL, *pass = NULL;
902 char *dpassarg = NULL, *dpass = NULL;
903 int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
904 X509 *s_cert = NULL, *s_dcert = NULL;
905 EVP_PKEY *s_key = NULL, *s_dkey = NULL;
907 #ifndef OPENSSL_NO_TLSEXT
908 EVP_PKEY *s_key2 = NULL;
909 X509 *s_cert2 = NULL;
911 #ifndef OPENSSL_NO_TLSEXT
912 tlsextctx tlsextcbp = { NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING };
914 #ifndef OPENSSL_NO_PSK
915 /* by default do not send a PSK identity hint */
916 static char *psk_identity_hint = NULL;
918 meth = SSLv23_server_method();
929 bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
931 if (!load_config(bio_err, NULL))
944 if ((strcmp(*argv, "-port") == 0) || (strcmp(*argv, "-accept") == 0)) {
947 if (!extract_port(*(++argv), &port))
949 } else if (strcmp(*argv, "-verify") == 0) {
950 s_server_verify = SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE;
953 verify_depth = atoi(*(++argv));
954 BIO_printf(bio_err, "verify depth is %d\n", verify_depth);
955 } else if (strcmp(*argv, "-Verify") == 0) {
957 SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT |
958 SSL_VERIFY_CLIENT_ONCE;
961 verify_depth = atoi(*(++argv));
963 "verify depth is %d, must return a certificate\n",
965 } else if (strcmp(*argv, "-context") == 0) {
968 context = (unsigned char *)*(++argv);
969 } else if (strcmp(*argv, "-cert") == 0) {
972 s_cert_file = *(++argv);
973 } else if (strcmp(*argv, "-certform") == 0) {
976 s_cert_format = str2fmt(*(++argv));
977 } else if (strcmp(*argv, "-key") == 0) {
980 s_key_file = *(++argv);
981 } else if (strcmp(*argv, "-keyform") == 0) {
984 s_key_format = str2fmt(*(++argv));
985 } else if (strcmp(*argv, "-pass") == 0) {
989 } else if (strcmp(*argv, "-dhparam") == 0) {
994 #ifndef OPENSSL_NO_ECDH
995 else if (strcmp(*argv, "-named_curve") == 0) {
998 named_curve = *(++argv);
1001 else if (strcmp(*argv, "-dcertform") == 0) {
1004 s_dcert_format = str2fmt(*(++argv));
1005 } else if (strcmp(*argv, "-dcert") == 0) {
1008 s_dcert_file = *(++argv);
1009 } else if (strcmp(*argv, "-dkeyform") == 0) {
1012 s_dkey_format = str2fmt(*(++argv));
1013 } else if (strcmp(*argv, "-dpass") == 0) {
1016 dpassarg = *(++argv);
1017 } else if (strcmp(*argv, "-dkey") == 0) {
1020 s_dkey_file = *(++argv);
1021 } else if (strcmp(*argv, "-nocert") == 0) {
1023 } else if (strcmp(*argv, "-CApath") == 0) {
1027 } else if (strcmp(*argv, "-no_cache") == 0)
1029 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm)) {
1033 } else if (strcmp(*argv, "-verify_return_error") == 0)
1034 verify_return_error = 1;
1035 else if (strcmp(*argv, "-serverpref") == 0) {
1036 off |= SSL_OP_CIPHER_SERVER_PREFERENCE;
1037 } else if (strcmp(*argv, "-legacy_renegotiation") == 0)
1038 off |= SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
1039 else if (strcmp(*argv, "-cipher") == 0) {
1043 } else if (strcmp(*argv, "-CAfile") == 0) {
1049 else if (strcmp(*argv, "-nbio") == 0) {
1053 else if (strcmp(*argv, "-nbio_test") == 0) {
1058 } else if (strcmp(*argv, "-debug") == 0) {
1061 #ifndef OPENSSL_NO_TLSEXT
1062 else if (strcmp(*argv, "-tlsextdebug") == 0)
1064 else if (strcmp(*argv, "-status") == 0)
1066 else if (strcmp(*argv, "-status_verbose") == 0) {
1068 tlscstatp.verbose = 1;
1069 } else if (!strcmp(*argv, "-status_timeout")) {
1073 tlscstatp.timeout = atoi(*(++argv));
1074 } else if (!strcmp(*argv, "-status_url")) {
1078 if (!OCSP_parse_url(*(++argv),
1081 &tlscstatp.path, &tlscstatp.use_ssl)) {
1082 BIO_printf(bio_err, "Error parsing URL\n");
1087 else if (strcmp(*argv, "-msg") == 0) {
1089 } else if (strcmp(*argv, "-hack") == 0) {
1091 } else if (strcmp(*argv, "-state") == 0) {
1093 } else if (strcmp(*argv, "-crlf") == 0) {
1095 } else if (strcmp(*argv, "-quiet") == 0) {
1097 } else if (strcmp(*argv, "-bugs") == 0) {
1099 } else if (strcmp(*argv, "-no_tmp_rsa") == 0) {
1101 } else if (strcmp(*argv, "-no_dhe") == 0) {
1103 } else if (strcmp(*argv, "-no_ecdhe") == 0) {
1106 #ifndef OPENSSL_NO_PSK
1107 else if (strcmp(*argv, "-psk_hint") == 0) {
1110 psk_identity_hint = *(++argv);
1111 } else if (strcmp(*argv, "-psk") == 0) {
1116 psk_key = *(++argv);
1117 for (i = 0; i < strlen(psk_key); i++) {
1118 if (isxdigit((unsigned char)psk_key[i]))
1120 BIO_printf(bio_err, "Not a hex number '%s'\n", *argv);
1125 else if (strcmp(*argv, "-www") == 0) {
1127 } else if (strcmp(*argv, "-WWW") == 0) {
1129 } else if (strcmp(*argv, "-HTTP") == 0) {
1131 } else if (strcmp(*argv, "-no_ssl2") == 0) {
1132 off |= SSL_OP_NO_SSLv2;
1133 } else if (strcmp(*argv, "-no_ssl3") == 0) {
1134 off |= SSL_OP_NO_SSLv3;
1135 } else if (strcmp(*argv, "-no_tls1") == 0) {
1136 off |= SSL_OP_NO_TLSv1;
1137 } else if (strcmp(*argv, "-no_comp") == 0) {
1138 off |= SSL_OP_NO_COMPRESSION;
1140 #ifndef OPENSSL_NO_TLSEXT
1141 else if (strcmp(*argv, "-no_ticket") == 0) {
1142 off |= SSL_OP_NO_TICKET;
1145 #ifndef OPENSSL_NO_SSL2
1146 else if (strcmp(*argv, "-ssl2") == 0) {
1147 meth = SSLv2_server_method();
1150 #ifndef OPENSSL_NO_SSL3
1151 else if (strcmp(*argv, "-ssl3") == 0) {
1152 meth = SSLv3_server_method();
1155 #ifndef OPENSSL_NO_TLS1
1156 else if (strcmp(*argv, "-tls1") == 0) {
1157 meth = TLSv1_server_method();
1160 #ifndef OPENSSL_NO_DTLS1
1161 else if (strcmp(*argv, "-dtls1") == 0) {
1162 meth = DTLSv1_server_method();
1163 socket_type = SOCK_DGRAM;
1164 } else if (strcmp(*argv, "-timeout") == 0)
1165 enable_timeouts = 1;
1166 else if (strcmp(*argv, "-mtu") == 0) {
1169 socket_mtu = atol(*(++argv));
1170 } else if (strcmp(*argv, "-chain") == 0)
1173 else if (strcmp(*argv, "-id_prefix") == 0) {
1176 session_id_prefix = *(++argv);
1178 #ifndef OPENSSL_NO_ENGINE
1179 else if (strcmp(*argv, "-engine") == 0) {
1182 engine_id = *(++argv);
1185 else if (strcmp(*argv, "-rand") == 0) {
1190 #ifndef OPENSSL_NO_TLSEXT
1191 else if (strcmp(*argv, "-servername") == 0) {
1194 tlsextcbp.servername = *(++argv);
1195 } else if (strcmp(*argv, "-servername_fatal") == 0) {
1196 tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL;
1197 } else if (strcmp(*argv, "-cert2") == 0) {
1200 s_cert_file2 = *(++argv);
1201 } else if (strcmp(*argv, "-key2") == 0) {
1204 s_key_file2 = *(++argv);
1207 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1208 else if (strcmp(*argv, "-jpake") == 0) {
1211 jpake_secret = *(++argv);
1215 BIO_printf(bio_err, "unknown option %s\n", *argv);
1227 #ifndef OPENSSL_NO_DTLS1
1228 if (www && socket_type == SOCK_DGRAM) {
1229 BIO_printf(bio_err, "Can't use -HTTP, -www or -WWW with DTLS\n");
1234 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1237 BIO_printf(bio_err, "Can't use JPAKE and PSK together\n");
1240 psk_identity = "JPAKE";
1242 BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1249 SSL_load_error_strings();
1250 OpenSSL_add_ssl_algorithms();
1252 #ifndef OPENSSL_NO_ENGINE
1253 e = setup_engine(bio_err, engine_id, 1);
1256 if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass)) {
1257 BIO_printf(bio_err, "Error getting password\n");
1261 if (s_key_file == NULL)
1262 s_key_file = s_cert_file;
1263 #ifndef OPENSSL_NO_TLSEXT
1264 if (s_key_file2 == NULL)
1265 s_key_file2 = s_cert_file2;
1269 s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
1270 "server certificate private key file");
1272 ERR_print_errors(bio_err);
1276 s_cert = load_cert(bio_err, s_cert_file, s_cert_format,
1277 NULL, e, "server certificate file");
1280 ERR_print_errors(bio_err);
1283 #ifndef OPENSSL_NO_TLSEXT
1284 if (tlsextcbp.servername) {
1285 s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
1286 "second server certificate private key file");
1288 ERR_print_errors(bio_err);
1292 s_cert2 = load_cert(bio_err, s_cert_file2, s_cert_format,
1293 NULL, e, "second server certificate file");
1296 ERR_print_errors(bio_err);
1305 if (s_dkey_file == NULL)
1306 s_dkey_file = s_dcert_file;
1308 s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
1309 0, dpass, e, "second certificate private key file");
1311 ERR_print_errors(bio_err);
1315 s_dcert = load_cert(bio_err, s_dcert_file, s_dcert_format,
1316 NULL, e, "second server certificate file");
1319 ERR_print_errors(bio_err);
1325 if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1326 && !RAND_status()) {
1328 "warning, not much extra random data, consider using the -rand option\n");
1331 BIO_printf(bio_err, "%ld semi-random bytes loaded\n",
1332 app_RAND_load_files(inrand));
1334 if (bio_s_out == NULL) {
1335 if (s_quiet && !s_debug && !s_msg) {
1336 bio_s_out = BIO_new(BIO_s_null());
1338 if (bio_s_out == NULL)
1339 bio_s_out = BIO_new_fp(stdout, BIO_NOCLOSE);
1342 #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
1348 s_dcert_file = NULL;
1350 #ifndef OPENSSL_NO_TLSEXT
1351 s_cert_file2 = NULL;
1356 ctx = SSL_CTX_new(meth);
1358 ERR_print_errors(bio_err);
1361 if (session_id_prefix) {
1362 if (strlen(session_id_prefix) >= 32)
1364 "warning: id_prefix is too long, only one new session will be possible\n");
1365 else if (strlen(session_id_prefix) >= 16)
1367 "warning: id_prefix is too long if you use SSLv2\n");
1368 if (!SSL_CTX_set_generate_session_id(ctx, generate_session_id)) {
1369 BIO_printf(bio_err, "error setting 'id_prefix'\n");
1370 ERR_print_errors(bio_err);
1373 BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
1375 SSL_CTX_set_quiet_shutdown(ctx, 1);
1377 SSL_CTX_set_options(ctx, SSL_OP_ALL);
1379 SSL_CTX_set_options(ctx, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1380 SSL_CTX_set_options(ctx, off);
1382 * DTLS: partial reads end up discarding unread UDP bytes :-( Setting
1383 * read ahead solves this problem.
1385 if (socket_type == SOCK_DGRAM)
1386 SSL_CTX_set_read_ahead(ctx, 1);
1389 SSL_CTX_set_info_callback(ctx, apps_ssl_info_callback);
1391 SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
1393 SSL_CTX_sess_set_cache_size(ctx, 128);
1397 cipher = getenv("SSL_CIPHER");
1401 if (s_cert_file == NULL) {
1403 "You must specify a certificate file for the server to use\n");
1408 if ((!SSL_CTX_load_verify_locations(ctx, CAfile, CApath)) ||
1409 (!SSL_CTX_set_default_verify_paths(ctx))) {
1410 /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
1411 ERR_print_errors(bio_err);
1415 SSL_CTX_set1_param(ctx, vpm);
1417 #ifndef OPENSSL_NO_TLSEXT
1419 ctx2 = SSL_CTX_new(meth);
1421 ERR_print_errors(bio_err);
1427 BIO_printf(bio_s_out, "Setting secondary ctx parameters\n");
1429 if (session_id_prefix) {
1430 if (strlen(session_id_prefix) >= 32)
1432 "warning: id_prefix is too long, only one new session will be possible\n");
1433 else if (strlen(session_id_prefix) >= 16)
1435 "warning: id_prefix is too long if you use SSLv2\n");
1436 if (!SSL_CTX_set_generate_session_id(ctx2, generate_session_id)) {
1437 BIO_printf(bio_err, "error setting 'id_prefix'\n");
1438 ERR_print_errors(bio_err);
1441 BIO_printf(bio_err, "id_prefix '%s' set.\n", session_id_prefix);
1443 SSL_CTX_set_quiet_shutdown(ctx2, 1);
1445 SSL_CTX_set_options(ctx2, SSL_OP_ALL);
1447 SSL_CTX_set_options(ctx2, SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1448 SSL_CTX_set_options(ctx2, off);
1450 * DTLS: partial reads end up discarding unread UDP bytes :-(
1451 * Setting read ahead solves this problem.
1453 if (socket_type == SOCK_DGRAM)
1454 SSL_CTX_set_read_ahead(ctx2, 1);
1457 SSL_CTX_set_info_callback(ctx2, apps_ssl_info_callback);
1460 SSL_CTX_set_session_cache_mode(ctx2, SSL_SESS_CACHE_OFF);
1462 SSL_CTX_sess_set_cache_size(ctx2, 128);
1464 if ((!SSL_CTX_load_verify_locations(ctx2, CAfile, CApath)) ||
1465 (!SSL_CTX_set_default_verify_paths(ctx2))) {
1466 ERR_print_errors(bio_err);
1469 SSL_CTX_set1_param(ctx2, vpm);
1473 #ifndef OPENSSL_NO_DH
1478 dh = load_dh_param(dhfile);
1479 else if (s_cert_file)
1480 dh = load_dh_param(s_cert_file);
1483 BIO_printf(bio_s_out, "Setting temp DH parameters\n");
1485 BIO_printf(bio_s_out, "Using default temp DH parameters\n");
1488 (void)BIO_flush(bio_s_out);
1490 SSL_CTX_set_tmp_dh(ctx, dh);
1491 # ifndef OPENSSL_NO_TLSEXT
1494 DH *dh2 = load_dh_param(s_cert_file2);
1496 BIO_printf(bio_s_out, "Setting temp DH parameters\n");
1497 (void)BIO_flush(bio_s_out);
1503 SSL_CTX_set_tmp_dh(ctx2, dh);
1510 #ifndef OPENSSL_NO_ECDH
1512 EC_KEY *ecdh = NULL;
1515 int nid = OBJ_sn2nid(named_curve);
1518 BIO_printf(bio_err, "unknown curve name (%s)\n", named_curve);
1521 ecdh = EC_KEY_new_by_curve_name(nid);
1523 BIO_printf(bio_err, "unable to create curve (%s)\n",
1530 BIO_printf(bio_s_out, "Setting temp ECDH parameters\n");
1532 BIO_printf(bio_s_out, "Using default temp ECDH parameters\n");
1533 ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
1535 BIO_printf(bio_err, "unable to create curve (nistp256)\n");
1539 (void)BIO_flush(bio_s_out);
1541 SSL_CTX_set_tmp_ecdh(ctx, ecdh);
1542 # ifndef OPENSSL_NO_TLSEXT
1544 SSL_CTX_set_tmp_ecdh(ctx2, ecdh);
1550 if (!set_cert_key_stuff(ctx, s_cert, s_key))
1552 #ifndef OPENSSL_NO_TLSEXT
1553 if (ctx2 && !set_cert_key_stuff(ctx2, s_cert2, s_key2))
1556 if (s_dcert != NULL) {
1557 if (!set_cert_key_stuff(ctx, s_dcert, s_dkey))
1560 #ifndef OPENSSL_NO_RSA
1563 SSL_CTX_set_tmp_rsa_callback(ctx, tmp_rsa_cb);
1564 # ifndef OPENSSL_NO_TLSEXT
1566 SSL_CTX_set_tmp_rsa_callback(ctx2, tmp_rsa_cb);
1570 if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx)) {
1573 BIO_printf(bio_s_out, "Generating temp (512 bit) RSA key...");
1574 BIO_flush(bio_s_out);
1576 rsa = RSA_generate_key(512, RSA_F4, NULL);
1578 if (!SSL_CTX_set_tmp_rsa(ctx, rsa)) {
1579 ERR_print_errors(bio_err);
1582 # ifndef OPENSSL_NO_TLSEXT
1584 if (!SSL_CTX_set_tmp_rsa(ctx2, rsa)) {
1585 ERR_print_errors(bio_err);
1591 BIO_printf(bio_s_out, "\n");
1596 #ifndef OPENSSL_NO_PSK
1597 # ifdef OPENSSL_NO_JPAKE
1598 if (psk_key != NULL)
1600 if (psk_key != NULL || jpake_secret)
1604 BIO_printf(bio_s_out,
1605 "PSK key given or JPAKE in use, setting server callback\n");
1606 SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
1609 if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint)) {
1610 BIO_printf(bio_err, "error setting PSK identity hint to context\n");
1611 ERR_print_errors(bio_err);
1616 if (cipher != NULL) {
1617 if (!SSL_CTX_set_cipher_list(ctx, cipher)) {
1618 BIO_printf(bio_err, "error setting cipher list\n");
1619 ERR_print_errors(bio_err);
1622 #ifndef OPENSSL_NO_TLSEXT
1623 if (ctx2 && !SSL_CTX_set_cipher_list(ctx2, cipher)) {
1624 BIO_printf(bio_err, "error setting cipher list\n");
1625 ERR_print_errors(bio_err);
1630 SSL_CTX_set_verify(ctx, s_server_verify, verify_callback);
1631 SSL_CTX_set_session_id_context(ctx, (void *)&s_server_session_id_context,
1632 sizeof s_server_session_id_context);
1634 /* Set DTLS cookie generation and verification callbacks */
1635 SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback);
1636 SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback);
1638 #ifndef OPENSSL_NO_TLSEXT
1640 SSL_CTX_set_verify(ctx2, s_server_verify, verify_callback);
1641 SSL_CTX_set_session_id_context(ctx2,
1642 (void *)&s_server_session_id_context,
1643 sizeof s_server_session_id_context);
1645 tlsextcbp.biodebug = bio_s_out;
1646 SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
1647 SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
1648 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1649 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1653 if (CAfile != NULL) {
1654 SSL_CTX_set_client_CA_list(ctx, SSL_load_client_CA_file(CAfile));
1655 #ifndef OPENSSL_NO_TLSEXT
1657 SSL_CTX_set_client_CA_list(ctx2, SSL_load_client_CA_file(CAfile));
1661 BIO_printf(bio_s_out, "ACCEPT\n");
1662 (void)BIO_flush(bio_s_out);
1664 do_server(port, socket_type, &accept_socket, www_body, context);
1666 do_server(port, socket_type, &accept_socket, sv_body, context);
1667 print_stats(bio_s_out, ctx);
1677 EVP_PKEY_free(s_key);
1679 EVP_PKEY_free(s_dkey);
1683 OPENSSL_free(dpass);
1685 X509_VERIFY_PARAM_free(vpm);
1686 #ifndef OPENSSL_NO_TLSEXT
1688 OPENSSL_free(tlscstatp.host);
1690 OPENSSL_free(tlscstatp.port);
1692 OPENSSL_free(tlscstatp.path);
1698 EVP_PKEY_free(s_key2);
1700 if (bio_s_out != NULL) {
1701 BIO_free(bio_s_out);
1708 static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
1710 BIO_printf(bio, "%4ld items in the session cache\n",
1711 SSL_CTX_sess_number(ssl_ctx));
1712 BIO_printf(bio, "%4ld client connects (SSL_connect())\n",
1713 SSL_CTX_sess_connect(ssl_ctx));
1714 BIO_printf(bio, "%4ld client renegotiates (SSL_connect())\n",
1715 SSL_CTX_sess_connect_renegotiate(ssl_ctx));
1716 BIO_printf(bio, "%4ld client connects that finished\n",
1717 SSL_CTX_sess_connect_good(ssl_ctx));
1718 BIO_printf(bio, "%4ld server accepts (SSL_accept())\n",
1719 SSL_CTX_sess_accept(ssl_ctx));
1720 BIO_printf(bio, "%4ld server renegotiates (SSL_accept())\n",
1721 SSL_CTX_sess_accept_renegotiate(ssl_ctx));
1722 BIO_printf(bio, "%4ld server accepts that finished\n",
1723 SSL_CTX_sess_accept_good(ssl_ctx));
1724 BIO_printf(bio, "%4ld session cache hits\n", SSL_CTX_sess_hits(ssl_ctx));
1725 BIO_printf(bio, "%4ld session cache misses\n",
1726 SSL_CTX_sess_misses(ssl_ctx));
1727 BIO_printf(bio, "%4ld session cache timeouts\n",
1728 SSL_CTX_sess_timeouts(ssl_ctx));
1729 BIO_printf(bio, "%4ld callback cache hits\n",
1730 SSL_CTX_sess_cb_hits(ssl_ctx));
1731 BIO_printf(bio, "%4ld cache full overflows (%ld allowed)\n",
1732 SSL_CTX_sess_cache_full(ssl_ctx),
1733 SSL_CTX_sess_get_cache_size(ssl_ctx));
1736 static int sv_body(char *hostname, int s, unsigned char *context)
1745 struct timeval timeout;
1746 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1749 struct timeval *timeoutp;
1752 if ((buf = OPENSSL_malloc(bufsize)) == NULL) {
1753 BIO_printf(bio_err, "out of memory\n");
1758 unsigned long sl = 1;
1761 BIO_printf(bio_err, "turning on non blocking io\n");
1762 if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
1763 ERR_print_errors(bio_err);
1769 #ifndef OPENSSL_NO_TLSEXT
1770 if (s_tlsextdebug) {
1771 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1772 SSL_set_tlsext_debug_arg(con, bio_s_out);
1774 if (s_tlsextstatus) {
1775 SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb);
1776 tlscstatp.err = bio_err;
1777 SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp);
1780 #ifndef OPENSSL_NO_KRB5
1781 if ((con->kssl_ctx = kssl_ctx_new()) != NULL) {
1782 kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC);
1783 kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB);
1785 #endif /* OPENSSL_NO_KRB5 */
1787 SSL_set_session_id_context(con, context, strlen((char *)context));
1791 # ifdef TLSEXT_TYPE_opaque_prf_input
1792 SSL_set_tlsext_opaque_prf_input(con, "Test server", 11);
1796 if (SSL_version(con) == DTLS1_VERSION) {
1798 sbio = BIO_new_dgram(s, BIO_NOCLOSE);
1800 if (enable_timeouts) {
1802 timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1803 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1806 timeout.tv_usec = DGRAM_SND_TIMEOUT;
1807 BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1811 if (socket_mtu < DTLS_get_link_min_mtu(con)) {
1812 BIO_printf(bio_err, "MTU too small. Must be at least %ld\n",
1813 DTLS_get_link_min_mtu(con));
1818 SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1819 if (!DTLS_set_link_mtu(con, socket_mtu)) {
1820 BIO_printf(bio_err, "Failed to set MTU\n");
1826 /* want to do MTU discovery */
1827 BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1829 /* turn on cookie exchange */
1830 SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
1832 sbio = BIO_new_socket(s, BIO_NOCLOSE);
1837 test = BIO_new(BIO_f_nbio_test());
1838 sbio = BIO_push(test, sbio);
1840 #ifndef OPENSSL_NO_JPAKE
1842 jpake_server_auth(bio_s_out, sbio, jpake_secret);
1845 SSL_set_bio(con, sbio, sbio);
1846 SSL_set_accept_state(con);
1847 /* SSL_set_fd(con,s); */
1851 BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
1852 BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
1855 SSL_set_msg_callback(con, msg_cb);
1856 SSL_set_msg_callback_arg(con, bio_s_out);
1858 #ifndef OPENSSL_NO_TLSEXT
1859 if (s_tlsextdebug) {
1860 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1861 SSL_set_tlsext_debug_arg(con, bio_s_out);
1867 int read_from_terminal;
1868 int read_from_sslcon;
1870 read_from_terminal = 0;
1871 read_from_sslcon = SSL_pending(con);
1873 if (!read_from_sslcon) {
1875 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
1876 openssl_fdset(fileno(stdin), &readfds);
1878 openssl_fdset(s, &readfds);
1880 * Note: under VMS with SOCKETSHR the second parameter is
1881 * currently of type (int *) whereas under other systems it is
1882 * (void *) if you don't have a cast it will choke the compiler:
1883 * if you do have a cast then you can either go for (int *) or
1886 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
1888 * Under DOS (non-djgpp) and Windows we can't select on stdin:
1889 * only on sockets. As a workaround we timeout the select every
1890 * second and check for any keypress. In a proper Windows
1891 * application we wouldn't do this because it is inefficient.
1895 i = select(width, (void *)&readfds, NULL, NULL, &tv);
1896 if ((i < 0) || (!i && !_kbhit()))
1899 read_from_terminal = 1;
1900 #elif defined(OPENSSL_SYS_BEOS_R5)
1901 /* Under BeOS-R5 the situation is similar to DOS */
1904 (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1905 i = select(width, (void *)&readfds, NULL, NULL, &tv);
1906 if ((i < 0) || (!i && read(fileno(stdin), buf, 0) < 0))
1908 if (read(fileno(stdin), buf, 0) >= 0)
1909 read_from_terminal = 1;
1910 (void)fcntl(fileno(stdin), F_SETFL, 0);
1912 if ((SSL_version(con) == DTLS1_VERSION) &&
1913 DTLSv1_get_timeout(con, &timeout))
1914 timeoutp = &timeout;
1918 i = select(width, (void *)&readfds, NULL, NULL, timeoutp);
1920 if ((SSL_version(con) == DTLS1_VERSION)
1921 && DTLSv1_handle_timeout(con) > 0) {
1922 BIO_printf(bio_err, "TIMEOUT occured\n");
1927 if (FD_ISSET(fileno(stdin), &readfds))
1928 read_from_terminal = 1;
1930 if (FD_ISSET(s, &readfds))
1931 read_from_sslcon = 1;
1933 if (read_from_terminal) {
1937 i = raw_read_stdin(buf, bufsize / 2);
1939 /* both loops are skipped when i <= 0 */
1940 for (j = 0; j < i; j++)
1943 for (j = i - 1; j >= 0; j--) {
1944 buf[j + lf_num] = buf[j];
1945 if (buf[j] == '\n') {
1948 buf[j + lf_num] = '\r';
1951 assert(lf_num == 0);
1953 i = raw_read_stdin(buf, bufsize);
1955 if ((i <= 0) || (buf[0] == 'Q')) {
1956 BIO_printf(bio_s_out, "DONE\n");
1958 close_accept_socket();
1962 if ((i <= 0) || (buf[0] == 'q')) {
1963 BIO_printf(bio_s_out, "DONE\n");
1964 if (SSL_version(con) != DTLS1_VERSION)
1967 * close_accept_socket(); ret= -11;
1972 if ((buf[0] == 'r') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
1973 SSL_renegotiate(con);
1974 i = SSL_do_handshake(con);
1975 printf("SSL_do_handshake -> %d\n", i);
1979 * strcpy(buf,"server side RE-NEGOTIATE\n");
1982 if ((buf[0] == 'R') && ((buf[1] == '\n') || (buf[1] == '\r'))) {
1984 SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE,
1986 SSL_renegotiate(con);
1987 i = SSL_do_handshake(con);
1988 printf("SSL_do_handshake -> %d\n", i);
1992 * strcpy(buf,"server side RE-NEGOTIATE asking for client
1996 if (buf[0] == 'P') {
1997 static const char *str = "Lets print some clear text\n";
1998 BIO_write(SSL_get_wbio(con), str, strlen(str));
2000 if (buf[0] == 'S') {
2001 print_stats(bio_s_out, SSL_get_SSL_CTX(con));
2004 #ifdef CHARSET_EBCDIC
2005 ebcdic2ascii(buf, buf, i);
2009 /* should do a select for the write */
2013 if (++count == 100) {
2015 SSL_renegotiate(con);
2019 k = SSL_write(con, &(buf[l]), (unsigned int)i);
2020 switch (SSL_get_error(con, k)) {
2021 case SSL_ERROR_NONE:
2023 case SSL_ERROR_WANT_WRITE:
2024 case SSL_ERROR_WANT_READ:
2025 case SSL_ERROR_WANT_X509_LOOKUP:
2026 BIO_printf(bio_s_out, "Write BLOCK\n");
2028 case SSL_ERROR_SYSCALL:
2030 BIO_printf(bio_s_out, "ERROR\n");
2031 ERR_print_errors(bio_err);
2035 case SSL_ERROR_ZERO_RETURN:
2036 BIO_printf(bio_s_out, "DONE\n");
2046 if (read_from_sslcon) {
2047 if (!SSL_is_init_finished(con)) {
2048 i = init_ssl_connection(con);
2053 } else if (i == 0) {
2059 i = SSL_read(con, (char *)buf, bufsize);
2060 switch (SSL_get_error(con, i)) {
2061 case SSL_ERROR_NONE:
2062 #ifdef CHARSET_EBCDIC
2063 ascii2ebcdic(buf, buf, i);
2065 raw_write_stdout(buf, (unsigned int)i);
2066 if (SSL_pending(con))
2069 case SSL_ERROR_WANT_WRITE:
2070 case SSL_ERROR_WANT_READ:
2071 case SSL_ERROR_WANT_X509_LOOKUP:
2072 BIO_printf(bio_s_out, "Read BLOCK\n");
2074 case SSL_ERROR_SYSCALL:
2076 BIO_printf(bio_s_out, "ERROR\n");
2077 ERR_print_errors(bio_err);
2080 case SSL_ERROR_ZERO_RETURN:
2081 BIO_printf(bio_s_out, "DONE\n");
2090 BIO_printf(bio_s_out, "shutting down SSL\n");
2092 SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2098 BIO_printf(bio_s_out, "CONNECTION CLOSED\n");
2100 OPENSSL_cleanse(buf, bufsize);
2104 BIO_printf(bio_s_out, "ACCEPT\n");
2108 static void close_accept_socket(void)
2110 BIO_printf(bio_err, "shutdown accept socket\n");
2111 if (accept_socket >= 0) {
2112 SHUTDOWN2(accept_socket);
2116 static int init_ssl_connection(SSL *con)
2122 MS_STATIC char buf[BUFSIZ];
2124 if ((i = SSL_accept(con)) <= 0) {
2125 if (BIO_sock_should_retry(i)) {
2126 BIO_printf(bio_s_out, "DELAY\n");
2130 BIO_printf(bio_err, "ERROR\n");
2131 verify_error = SSL_get_verify_result(con);
2132 if (verify_error != X509_V_OK) {
2133 BIO_printf(bio_err, "verify error:%s\n",
2134 X509_verify_cert_error_string(verify_error));
2136 ERR_print_errors(bio_err);
2140 PEM_write_bio_SSL_SESSION(bio_s_out, SSL_get_session(con));
2142 peer = SSL_get_peer_certificate(con);
2144 BIO_printf(bio_s_out, "Client certificate\n");
2145 PEM_write_bio_X509(bio_s_out, peer);
2146 X509_NAME_oneline(X509_get_subject_name(peer), buf, sizeof buf);
2147 BIO_printf(bio_s_out, "subject=%s\n", buf);
2148 X509_NAME_oneline(X509_get_issuer_name(peer), buf, sizeof buf);
2149 BIO_printf(bio_s_out, "issuer=%s\n", buf);
2153 if (SSL_get_shared_ciphers(con, buf, sizeof buf) != NULL)
2154 BIO_printf(bio_s_out, "Shared ciphers:%s\n", buf);
2155 str = SSL_CIPHER_get_name(SSL_get_current_cipher(con));
2156 BIO_printf(bio_s_out, "CIPHER is %s\n", (str != NULL) ? str : "(NONE)");
2158 BIO_printf(bio_s_out, "Reused session-id\n");
2159 if (SSL_ctrl(con, SSL_CTRL_GET_FLAGS, 0, NULL) &
2160 TLS1_FLAGS_TLS_PADDING_BUG)
2161 BIO_printf(bio_s_out, "Peer has incorrect TLSv1 block padding\n");
2162 #ifndef OPENSSL_NO_KRB5
2163 if (con->kssl_ctx->client_princ != NULL) {
2164 BIO_printf(bio_s_out, "Kerberos peer principal is %s\n",
2165 con->kssl_ctx->client_princ);
2167 #endif /* OPENSSL_NO_KRB5 */
2168 BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n",
2169 SSL_get_secure_renegotiation_support(con) ? "" : " NOT");
2173 #ifndef OPENSSL_NO_DH
2174 static DH *load_dh_param(const char *dhfile)
2179 if ((bio = BIO_new_file(dhfile, "r")) == NULL)
2181 ret = PEM_read_bio_DHparams(bio, NULL, NULL, NULL);
2190 static int load_CA(SSL_CTX *ctx, char *file)
2195 if ((in = fopen(file, "r")) == NULL)
2199 if (PEM_read_X509(in, &x, NULL) == NULL)
2201 SSL_CTX_add_client_CA(ctx, x);
2210 static int www_body(char *hostname, int s, unsigned char *context)
2216 const SSL_CIPHER *c;
2217 BIO *io, *ssl_bio, *sbio;
2219 buf = OPENSSL_malloc(bufsize);
2222 io = BIO_new(BIO_f_buffer());
2223 ssl_bio = BIO_new(BIO_f_ssl());
2224 if ((io == NULL) || (ssl_bio == NULL))
2229 unsigned long sl = 1;
2232 BIO_printf(bio_err, "turning on non blocking io\n");
2233 if (BIO_socket_ioctl(s, FIONBIO, &sl) < 0)
2234 ERR_print_errors(bio_err);
2238 /* lets make the output buffer a reasonable size */
2239 if (!BIO_set_write_buffer_size(io, bufsize))
2242 if ((con = SSL_new(ctx)) == NULL)
2244 #ifndef OPENSSL_NO_TLSEXT
2245 if (s_tlsextdebug) {
2246 SSL_set_tlsext_debug_callback(con, tlsext_cb);
2247 SSL_set_tlsext_debug_arg(con, bio_s_out);
2250 #ifndef OPENSSL_NO_KRB5
2251 if ((con->kssl_ctx = kssl_ctx_new()) != NULL) {
2252 kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVICE, KRB5SVC);
2253 kssl_ctx_setstring(con->kssl_ctx, KSSL_KEYTAB, KRB5KEYTAB);
2255 #endif /* OPENSSL_NO_KRB5 */
2257 SSL_set_session_id_context(con, context, strlen((char *)context));
2259 sbio = BIO_new_socket(s, BIO_NOCLOSE);
2263 test = BIO_new(BIO_f_nbio_test());
2264 sbio = BIO_push(test, sbio);
2266 SSL_set_bio(con, sbio, sbio);
2267 SSL_set_accept_state(con);
2269 /* SSL_set_fd(con,s); */
2270 BIO_set_ssl(ssl_bio, con, BIO_CLOSE);
2271 BIO_push(io, ssl_bio);
2272 #ifdef CHARSET_EBCDIC
2273 io = BIO_push(BIO_new(BIO_f_ebcdic_filter()), io);
2278 BIO_set_callback(SSL_get_rbio(con), bio_dump_callback);
2279 BIO_set_callback_arg(SSL_get_rbio(con), (char *)bio_s_out);
2282 SSL_set_msg_callback(con, msg_cb);
2283 SSL_set_msg_callback_arg(con, bio_s_out);
2288 i = SSL_accept(con);
2290 switch (SSL_get_error(con, i)) {
2291 case SSL_ERROR_NONE:
2293 case SSL_ERROR_WANT_WRITE:
2294 case SSL_ERROR_WANT_READ:
2295 case SSL_ERROR_WANT_X509_LOOKUP:
2297 case SSL_ERROR_SYSCALL:
2299 case SSL_ERROR_ZERO_RETURN:
2305 SSL_renegotiate(con);
2306 SSL_write(con, NULL, 0);
2309 i = BIO_gets(io, buf, bufsize - 1);
2310 if (i < 0) { /* error */
2311 if (!BIO_should_retry(io)) {
2313 ERR_print_errors(bio_err);
2316 BIO_printf(bio_s_out, "read R BLOCK\n");
2317 #if defined(OPENSSL_SYS_NETWARE)
2319 #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
2324 } else if (i == 0) { /* end of input */
2329 /* else we have data */
2330 if (((www == 1) && (strncmp("GET ", buf, 4) == 0)) ||
2331 ((www == 2) && (strncmp("GET /stats ", buf, 10) == 0))) {
2334 STACK_OF(SSL_CIPHER) *sk;
2335 static const char *space = " ";
2338 "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2339 BIO_puts(io, "<HTML><BODY BGCOLOR=\"#ffffff\">\n");
2340 BIO_puts(io, "<pre>\n");
2341 /* BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
2343 for (i = 0; i < local_argc; i++) {
2344 BIO_puts(io, local_argv[i]);
2345 BIO_write(io, " ", 1);
2350 * The following is evil and should not really be done
2352 BIO_printf(io, "Ciphers supported in s_server binary\n");
2353 sk = SSL_get_ciphers(con);
2354 j = sk_SSL_CIPHER_num(sk);
2355 for (i = 0; i < j; i++) {
2356 c = sk_SSL_CIPHER_value(sk, i);
2357 BIO_printf(io, "%-11s:%-25s",
2358 SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2359 if ((((i + 1) % 2) == 0) && (i + 1 != j))
2363 p = SSL_get_shared_ciphers(con, buf, bufsize);
2366 "---\nCiphers common between both SSL end points:\n");
2370 BIO_write(io, space, 26 - j);
2373 BIO_write(io, ((i % 3) ? " " : "\n"), 1);
2375 BIO_write(io, p, 1);
2382 BIO_printf(io, ((con->hit)
2383 ? "---\nReused, " : "---\nNew, "));
2384 c = SSL_get_current_cipher(con);
2385 BIO_printf(io, "%s, Cipher is %s\n",
2386 SSL_CIPHER_get_version(c), SSL_CIPHER_get_name(c));
2387 SSL_SESSION_print(io, SSL_get_session(con));
2388 BIO_printf(io, "---\n");
2389 print_stats(io, SSL_get_SSL_CTX(con));
2390 BIO_printf(io, "---\n");
2391 peer = SSL_get_peer_certificate(con);
2393 BIO_printf(io, "Client certificate\n");
2394 X509_print(io, peer);
2395 PEM_write_bio_X509(io, peer);
2397 BIO_puts(io, "no client certificate available\n");
2398 BIO_puts(io, "</BODY></HTML>\r\n\r\n");
2400 } else if ((www == 2 || www == 3)
2401 && (strncmp("GET /", buf, 5) == 0)) {
2404 static const char *text =
2405 "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
2411 for (e = p; *e != '\0'; e++) {
2417 dot = (e[0] == '.') ? 2 : 0;
2420 dot = (e[0] == '.') ? 3 : 0;
2423 dot = (e[0] == '/') ? -1 : 0;
2427 dot = (e[0] == '/') ? 1 : 0;
2429 dot = (dot == 3) || (dot == -1); /* filename contains ".."
2434 BIO_printf(io, "'%s' is an invalid file name\r\n", p);
2441 BIO_printf(io, "'%s' contains '..' reference\r\n", p);
2447 BIO_printf(io, "'%s' is an invalid path\r\n", p);
2451 /* append if a directory lookup */
2453 strcat(p, "index.html");
2456 /* if a directory, do the index thang */
2457 if (app_isdir(p) > 0) {
2458 #if 0 /* must check buffer size */
2459 strcat(p, "/index.html");
2462 BIO_printf(io, "'%s' is a directory\r\n", p);
2467 if ((file = BIO_new_file(p, "r")) == NULL) {
2469 BIO_printf(io, "Error opening '%s'\r\n", p);
2470 ERR_print_errors(io);
2475 BIO_printf(bio_err, "FILE:%s\n", p);
2479 if (((i > 5) && (strcmp(&(p[i - 5]), ".html") == 0)) ||
2480 ((i > 4) && (strcmp(&(p[i - 4]), ".php") == 0)) ||
2481 ((i > 4) && (strcmp(&(p[i - 4]), ".htm") == 0)))
2483 "HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
2486 "HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
2490 i = BIO_read(file, buf, bufsize);
2496 fprintf(stderr, "%d\n", i);
2497 if (total_bytes > 3 * 1024) {
2499 fprintf(stderr, "RENEGOTIATE\n");
2500 SSL_renegotiate(con);
2504 for (j = 0; j < i;) {
2508 if (++count == 13) {
2509 SSL_renegotiate(con);
2513 k = BIO_write(io, &(buf[j]), i - j);
2515 if (!BIO_should_retry(io))
2518 BIO_printf(bio_s_out, "rwrite W BLOCK\n");
2532 i = (int)BIO_flush(io);
2534 if (!BIO_should_retry(io))
2541 /* make sure we re-use sessions */
2542 SSL_set_shutdown(con, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
2544 /* This kills performance */
2546 * SSL_shutdown(con); A shutdown gets sent in the BIO_free_all(io)
2554 BIO_printf(bio_s_out, "ACCEPT\n");
2560 /* if (ssl_bio != NULL) BIO_free(ssl_bio);*/
2564 #ifndef OPENSSL_NO_RSA
2565 static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
2568 static RSA *rsa_tmp = NULL;
2570 if (!rsa_tmp && ((bn = BN_new()) == NULL))
2571 BIO_printf(bio_err, "Allocation error in generating RSA key\n");
2572 if (!rsa_tmp && bn) {
2574 BIO_printf(bio_err, "Generating temp (%d bit) RSA key...",
2576 (void)BIO_flush(bio_err);
2578 if (!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
2579 !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL)) {
2585 BIO_printf(bio_err, "\n");
2586 (void)BIO_flush(bio_err);
2594 #define MAX_SESSION_ID_ATTEMPTS 10
2595 static int generate_session_id(const SSL *ssl, unsigned char *id,
2596 unsigned int *id_len)
2598 unsigned int count = 0;
2600 RAND_pseudo_bytes(id, *id_len);
2602 * Prefix the session_id with the required prefix. NB: If our prefix
2603 * is too long, clip it - but there will be worse effects anyway, eg.
2604 * the server could only possibly create 1 session ID (ie. the
2605 * prefix!) so all future session negotiations will fail due to
2608 memcpy(id, session_id_prefix,
2609 (strlen(session_id_prefix) < *id_len) ?
2610 strlen(session_id_prefix) : *id_len);
2612 while (SSL_has_matching_session_id(ssl, id, *id_len) &&
2613 (++count < MAX_SESSION_ID_ATTEMPTS));
2614 if (count >= MAX_SESSION_ID_ATTEMPTS)