Branch data Line data Source code
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 : : #include <openssl/ocsp.h>
183 : : #ifndef OPENSSL_NO_DH
184 : : #include <openssl/dh.h>
185 : : #endif
186 : : #ifndef OPENSSL_NO_RSA
187 : : #include <openssl/rsa.h>
188 : : #endif
189 : : #ifndef OPENSSL_NO_SRP
190 : : #include <openssl/srp.h>
191 : : #endif
192 : : #include "s_apps.h"
193 : : #include "timeouts.h"
194 : :
195 : : #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
196 : : /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
197 : : #undef FIONBIO
198 : : #endif
199 : :
200 : : #if defined(OPENSSL_SYS_BEOS_R5)
201 : : #include <fcntl.h>
202 : : #endif
203 : :
204 : : #ifndef OPENSSL_NO_RSA
205 : : static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength);
206 : : #endif
207 : : static int not_resumable_sess_cb(SSL *s, int is_forward_secure);
208 : : static int sv_body(char *hostname, int s, int stype, unsigned char *context);
209 : : static int www_body(char *hostname, int s, int stype, unsigned char *context);
210 : : static int rev_body(char *hostname, int s, int stype, 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 : : static void init_session_cache_ctx(SSL_CTX *sctx);
218 : : static void free_sessions(void);
219 : : #ifndef OPENSSL_NO_DH
220 : : static DH *load_dh_param(const char *dhfile);
221 : : #endif
222 : :
223 : : #ifdef MONOLITH
224 : : static void s_server_init(void);
225 : : #endif
226 : :
227 : : /* static int load_CA(SSL_CTX *ctx, char *file);*/
228 : :
229 : : #undef BUFSIZZ
230 : : #define BUFSIZZ 16*1024
231 : : static int bufsize=BUFSIZZ;
232 : : static int accept_socket= -1;
233 : :
234 : : #define TEST_CERT "server.pem"
235 : : #ifndef OPENSSL_NO_TLSEXT
236 : : #define TEST_CERT2 "server2.pem"
237 : : #endif
238 : : #undef PROG
239 : : #define PROG s_server_main
240 : :
241 : : extern int verify_depth, verify_return_error, verify_quiet;
242 : :
243 : : static int s_server_verify=SSL_VERIFY_NONE;
244 : : static int s_server_session_id_context = 1; /* anything will do */
245 : : static const char *s_cert_file=TEST_CERT,*s_key_file=NULL, *s_chain_file=NULL;
246 : : #ifndef OPENSSL_NO_TLSEXT
247 : : static const char *s_cert_file2=TEST_CERT2,*s_key_file2=NULL;
248 : : #endif
249 : : static char *s_dcert_file=NULL,*s_dkey_file=NULL, *s_dchain_file=NULL;
250 : : #ifdef FIONBIO
251 : : static int s_nbio=0;
252 : : #endif
253 : : static int s_nbio_test=0;
254 : : int s_crlf=0;
255 : : static SSL_CTX *ctx=NULL;
256 : : #ifndef OPENSSL_NO_TLSEXT
257 : : static SSL_CTX *ctx2=NULL;
258 : : #endif
259 : : static int www=0;
260 : :
261 : : static BIO *bio_s_out=NULL;
262 : : static BIO *bio_s_msg = NULL;
263 : : static int s_debug=0;
264 : : #ifndef OPENSSL_NO_TLSEXT
265 : : static int s_tlsextdebug=0;
266 : : static int s_tlsextstatus=0;
267 : : static int cert_status_cb(SSL *s, void *arg);
268 : : #endif
269 : : static int no_resume_ephemeral = 0;
270 : : static int s_msg=0;
271 : : static int s_quiet=0;
272 : : static int s_ign_eof=0;
273 : : static int s_brief=0;
274 : :
275 : : static char *keymatexportlabel=NULL;
276 : : static int keymatexportlen=20;
277 : :
278 : : static int hack=0;
279 : : #ifndef OPENSSL_NO_ENGINE
280 : : static char *engine_id=NULL;
281 : : #endif
282 : : static const char *session_id_prefix=NULL;
283 : :
284 : : static int enable_timeouts = 0;
285 : : static long socket_mtu;
286 : : #ifndef OPENSSL_NO_DTLS1
287 : : static int cert_chain = 0;
288 : : #endif
289 : :
290 : : #ifndef OPENSSL_NO_TLSEXT
291 : : static BIO *serverinfo_in = NULL;
292 : : static const char *s_serverinfo_file = NULL;
293 : :
294 : : #endif
295 : :
296 : : #ifndef OPENSSL_NO_PSK
297 : : static char *psk_identity="Client_identity";
298 : : char *psk_key=NULL; /* by default PSK is not used */
299 : :
300 : 0 : static unsigned int psk_server_cb(SSL *ssl, const char *identity,
301 : : unsigned char *psk, unsigned int max_psk_len)
302 : : {
303 : 0 : unsigned int psk_len = 0;
304 : : int ret;
305 : 0 : BIGNUM *bn = NULL;
306 : :
307 [ # # ]: 0 : if (s_debug)
308 : 0 : BIO_printf(bio_s_out,"psk_server_cb\n");
309 [ # # ]: 0 : if (!identity)
310 : : {
311 : 0 : BIO_printf(bio_err,"Error: client did not send PSK identity\n");
312 : 0 : goto out_err;
313 : : }
314 [ # # ]: 0 : if (s_debug)
315 [ # # ]: 0 : BIO_printf(bio_s_out,"identity_len=%d identity=%s\n",
316 : 0 : identity ? (int)strlen(identity) : 0, identity);
317 : :
318 : : /* here we could lookup the given identity e.g. from a database */
319 [ # # ]: 0 : if (strcmp(identity, psk_identity) != 0)
320 : : {
321 : 0 : BIO_printf(bio_s_out, "PSK error: client identity not found"
322 : : " (got '%s' expected '%s')\n", identity,
323 : : psk_identity);
324 : 0 : goto out_err;
325 : : }
326 [ # # ]: 0 : if (s_debug)
327 : 0 : BIO_printf(bio_s_out, "PSK client identity found\n");
328 : :
329 : : /* convert the PSK key to binary */
330 : 0 : ret = BN_hex2bn(&bn, psk_key);
331 [ # # ]: 0 : if (!ret)
332 : : {
333 : 0 : BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
334 [ # # ]: 0 : if (bn)
335 : 0 : BN_free(bn);
336 : : return 0;
337 : : }
338 [ # # ]: 0 : if (BN_num_bytes(bn) > (int)max_psk_len)
339 : : {
340 : 0 : BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
341 : 0 : max_psk_len, BN_num_bytes(bn));
342 : 0 : BN_free(bn);
343 : 0 : return 0;
344 : : }
345 : :
346 : 0 : ret = BN_bn2bin(bn, psk);
347 : 0 : BN_free(bn);
348 : :
349 [ # # ]: 0 : if (ret < 0)
350 : : goto out_err;
351 : 0 : psk_len = (unsigned int)ret;
352 : :
353 [ # # ]: 0 : if (s_debug)
354 : 0 : BIO_printf(bio_s_out, "fetched PSK len=%d\n", psk_len);
355 : 0 : return psk_len;
356 : : out_err:
357 [ # # ]: 0 : if (s_debug)
358 : 0 : BIO_printf(bio_err, "Error in PSK server callback\n");
359 : : return 0;
360 : : }
361 : : #endif
362 : :
363 : : #ifndef OPENSSL_NO_SRP
364 : : /* This is a context that we pass to callbacks */
365 : : typedef struct srpsrvparm_st
366 : : {
367 : : char *login;
368 : : SRP_VBASE *vb;
369 : : SRP_user_pwd *user;
370 : : } srpsrvparm;
371 : :
372 : : /* This callback pretends to require some asynchronous logic in order to obtain
373 : : a verifier. When the callback is called for a new connection we return
374 : : with a negative value. This will provoke the accept etc to return with
375 : : an LOOKUP_X509. The main logic of the reinvokes the suspended call
376 : : (which would normally occur after a worker has finished) and we
377 : : set the user parameters.
378 : : */
379 : 0 : static int MS_CALLBACK ssl_srp_server_param_cb(SSL *s, int *ad, void *arg)
380 : : {
381 : 0 : srpsrvparm *p = (srpsrvparm *)arg;
382 [ # # ][ # # ]: 0 : if (p->login == NULL && p->user == NULL )
383 : : {
384 : 0 : p->login = SSL_get_srp_username(s);
385 : 0 : BIO_printf(bio_err, "SRP username = \"%s\"\n", p->login);
386 : 0 : return (-1) ;
387 : : }
388 : :
389 [ # # ]: 0 : if (p->user == NULL)
390 : : {
391 : 0 : BIO_printf(bio_err, "User %s doesn't exist\n", p->login);
392 : 0 : return SSL3_AL_FATAL;
393 : : }
394 [ # # ]: 0 : if (SSL_set_srp_server_param(s, p->user->N, p->user->g, p->user->s, p->user->v,
395 : : p->user->info) < 0)
396 : : {
397 : 0 : *ad = SSL_AD_INTERNAL_ERROR;
398 : 0 : return SSL3_AL_FATAL;
399 : : }
400 : 0 : BIO_printf(bio_err, "SRP parameters set: username = \"%s\" info=\"%s\" \n", p->login,p->user->info);
401 : : /* need to check whether there are memory leaks */
402 : 0 : p->user = NULL;
403 : 0 : p->login = NULL;
404 : 0 : return SSL_ERROR_NONE;
405 : : }
406 : :
407 : : #endif
408 : :
409 : : #ifdef MONOLITH
410 : 0 : static void s_server_init(void)
411 : : {
412 : 0 : accept_socket=-1;
413 : 0 : s_server_verify=SSL_VERIFY_NONE;
414 : 0 : s_dcert_file=NULL;
415 : 0 : s_dkey_file=NULL;
416 : 0 : s_dchain_file=NULL;
417 : 0 : s_cert_file=TEST_CERT;
418 : 0 : s_key_file=NULL;
419 : 0 : s_chain_file=NULL;
420 : : #ifndef OPENSSL_NO_TLSEXT
421 : 0 : s_cert_file2=TEST_CERT2;
422 : 0 : s_key_file2=NULL;
423 : 0 : ctx2=NULL;
424 : : #endif
425 : : #ifdef FIONBIO
426 : 0 : s_nbio=0;
427 : : #endif
428 : 0 : s_nbio_test=0;
429 : 0 : ctx=NULL;
430 : 0 : www=0;
431 : :
432 : 0 : bio_s_out=NULL;
433 : 0 : s_debug=0;
434 : 0 : s_msg=0;
435 : 0 : s_quiet=0;
436 : 0 : s_brief=0;
437 : 0 : hack=0;
438 : : #ifndef OPENSSL_NO_ENGINE
439 : 0 : engine_id=NULL;
440 : : #endif
441 : 0 : }
442 : : #endif
443 : :
444 : 0 : static void sv_usage(void)
445 : : {
446 : 0 : BIO_printf(bio_err,"usage: s_server [args ...]\n");
447 : 0 : BIO_printf(bio_err,"\n");
448 : 0 : BIO_printf(bio_err," -accept port - TCP/IP port to accept on (default is %d)\n",PORT);
449 : 0 : BIO_printf(bio_err," -unix path - unix domain socket to accept on\n");
450 : 0 : BIO_printf(bio_err," -unlink - for -unix, unlink existing socket first\n");
451 : 0 : BIO_printf(bio_err," -context arg - set session ID context\n");
452 : 0 : BIO_printf(bio_err," -verify arg - turn on peer certificate verification\n");
453 : 0 : BIO_printf(bio_err," -Verify arg - turn on peer certificate verification, must have a cert.\n");
454 : 0 : BIO_printf(bio_err," -verify_return_error - return verification errors\n");
455 : 0 : BIO_printf(bio_err," -cert arg - certificate file to use\n");
456 : 0 : BIO_printf(bio_err," (default is %s)\n",TEST_CERT);
457 : 0 : BIO_printf(bio_err," -naccept arg - terminate after 'arg' connections\n");
458 : : #ifndef OPENSSL_NO_TLSEXT
459 : 0 : BIO_printf(bio_err," -serverinfo arg - PEM serverinfo file for certificate\n");
460 : : #endif
461 : 0 : BIO_printf(bio_err," -no_resumption_on_reneg - set SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION flag\n");
462 : 0 : BIO_printf(bio_err," -crl_check - check the peer certificate has not been revoked by its CA.\n" \
463 : : " The CRL(s) are appended to the certificate file\n");
464 : 0 : BIO_printf(bio_err," -crl_check_all - check the peer certificate has not been revoked by its CA\n" \
465 : : " or any other CRL in the CA chain. CRL(s) are appened to the\n" \
466 : : " the certificate file.\n");
467 : 0 : BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
468 : 0 : BIO_printf(bio_err," -key arg - Private Key file to use, in cert file if\n");
469 : 0 : BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT);
470 : 0 : BIO_printf(bio_err," -keyform arg - key format (PEM, DER or ENGINE) PEM default\n");
471 : 0 : BIO_printf(bio_err," -pass arg - private key file pass phrase source\n");
472 : 0 : BIO_printf(bio_err," -dcert arg - second certificate file to use (usually for DSA)\n");
473 : 0 : BIO_printf(bio_err," -dcertform x - second certificate format (PEM or DER) PEM default\n");
474 : 0 : BIO_printf(bio_err," -dkey arg - second private key file to use (usually for DSA)\n");
475 : 0 : BIO_printf(bio_err," -dkeyform arg - second key format (PEM, DER or ENGINE) PEM default\n");
476 : 0 : BIO_printf(bio_err," -dpass arg - second private key file pass phrase source\n");
477 : 0 : BIO_printf(bio_err," -dhparam arg - DH parameter file to use, in cert file if not specified\n");
478 : 0 : BIO_printf(bio_err," or a default set of parameters is used\n");
479 : : #ifndef OPENSSL_NO_ECDH
480 : 0 : BIO_printf(bio_err," -named_curve arg - Elliptic curve name to use for ephemeral ECDH keys.\n" \
481 : : " Use \"openssl ecparam -list_curves\" for all names\n" \
482 : : " (default is nistp256).\n");
483 : : #endif
484 : : #ifdef FIONBIO
485 : 0 : BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
486 : : #endif
487 : 0 : BIO_printf(bio_err," -nbio_test - test with the non-blocking test bio\n");
488 : 0 : BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
489 : 0 : BIO_printf(bio_err," -debug - Print more output\n");
490 : 0 : BIO_printf(bio_err," -msg - Show protocol messages\n");
491 : 0 : BIO_printf(bio_err," -state - Print the SSL states\n");
492 : 0 : BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
493 : 0 : BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
494 : 0 : BIO_printf(bio_err," -trusted_first - Use locally trusted CA's first when building trust chain\n");
495 : 0 : BIO_printf(bio_err," -nocert - Don't use any certificates (Anon-DH)\n");
496 : 0 : BIO_printf(bio_err," -cipher arg - play with 'openssl ciphers' to see what goes here\n");
497 : 0 : BIO_printf(bio_err," -serverpref - Use server's cipher preferences\n");
498 : 0 : BIO_printf(bio_err," -quiet - No server output\n");
499 : 0 : BIO_printf(bio_err," -no_tmp_rsa - Do not generate a tmp RSA key\n");
500 : : #ifndef OPENSSL_NO_PSK
501 : 0 : BIO_printf(bio_err," -psk_hint arg - PSK identity hint to use\n");
502 : 0 : BIO_printf(bio_err," -psk arg - PSK in hex (without 0x)\n");
503 : : # ifndef OPENSSL_NO_JPAKE
504 : : BIO_printf(bio_err," -jpake arg - JPAKE secret to use\n");
505 : : # endif
506 : : #endif
507 : : #ifndef OPENSSL_NO_SRP
508 : 0 : BIO_printf(bio_err," -srpvfile file - The verifier file for SRP\n");
509 : 0 : BIO_printf(bio_err," -srpuserseed string - A seed string for a default user salt.\n");
510 : : #endif
511 : 0 : BIO_printf(bio_err," -ssl2 - Just talk SSLv2\n");
512 : 0 : BIO_printf(bio_err," -ssl3 - Just talk SSLv3\n");
513 : 0 : BIO_printf(bio_err," -tls1_2 - Just talk TLSv1.2\n");
514 : 0 : BIO_printf(bio_err," -tls1_1 - Just talk TLSv1.1\n");
515 : 0 : BIO_printf(bio_err," -tls1 - Just talk TLSv1\n");
516 : 0 : BIO_printf(bio_err," -dtls1 - Just talk DTLSv1\n");
517 : 0 : BIO_printf(bio_err," -dtls1_2 - Just talk DTLSv1.2\n");
518 : 0 : BIO_printf(bio_err," -timeout - Enable timeouts\n");
519 : 0 : BIO_printf(bio_err," -mtu - Set link layer MTU\n");
520 : 0 : BIO_printf(bio_err," -chain - Read a certificate chain\n");
521 : 0 : BIO_printf(bio_err," -no_ssl2 - Just disable SSLv2\n");
522 : 0 : BIO_printf(bio_err," -no_ssl3 - Just disable SSLv3\n");
523 : 0 : BIO_printf(bio_err," -no_tls1 - Just disable TLSv1\n");
524 : 0 : BIO_printf(bio_err," -no_tls1_1 - Just disable TLSv1.1\n");
525 : 0 : BIO_printf(bio_err," -no_tls1_2 - Just disable TLSv1.2\n");
526 : : #ifndef OPENSSL_NO_DH
527 : 0 : BIO_printf(bio_err," -no_dhe - Disable ephemeral DH\n");
528 : : #endif
529 : : #ifndef OPENSSL_NO_ECDH
530 : 0 : BIO_printf(bio_err," -no_ecdhe - Disable ephemeral ECDH\n");
531 : : #endif
532 : 0 : BIO_printf(bio_err, "-no_resume_ephemeral - Disable caching and tickets if ephemeral (EC)DH is used\n");
533 : 0 : BIO_printf(bio_err," -bugs - Turn on SSL bug compatibility\n");
534 : 0 : BIO_printf(bio_err," -hack - workaround for early Netscape code\n");
535 : 0 : BIO_printf(bio_err," -www - Respond to a 'GET /' with a status page\n");
536 : 0 : BIO_printf(bio_err," -WWW - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
537 : 0 : BIO_printf(bio_err," -HTTP - Respond to a 'GET /<path> HTTP/1.0' with file ./<path>\n");
538 : 0 : BIO_printf(bio_err," with the assumption it contains a complete HTTP response.\n");
539 : : #ifndef OPENSSL_NO_ENGINE
540 : 0 : BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
541 : : #endif
542 : 0 : BIO_printf(bio_err," -id_prefix arg - Generate SSL/TLS session IDs prefixed by 'arg'\n");
543 : 0 : BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
544 : : #ifndef OPENSSL_NO_TLSEXT
545 : 0 : BIO_printf(bio_err," -servername host - servername for HostName TLS extension\n");
546 : 0 : BIO_printf(bio_err," -servername_fatal - on mismatch send fatal alert (default warning alert)\n");
547 : 0 : BIO_printf(bio_err," -cert2 arg - certificate file to use for servername\n");
548 : 0 : BIO_printf(bio_err," (default is %s)\n",TEST_CERT2);
549 : 0 : BIO_printf(bio_err," -key2 arg - Private Key file to use for servername, in cert file if\n");
550 : 0 : BIO_printf(bio_err," not specified (default is %s)\n",TEST_CERT2);
551 : 0 : BIO_printf(bio_err," -tlsextdebug - hex dump of all TLS extensions received\n");
552 : 0 : BIO_printf(bio_err," -no_ticket - disable use of RFC4507bis session tickets\n");
553 : 0 : BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
554 : : # ifndef OPENSSL_NO_NEXTPROTONEG
555 : 0 : BIO_printf(bio_err," -nextprotoneg arg - set the advertised protocols for the NPN extension (comma-separated list)\n");
556 : : # endif
557 : 0 : BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
558 : 0 : BIO_printf(bio_err," -alpn arg - set the advertised protocols for the ALPN extension (comma-separated list)\n");
559 : : #endif
560 : 0 : BIO_printf(bio_err," -keymatexport label - Export keying material using label\n");
561 : 0 : BIO_printf(bio_err," -keymatexportlen len - Export len bytes of keying material (default 20)\n");
562 : 0 : BIO_printf(bio_err," -status - respond to certificate status requests\n");
563 : 0 : BIO_printf(bio_err," -status_verbose - enable status request verbose printout\n");
564 : 0 : BIO_printf(bio_err," -status_timeout n - status request responder timeout\n");
565 : 0 : BIO_printf(bio_err," -status_url URL - status request fallback URL\n");
566 : 0 : }
567 : :
568 : : static int local_argc=0;
569 : : static char **local_argv;
570 : :
571 : : #ifdef CHARSET_EBCDIC
572 : : static int ebcdic_new(BIO *bi);
573 : : static int ebcdic_free(BIO *a);
574 : : static int ebcdic_read(BIO *b, char *out, int outl);
575 : : static int ebcdic_write(BIO *b, const char *in, int inl);
576 : : static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr);
577 : : static int ebcdic_gets(BIO *bp, char *buf, int size);
578 : : static int ebcdic_puts(BIO *bp, const char *str);
579 : :
580 : : #define BIO_TYPE_EBCDIC_FILTER (18|0x0200)
581 : : static BIO_METHOD methods_ebcdic=
582 : : {
583 : : BIO_TYPE_EBCDIC_FILTER,
584 : : "EBCDIC/ASCII filter",
585 : : ebcdic_write,
586 : : ebcdic_read,
587 : : ebcdic_puts,
588 : : ebcdic_gets,
589 : : ebcdic_ctrl,
590 : : ebcdic_new,
591 : : ebcdic_free,
592 : : };
593 : :
594 : : typedef struct
595 : : {
596 : : size_t alloced;
597 : : char buff[1];
598 : : } EBCDIC_OUTBUFF;
599 : :
600 : : BIO_METHOD *BIO_f_ebcdic_filter()
601 : : {
602 : : return(&methods_ebcdic);
603 : : }
604 : :
605 : : static int ebcdic_new(BIO *bi)
606 : : {
607 : : EBCDIC_OUTBUFF *wbuf;
608 : :
609 : : wbuf = (EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + 1024);
610 : : wbuf->alloced = 1024;
611 : : wbuf->buff[0] = '\0';
612 : :
613 : : bi->ptr=(char *)wbuf;
614 : : bi->init=1;
615 : : bi->flags=0;
616 : : return(1);
617 : : }
618 : :
619 : : static int ebcdic_free(BIO *a)
620 : : {
621 : : if (a == NULL) return(0);
622 : : if (a->ptr != NULL)
623 : : OPENSSL_free(a->ptr);
624 : : a->ptr=NULL;
625 : : a->init=0;
626 : : a->flags=0;
627 : : return(1);
628 : : }
629 : :
630 : : static int ebcdic_read(BIO *b, char *out, int outl)
631 : : {
632 : : int ret=0;
633 : :
634 : : if (out == NULL || outl == 0) return(0);
635 : : if (b->next_bio == NULL) return(0);
636 : :
637 : : ret=BIO_read(b->next_bio,out,outl);
638 : : if (ret > 0)
639 : : ascii2ebcdic(out,out,ret);
640 : : return(ret);
641 : : }
642 : :
643 : : static int ebcdic_write(BIO *b, const char *in, int inl)
644 : : {
645 : : EBCDIC_OUTBUFF *wbuf;
646 : : int ret=0;
647 : : int num;
648 : : unsigned char n;
649 : :
650 : : if ((in == NULL) || (inl <= 0)) return(0);
651 : : if (b->next_bio == NULL) return(0);
652 : :
653 : : wbuf=(EBCDIC_OUTBUFF *)b->ptr;
654 : :
655 : : if (inl > (num = wbuf->alloced))
656 : : {
657 : : num = num + num; /* double the size */
658 : : if (num < inl)
659 : : num = inl;
660 : : OPENSSL_free(wbuf);
661 : : wbuf=(EBCDIC_OUTBUFF *)OPENSSL_malloc(sizeof(EBCDIC_OUTBUFF) + num);
662 : :
663 : : wbuf->alloced = num;
664 : : wbuf->buff[0] = '\0';
665 : :
666 : : b->ptr=(char *)wbuf;
667 : : }
668 : :
669 : : ebcdic2ascii(wbuf->buff, in, inl);
670 : :
671 : : ret=BIO_write(b->next_bio, wbuf->buff, inl);
672 : :
673 : : return(ret);
674 : : }
675 : :
676 : : static long ebcdic_ctrl(BIO *b, int cmd, long num, void *ptr)
677 : : {
678 : : long ret;
679 : :
680 : : if (b->next_bio == NULL) return(0);
681 : : switch (cmd)
682 : : {
683 : : case BIO_CTRL_DUP:
684 : : ret=0L;
685 : : break;
686 : : default:
687 : : ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
688 : : break;
689 : : }
690 : : return(ret);
691 : : }
692 : :
693 : : static int ebcdic_gets(BIO *bp, char *buf, int size)
694 : : {
695 : : int i, ret=0;
696 : : if (bp->next_bio == NULL) return(0);
697 : : /* return(BIO_gets(bp->next_bio,buf,size));*/
698 : : for (i=0; i<size-1; ++i)
699 : : {
700 : : ret = ebcdic_read(bp,&buf[i],1);
701 : : if (ret <= 0)
702 : : break;
703 : : else if (buf[i] == '\n')
704 : : {
705 : : ++i;
706 : : break;
707 : : }
708 : : }
709 : : if (i < size)
710 : : buf[i] = '\0';
711 : : return (ret < 0 && i == 0) ? ret : i;
712 : : }
713 : :
714 : : static int ebcdic_puts(BIO *bp, const char *str)
715 : : {
716 : : if (bp->next_bio == NULL) return(0);
717 : : return ebcdic_write(bp, str, strlen(str));
718 : : }
719 : : #endif
720 : :
721 : : #ifndef OPENSSL_NO_TLSEXT
722 : :
723 : : /* This is a context that we pass to callbacks */
724 : : typedef struct tlsextctx_st {
725 : : char * servername;
726 : : BIO * biodebug;
727 : : int extension_error;
728 : : } tlsextctx;
729 : :
730 : :
731 : 0 : static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
732 : : {
733 : 0 : tlsextctx * p = (tlsextctx *) arg;
734 : 0 : const char * servername = SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
735 [ # # ][ # # ]: 0 : if (servername && p->biodebug)
736 : 0 : BIO_printf(p->biodebug,"Hostname in TLS extension: \"%s\"\n",servername);
737 : :
738 [ # # ]: 0 : if (!p->servername)
739 : : return SSL_TLSEXT_ERR_NOACK;
740 : :
741 [ # # ]: 0 : if (servername)
742 : : {
743 [ # # ]: 0 : if (strcasecmp(servername,p->servername))
744 : 0 : return p->extension_error;
745 [ # # ]: 0 : if (ctx2)
746 : : {
747 : 0 : BIO_printf(p->biodebug,"Switching server context.\n");
748 : 0 : SSL_set_SSL_CTX(s,ctx2);
749 : : }
750 : : }
751 : : return SSL_TLSEXT_ERR_OK;
752 : : }
753 : :
754 : : /* Structure passed to cert status callback */
755 : :
756 : : typedef struct tlsextstatusctx_st {
757 : : /* Default responder to use */
758 : : char *host, *path, *port;
759 : : int use_ssl;
760 : : int timeout;
761 : : BIO *err;
762 : : int verbose;
763 : : } tlsextstatusctx;
764 : :
765 : : static tlsextstatusctx tlscstatp = {NULL, NULL, NULL, 0, -1, NULL, 0};
766 : :
767 : : /* Certificate Status callback. This is called when a client includes a
768 : : * certificate status request extension.
769 : : *
770 : : * This is a simplified version. It examines certificates each time and
771 : : * makes one OCSP responder query for each request.
772 : : *
773 : : * A full version would store details such as the OCSP certificate IDs and
774 : : * minimise the number of OCSP responses by caching them until they were
775 : : * considered "expired".
776 : : */
777 : :
778 : 0 : static int cert_status_cb(SSL *s, void *arg)
779 : : {
780 : 0 : tlsextstatusctx *srctx = arg;
781 : 0 : BIO *err = srctx->err;
782 : : char *host, *port, *path;
783 : : int use_ssl;
784 : 0 : unsigned char *rspder = NULL;
785 : : int rspderlen;
786 : 0 : STACK_OF(OPENSSL_STRING) *aia = NULL;
787 : 0 : X509 *x = NULL;
788 : : X509_STORE_CTX inctx;
789 : : X509_OBJECT obj;
790 : 0 : OCSP_REQUEST *req = NULL;
791 : 0 : OCSP_RESPONSE *resp = NULL;
792 : 0 : OCSP_CERTID *id = NULL;
793 : : STACK_OF(X509_EXTENSION) *exts;
794 : 0 : int ret = SSL_TLSEXT_ERR_NOACK;
795 : : int i;
796 : : #if 0
797 : : STACK_OF(OCSP_RESPID) *ids;
798 : : SSL_get_tlsext_status_ids(s, &ids);
799 : : BIO_printf(err, "cert_status: received %d ids\n", sk_OCSP_RESPID_num(ids));
800 : : #endif
801 [ # # ]: 0 : if (srctx->verbose)
802 : 0 : BIO_puts(err, "cert_status: callback called\n");
803 : : /* Build up OCSP query from server certificate */
804 : 0 : x = SSL_get_certificate(s);
805 : 0 : aia = X509_get1_ocsp(x);
806 [ # # ]: 0 : if (aia)
807 : : {
808 [ # # ]: 0 : if (!OCSP_parse_url(sk_OPENSSL_STRING_value(aia, 0),
809 : : &host, &port, &path, &use_ssl))
810 : : {
811 : 0 : BIO_puts(err, "cert_status: can't parse AIA URL\n");
812 : 0 : goto err;
813 : : }
814 [ # # ]: 0 : if (srctx->verbose)
815 : 0 : BIO_printf(err, "cert_status: AIA URL: %s\n",
816 : 0 : sk_OPENSSL_STRING_value(aia, 0));
817 : : }
818 : : else
819 : : {
820 [ # # ]: 0 : if (!srctx->host)
821 : : {
822 : 0 : BIO_puts(srctx->err, "cert_status: no AIA and no default responder URL\n");
823 : 0 : goto done;
824 : : }
825 : 0 : host = srctx->host;
826 : 0 : path = srctx->path;
827 : 0 : port = srctx->port;
828 : 0 : use_ssl = srctx->use_ssl;
829 : : }
830 : :
831 [ # # ]: 0 : if (!X509_STORE_CTX_init(&inctx,
832 : 0 : SSL_CTX_get_cert_store(SSL_get_SSL_CTX(s)),
833 : : NULL, NULL))
834 : : goto err;
835 [ # # ]: 0 : if (X509_STORE_get_by_subject(&inctx,X509_LU_X509,
836 : : X509_get_issuer_name(x),&obj) <= 0)
837 : : {
838 : 0 : BIO_puts(err, "cert_status: Can't retrieve issuer certificate.\n");
839 : 0 : X509_STORE_CTX_cleanup(&inctx);
840 : 0 : goto done;
841 : : }
842 : 0 : req = OCSP_REQUEST_new();
843 [ # # ]: 0 : if (!req)
844 : : goto err;
845 : 0 : id = OCSP_cert_to_id(NULL, x, obj.data.x509);
846 : 0 : X509_free(obj.data.x509);
847 : 0 : X509_STORE_CTX_cleanup(&inctx);
848 [ # # ]: 0 : if (!id)
849 : : goto err;
850 [ # # ]: 0 : if (!OCSP_request_add0_id(req, id))
851 : : goto err;
852 : 0 : id = NULL;
853 : : /* Add any extensions to the request */
854 : 0 : SSL_get_tlsext_status_exts(s, &exts);
855 [ # # ]: 0 : for (i = 0; i < sk_X509_EXTENSION_num(exts); i++)
856 : : {
857 : 0 : X509_EXTENSION *ext = sk_X509_EXTENSION_value(exts, i);
858 [ # # ]: 0 : if (!OCSP_REQUEST_add_ext(req, ext, -1))
859 : : goto err;
860 : : }
861 : 0 : resp = process_responder(err, req, host, path, port, use_ssl, NULL,
862 : : srctx->timeout);
863 [ # # ]: 0 : if (!resp)
864 : : {
865 : 0 : BIO_puts(err, "cert_status: error querying responder\n");
866 : 0 : goto done;
867 : : }
868 : 0 : rspderlen = i2d_OCSP_RESPONSE(resp, &rspder);
869 [ # # ]: 0 : if (rspderlen <= 0)
870 : : goto err;
871 : 0 : SSL_set_tlsext_status_ocsp_resp(s, rspder, rspderlen);
872 [ # # ]: 0 : if (srctx->verbose)
873 : : {
874 : 0 : BIO_puts(err, "cert_status: ocsp response sent:\n");
875 : 0 : OCSP_RESPONSE_print(err, resp, 2);
876 : : }
877 : : ret = SSL_TLSEXT_ERR_OK;
878 : : done:
879 [ # # ]: 0 : if (ret != SSL_TLSEXT_ERR_OK)
880 : 0 : ERR_print_errors(err);
881 [ # # ]: 0 : if (aia)
882 : : {
883 : 0 : OPENSSL_free(host);
884 : 0 : OPENSSL_free(path);
885 : 0 : OPENSSL_free(port);
886 : 0 : X509_email_free(aia);
887 : : }
888 [ # # ]: 0 : if (id)
889 : 0 : OCSP_CERTID_free(id);
890 [ # # ]: 0 : if (req)
891 : 0 : OCSP_REQUEST_free(req);
892 [ # # ]: 0 : if (resp)
893 : 0 : OCSP_RESPONSE_free(resp);
894 : 0 : return ret;
895 : : err:
896 : : ret = SSL_TLSEXT_ERR_ALERT_FATAL;
897 : : goto done;
898 : : }
899 : :
900 : : # ifndef OPENSSL_NO_NEXTPROTONEG
901 : : /* This is the context that we pass to next_proto_cb */
902 : : typedef struct tlsextnextprotoctx_st {
903 : : unsigned char *data;
904 : : unsigned int len;
905 : : } tlsextnextprotoctx;
906 : :
907 : 0 : static int next_proto_cb(SSL *s, const unsigned char **data, unsigned int *len, void *arg)
908 : : {
909 : 0 : tlsextnextprotoctx *next_proto = arg;
910 : :
911 : 0 : *data = next_proto->data;
912 : 0 : *len = next_proto->len;
913 : :
914 : 0 : return SSL_TLSEXT_ERR_OK;
915 : : }
916 : : # endif /* ndef OPENSSL_NO_NEXTPROTONEG */
917 : :
918 : : /* This the context that we pass to alpn_cb */
919 : : typedef struct tlsextalpnctx_st {
920 : : unsigned char *data;
921 : : unsigned short len;
922 : : } tlsextalpnctx;
923 : :
924 : 0 : static int alpn_cb(SSL *s, const unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
925 : : {
926 : 0 : tlsextalpnctx *alpn_ctx = arg;
927 : :
928 [ # # ]: 0 : if (!s_quiet)
929 : : {
930 : : /* We can assume that |in| is syntactically valid. */
931 : : unsigned i;
932 : 0 : BIO_printf(bio_s_out, "ALPN protocols advertised by the client: ");
933 [ # # ]: 0 : for (i = 0; i < inlen; )
934 : : {
935 [ # # ]: 0 : if (i)
936 : 0 : BIO_write(bio_s_out, ", ", 2);
937 : 0 : BIO_write(bio_s_out, &in[i + 1], in[i]);
938 : 0 : i += in[i] + 1;
939 : : }
940 : 0 : BIO_write(bio_s_out, "\n", 1);
941 : : }
942 : :
943 [ # # ]: 0 : if (SSL_select_next_proto((unsigned char**) out, outlen, alpn_ctx->data, alpn_ctx->len, in, inlen) !=
944 : : OPENSSL_NPN_NEGOTIATED)
945 : : {
946 : : return SSL_TLSEXT_ERR_NOACK;
947 : : }
948 : :
949 [ # # ]: 0 : if (!s_quiet)
950 : : {
951 : 0 : BIO_printf(bio_s_out, "ALPN protocols selected: ");
952 : 0 : BIO_write(bio_s_out, *out, *outlen);
953 : 0 : BIO_write(bio_s_out, "\n", 1);
954 : : }
955 : :
956 : : return SSL_TLSEXT_ERR_OK;
957 : : }
958 : : #endif /* ndef OPENSSL_NO_TLSEXT */
959 : :
960 : 0 : static int not_resumable_sess_cb(SSL *s, int is_forward_secure)
961 : : {
962 : : /* disable resumption for sessions with forward secure ciphers */
963 : 0 : return is_forward_secure;
964 : : }
965 : :
966 : : int MAIN(int, char **);
967 : :
968 : : #ifndef OPENSSL_NO_JPAKE
969 : : static char *jpake_secret = NULL;
970 : : #define no_jpake !jpake_secret
971 : : #else
972 : : #define no_jpake 1
973 : : #endif
974 : : #ifndef OPENSSL_NO_SRP
975 : : static srpsrvparm srp_callback_parm;
976 : : #endif
977 : : static char *srtp_profiles = NULL;
978 : :
979 : 0 : int MAIN(int argc, char *argv[])
980 : : {
981 : 0 : X509_VERIFY_PARAM *vpm = NULL;
982 : 0 : int badarg = 0;
983 : 0 : short port=PORT;
984 : 0 : const char *unix_path=NULL;
985 : : #ifndef NO_SYS_UN_H
986 : 0 : int unlink_unix_path=0;
987 : : #endif
988 : : int (*server_cb)(char *hostname, int s, int stype, unsigned char *context);
989 : 0 : char *CApath=NULL,*CAfile=NULL;
990 : 0 : char *chCApath=NULL,*chCAfile=NULL;
991 : 0 : char *vfyCApath=NULL,*vfyCAfile=NULL;
992 : 0 : unsigned char *context = NULL;
993 : 0 : char *dhfile = NULL;
994 : 0 : int badop=0;
995 : 0 : int ret=1;
996 : 0 : int build_chain = 0;
997 : 0 : int no_tmp_rsa=0,no_dhe=0,no_ecdhe=0,nocert=0;
998 : 0 : int state=0;
999 : 0 : const SSL_METHOD *meth=NULL;
1000 : 0 : int socket_type=SOCK_STREAM;
1001 : 0 : ENGINE *e=NULL;
1002 : 0 : char *inrand=NULL;
1003 : 0 : int s_cert_format = FORMAT_PEM, s_key_format = FORMAT_PEM;
1004 : 0 : char *passarg = NULL, *pass = NULL;
1005 : 0 : char *dpassarg = NULL, *dpass = NULL;
1006 : 0 : int s_dcert_format = FORMAT_PEM, s_dkey_format = FORMAT_PEM;
1007 : 0 : X509 *s_cert = NULL, *s_dcert = NULL;
1008 : 0 : STACK_OF(X509) *s_chain = NULL, *s_dchain = NULL;
1009 : 0 : EVP_PKEY *s_key = NULL, *s_dkey = NULL;
1010 : 0 : int no_cache = 0, ext_cache = 0;
1011 : 0 : int rev = 0, naccept = -1;
1012 : 0 : int sdebug = 0;
1013 : : #ifndef OPENSSL_NO_TLSEXT
1014 : 0 : EVP_PKEY *s_key2 = NULL;
1015 : 0 : X509 *s_cert2 = NULL;
1016 : 0 : tlsextctx tlsextcbp = {NULL, NULL, SSL_TLSEXT_ERR_ALERT_WARNING};
1017 : : # ifndef OPENSSL_NO_NEXTPROTONEG
1018 : 0 : const char *next_proto_neg_in = NULL;
1019 : 0 : tlsextnextprotoctx next_proto = { NULL, 0};
1020 : : # endif
1021 : 0 : const char *alpn_in = NULL;
1022 : 0 : tlsextalpnctx alpn_ctx = { NULL, 0};
1023 : : #endif
1024 : : #ifndef OPENSSL_NO_PSK
1025 : : /* by default do not send a PSK identity hint */
1026 : : static char *psk_identity_hint=NULL;
1027 : : #endif
1028 : : #ifndef OPENSSL_NO_SRP
1029 : 0 : char *srpuserseed = NULL;
1030 : 0 : char *srp_verifier_file = NULL;
1031 : : #endif
1032 : 0 : SSL_EXCERT *exc = NULL;
1033 : 0 : SSL_CONF_CTX *cctx = NULL;
1034 : 0 : STACK_OF(OPENSSL_STRING) *ssl_args = NULL;
1035 : :
1036 : 0 : char *crl_file = NULL;
1037 : 0 : int crl_format = FORMAT_PEM;
1038 : 0 : int crl_download = 0;
1039 : 0 : STACK_OF(X509_CRL) *crls = NULL;
1040 : :
1041 : 0 : meth=SSLv23_server_method();
1042 : :
1043 : 0 : local_argc=argc;
1044 : 0 : local_argv=argv;
1045 : :
1046 : 0 : apps_startup();
1047 : : #ifdef MONOLITH
1048 : 0 : s_server_init();
1049 : : #endif
1050 : :
1051 [ # # ]: 0 : if (bio_err == NULL)
1052 : 0 : bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
1053 : :
1054 [ # # ]: 0 : if (!load_config(bio_err, NULL))
1055 : : goto end;
1056 : :
1057 : 0 : cctx = SSL_CONF_CTX_new();
1058 [ # # ]: 0 : if (!cctx)
1059 : : goto end;
1060 : 0 : SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_SERVER);
1061 : 0 : SSL_CONF_CTX_set_flags(cctx, SSL_CONF_FLAG_CMDLINE);
1062 : :
1063 : 0 : verify_depth=0;
1064 : : #ifdef FIONBIO
1065 : 0 : s_nbio=0;
1066 : : #endif
1067 : 0 : s_nbio_test=0;
1068 : :
1069 : 0 : argc--;
1070 : 0 : argv++;
1071 : :
1072 [ # # ]: 0 : while (argc >= 1)
1073 : : {
1074 [ # # ][ # # ]: 0 : if ((strcmp(*argv,"-port") == 0) ||
1075 : 0 : (strcmp(*argv,"-accept") == 0))
1076 : : {
1077 [ # # ]: 0 : if (--argc < 1) goto bad;
1078 [ # # ]: 0 : if (!extract_port(*(++argv),&port))
1079 : : goto bad;
1080 : : }
1081 [ # # ]: 0 : else if (strcmp(*argv,"-unix") == 0)
1082 : : {
1083 : : #ifdef NO_SYS_UN_H
1084 : : BIO_printf(bio_err, "unix domain sockets unsupported\n");
1085 : : goto bad;
1086 : : #else
1087 [ # # ]: 0 : if (--argc < 1) goto bad;
1088 : 0 : unix_path = *(++argv);
1089 : : #endif
1090 : : }
1091 [ # # ]: 0 : else if (strcmp(*argv,"-unlink") == 0)
1092 : : {
1093 : : #ifdef NO_SYS_UN_H
1094 : : BIO_printf(bio_err, "unix domain sockets unsupported\n");
1095 : : goto bad;
1096 : : #else
1097 : : unlink_unix_path = 1;
1098 : : #endif
1099 : : }
1100 [ # # ]: 0 : else if (strcmp(*argv,"-naccept") == 0)
1101 : : {
1102 [ # # ]: 0 : if (--argc < 1) goto bad;
1103 : 0 : naccept = atol(*(++argv));
1104 [ # # ]: 0 : if (naccept <= 0)
1105 : : {
1106 : 0 : BIO_printf(bio_err, "bad accept value %s\n",
1107 : : *argv);
1108 : 0 : goto bad;
1109 : : }
1110 : : }
1111 [ # # ]: 0 : else if (strcmp(*argv,"-verify") == 0)
1112 : : {
1113 : 0 : s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE;
1114 [ # # ]: 0 : if (--argc < 1) goto bad;
1115 : 0 : verify_depth=atoi(*(++argv));
1116 [ # # ]: 0 : if (!s_quiet)
1117 : 0 : BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
1118 : : }
1119 [ # # ]: 0 : else if (strcmp(*argv,"-Verify") == 0)
1120 : : {
1121 : 0 : s_server_verify=SSL_VERIFY_PEER|SSL_VERIFY_FAIL_IF_NO_PEER_CERT|
1122 : : SSL_VERIFY_CLIENT_ONCE;
1123 [ # # ]: 0 : if (--argc < 1) goto bad;
1124 : 0 : verify_depth=atoi(*(++argv));
1125 [ # # ]: 0 : if (!s_quiet)
1126 : 0 : BIO_printf(bio_err,"verify depth is %d, must return a certificate\n",verify_depth);
1127 : : }
1128 [ # # ]: 0 : else if (strcmp(*argv,"-context") == 0)
1129 : : {
1130 [ # # ]: 0 : if (--argc < 1) goto bad;
1131 : 0 : context= (unsigned char *)*(++argv);
1132 : : }
1133 [ # # ]: 0 : else if (strcmp(*argv,"-cert") == 0)
1134 : : {
1135 [ # # ]: 0 : if (--argc < 1) goto bad;
1136 : 0 : s_cert_file= *(++argv);
1137 : : }
1138 [ # # ]: 0 : else if (strcmp(*argv,"-CRL") == 0)
1139 : : {
1140 [ # # ]: 0 : if (--argc < 1) goto bad;
1141 : 0 : crl_file= *(++argv);
1142 : : }
1143 [ # # ]: 0 : else if (strcmp(*argv,"-crl_download") == 0)
1144 : : crl_download = 1;
1145 : : #ifndef OPENSSL_NO_TLSEXT
1146 [ # # ]: 0 : else if (strcmp(*argv,"-serverinfo") == 0)
1147 : : {
1148 [ # # ]: 0 : if (--argc < 1) goto bad;
1149 : 0 : s_serverinfo_file = *(++argv);
1150 : : }
1151 : : #endif
1152 [ # # ]: 0 : else if (strcmp(*argv,"-certform") == 0)
1153 : : {
1154 [ # # ]: 0 : if (--argc < 1) goto bad;
1155 : 0 : s_cert_format = str2fmt(*(++argv));
1156 : : }
1157 [ # # ]: 0 : else if (strcmp(*argv,"-key") == 0)
1158 : : {
1159 [ # # ]: 0 : if (--argc < 1) goto bad;
1160 : 0 : s_key_file= *(++argv);
1161 : : }
1162 [ # # ]: 0 : else if (strcmp(*argv,"-keyform") == 0)
1163 : : {
1164 [ # # ]: 0 : if (--argc < 1) goto bad;
1165 : 0 : s_key_format = str2fmt(*(++argv));
1166 : : }
1167 [ # # ]: 0 : else if (strcmp(*argv,"-pass") == 0)
1168 : : {
1169 [ # # ]: 0 : if (--argc < 1) goto bad;
1170 : 0 : passarg = *(++argv);
1171 : : }
1172 [ # # ]: 0 : else if (strcmp(*argv,"-cert_chain") == 0)
1173 : : {
1174 [ # # ]: 0 : if (--argc < 1) goto bad;
1175 : 0 : s_chain_file= *(++argv);
1176 : : }
1177 [ # # ]: 0 : else if (strcmp(*argv,"-dhparam") == 0)
1178 : : {
1179 [ # # ]: 0 : if (--argc < 1) goto bad;
1180 : 0 : dhfile = *(++argv);
1181 : : }
1182 [ # # ]: 0 : else if (strcmp(*argv,"-dcertform") == 0)
1183 : : {
1184 [ # # ]: 0 : if (--argc < 1) goto bad;
1185 : 0 : s_dcert_format = str2fmt(*(++argv));
1186 : : }
1187 [ # # ]: 0 : else if (strcmp(*argv,"-dcert") == 0)
1188 : : {
1189 [ # # ]: 0 : if (--argc < 1) goto bad;
1190 : 0 : s_dcert_file= *(++argv);
1191 : : }
1192 [ # # ]: 0 : else if (strcmp(*argv,"-dkeyform") == 0)
1193 : : {
1194 [ # # ]: 0 : if (--argc < 1) goto bad;
1195 : 0 : s_dkey_format = str2fmt(*(++argv));
1196 : : }
1197 [ # # ]: 0 : else if (strcmp(*argv,"-dpass") == 0)
1198 : : {
1199 [ # # ]: 0 : if (--argc < 1) goto bad;
1200 : 0 : dpassarg = *(++argv);
1201 : : }
1202 [ # # ]: 0 : else if (strcmp(*argv,"-dkey") == 0)
1203 : : {
1204 [ # # ]: 0 : if (--argc < 1) goto bad;
1205 : 0 : s_dkey_file= *(++argv);
1206 : : }
1207 [ # # ]: 0 : else if (strcmp(*argv,"-dcert_chain") == 0)
1208 : : {
1209 [ # # ]: 0 : if (--argc < 1) goto bad;
1210 : 0 : s_dchain_file= *(++argv);
1211 : : }
1212 [ # # ]: 0 : else if (strcmp(*argv,"-nocert") == 0)
1213 : : {
1214 : : nocert=1;
1215 : : }
1216 [ # # ]: 0 : else if (strcmp(*argv,"-CApath") == 0)
1217 : : {
1218 [ # # ]: 0 : if (--argc < 1) goto bad;
1219 : 0 : CApath= *(++argv);
1220 : : }
1221 [ # # ]: 0 : else if (strcmp(*argv,"-chainCApath") == 0)
1222 : : {
1223 [ # # ]: 0 : if (--argc < 1) goto bad;
1224 : 0 : chCApath= *(++argv);
1225 : : }
1226 [ # # ]: 0 : else if (strcmp(*argv,"-verifyCApath") == 0)
1227 : : {
1228 [ # # ]: 0 : if (--argc < 1) goto bad;
1229 : 0 : vfyCApath= *(++argv);
1230 : : }
1231 [ # # ]: 0 : else if (strcmp(*argv,"-no_cache") == 0)
1232 : : no_cache = 1;
1233 [ # # ]: 0 : else if (strcmp(*argv,"-ext_cache") == 0)
1234 : : ext_cache = 1;
1235 [ # # ]: 0 : else if (strcmp(*argv,"-CRLform") == 0)
1236 : : {
1237 [ # # ]: 0 : if (--argc < 1) goto bad;
1238 : 0 : crl_format = str2fmt(*(++argv));
1239 : : }
1240 [ # # ]: 0 : else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
1241 : : {
1242 [ # # ]: 0 : if (badarg)
1243 : : goto bad;
1244 : 0 : continue;
1245 : : }
1246 [ # # ]: 0 : else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
1247 : : {
1248 [ # # ]: 0 : if (badarg)
1249 : : goto bad;
1250 : 0 : continue;
1251 : : }
1252 [ # # ]: 0 : else if (args_ssl(&argv, &argc, cctx, &badarg, bio_err, &ssl_args))
1253 : : {
1254 [ # # ]: 0 : if (badarg)
1255 : : goto bad;
1256 : 0 : continue;
1257 : : }
1258 [ # # ]: 0 : else if (strcmp(*argv,"-verify_return_error") == 0)
1259 : 0 : verify_return_error = 1;
1260 [ # # ]: 0 : else if (strcmp(*argv,"-verify_quiet") == 0)
1261 : 0 : verify_quiet = 1;
1262 [ # # ]: 0 : else if (strcmp(*argv,"-build_chain") == 0)
1263 : : build_chain = 1;
1264 [ # # ]: 0 : else if (strcmp(*argv,"-CAfile") == 0)
1265 : : {
1266 [ # # ]: 0 : if (--argc < 1) goto bad;
1267 : 0 : CAfile= *(++argv);
1268 : : }
1269 [ # # ]: 0 : else if (strcmp(*argv,"-chainCAfile") == 0)
1270 : : {
1271 [ # # ]: 0 : if (--argc < 1) goto bad;
1272 : 0 : chCAfile= *(++argv);
1273 : : }
1274 [ # # ]: 0 : else if (strcmp(*argv,"-verifyCAfile") == 0)
1275 : : {
1276 [ # # ]: 0 : if (--argc < 1) goto bad;
1277 : 0 : vfyCAfile= *(++argv);
1278 : : }
1279 : : #ifdef FIONBIO
1280 [ # # ]: 0 : else if (strcmp(*argv,"-nbio") == 0)
1281 : 0 : { s_nbio=1; }
1282 : : #endif
1283 [ # # ]: 0 : else if (strcmp(*argv,"-nbio_test") == 0)
1284 : : {
1285 : : #ifdef FIONBIO
1286 : 0 : s_nbio=1;
1287 : : #endif
1288 : 0 : s_nbio_test=1;
1289 : : }
1290 [ # # ]: 0 : else if (strcmp(*argv,"-ign_eof") == 0)
1291 : 0 : s_ign_eof=1;
1292 [ # # ]: 0 : else if (strcmp(*argv,"-no_ign_eof") == 0)
1293 : 0 : s_ign_eof=0;
1294 [ # # ]: 0 : else if (strcmp(*argv,"-debug") == 0)
1295 : 0 : { s_debug=1; }
1296 : : #ifndef OPENSSL_NO_TLSEXT
1297 [ # # ]: 0 : else if (strcmp(*argv,"-tlsextdebug") == 0)
1298 : 0 : s_tlsextdebug=1;
1299 [ # # ]: 0 : else if (strcmp(*argv,"-status") == 0)
1300 : 0 : s_tlsextstatus=1;
1301 [ # # ]: 0 : else if (strcmp(*argv,"-status_verbose") == 0)
1302 : : {
1303 : 0 : s_tlsextstatus=1;
1304 : 0 : tlscstatp.verbose = 1;
1305 : : }
1306 [ # # ]: 0 : else if (!strcmp(*argv, "-status_timeout"))
1307 : : {
1308 : 0 : s_tlsextstatus=1;
1309 [ # # ]: 0 : if (--argc < 1) goto bad;
1310 : 0 : tlscstatp.timeout = atoi(*(++argv));
1311 : : }
1312 [ # # ]: 0 : else if (!strcmp(*argv, "-status_url"))
1313 : : {
1314 : 0 : s_tlsextstatus=1;
1315 [ # # ]: 0 : if (--argc < 1) goto bad;
1316 [ # # ]: 0 : if (!OCSP_parse_url(*(++argv),
1317 : : &tlscstatp.host,
1318 : : &tlscstatp.port,
1319 : : &tlscstatp.path,
1320 : : &tlscstatp.use_ssl))
1321 : : {
1322 : 0 : BIO_printf(bio_err, "Error parsing URL\n");
1323 : 0 : goto bad;
1324 : : }
1325 : : }
1326 : : #endif
1327 [ # # ]: 0 : else if (strcmp(*argv,"-msg") == 0)
1328 : 0 : { s_msg=1; }
1329 [ # # ]: 0 : else if (strcmp(*argv,"-msgfile") == 0)
1330 : : {
1331 [ # # ]: 0 : if (--argc < 1) goto bad;
1332 : 0 : bio_s_msg = BIO_new_file(*(++argv), "w");
1333 : : }
1334 : : #ifndef OPENSSL_NO_SSL_TRACE
1335 : : else if (strcmp(*argv,"-trace") == 0)
1336 : : { s_msg=2; }
1337 : : #endif
1338 [ # # ]: 0 : else if (strcmp(*argv,"-security_debug") == 0)
1339 : : { sdebug=1; }
1340 [ # # ]: 0 : else if (strcmp(*argv,"-security_debug_verbose") == 0)
1341 : : { sdebug=2; }
1342 [ # # ]: 0 : else if (strcmp(*argv,"-hack") == 0)
1343 : 0 : { hack=1; }
1344 [ # # ]: 0 : else if (strcmp(*argv,"-state") == 0)
1345 : : { state=1; }
1346 [ # # ]: 0 : else if (strcmp(*argv,"-crlf") == 0)
1347 : 0 : { s_crlf=1; }
1348 [ # # ]: 0 : else if (strcmp(*argv,"-quiet") == 0)
1349 : 0 : { s_quiet=1; }
1350 [ # # ]: 0 : else if (strcmp(*argv,"-brief") == 0)
1351 : : {
1352 : 0 : s_quiet=1;
1353 : 0 : s_brief=1;
1354 : 0 : verify_quiet=1;
1355 : : }
1356 [ # # ]: 0 : else if (strcmp(*argv,"-no_tmp_rsa") == 0)
1357 : : { no_tmp_rsa=1; }
1358 [ # # ]: 0 : else if (strcmp(*argv,"-no_dhe") == 0)
1359 : : { no_dhe=1; }
1360 [ # # ]: 0 : else if (strcmp(*argv,"-no_ecdhe") == 0)
1361 : : { no_ecdhe=1; }
1362 [ # # ]: 0 : else if (strcmp(*argv,"-no_resume_ephemeral") == 0)
1363 : 0 : { no_resume_ephemeral = 1; }
1364 : : #ifndef OPENSSL_NO_PSK
1365 [ # # ]: 0 : else if (strcmp(*argv,"-psk_hint") == 0)
1366 : : {
1367 [ # # ]: 0 : if (--argc < 1) goto bad;
1368 : 0 : psk_identity_hint= *(++argv);
1369 : : }
1370 [ # # ]: 0 : else if (strcmp(*argv,"-psk") == 0)
1371 : : {
1372 : : size_t i;
1373 : :
1374 [ # # ]: 0 : if (--argc < 1) goto bad;
1375 : 0 : psk_key=*(++argv);
1376 [ # # ]: 0 : for (i=0; i<strlen(psk_key); i++)
1377 : : {
1378 [ # # ]: 0 : if (isxdigit((unsigned char)psk_key[i]))
1379 : 0 : continue;
1380 : 0 : BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
1381 : 0 : goto bad;
1382 : : }
1383 : : }
1384 : : #endif
1385 : : #ifndef OPENSSL_NO_SRP
1386 [ # # ]: 0 : else if (strcmp(*argv, "-srpvfile") == 0)
1387 : : {
1388 [ # # ]: 0 : if (--argc < 1) goto bad;
1389 : 0 : srp_verifier_file = *(++argv);
1390 : 0 : meth = TLSv1_server_method();
1391 : : }
1392 [ # # ]: 0 : else if (strcmp(*argv, "-srpuserseed") == 0)
1393 : : {
1394 [ # # ]: 0 : if (--argc < 1) goto bad;
1395 : 0 : srpuserseed = *(++argv);
1396 : 0 : meth = TLSv1_server_method();
1397 : : }
1398 : : #endif
1399 [ # # ]: 0 : else if (strcmp(*argv,"-rev") == 0)
1400 : : { rev=1; }
1401 [ # # ]: 0 : else if (strcmp(*argv,"-www") == 0)
1402 : 0 : { www=1; }
1403 [ # # ]: 0 : else if (strcmp(*argv,"-WWW") == 0)
1404 : 0 : { www=2; }
1405 [ # # ]: 0 : else if (strcmp(*argv,"-HTTP") == 0)
1406 : 0 : { www=3; }
1407 : : #ifndef OPENSSL_NO_SSL2
1408 [ # # ]: 0 : else if (strcmp(*argv,"-ssl2") == 0)
1409 : 0 : { meth=SSLv2_server_method(); }
1410 : : #endif
1411 : : #ifndef OPENSSL_NO_SSL3
1412 [ # # ]: 0 : else if (strcmp(*argv,"-ssl3") == 0)
1413 : 0 : { meth=SSLv3_server_method(); }
1414 : : #endif
1415 : : #ifndef OPENSSL_NO_TLS1
1416 [ # # ]: 0 : else if (strcmp(*argv,"-tls1") == 0)
1417 : 0 : { meth=TLSv1_server_method(); }
1418 [ # # ]: 0 : else if (strcmp(*argv,"-tls1_1") == 0)
1419 : 0 : { meth=TLSv1_1_server_method(); }
1420 [ # # ]: 0 : else if (strcmp(*argv,"-tls1_2") == 0)
1421 : 0 : { meth=TLSv1_2_server_method(); }
1422 : : #endif
1423 : : #ifndef OPENSSL_NO_DTLS1
1424 [ # # ]: 0 : else if (strcmp(*argv,"-dtls") == 0)
1425 : : {
1426 : 0 : meth=DTLS_server_method();
1427 : 0 : socket_type = SOCK_DGRAM;
1428 : : }
1429 [ # # ]: 0 : else if (strcmp(*argv,"-dtls1") == 0)
1430 : : {
1431 : 0 : meth=DTLSv1_server_method();
1432 : 0 : socket_type = SOCK_DGRAM;
1433 : : }
1434 [ # # ]: 0 : else if (strcmp(*argv,"-dtls1_2") == 0)
1435 : : {
1436 : 0 : meth=DTLSv1_2_server_method();
1437 : 0 : socket_type = SOCK_DGRAM;
1438 : : }
1439 [ # # ]: 0 : else if (strcmp(*argv,"-timeout") == 0)
1440 : 0 : enable_timeouts = 1;
1441 [ # # ]: 0 : else if (strcmp(*argv,"-mtu") == 0)
1442 : : {
1443 [ # # ]: 0 : if (--argc < 1) goto bad;
1444 : 0 : socket_mtu = atol(*(++argv));
1445 : : }
1446 [ # # ]: 0 : else if (strcmp(*argv, "-chain") == 0)
1447 : 0 : cert_chain = 1;
1448 : : #endif
1449 [ # # ]: 0 : else if (strcmp(*argv, "-id_prefix") == 0)
1450 : : {
1451 [ # # ]: 0 : if (--argc < 1) goto bad;
1452 : 0 : session_id_prefix = *(++argv);
1453 : : }
1454 : : #ifndef OPENSSL_NO_ENGINE
1455 [ # # ]: 0 : else if (strcmp(*argv,"-engine") == 0)
1456 : : {
1457 [ # # ]: 0 : if (--argc < 1) goto bad;
1458 : 0 : engine_id= *(++argv);
1459 : : }
1460 : : #endif
1461 [ # # ]: 0 : else if (strcmp(*argv,"-rand") == 0)
1462 : : {
1463 [ # # ]: 0 : if (--argc < 1) goto bad;
1464 : 0 : inrand= *(++argv);
1465 : : }
1466 : : #ifndef OPENSSL_NO_TLSEXT
1467 [ # # ]: 0 : else if (strcmp(*argv,"-servername") == 0)
1468 : : {
1469 [ # # ]: 0 : if (--argc < 1) goto bad;
1470 : 0 : tlsextcbp.servername= *(++argv);
1471 : : }
1472 [ # # ]: 0 : else if (strcmp(*argv,"-servername_fatal") == 0)
1473 : 0 : { tlsextcbp.extension_error = SSL_TLSEXT_ERR_ALERT_FATAL; }
1474 [ # # ]: 0 : else if (strcmp(*argv,"-cert2") == 0)
1475 : : {
1476 [ # # ]: 0 : if (--argc < 1) goto bad;
1477 : 0 : s_cert_file2= *(++argv);
1478 : : }
1479 [ # # ]: 0 : else if (strcmp(*argv,"-key2") == 0)
1480 : : {
1481 [ # # ]: 0 : if (--argc < 1) goto bad;
1482 : 0 : s_key_file2= *(++argv);
1483 : : }
1484 : : # ifndef OPENSSL_NO_NEXTPROTONEG
1485 [ # # ]: 0 : else if (strcmp(*argv,"-nextprotoneg") == 0)
1486 : : {
1487 [ # # ]: 0 : if (--argc < 1) goto bad;
1488 : 0 : next_proto_neg_in = *(++argv);
1489 : : }
1490 : : # endif
1491 [ # # ]: 0 : else if (strcmp(*argv,"-alpn") == 0)
1492 : : {
1493 [ # # ]: 0 : if (--argc < 1) goto bad;
1494 : 0 : alpn_in = *(++argv);
1495 : : }
1496 : : #endif
1497 : : #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1498 : : else if (strcmp(*argv,"-jpake") == 0)
1499 : : {
1500 : : if (--argc < 1) goto bad;
1501 : : jpake_secret = *(++argv);
1502 : : }
1503 : : #endif
1504 [ # # ]: 0 : else if (strcmp(*argv,"-use_srtp") == 0)
1505 : : {
1506 [ # # ]: 0 : if (--argc < 1) goto bad;
1507 : 0 : srtp_profiles = *(++argv);
1508 : : }
1509 [ # # ]: 0 : else if (strcmp(*argv,"-keymatexport") == 0)
1510 : : {
1511 [ # # ]: 0 : if (--argc < 1) goto bad;
1512 : 0 : keymatexportlabel= *(++argv);
1513 : : }
1514 [ # # ]: 0 : else if (strcmp(*argv,"-keymatexportlen") == 0)
1515 : : {
1516 [ # # ]: 0 : if (--argc < 1) goto bad;
1517 : 0 : keymatexportlen=atoi(*(++argv));
1518 [ # # ]: 0 : if (keymatexportlen == 0) goto bad;
1519 : : }
1520 : : else
1521 : : {
1522 : 0 : BIO_printf(bio_err,"unknown option %s\n",*argv);
1523 : 0 : badop=1;
1524 : 0 : break;
1525 : : }
1526 : 0 : argc--;
1527 : 0 : argv++;
1528 : : }
1529 [ # # ]: 0 : if (badop)
1530 : : {
1531 : : bad:
1532 : 0 : sv_usage();
1533 : 0 : goto end;
1534 : : }
1535 : : #ifndef OPENSSL_NO_DTLS1
1536 [ # # ][ # # ]: 0 : if (www && socket_type == SOCK_DGRAM)
1537 : : {
1538 : 0 : BIO_printf(bio_err,
1539 : : "Can't use -HTTP, -www or -WWW with DTLS\n");
1540 : 0 : goto end;
1541 : : }
1542 : : #endif
1543 : :
1544 [ # # ]: 0 : if (unix_path && (socket_type != SOCK_STREAM))
1545 : : {
1546 : 0 : BIO_printf(bio_err, "Can't use unix sockets and datagrams together\n");
1547 : 0 : goto end;
1548 : : }
1549 : : #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1550 : : if (jpake_secret)
1551 : : {
1552 : : if (psk_key)
1553 : : {
1554 : : BIO_printf(bio_err,
1555 : : "Can't use JPAKE and PSK together\n");
1556 : : goto end;
1557 : : }
1558 : : psk_identity = "JPAKE";
1559 : : }
1560 : : #endif
1561 : :
1562 : 0 : SSL_load_error_strings();
1563 : 0 : OpenSSL_add_ssl_algorithms();
1564 : :
1565 : : #ifndef OPENSSL_NO_ENGINE
1566 : 0 : e = setup_engine(bio_err, engine_id, 1);
1567 : : #endif
1568 : :
1569 [ # # ]: 0 : if (!app_passwd(bio_err, passarg, dpassarg, &pass, &dpass))
1570 : : {
1571 : 0 : BIO_printf(bio_err, "Error getting password\n");
1572 : 0 : goto end;
1573 : : }
1574 : :
1575 : :
1576 [ # # ]: 0 : if (s_key_file == NULL)
1577 : 0 : s_key_file = s_cert_file;
1578 : : #ifndef OPENSSL_NO_TLSEXT
1579 [ # # ]: 0 : if (s_key_file2 == NULL)
1580 : 0 : s_key_file2 = s_cert_file2;
1581 : : #endif
1582 : :
1583 [ # # ]: 0 : if (!load_excert(&exc, bio_err))
1584 : : goto end;
1585 : :
1586 [ # # ]: 0 : if (nocert == 0)
1587 : : {
1588 : 0 : s_key = load_key(bio_err, s_key_file, s_key_format, 0, pass, e,
1589 : : "server certificate private key file");
1590 [ # # ]: 0 : if (!s_key)
1591 : : {
1592 : 0 : ERR_print_errors(bio_err);
1593 : 0 : goto end;
1594 : : }
1595 : :
1596 : 0 : s_cert = load_cert(bio_err,s_cert_file,s_cert_format,
1597 : : NULL, e, "server certificate file");
1598 : :
1599 [ # # ]: 0 : if (!s_cert)
1600 : : {
1601 : 0 : ERR_print_errors(bio_err);
1602 : 0 : goto end;
1603 : : }
1604 [ # # ]: 0 : if (s_chain_file)
1605 : : {
1606 : 0 : s_chain = load_certs(bio_err, s_chain_file,FORMAT_PEM,
1607 : : NULL, e, "server certificate chain");
1608 [ # # ]: 0 : if (!s_chain)
1609 : : goto end;
1610 : : }
1611 : :
1612 : : #ifndef OPENSSL_NO_TLSEXT
1613 [ # # ]: 0 : if (tlsextcbp.servername)
1614 : : {
1615 : 0 : s_key2 = load_key(bio_err, s_key_file2, s_key_format, 0, pass, e,
1616 : : "second server certificate private key file");
1617 [ # # ]: 0 : if (!s_key2)
1618 : : {
1619 : 0 : ERR_print_errors(bio_err);
1620 : 0 : goto end;
1621 : : }
1622 : :
1623 : 0 : s_cert2 = load_cert(bio_err,s_cert_file2,s_cert_format,
1624 : : NULL, e, "second server certificate file");
1625 : :
1626 [ # # ]: 0 : if (!s_cert2)
1627 : : {
1628 : 0 : ERR_print_errors(bio_err);
1629 : 0 : goto end;
1630 : : }
1631 : : }
1632 : : #endif /* OPENSSL_NO_TLSEXT */
1633 : : }
1634 : :
1635 : : #if !defined(OPENSSL_NO_TLSEXT)
1636 : : # if !defined(OPENSSL_NO_NEXTPROTONEG)
1637 [ # # ]: 0 : if (next_proto_neg_in)
1638 : : {
1639 : : unsigned short len;
1640 : 0 : next_proto.data = next_protos_parse(&len, next_proto_neg_in);
1641 [ # # ]: 0 : if (next_proto.data == NULL)
1642 : : goto end;
1643 : 0 : next_proto.len = len;
1644 : : }
1645 : : else
1646 : : {
1647 : 0 : next_proto.data = NULL;
1648 : : }
1649 : : # endif
1650 : 0 : alpn_ctx.data = NULL;
1651 [ # # ]: 0 : if (alpn_in)
1652 : : {
1653 : : unsigned short len;
1654 : 0 : alpn_ctx.data = next_protos_parse(&len, alpn_in);
1655 [ # # ]: 0 : if (alpn_ctx.data == NULL)
1656 : : goto end;
1657 : 0 : alpn_ctx.len = len;
1658 : : }
1659 : : #endif
1660 : :
1661 [ # # ]: 0 : if (crl_file)
1662 : : {
1663 : : X509_CRL *crl;
1664 : 0 : crl = load_crl(crl_file, crl_format);
1665 [ # # ]: 0 : if (!crl)
1666 : : {
1667 : 0 : BIO_puts(bio_err, "Error loading CRL\n");
1668 : 0 : ERR_print_errors(bio_err);
1669 : 0 : goto end;
1670 : : }
1671 : 0 : crls = sk_X509_CRL_new_null();
1672 [ # # ][ # # ]: 0 : if (!crls || !sk_X509_CRL_push(crls, crl))
1673 : : {
1674 : 0 : BIO_puts(bio_err, "Error adding CRL\n");
1675 : 0 : ERR_print_errors(bio_err);
1676 : 0 : X509_CRL_free(crl);
1677 : 0 : goto end;
1678 : : }
1679 : : }
1680 : :
1681 : :
1682 [ # # ]: 0 : if (s_dcert_file)
1683 : : {
1684 : :
1685 [ # # ]: 0 : if (s_dkey_file == NULL)
1686 : 0 : s_dkey_file = s_dcert_file;
1687 : :
1688 : 0 : s_dkey = load_key(bio_err, s_dkey_file, s_dkey_format,
1689 : : 0, dpass, e,
1690 : : "second certificate private key file");
1691 [ # # ]: 0 : if (!s_dkey)
1692 : : {
1693 : 0 : ERR_print_errors(bio_err);
1694 : 0 : goto end;
1695 : : }
1696 : :
1697 : 0 : s_dcert = load_cert(bio_err,s_dcert_file,s_dcert_format,
1698 : : NULL, e, "second server certificate file");
1699 : :
1700 [ # # ]: 0 : if (!s_dcert)
1701 : : {
1702 : 0 : ERR_print_errors(bio_err);
1703 : 0 : goto end;
1704 : : }
1705 [ # # ]: 0 : if (s_dchain_file)
1706 : : {
1707 : 0 : s_dchain = load_certs(bio_err, s_dchain_file,FORMAT_PEM,
1708 : : NULL, e, "second server certificate chain");
1709 [ # # ]: 0 : if (!s_dchain)
1710 : : goto end;
1711 : : }
1712 : :
1713 : : }
1714 : :
1715 [ # # ][ # # ]: 0 : if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1716 [ # # ]: 0 : && !RAND_status())
1717 : : {
1718 : 0 : BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1719 : : }
1720 [ # # ]: 0 : if (inrand != NULL)
1721 : 0 : BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1722 : : app_RAND_load_files(inrand));
1723 : :
1724 [ # # ]: 0 : if (bio_s_out == NULL)
1725 : : {
1726 [ # # ][ # # ]: 0 : if (s_quiet && !s_debug)
1727 : : {
1728 : 0 : bio_s_out=BIO_new(BIO_s_null());
1729 [ # # ][ # # ]: 0 : if (s_msg && !bio_s_msg)
1730 : 0 : bio_s_msg=BIO_new_fp(stdout,BIO_NOCLOSE);
1731 : : }
1732 : : else
1733 : : {
1734 [ # # ]: 0 : if (bio_s_out == NULL)
1735 : 0 : bio_s_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1736 : : }
1737 : : }
1738 : :
1739 : : #if !defined(OPENSSL_NO_RSA) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_ECDSA)
1740 [ # # ]: 0 : if (nocert)
1741 : : #endif
1742 : : {
1743 : 0 : s_cert_file=NULL;
1744 : 0 : s_key_file=NULL;
1745 : 0 : s_dcert_file=NULL;
1746 : 0 : s_dkey_file=NULL;
1747 : : #ifndef OPENSSL_NO_TLSEXT
1748 : 0 : s_cert_file2=NULL;
1749 : 0 : s_key_file2=NULL;
1750 : : #endif
1751 : : }
1752 : :
1753 : 0 : ctx=SSL_CTX_new(meth);
1754 [ # # ]: 0 : if (sdebug)
1755 : 0 : ssl_ctx_security_debug(ctx, bio_err, sdebug);
1756 [ # # ]: 0 : if (ctx == NULL)
1757 : : {
1758 : 0 : ERR_print_errors(bio_err);
1759 : 0 : goto end;
1760 : : }
1761 [ # # ]: 0 : if (session_id_prefix)
1762 : : {
1763 [ # # ]: 0 : if(strlen(session_id_prefix) >= 32)
1764 : 0 : BIO_printf(bio_err,
1765 : : "warning: id_prefix is too long, only one new session will be possible\n");
1766 [ # # ]: 0 : else if(strlen(session_id_prefix) >= 16)
1767 : 0 : BIO_printf(bio_err,
1768 : : "warning: id_prefix is too long if you use SSLv2\n");
1769 [ # # ]: 0 : if(!SSL_CTX_set_generate_session_id(ctx, generate_session_id))
1770 : : {
1771 : 0 : BIO_printf(bio_err,"error setting 'id_prefix'\n");
1772 : 0 : ERR_print_errors(bio_err);
1773 : 0 : goto end;
1774 : : }
1775 : 0 : BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1776 : : }
1777 : 0 : SSL_CTX_set_quiet_shutdown(ctx,1);
1778 [ # # ]: 0 : if (hack) SSL_CTX_set_options(ctx,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1779 [ # # ]: 0 : if (exc) ssl_ctx_set_excert(ctx, exc);
1780 : : /* DTLS: partial reads end up discarding unread UDP bytes :-(
1781 : : * Setting read ahead solves this problem.
1782 : : */
1783 [ # # ]: 0 : if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1784 : :
1785 [ # # ]: 0 : if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1786 [ # # ]: 0 : if (no_cache)
1787 : 0 : SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
1788 [ # # ]: 0 : else if (ext_cache)
1789 : 0 : init_session_cache_ctx(ctx);
1790 : : else
1791 : 0 : SSL_CTX_sess_set_cache_size(ctx,128);
1792 : :
1793 [ # # ]: 0 : if (srtp_profiles != NULL)
1794 : 0 : SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1795 : :
1796 : : #if 0
1797 : : if (cipher == NULL) cipher=getenv("SSL_CIPHER");
1798 : : #endif
1799 : :
1800 : : #if 0
1801 : : if (s_cert_file == NULL)
1802 : : {
1803 : : BIO_printf(bio_err,"You must specify a certificate file for the server to use\n");
1804 : : goto end;
1805 : : }
1806 : : #endif
1807 : :
1808 [ # # # # ]: 0 : if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1809 : 0 : (!SSL_CTX_set_default_verify_paths(ctx)))
1810 : : {
1811 : : /* BIO_printf(bio_err,"X509_load_verify_locations\n"); */
1812 : 0 : ERR_print_errors(bio_err);
1813 : : /* goto end; */
1814 : : }
1815 [ # # ]: 0 : if (vpm)
1816 : 0 : SSL_CTX_set1_param(ctx, vpm);
1817 : :
1818 : 0 : ssl_ctx_add_crls(ctx, crls, 0);
1819 [ # # ]: 0 : if (!args_ssl_call(ctx, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
1820 : : goto end;
1821 : :
1822 [ # # ]: 0 : if (!ssl_load_stores(ctx, vfyCApath, vfyCAfile, chCApath, chCAfile,
1823 : : crls, crl_download))
1824 : : {
1825 : 0 : BIO_printf(bio_err, "Error loading store locations\n");
1826 : 0 : ERR_print_errors(bio_err);
1827 : 0 : goto end;
1828 : : }
1829 : :
1830 : : #ifndef OPENSSL_NO_TLSEXT
1831 [ # # ]: 0 : if (s_cert2)
1832 : : {
1833 : 0 : ctx2=SSL_CTX_new(meth);
1834 [ # # ]: 0 : if (ctx2 == NULL)
1835 : : {
1836 : 0 : ERR_print_errors(bio_err);
1837 : 0 : goto end;
1838 : : }
1839 : : }
1840 : :
1841 [ # # ]: 0 : if (ctx2)
1842 : : {
1843 : 0 : BIO_printf(bio_s_out,"Setting secondary ctx parameters\n");
1844 : :
1845 [ # # ]: 0 : if (sdebug)
1846 : 0 : ssl_ctx_security_debug(ctx, bio_err, sdebug);
1847 : :
1848 [ # # ]: 0 : if (session_id_prefix)
1849 : : {
1850 [ # # ]: 0 : if(strlen(session_id_prefix) >= 32)
1851 : 0 : BIO_printf(bio_err,
1852 : : "warning: id_prefix is too long, only one new session will be possible\n");
1853 [ # # ]: 0 : else if(strlen(session_id_prefix) >= 16)
1854 : 0 : BIO_printf(bio_err,
1855 : : "warning: id_prefix is too long if you use SSLv2\n");
1856 [ # # ]: 0 : if(!SSL_CTX_set_generate_session_id(ctx2, generate_session_id))
1857 : : {
1858 : 0 : BIO_printf(bio_err,"error setting 'id_prefix'\n");
1859 : 0 : ERR_print_errors(bio_err);
1860 : 0 : goto end;
1861 : : }
1862 : 0 : BIO_printf(bio_err,"id_prefix '%s' set.\n", session_id_prefix);
1863 : : }
1864 : 0 : SSL_CTX_set_quiet_shutdown(ctx2,1);
1865 [ # # ]: 0 : if (hack) SSL_CTX_set_options(ctx2,SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG);
1866 [ # # ]: 0 : if (exc) ssl_ctx_set_excert(ctx2, exc);
1867 : : /* DTLS: partial reads end up discarding unread UDP bytes :-(
1868 : : * Setting read ahead solves this problem.
1869 : : */
1870 [ # # ]: 0 : if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx2, 1);
1871 : :
1872 [ # # ]: 0 : if (state) SSL_CTX_set_info_callback(ctx2,apps_ssl_info_callback);
1873 : :
1874 [ # # ]: 0 : if (no_cache)
1875 : 0 : SSL_CTX_set_session_cache_mode(ctx2,SSL_SESS_CACHE_OFF);
1876 [ # # ]: 0 : else if (ext_cache)
1877 : 0 : init_session_cache_ctx(ctx2);
1878 : : else
1879 : 0 : SSL_CTX_sess_set_cache_size(ctx2,128);
1880 : :
1881 [ # # # # ]: 0 : if ((!SSL_CTX_load_verify_locations(ctx2,CAfile,CApath)) ||
1882 : 0 : (!SSL_CTX_set_default_verify_paths(ctx2)))
1883 : : {
1884 : 0 : ERR_print_errors(bio_err);
1885 : : }
1886 [ # # ]: 0 : if (vpm)
1887 : 0 : SSL_CTX_set1_param(ctx2, vpm);
1888 : :
1889 : 0 : ssl_ctx_add_crls(ctx2, crls, 0);
1890 [ # # ]: 0 : if (!args_ssl_call(ctx2, bio_err, cctx, ssl_args, no_ecdhe, no_jpake))
1891 : : goto end;
1892 : : }
1893 : :
1894 : : # ifndef OPENSSL_NO_NEXTPROTONEG
1895 [ # # ]: 0 : if (next_proto.data)
1896 : 0 : SSL_CTX_set_next_protos_advertised_cb(ctx, next_proto_cb, &next_proto);
1897 : : # endif
1898 [ # # ]: 0 : if (alpn_ctx.data)
1899 : 0 : SSL_CTX_set_alpn_select_cb(ctx, alpn_cb, &alpn_ctx);
1900 : : #endif
1901 : :
1902 : : #ifndef OPENSSL_NO_DH
1903 [ # # ]: 0 : if (!no_dhe)
1904 : : {
1905 : 0 : DH *dh=NULL;
1906 : :
1907 [ # # ]: 0 : if (dhfile)
1908 : 0 : dh = load_dh_param(dhfile);
1909 [ # # ]: 0 : else if (s_cert_file)
1910 : 0 : dh = load_dh_param(s_cert_file);
1911 : :
1912 [ # # ]: 0 : if (dh != NULL)
1913 : : {
1914 : 0 : BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1915 : : }
1916 : : else
1917 : : {
1918 : 0 : BIO_printf(bio_s_out,"Using default temp DH parameters\n");
1919 : : }
1920 : 0 : (void)BIO_flush(bio_s_out);
1921 : :
1922 [ # # ]: 0 : if (dh == NULL)
1923 : 0 : SSL_CTX_set_dh_auto(ctx, 1);
1924 [ # # ]: 0 : else if (!SSL_CTX_set_tmp_dh(ctx,dh))
1925 : : {
1926 : 0 : BIO_puts(bio_err, "Error setting temp DH parameters\n");
1927 : 0 : ERR_print_errors(bio_err);
1928 : 0 : DH_free(dh);
1929 : 0 : goto end;
1930 : : }
1931 : : #ifndef OPENSSL_NO_TLSEXT
1932 [ # # ]: 0 : if (ctx2)
1933 : : {
1934 [ # # ]: 0 : if (!dhfile)
1935 : : {
1936 : 0 : DH *dh2=load_dh_param(s_cert_file2);
1937 [ # # ]: 0 : if (dh2 != NULL)
1938 : : {
1939 : 0 : BIO_printf(bio_s_out,"Setting temp DH parameters\n");
1940 : 0 : (void)BIO_flush(bio_s_out);
1941 : :
1942 : 0 : DH_free(dh);
1943 : 0 : dh = dh2;
1944 : : }
1945 : : }
1946 [ # # ]: 0 : if (dh == NULL)
1947 : 0 : SSL_CTX_set_dh_auto(ctx2, 1);
1948 [ # # ]: 0 : else if (!SSL_CTX_set_tmp_dh(ctx2,dh))
1949 : : {
1950 : 0 : BIO_puts(bio_err, "Error setting temp DH parameters\n");
1951 : 0 : ERR_print_errors(bio_err);
1952 : 0 : DH_free(dh);
1953 : 0 : goto end;
1954 : : }
1955 : : }
1956 : : #endif
1957 : 0 : DH_free(dh);
1958 : : }
1959 : : #endif
1960 : :
1961 [ # # ]: 0 : if (!set_cert_key_stuff(ctx, s_cert, s_key, s_chain, build_chain))
1962 : : goto end;
1963 : : #ifndef OPENSSL_NO_TLSEXT
1964 [ # # ]: 0 : if (s_serverinfo_file != NULL
1965 [ # # ]: 0 : && !SSL_CTX_use_serverinfo_file(ctx, s_serverinfo_file))
1966 : : {
1967 : 0 : ERR_print_errors(bio_err);
1968 : 0 : goto end;
1969 : : }
1970 : : #endif
1971 : : #ifndef OPENSSL_NO_TLSEXT
1972 [ # # ][ # # ]: 0 : if (ctx2 && !set_cert_key_stuff(ctx2,s_cert2,s_key2, NULL, build_chain))
1973 : : goto end;
1974 : : #endif
1975 [ # # ]: 0 : if (s_dcert != NULL)
1976 : : {
1977 [ # # ]: 0 : if (!set_cert_key_stuff(ctx, s_dcert, s_dkey, s_dchain, build_chain))
1978 : : goto end;
1979 : : }
1980 : :
1981 : : #ifndef OPENSSL_NO_RSA
1982 : : #if 1
1983 [ # # ]: 0 : if (!no_tmp_rsa)
1984 : : {
1985 : 0 : SSL_CTX_set_tmp_rsa_callback(ctx,tmp_rsa_cb);
1986 : : #ifndef OPENSSL_NO_TLSEXT
1987 [ # # ]: 0 : if (ctx2)
1988 : 0 : SSL_CTX_set_tmp_rsa_callback(ctx2,tmp_rsa_cb);
1989 : : #endif
1990 : : }
1991 : : #else
1992 : : if (!no_tmp_rsa && SSL_CTX_need_tmp_RSA(ctx))
1993 : : {
1994 : : RSA *rsa;
1995 : :
1996 : : BIO_printf(bio_s_out,"Generating temp (512 bit) RSA key...");
1997 : : BIO_flush(bio_s_out);
1998 : :
1999 : : rsa=RSA_generate_key(512,RSA_F4,NULL);
2000 : :
2001 : : if (!SSL_CTX_set_tmp_rsa(ctx,rsa))
2002 : : {
2003 : : ERR_print_errors(bio_err);
2004 : : goto end;
2005 : : }
2006 : : #ifndef OPENSSL_NO_TLSEXT
2007 : : if (ctx2)
2008 : : {
2009 : : if (!SSL_CTX_set_tmp_rsa(ctx2,rsa))
2010 : : {
2011 : : ERR_print_errors(bio_err);
2012 : : goto end;
2013 : : }
2014 : : }
2015 : : #endif
2016 : : RSA_free(rsa);
2017 : : BIO_printf(bio_s_out,"\n");
2018 : : }
2019 : : #endif
2020 : : #endif
2021 : :
2022 [ # # ]: 0 : if (no_resume_ephemeral)
2023 : : {
2024 : 0 : SSL_CTX_set_not_resumable_session_callback(ctx, not_resumable_sess_cb);
2025 : : #ifndef OPENSSL_NO_TLSEXT
2026 [ # # ]: 0 : if (ctx2)
2027 : 0 : SSL_CTX_set_not_resumable_session_callback(ctx2, not_resumable_sess_cb);
2028 : : #endif
2029 : : }
2030 : :
2031 : : #ifndef OPENSSL_NO_PSK
2032 : : #ifdef OPENSSL_NO_JPAKE
2033 [ # # ]: 0 : if (psk_key != NULL)
2034 : : #else
2035 : : if (psk_key != NULL || jpake_secret)
2036 : : #endif
2037 : : {
2038 [ # # ]: 0 : if (s_debug)
2039 : 0 : BIO_printf(bio_s_out, "PSK key given or JPAKE in use, setting server callback\n");
2040 : 0 : SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
2041 : : }
2042 : :
2043 [ # # ]: 0 : if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint))
2044 : : {
2045 : 0 : BIO_printf(bio_err,"error setting PSK identity hint to context\n");
2046 : 0 : ERR_print_errors(bio_err);
2047 : 0 : goto end;
2048 : : }
2049 : : #endif
2050 : :
2051 : 0 : SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
2052 : 0 : SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,
2053 : : sizeof s_server_session_id_context);
2054 : :
2055 : : /* Set DTLS cookie generation and verification callbacks */
2056 : 0 : SSL_CTX_set_cookie_generate_cb(ctx, generate_cookie_callback);
2057 : 0 : SSL_CTX_set_cookie_verify_cb(ctx, verify_cookie_callback);
2058 : :
2059 : : #ifndef OPENSSL_NO_TLSEXT
2060 [ # # ]: 0 : if (ctx2)
2061 : : {
2062 : 0 : SSL_CTX_set_verify(ctx2,s_server_verify,verify_callback);
2063 : 0 : SSL_CTX_set_session_id_context(ctx2,(void*)&s_server_session_id_context,
2064 : : sizeof s_server_session_id_context);
2065 : :
2066 : 0 : tlsextcbp.biodebug = bio_s_out;
2067 : 0 : SSL_CTX_set_tlsext_servername_callback(ctx2, ssl_servername_cb);
2068 : 0 : SSL_CTX_set_tlsext_servername_arg(ctx2, &tlsextcbp);
2069 : 0 : SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
2070 : 0 : SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
2071 : : }
2072 : : #endif
2073 : :
2074 : : #ifndef OPENSSL_NO_SRP
2075 [ # # ]: 0 : if (srp_verifier_file != NULL)
2076 : : {
2077 : 0 : srp_callback_parm.vb = SRP_VBASE_new(srpuserseed);
2078 : 0 : srp_callback_parm.user = NULL;
2079 : 0 : srp_callback_parm.login = NULL;
2080 [ # # ]: 0 : if ((ret = SRP_VBASE_init(srp_callback_parm.vb, srp_verifier_file)) != SRP_NO_ERROR)
2081 : : {
2082 : 0 : BIO_printf(bio_err,
2083 : : "Cannot initialize SRP verifier file \"%s\":ret=%d\n",
2084 : : srp_verifier_file, ret);
2085 : 0 : goto end;
2086 : : }
2087 : 0 : SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE,verify_callback);
2088 : 0 : SSL_CTX_set_srp_cb_arg(ctx, &srp_callback_parm);
2089 : 0 : SSL_CTX_set_srp_username_callback(ctx, ssl_srp_server_param_cb);
2090 : : }
2091 : : else
2092 : : #endif
2093 [ # # ]: 0 : if (CAfile != NULL)
2094 : : {
2095 : 0 : SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
2096 : : #ifndef OPENSSL_NO_TLSEXT
2097 [ # # ]: 0 : if (ctx2)
2098 : 0 : SSL_CTX_set_client_CA_list(ctx2,SSL_load_client_CA_file(CAfile));
2099 : : #endif
2100 : : }
2101 : :
2102 : 0 : BIO_printf(bio_s_out,"ACCEPT\n");
2103 : 0 : (void)BIO_flush(bio_s_out);
2104 [ # # ]: 0 : if (rev)
2105 : : server_cb = rev_body;
2106 [ # # ]: 0 : else if (www)
2107 : : server_cb = www_body;
2108 : : else
2109 : 0 : server_cb = sv_body;
2110 : : #ifndef NO_SYS_UN_H
2111 [ # # ]: 0 : if (unix_path)
2112 : : {
2113 [ # # ]: 0 : if (unlink_unix_path)
2114 : 0 : unlink(unix_path);
2115 : 0 : do_server_unix(unix_path,&accept_socket,server_cb, context, naccept);
2116 : : }
2117 : : else
2118 : : #endif
2119 : 0 : do_server(port,socket_type,&accept_socket,server_cb, context, naccept);
2120 : 0 : print_stats(bio_s_out,ctx);
2121 : 0 : ret=0;
2122 : : end:
2123 [ # # ]: 0 : if (ctx != NULL) SSL_CTX_free(ctx);
2124 [ # # ]: 0 : if (s_cert)
2125 : 0 : X509_free(s_cert);
2126 [ # # ]: 0 : if (crls)
2127 : 0 : sk_X509_CRL_pop_free(crls, X509_CRL_free);
2128 [ # # ]: 0 : if (s_dcert)
2129 : 0 : X509_free(s_dcert);
2130 [ # # ]: 0 : if (s_key)
2131 : 0 : EVP_PKEY_free(s_key);
2132 [ # # ]: 0 : if (s_dkey)
2133 : 0 : EVP_PKEY_free(s_dkey);
2134 [ # # ]: 0 : if (s_chain)
2135 : 0 : sk_X509_pop_free(s_chain, X509_free);
2136 [ # # ]: 0 : if (s_dchain)
2137 : 0 : sk_X509_pop_free(s_dchain, X509_free);
2138 [ # # ]: 0 : if (pass)
2139 : 0 : OPENSSL_free(pass);
2140 [ # # ]: 0 : if (dpass)
2141 : 0 : OPENSSL_free(dpass);
2142 [ # # ]: 0 : if (vpm)
2143 : 0 : X509_VERIFY_PARAM_free(vpm);
2144 : 0 : free_sessions();
2145 : : #ifndef OPENSSL_NO_TLSEXT
2146 [ # # ]: 0 : if (tlscstatp.host)
2147 : 0 : OPENSSL_free(tlscstatp.host);
2148 [ # # ]: 0 : if (tlscstatp.port)
2149 : 0 : OPENSSL_free(tlscstatp.port);
2150 [ # # ]: 0 : if (tlscstatp.path)
2151 : 0 : OPENSSL_free(tlscstatp.path);
2152 [ # # ]: 0 : if (ctx2 != NULL) SSL_CTX_free(ctx2);
2153 [ # # ]: 0 : if (s_cert2)
2154 : 0 : X509_free(s_cert2);
2155 [ # # ]: 0 : if (s_key2)
2156 : 0 : EVP_PKEY_free(s_key2);
2157 [ # # ]: 0 : if (serverinfo_in != NULL)
2158 : 0 : BIO_free(serverinfo_in);
2159 : : # ifndef OPENSSL_NO_NEXTPROTONEG
2160 [ # # ]: 0 : if (next_proto.data)
2161 : 0 : OPENSSL_free(next_proto.data);
2162 : : # endif
2163 [ # # ]: 0 : if (alpn_ctx.data)
2164 : 0 : OPENSSL_free(alpn_ctx.data);
2165 : : #endif
2166 : 0 : ssl_excert_free(exc);
2167 [ # # ]: 0 : if (ssl_args)
2168 : 0 : sk_OPENSSL_STRING_free(ssl_args);
2169 [ # # ]: 0 : if (cctx)
2170 : 0 : SSL_CONF_CTX_free(cctx);
2171 : : #ifndef OPENSSL_NO_JPAKE
2172 : : if (jpake_secret && psk_key)
2173 : : OPENSSL_free(psk_key);
2174 : : #endif
2175 [ # # ]: 0 : if (bio_s_out != NULL)
2176 : : {
2177 : 0 : BIO_free(bio_s_out);
2178 : 0 : bio_s_out=NULL;
2179 : : }
2180 [ # # ]: 0 : if (bio_s_msg != NULL)
2181 : : {
2182 : 0 : BIO_free(bio_s_msg);
2183 : 0 : bio_s_msg = NULL;
2184 : : }
2185 : : apps_shutdown();
2186 : 0 : OPENSSL_EXIT(ret);
2187 : : }
2188 : :
2189 : 0 : static void print_stats(BIO *bio, SSL_CTX *ssl_ctx)
2190 : : {
2191 : 0 : BIO_printf(bio,"%4ld items in the session cache\n",
2192 : : SSL_CTX_sess_number(ssl_ctx));
2193 : 0 : BIO_printf(bio,"%4ld client connects (SSL_connect())\n",
2194 : : SSL_CTX_sess_connect(ssl_ctx));
2195 : 0 : BIO_printf(bio,"%4ld client renegotiates (SSL_connect())\n",
2196 : : SSL_CTX_sess_connect_renegotiate(ssl_ctx));
2197 : 0 : BIO_printf(bio,"%4ld client connects that finished\n",
2198 : : SSL_CTX_sess_connect_good(ssl_ctx));
2199 : 0 : BIO_printf(bio,"%4ld server accepts (SSL_accept())\n",
2200 : : SSL_CTX_sess_accept(ssl_ctx));
2201 : 0 : BIO_printf(bio,"%4ld server renegotiates (SSL_accept())\n",
2202 : : SSL_CTX_sess_accept_renegotiate(ssl_ctx));
2203 : 0 : BIO_printf(bio,"%4ld server accepts that finished\n",
2204 : : SSL_CTX_sess_accept_good(ssl_ctx));
2205 : 0 : BIO_printf(bio,"%4ld session cache hits\n",SSL_CTX_sess_hits(ssl_ctx));
2206 : 0 : BIO_printf(bio,"%4ld session cache misses\n",SSL_CTX_sess_misses(ssl_ctx));
2207 : 0 : BIO_printf(bio,"%4ld session cache timeouts\n",SSL_CTX_sess_timeouts(ssl_ctx));
2208 : 0 : BIO_printf(bio,"%4ld callback cache hits\n",SSL_CTX_sess_cb_hits(ssl_ctx));
2209 : 0 : BIO_printf(bio,"%4ld cache full overflows (%ld allowed)\n",
2210 : : SSL_CTX_sess_cache_full(ssl_ctx),
2211 : : SSL_CTX_sess_get_cache_size(ssl_ctx));
2212 : 0 : }
2213 : :
2214 : 0 : static int sv_body(char *hostname, int s, int stype, unsigned char *context)
2215 : : {
2216 : 0 : char *buf=NULL;
2217 : : fd_set readfds;
2218 : 0 : int ret=1,width;
2219 : : int k,i;
2220 : : unsigned long l;
2221 : 0 : SSL *con=NULL;
2222 : : BIO *sbio;
2223 : : #ifndef OPENSSL_NO_KRB5
2224 : : KSSL_CTX *kctx;
2225 : : #endif
2226 : : struct timeval timeout;
2227 : : #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
2228 : : struct timeval tv;
2229 : : #else
2230 : : struct timeval *timeoutp;
2231 : : #endif
2232 : :
2233 [ # # ]: 0 : if ((buf=OPENSSL_malloc(bufsize)) == NULL)
2234 : : {
2235 : 0 : BIO_printf(bio_err,"out of memory\n");
2236 : 0 : goto err;
2237 : : }
2238 : : #ifdef FIONBIO
2239 [ # # ]: 0 : if (s_nbio)
2240 : : {
2241 : 0 : unsigned long sl=1;
2242 : :
2243 [ # # ]: 0 : if (!s_quiet)
2244 : 0 : BIO_printf(bio_err,"turning on non blocking io\n");
2245 [ # # ]: 0 : if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
2246 : 0 : ERR_print_errors(bio_err);
2247 : : }
2248 : : #endif
2249 : :
2250 : : if (con == NULL) {
2251 : 0 : con=SSL_new(ctx);
2252 : : #ifndef OPENSSL_NO_TLSEXT
2253 [ # # ]: 0 : if (s_tlsextdebug)
2254 : : {
2255 : 0 : SSL_set_tlsext_debug_callback(con, tlsext_cb);
2256 : 0 : SSL_set_tlsext_debug_arg(con, bio_s_out);
2257 : : }
2258 [ # # ]: 0 : if (s_tlsextstatus)
2259 : : {
2260 : 0 : SSL_CTX_set_tlsext_status_cb(ctx, cert_status_cb);
2261 : 0 : tlscstatp.err = bio_err;
2262 : 0 : SSL_CTX_set_tlsext_status_arg(ctx, &tlscstatp);
2263 : : }
2264 : : #endif
2265 : : #ifndef OPENSSL_NO_KRB5
2266 : : if ((kctx = kssl_ctx_new()) != NULL)
2267 : : {
2268 : : SSL_set0_kssl_ctx(con, kctx);
2269 : : kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
2270 : : kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
2271 : : }
2272 : : #endif /* OPENSSL_NO_KRB5 */
2273 [ # # ]: 0 : if(context)
2274 : 0 : SSL_set_session_id_context(con, context,
2275 : 0 : strlen((char *)context));
2276 : : }
2277 : 0 : SSL_clear(con);
2278 : : #if 0
2279 : : #ifdef TLSEXT_TYPE_opaque_prf_input
2280 : : SSL_set_tlsext_opaque_prf_input(con, "Test server", 11);
2281 : : #endif
2282 : : #endif
2283 : :
2284 [ # # ]: 0 : if (stype == SOCK_DGRAM)
2285 : : {
2286 : :
2287 : 0 : sbio=BIO_new_dgram(s,BIO_NOCLOSE);
2288 : :
2289 [ # # ]: 0 : if (enable_timeouts)
2290 : : {
2291 : 0 : timeout.tv_sec = 0;
2292 : 0 : timeout.tv_usec = DGRAM_RCV_TIMEOUT;
2293 : 0 : BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
2294 : :
2295 : 0 : timeout.tv_sec = 0;
2296 : 0 : timeout.tv_usec = DGRAM_SND_TIMEOUT;
2297 : 0 : BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
2298 : : }
2299 : :
2300 [ # # ]: 0 : if (socket_mtu > 28)
2301 : : {
2302 : 0 : SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
2303 : 0 : SSL_set_mtu(con, socket_mtu - 28);
2304 : : }
2305 : : else
2306 : : /* want to do MTU discovery */
2307 : 0 : BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
2308 : :
2309 : : /* turn on cookie exchange */
2310 : 0 : SSL_set_options(con, SSL_OP_COOKIE_EXCHANGE);
2311 : : }
2312 : : else
2313 : 0 : sbio=BIO_new_socket(s,BIO_NOCLOSE);
2314 : :
2315 [ # # ]: 0 : if (s_nbio_test)
2316 : : {
2317 : : BIO *test;
2318 : :
2319 : 0 : test=BIO_new(BIO_f_nbio_test());
2320 : 0 : sbio=BIO_push(test,sbio);
2321 : : }
2322 : : #ifndef OPENSSL_NO_JPAKE
2323 : : if(jpake_secret)
2324 : : jpake_server_auth(bio_s_out, sbio, jpake_secret);
2325 : : #endif
2326 : :
2327 : 0 : SSL_set_bio(con,sbio,sbio);
2328 : 0 : SSL_set_accept_state(con);
2329 : : /* SSL_set_fd(con,s); */
2330 : :
2331 [ # # ]: 0 : if (s_debug)
2332 : : {
2333 : 0 : SSL_set_debug(con, 1);
2334 : 0 : BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
2335 : 0 : BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
2336 : : }
2337 [ # # ]: 0 : if (s_msg)
2338 : : {
2339 : : #ifndef OPENSSL_NO_SSL_TRACE
2340 : : if (s_msg == 2)
2341 : : SSL_set_msg_callback(con, SSL_trace);
2342 : : else
2343 : : #endif
2344 : 0 : SSL_set_msg_callback(con, msg_cb);
2345 [ # # ]: 0 : SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
2346 : : }
2347 : : #ifndef OPENSSL_NO_TLSEXT
2348 [ # # ]: 0 : if (s_tlsextdebug)
2349 : : {
2350 : 0 : SSL_set_tlsext_debug_callback(con, tlsext_cb);
2351 : 0 : SSL_set_tlsext_debug_arg(con, bio_s_out);
2352 : : }
2353 : : #endif
2354 : :
2355 : 0 : width=s+1;
2356 : : for (;;)
2357 : : {
2358 : : int read_from_terminal;
2359 : : int read_from_sslcon;
2360 : :
2361 : 0 : read_from_terminal = 0;
2362 : 0 : read_from_sslcon = SSL_pending(con);
2363 : :
2364 [ # # ]: 0 : if (!read_from_sslcon)
2365 : : {
2366 : 0 : FD_ZERO(&readfds);
2367 : : #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined(OPENSSL_SYS_BEOS_R5)
2368 [ # # ][ # # ]: 0 : openssl_fdset(fileno(stdin),&readfds);
2369 : : #endif
2370 [ # # ][ # # ]: 0 : openssl_fdset(s,&readfds);
2371 : : /* Note: under VMS with SOCKETSHR the second parameter is
2372 : : * currently of type (int *) whereas under other systems
2373 : : * it is (void *) if you don't have a cast it will choke
2374 : : * the compiler: if you do have a cast then you can either
2375 : : * go for (int *) or (void *).
2376 : : */
2377 : : #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE)
2378 : : /* Under DOS (non-djgpp) and Windows we can't select on stdin: only
2379 : : * on sockets. As a workaround we timeout the select every
2380 : : * second and check for any keypress. In a proper Windows
2381 : : * application we wouldn't do this because it is inefficient.
2382 : : */
2383 : : tv.tv_sec = 1;
2384 : : tv.tv_usec = 0;
2385 : : i=select(width,(void *)&readfds,NULL,NULL,&tv);
2386 : : if((i < 0) || (!i && !_kbhit() ) )continue;
2387 : : if(_kbhit())
2388 : : read_from_terminal = 1;
2389 : : #elif defined(OPENSSL_SYS_BEOS_R5)
2390 : : /* Under BeOS-R5 the situation is similar to DOS */
2391 : : tv.tv_sec = 1;
2392 : : tv.tv_usec = 0;
2393 : : (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
2394 : : i=select(width,(void *)&readfds,NULL,NULL,&tv);
2395 : : if ((i < 0) || (!i && read(fileno(stdin), buf, 0) < 0))
2396 : : continue;
2397 : : if (read(fileno(stdin), buf, 0) >= 0)
2398 : : read_from_terminal = 1;
2399 : : (void)fcntl(fileno(stdin), F_SETFL, 0);
2400 : : #else
2401 [ # # # # ]: 0 : if ((SSL_version(con) == DTLS1_VERSION) &&
2402 : 0 : DTLSv1_get_timeout(con, &timeout))
2403 : : timeoutp = &timeout;
2404 : : else
2405 : : timeoutp = NULL;
2406 : :
2407 : 0 : i=select(width,(void *)&readfds,NULL,NULL,timeoutp);
2408 : :
2409 [ # # ][ # # ]: 0 : if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
2410 : : {
2411 : 0 : BIO_printf(bio_err,"TIMEOUT occurred\n");
2412 : : }
2413 : :
2414 [ # # ]: 0 : if (i <= 0) continue;
2415 [ # # ][ # # ]: 0 : if (FD_ISSET(fileno(stdin),&readfds))
[ # # ]
2416 : 0 : read_from_terminal = 1;
2417 : : #endif
2418 [ # # ][ # # ]: 0 : if (FD_ISSET(s,&readfds))
[ # # ]
2419 : 0 : read_from_sslcon = 1;
2420 : : }
2421 [ # # ]: 0 : if (read_from_terminal)
2422 : : {
2423 [ # # ]: 0 : if (s_crlf)
2424 : : {
2425 : : int j, lf_num;
2426 : :
2427 : 0 : i=raw_read_stdin(buf, bufsize/2);
2428 : 0 : lf_num = 0;
2429 : : /* both loops are skipped when i <= 0 */
2430 [ # # ]: 0 : for (j = 0; j < i; j++)
2431 [ # # ]: 0 : if (buf[j] == '\n')
2432 : 0 : lf_num++;
2433 [ # # ]: 0 : for (j = i-1; j >= 0; j--)
2434 : : {
2435 : 0 : buf[j+lf_num] = buf[j];
2436 [ # # ]: 0 : if (buf[j] == '\n')
2437 : : {
2438 : 0 : lf_num--;
2439 : 0 : i++;
2440 : 0 : buf[j+lf_num] = '\r';
2441 : : }
2442 : : }
2443 [ # # ]: 0 : assert(lf_num == 0);
2444 : : }
2445 : : else
2446 : 0 : i=raw_read_stdin(buf,bufsize);
2447 [ # # ][ # # ]: 0 : if (!s_quiet && !s_brief)
2448 : : {
2449 [ # # ][ # # ]: 0 : if ((i <= 0) || (buf[0] == 'Q'))
2450 : : {
2451 : 0 : BIO_printf(bio_s_out,"DONE\n");
2452 : 0 : SHUTDOWN(s);
2453 : 0 : close_accept_socket();
2454 : 0 : ret= -11;
2455 : 0 : goto err;
2456 : : }
2457 [ # # ][ # # ]: 0 : if ((i <= 0) || (buf[0] == 'q'))
2458 : : {
2459 : 0 : BIO_printf(bio_s_out,"DONE\n");
2460 [ # # ]: 0 : if (SSL_version(con) != DTLS1_VERSION)
2461 : 0 : SHUTDOWN(s);
2462 : : /* close_accept_socket();
2463 : : ret= -11;*/
2464 : : goto err;
2465 : : }
2466 : :
2467 : : #ifndef OPENSSL_NO_HEARTBEATS
2468 [ # # ][ # # ]: 0 : if ((buf[0] == 'B') &&
2469 : 0 : ((buf[1] == '\n') || (buf[1] == '\r')))
2470 : : {
2471 : 0 : BIO_printf(bio_err,"HEARTBEATING\n");
2472 : 0 : SSL_heartbeat(con);
2473 : 0 : i=0;
2474 : 0 : continue;
2475 : : }
2476 : : #endif
2477 [ # # ][ # # ]: 0 : if ((buf[0] == 'r') &&
2478 : 0 : ((buf[1] == '\n') || (buf[1] == '\r')))
2479 : : {
2480 : 0 : SSL_renegotiate(con);
2481 : 0 : i=SSL_do_handshake(con);
2482 : : printf("SSL_do_handshake -> %d\n",i);
2483 : 0 : i=0; /*13; */
2484 : 0 : continue;
2485 : : /* strcpy(buf,"server side RE-NEGOTIATE\n"); */
2486 : : }
2487 [ # # ][ # # ]: 0 : if ((buf[0] == 'R') &&
2488 : 0 : ((buf[1] == '\n') || (buf[1] == '\r')))
2489 : : {
2490 : 0 : SSL_set_verify(con,
2491 : : SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
2492 : 0 : SSL_renegotiate(con);
2493 : 0 : i=SSL_do_handshake(con);
2494 : : printf("SSL_do_handshake -> %d\n",i);
2495 : 0 : i=0; /* 13; */
2496 : 0 : continue;
2497 : : /* strcpy(buf,"server side RE-NEGOTIATE asking for client cert\n"); */
2498 : : }
2499 [ # # ]: 0 : if (buf[0] == 'P')
2500 : : {
2501 : : static const char *str="Lets print some clear text\n";
2502 : 0 : BIO_write(SSL_get_wbio(con),str,strlen(str));
2503 : : }
2504 [ # # ]: 0 : if (buf[0] == 'S')
2505 : : {
2506 : 0 : print_stats(bio_s_out,SSL_get_SSL_CTX(con));
2507 : : }
2508 : : }
2509 : : #ifdef CHARSET_EBCDIC
2510 : : ebcdic2ascii(buf,buf,i);
2511 : : #endif
2512 : : l=k=0;
2513 : : for (;;)
2514 : : {
2515 : : /* should do a select for the write */
2516 : : #ifdef RENEG
2517 : : { static count=0; if (++count == 100) { count=0; SSL_renegotiate(con); } }
2518 : : #endif
2519 : 0 : k=SSL_write(con,&(buf[l]),(unsigned int)i);
2520 : : #ifndef OPENSSL_NO_SRP
2521 [ # # ]: 0 : while (SSL_get_error(con,k) == SSL_ERROR_WANT_X509_LOOKUP)
2522 : : {
2523 : 0 : BIO_printf(bio_s_out,"LOOKUP renego during write\n");
2524 : 0 : srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2525 [ # # ]: 0 : if (srp_callback_parm.user)
2526 : 0 : BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2527 : : else
2528 : 0 : BIO_printf(bio_s_out,"LOOKUP not successful\n");
2529 : 0 : k=SSL_write(con,&(buf[l]),(unsigned int)i);
2530 : : }
2531 : : #endif
2532 [ # # # # ]: 0 : switch (SSL_get_error(con,k))
2533 : : {
2534 : : case SSL_ERROR_NONE:
2535 : : break;
2536 : : case SSL_ERROR_WANT_WRITE:
2537 : : case SSL_ERROR_WANT_READ:
2538 : : case SSL_ERROR_WANT_X509_LOOKUP:
2539 : 0 : BIO_printf(bio_s_out,"Write BLOCK\n");
2540 : 0 : break;
2541 : : case SSL_ERROR_SYSCALL:
2542 : : case SSL_ERROR_SSL:
2543 : 0 : BIO_printf(bio_s_out,"ERROR\n");
2544 : 0 : ERR_print_errors(bio_err);
2545 : 0 : ret=1;
2546 : 0 : goto err;
2547 : : /* break; */
2548 : : case SSL_ERROR_ZERO_RETURN:
2549 : 0 : BIO_printf(bio_s_out,"DONE\n");
2550 : 0 : ret=1;
2551 : 0 : goto err;
2552 : : }
2553 : 0 : l+=k;
2554 : 0 : i-=k;
2555 [ # # ]: 0 : if (i <= 0) break;
2556 : : }
2557 : : }
2558 [ # # ]: 0 : if (read_from_sslcon)
2559 : : {
2560 [ # # ]: 0 : if (!SSL_is_init_finished(con))
2561 : : {
2562 : 0 : i=init_ssl_connection(con);
2563 : :
2564 [ # # ]: 0 : if (i < 0)
2565 : : {
2566 : : ret=0;
2567 : : goto err;
2568 : : }
2569 [ # # ]: 0 : else if (i == 0)
2570 : : {
2571 : : ret=1;
2572 : : goto err;
2573 : : }
2574 : : }
2575 : : else
2576 : : {
2577 : : again:
2578 : 0 : i=SSL_read(con,(char *)buf,bufsize);
2579 : : #ifndef OPENSSL_NO_SRP
2580 [ # # ]: 0 : while (SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2581 : : {
2582 : 0 : BIO_printf(bio_s_out,"LOOKUP renego during read\n");
2583 : 0 : srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2584 [ # # ]: 0 : if (srp_callback_parm.user)
2585 : 0 : BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2586 : : else
2587 : 0 : BIO_printf(bio_s_out,"LOOKUP not successful\n");
2588 : 0 : i=SSL_read(con,(char *)buf,bufsize);
2589 : : }
2590 : : #endif
2591 [ # # # # : 0 : switch (SSL_get_error(con,i))
# ]
2592 : : {
2593 : : case SSL_ERROR_NONE:
2594 : : #ifdef CHARSET_EBCDIC
2595 : : ascii2ebcdic(buf,buf,i);
2596 : : #endif
2597 : 0 : raw_write_stdout(buf,
2598 : : (unsigned int)i);
2599 [ # # ]: 0 : if (SSL_pending(con)) goto again;
2600 : : break;
2601 : : case SSL_ERROR_WANT_WRITE:
2602 : : case SSL_ERROR_WANT_READ:
2603 : 0 : BIO_printf(bio_s_out,"Read BLOCK\n");
2604 : 0 : break;
2605 : : case SSL_ERROR_SYSCALL:
2606 : : case SSL_ERROR_SSL:
2607 : 0 : BIO_printf(bio_s_out,"ERROR\n");
2608 : 0 : ERR_print_errors(bio_err);
2609 : 0 : ret=1;
2610 : 0 : goto err;
2611 : : case SSL_ERROR_ZERO_RETURN:
2612 : 0 : BIO_printf(bio_s_out,"DONE\n");
2613 : 0 : ret=1;
2614 : 0 : goto err;
2615 : : }
2616 : : }
2617 : : }
2618 : : }
2619 : : err:
2620 [ # # ]: 0 : if (con != NULL)
2621 : : {
2622 : 0 : BIO_printf(bio_s_out,"shutting down SSL\n");
2623 : : #if 1
2624 : 0 : SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
2625 : : #else
2626 : : SSL_shutdown(con);
2627 : : #endif
2628 : 0 : SSL_free(con);
2629 : : }
2630 : 0 : BIO_printf(bio_s_out,"CONNECTION CLOSED\n");
2631 [ # # ]: 0 : if (buf != NULL)
2632 : : {
2633 : 0 : OPENSSL_cleanse(buf,bufsize);
2634 : 0 : OPENSSL_free(buf);
2635 : : }
2636 [ # # ]: 0 : if (ret >= 0)
2637 : 0 : BIO_printf(bio_s_out,"ACCEPT\n");
2638 : 0 : return(ret);
2639 : : }
2640 : :
2641 : 0 : static void close_accept_socket(void)
2642 : : {
2643 : 0 : BIO_printf(bio_err,"shutdown accept socket\n");
2644 [ # # ]: 0 : if (accept_socket >= 0)
2645 : : {
2646 : 0 : SHUTDOWN2(accept_socket);
2647 : : }
2648 : 0 : }
2649 : :
2650 : 0 : static int init_ssl_connection(SSL *con)
2651 : : {
2652 : : int i;
2653 : : const char *str;
2654 : : X509 *peer;
2655 : : long verify_error;
2656 : : MS_STATIC char buf[BUFSIZ];
2657 : : #ifndef OPENSSL_NO_KRB5
2658 : : char *client_princ;
2659 : : #endif
2660 : : #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2661 : : const unsigned char *next_proto_neg;
2662 : : unsigned next_proto_neg_len;
2663 : : #endif
2664 : : unsigned char *exportedkeymat;
2665 : :
2666 : :
2667 : 0 : i=SSL_accept(con);
2668 : : #ifdef CERT_CB_TEST_RETRY
2669 : : {
2670 : : while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP && SSL_state(con) == SSL3_ST_SR_CLNT_HELLO_C)
2671 : : {
2672 : : fprintf(stderr, "LOOKUP from certificate callback during accept\n");
2673 : : i=SSL_accept(con);
2674 : : }
2675 : : }
2676 : : #endif
2677 : : #ifndef OPENSSL_NO_SRP
2678 [ # # ][ # # ]: 0 : while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2679 : : {
2680 : 0 : BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login);
2681 : 0 : srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2682 [ # # ]: 0 : if (srp_callback_parm.user)
2683 : 0 : BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2684 : : else
2685 : 0 : BIO_printf(bio_s_out,"LOOKUP not successful\n");
2686 : 0 : i=SSL_accept(con);
2687 : : }
2688 : : #endif
2689 : :
2690 [ # # ]: 0 : if (i <= 0)
2691 : : {
2692 [ # # ]: 0 : if (BIO_sock_should_retry(i))
2693 : : {
2694 : 0 : BIO_printf(bio_s_out,"DELAY\n");
2695 : 0 : return(1);
2696 : : }
2697 : :
2698 : 0 : BIO_printf(bio_err,"ERROR\n");
2699 : 0 : verify_error=SSL_get_verify_result(con);
2700 [ # # ]: 0 : if (verify_error != X509_V_OK)
2701 : : {
2702 : 0 : BIO_printf(bio_err,"verify error:%s\n",
2703 : : X509_verify_cert_error_string(verify_error));
2704 : : }
2705 : : /* Always print any error messages */
2706 : 0 : ERR_print_errors(bio_err);
2707 : 0 : return(0);
2708 : : }
2709 : :
2710 [ # # ]: 0 : if (s_brief)
2711 : 0 : print_ssl_summary(bio_err, con);
2712 : :
2713 : 0 : PEM_write_bio_SSL_SESSION(bio_s_out,SSL_get_session(con));
2714 : :
2715 : 0 : peer=SSL_get_peer_certificate(con);
2716 [ # # ]: 0 : if (peer != NULL)
2717 : : {
2718 : 0 : BIO_printf(bio_s_out,"Client certificate\n");
2719 : 0 : PEM_write_bio_X509(bio_s_out,peer);
2720 : 0 : X509_NAME_oneline(X509_get_subject_name(peer),buf,sizeof buf);
2721 : 0 : BIO_printf(bio_s_out,"subject=%s\n",buf);
2722 : 0 : X509_NAME_oneline(X509_get_issuer_name(peer),buf,sizeof buf);
2723 : 0 : BIO_printf(bio_s_out,"issuer=%s\n",buf);
2724 : 0 : X509_free(peer);
2725 : : }
2726 : :
2727 [ # # ]: 0 : if (SSL_get_shared_ciphers(con,buf,sizeof buf) != NULL)
2728 : 0 : BIO_printf(bio_s_out,"Shared ciphers:%s\n",buf);
2729 : 0 : str=SSL_CIPHER_get_name(SSL_get_current_cipher(con));
2730 : 0 : ssl_print_sigalgs(bio_s_out, con);
2731 : : #ifndef OPENSSL_NO_EC
2732 : 0 : ssl_print_point_formats(bio_s_out, con);
2733 : 0 : ssl_print_curves(bio_s_out, con, 0);
2734 : : #endif
2735 [ # # ]: 0 : BIO_printf(bio_s_out,"CIPHER is %s\n",(str != NULL)?str:"(NONE)");
2736 : :
2737 : : #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2738 : 0 : SSL_get0_next_proto_negotiated(con, &next_proto_neg, &next_proto_neg_len);
2739 [ # # ]: 0 : if (next_proto_neg)
2740 : : {
2741 : 0 : BIO_printf(bio_s_out,"NEXTPROTO is ");
2742 : 0 : BIO_write(bio_s_out, next_proto_neg, next_proto_neg_len);
2743 : 0 : BIO_printf(bio_s_out, "\n");
2744 : : }
2745 : : #endif
2746 : : {
2747 : 0 : SRTP_PROTECTION_PROFILE *srtp_profile
2748 : : = SSL_get_selected_srtp_profile(con);
2749 : :
2750 [ # # ]: 0 : if(srtp_profile)
2751 : 0 : BIO_printf(bio_s_out,"SRTP Extension negotiated, profile=%s\n",
2752 : : srtp_profile->name);
2753 : : }
2754 [ # # ]: 0 : if (SSL_cache_hit(con)) BIO_printf(bio_s_out,"Reused session-id\n");
2755 [ # # ]: 0 : if (SSL_ctrl(con,SSL_CTRL_GET_FLAGS,0,NULL) &
2756 : : TLS1_FLAGS_TLS_PADDING_BUG)
2757 : 0 : BIO_printf(bio_s_out,
2758 : : "Peer has incorrect TLSv1 block padding\n");
2759 : : #ifndef OPENSSL_NO_KRB5
2760 : : client_princ = kssl_ctx_get0_client_princ(SSL_get0_kssl_ctx(con));
2761 : : if (client_princ != NULL)
2762 : : {
2763 : : BIO_printf(bio_s_out,"Kerberos peer principal is %s\n",
2764 : : client_princ);
2765 : : }
2766 : : #endif /* OPENSSL_NO_KRB5 */
2767 [ # # ]: 0 : BIO_printf(bio_s_out, "Secure Renegotiation IS%s supported\n",
2768 : 0 : SSL_get_secure_renegotiation_support(con) ? "" : " NOT");
2769 [ # # ]: 0 : if (keymatexportlabel != NULL)
2770 : : {
2771 : 0 : BIO_printf(bio_s_out, "Keying material exporter:\n");
2772 : 0 : BIO_printf(bio_s_out, " Label: '%s'\n", keymatexportlabel);
2773 : 0 : BIO_printf(bio_s_out, " Length: %i bytes\n",
2774 : : keymatexportlen);
2775 : 0 : exportedkeymat = OPENSSL_malloc(keymatexportlen);
2776 [ # # ]: 0 : if (exportedkeymat != NULL)
2777 : : {
2778 [ # # ]: 0 : if (!SSL_export_keying_material(con, exportedkeymat,
2779 : : keymatexportlen,
2780 : : keymatexportlabel,
2781 : : strlen(keymatexportlabel),
2782 : : NULL, 0, 0))
2783 : : {
2784 : 0 : BIO_printf(bio_s_out, " Error\n");
2785 : : }
2786 : : else
2787 : : {
2788 : 0 : BIO_printf(bio_s_out, " Keying material: ");
2789 [ # # ]: 0 : for (i=0; i<keymatexportlen; i++)
2790 : 0 : BIO_printf(bio_s_out, "%02X",
2791 : 0 : exportedkeymat[i]);
2792 : 0 : BIO_printf(bio_s_out, "\n");
2793 : : }
2794 : 0 : OPENSSL_free(exportedkeymat);
2795 : : }
2796 : : }
2797 : :
2798 : : return(1);
2799 : : }
2800 : :
2801 : : #ifndef OPENSSL_NO_DH
2802 : 0 : static DH *load_dh_param(const char *dhfile)
2803 : : {
2804 : 0 : DH *ret=NULL;
2805 : : BIO *bio;
2806 : :
2807 [ # # ]: 0 : if ((bio=BIO_new_file(dhfile,"r")) == NULL)
2808 : : goto err;
2809 : 0 : ret=PEM_read_bio_DHparams(bio,NULL,NULL,NULL);
2810 : : err:
2811 [ # # ]: 0 : if (bio != NULL) BIO_free(bio);
2812 : 0 : return(ret);
2813 : : }
2814 : : #endif
2815 : :
2816 : : #if 0
2817 : : static int load_CA(SSL_CTX *ctx, char *file)
2818 : : {
2819 : : FILE *in;
2820 : : X509 *x=NULL;
2821 : :
2822 : : if ((in=fopen(file,"r")) == NULL)
2823 : : return(0);
2824 : :
2825 : : for (;;)
2826 : : {
2827 : : if (PEM_read_X509(in,&x,NULL) == NULL)
2828 : : break;
2829 : : SSL_CTX_add_client_CA(ctx,x);
2830 : : }
2831 : : if (x != NULL) X509_free(x);
2832 : : fclose(in);
2833 : : return(1);
2834 : : }
2835 : : #endif
2836 : :
2837 : 0 : static int www_body(char *hostname, int s, int stype, unsigned char *context)
2838 : : {
2839 : 0 : char *buf=NULL;
2840 : 0 : int ret=1;
2841 : : int i,j,k,dot;
2842 : : SSL *con;
2843 : : const SSL_CIPHER *c;
2844 : : BIO *io,*ssl_bio,*sbio;
2845 : : #ifndef OPENSSL_NO_KRB5
2846 : : KSSL_CTX *kctx;
2847 : : #endif
2848 : :
2849 : 0 : buf=OPENSSL_malloc(bufsize);
2850 [ # # ]: 0 : if (buf == NULL) return(0);
2851 : 0 : io=BIO_new(BIO_f_buffer());
2852 : 0 : ssl_bio=BIO_new(BIO_f_ssl());
2853 [ # # ]: 0 : if ((io == NULL) || (ssl_bio == NULL)) goto err;
2854 : :
2855 : : #ifdef FIONBIO
2856 [ # # ]: 0 : if (s_nbio)
2857 : : {
2858 : 0 : unsigned long sl=1;
2859 : :
2860 [ # # ]: 0 : if (!s_quiet)
2861 : 0 : BIO_printf(bio_err,"turning on non blocking io\n");
2862 [ # # ]: 0 : if (BIO_socket_ioctl(s,FIONBIO,&sl) < 0)
2863 : 0 : ERR_print_errors(bio_err);
2864 : : }
2865 : : #endif
2866 : :
2867 : : /* lets make the output buffer a reasonable size */
2868 [ # # ]: 0 : if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
2869 : :
2870 [ # # ]: 0 : if ((con=SSL_new(ctx)) == NULL) goto err;
2871 : : #ifndef OPENSSL_NO_TLSEXT
2872 [ # # ]: 0 : if (s_tlsextdebug)
2873 : : {
2874 : 0 : SSL_set_tlsext_debug_callback(con, tlsext_cb);
2875 : 0 : SSL_set_tlsext_debug_arg(con, bio_s_out);
2876 : : }
2877 : : #endif
2878 : : #ifndef OPENSSL_NO_KRB5
2879 : : if ((kctx = kssl_ctx_new()) != NULL)
2880 : : {
2881 : : kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
2882 : : kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
2883 : : }
2884 : : #endif /* OPENSSL_NO_KRB5 */
2885 [ # # ]: 0 : if(context) SSL_set_session_id_context(con, context,
2886 : 0 : strlen((char *)context));
2887 : :
2888 : 0 : sbio=BIO_new_socket(s,BIO_NOCLOSE);
2889 [ # # ]: 0 : if (s_nbio_test)
2890 : : {
2891 : : BIO *test;
2892 : :
2893 : 0 : test=BIO_new(BIO_f_nbio_test());
2894 : 0 : sbio=BIO_push(test,sbio);
2895 : : }
2896 : 0 : SSL_set_bio(con,sbio,sbio);
2897 : 0 : SSL_set_accept_state(con);
2898 : :
2899 : : /* SSL_set_fd(con,s); */
2900 : 0 : BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
2901 : 0 : BIO_push(io,ssl_bio);
2902 : : #ifdef CHARSET_EBCDIC
2903 : : io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
2904 : : #endif
2905 : :
2906 [ # # ]: 0 : if (s_debug)
2907 : : {
2908 : 0 : SSL_set_debug(con, 1);
2909 : 0 : BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
2910 : 0 : BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
2911 : : }
2912 [ # # ]: 0 : if (s_msg)
2913 : : {
2914 : : #ifndef OPENSSL_NO_SSL_TRACE
2915 : : if (s_msg == 2)
2916 : : SSL_set_msg_callback(con, SSL_trace);
2917 : : else
2918 : : #endif
2919 : 0 : SSL_set_msg_callback(con, msg_cb);
2920 [ # # ]: 0 : SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
2921 : : }
2922 : :
2923 : : for (;;)
2924 : : {
2925 [ # # ]: 0 : if (hack)
2926 : : {
2927 : 0 : i=SSL_accept(con);
2928 : : #ifndef OPENSSL_NO_SRP
2929 [ # # ][ # # ]: 0 : while (i <= 0 && SSL_get_error(con,i) == SSL_ERROR_WANT_X509_LOOKUP)
2930 : : {
2931 : 0 : BIO_printf(bio_s_out,"LOOKUP during accept %s\n",srp_callback_parm.login);
2932 : 0 : srp_callback_parm.user = SRP_VBASE_get_by_user(srp_callback_parm.vb, srp_callback_parm.login);
2933 [ # # ]: 0 : if (srp_callback_parm.user)
2934 : 0 : BIO_printf(bio_s_out,"LOOKUP done %s\n",srp_callback_parm.user->info);
2935 : : else
2936 : 0 : BIO_printf(bio_s_out,"LOOKUP not successful\n");
2937 : 0 : i=SSL_accept(con);
2938 : : }
2939 : : #endif
2940 [ # # ][ # # ]: 0 : switch (SSL_get_error(con,i))
[ # # ]
2941 : : {
2942 : : case SSL_ERROR_NONE:
2943 : : break;
2944 : : case SSL_ERROR_WANT_WRITE:
2945 : : case SSL_ERROR_WANT_READ:
2946 : : case SSL_ERROR_WANT_X509_LOOKUP:
2947 : 0 : continue;
2948 : : case SSL_ERROR_SYSCALL:
2949 : : case SSL_ERROR_SSL:
2950 : : case SSL_ERROR_ZERO_RETURN:
2951 : : ret=1;
2952 : : goto err;
2953 : : /* break; */
2954 : : }
2955 : :
2956 : 0 : SSL_renegotiate(con);
2957 : 0 : SSL_write(con,NULL,0);
2958 : : }
2959 : :
2960 : 0 : i=BIO_gets(io,buf,bufsize-1);
2961 [ # # ]: 0 : if (i < 0) /* error */
2962 : : {
2963 [ # # ]: 0 : if (!BIO_should_retry(io))
2964 : : {
2965 [ # # ]: 0 : if (!s_quiet)
2966 : 0 : ERR_print_errors(bio_err);
2967 : : goto err;
2968 : : }
2969 : : else
2970 : : {
2971 : 0 : BIO_printf(bio_s_out,"read R BLOCK\n");
2972 : : #if defined(OPENSSL_SYS_NETWARE)
2973 : : delay(1000);
2974 : : #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
2975 : 0 : sleep(1);
2976 : : #endif
2977 : 0 : continue;
2978 : : }
2979 : : }
2980 [ # # ]: 0 : else if (i == 0) /* end of input */
2981 : : {
2982 : : ret=1;
2983 : : goto end;
2984 : : }
2985 : :
2986 : : /* else we have data */
2987 [ # # ][ # # ]: 0 : if ( ((www == 1) && (strncmp("GET ",buf,4) == 0)) ||
[ # # ]
2988 [ # # ]: 0 : ((www == 2) && (strncmp("GET /stats ",buf,10) == 0)))
2989 : : {
2990 : : char *p;
2991 : : X509 *peer;
2992 : : STACK_OF(SSL_CIPHER) *sk;
2993 : : static const char *space=" ";
2994 : :
2995 [ # # ][ # # ]: 0 : if (www == 1 && strncmp("GET /reneg", buf, 10) == 0)
2996 : : {
2997 [ # # ]: 0 : if (strncmp("GET /renegcert", buf, 14) == 0)
2998 : 0 : SSL_set_verify(con,
2999 : : SSL_VERIFY_PEER|SSL_VERIFY_CLIENT_ONCE,NULL);
3000 : 0 : i=SSL_renegotiate(con);
3001 : 0 : BIO_printf(bio_s_out, "SSL_renegotiate -> %d\n",i);
3002 : 0 : i=SSL_do_handshake(con);
3003 [ # # ]: 0 : if (i <= 0)
3004 : : {
3005 : 0 : BIO_printf(bio_s_out, "SSL_do_handshake() Retval %d\n", SSL_get_error(con, i));
3006 : 0 : ERR_print_errors(bio_err);
3007 : 0 : goto err;
3008 : : }
3009 : : /* EVIL HACK! */
3010 : 0 : SSL_set_state(con, SSL_ST_ACCEPT);
3011 : 0 : i=SSL_do_handshake(con);
3012 : 0 : BIO_printf(bio_s_out, "SSL_do_handshake -> %d\n",i);
3013 [ # # ]: 0 : if (i <= 0)
3014 : : {
3015 : 0 : BIO_printf(bio_s_out, "SSL_do_handshake() Retval %d\n", SSL_get_error(con, i));
3016 : 0 : ERR_print_errors(bio_err);
3017 : 0 : goto err;
3018 : : }
3019 : : }
3020 : :
3021 : 0 : BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
3022 : 0 : BIO_puts(io,"<HTML><BODY BGCOLOR=\"#ffffff\">\n");
3023 : 0 : BIO_puts(io,"<pre>\n");
3024 : : /* BIO_puts(io,SSLeay_version(SSLEAY_VERSION));*/
3025 : 0 : BIO_puts(io,"\n");
3026 [ # # ]: 0 : for (i=0; i<local_argc; i++)
3027 : : {
3028 : 0 : BIO_puts(io,local_argv[i]);
3029 : 0 : BIO_write(io," ",1);
3030 : : }
3031 : 0 : BIO_puts(io,"\n");
3032 : :
3033 [ # # ]: 0 : BIO_printf(io,
3034 : : "Secure Renegotiation IS%s supported\n",
3035 : 0 : SSL_get_secure_renegotiation_support(con) ?
3036 : : "" : " NOT");
3037 : :
3038 : : /* The following is evil and should not really
3039 : : * be done */
3040 : 0 : BIO_printf(io,"Ciphers supported in s_server binary\n");
3041 : 0 : sk=SSL_get_ciphers(con);
3042 : 0 : j=sk_SSL_CIPHER_num(sk);
3043 [ # # ]: 0 : for (i=0; i<j; i++)
3044 : : {
3045 : 0 : c=sk_SSL_CIPHER_value(sk,i);
3046 : 0 : BIO_printf(io,"%-11s:%-25s",
3047 : : SSL_CIPHER_get_version(c),
3048 : : SSL_CIPHER_get_name(c));
3049 [ # # ][ # # ]: 0 : if ((((i+1)%2) == 0) && (i+1 != j))
3050 : 0 : BIO_puts(io,"\n");
3051 : : }
3052 : 0 : BIO_puts(io,"\n");
3053 : 0 : p=SSL_get_shared_ciphers(con,buf,bufsize);
3054 [ # # ]: 0 : if (p != NULL)
3055 : : {
3056 : 0 : BIO_printf(io,"---\nCiphers common between both SSL end points:\n");
3057 : 0 : j=i=0;
3058 [ # # ]: 0 : while (*p)
3059 : : {
3060 [ # # ]: 0 : if (*p == ':')
3061 : : {
3062 : 0 : BIO_write(io,space,26-j);
3063 : 0 : i++;
3064 : 0 : j=0;
3065 [ # # ]: 0 : BIO_write(io,((i%3)?" ":"\n"),1);
3066 : : }
3067 : : else
3068 : : {
3069 : 0 : BIO_write(io,p,1);
3070 : 0 : j++;
3071 : : }
3072 : 0 : p++;
3073 : : }
3074 : 0 : BIO_puts(io,"\n");
3075 : : }
3076 : 0 : ssl_print_sigalgs(io, con);
3077 : : #ifndef OPENSSL_NO_EC
3078 : 0 : ssl_print_curves(io, con, 0);
3079 : : #endif
3080 [ # # ]: 0 : BIO_printf(io,(SSL_cache_hit(con)
3081 : : ?"---\nReused, "
3082 : : :"---\nNew, "));
3083 : 0 : c=SSL_get_current_cipher(con);
3084 : 0 : BIO_printf(io,"%s, Cipher is %s\n",
3085 : : SSL_CIPHER_get_version(c),
3086 : : SSL_CIPHER_get_name(c));
3087 : 0 : SSL_SESSION_print(io,SSL_get_session(con));
3088 : 0 : BIO_printf(io,"---\n");
3089 : 0 : print_stats(io,SSL_get_SSL_CTX(con));
3090 : 0 : BIO_printf(io,"---\n");
3091 : 0 : peer=SSL_get_peer_certificate(con);
3092 [ # # ]: 0 : if (peer != NULL)
3093 : : {
3094 : 0 : BIO_printf(io,"Client certificate\n");
3095 : 0 : X509_print(io,peer);
3096 : 0 : PEM_write_bio_X509(io,peer);
3097 : : }
3098 : : else
3099 : 0 : BIO_puts(io,"no client certificate available\n");
3100 : 0 : BIO_puts(io,"</BODY></HTML>\r\n\r\n");
3101 : 0 : break;
3102 : : }
3103 [ # # ]: 0 : else if ((www == 2 || www == 3)
3104 [ # # ]: 0 : && (strncmp("GET /",buf,5) == 0))
3105 : : {
3106 : : BIO *file;
3107 : : char *p,*e;
3108 : : static const char *text="HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n";
3109 : :
3110 : : /* skip the '/' */
3111 : 0 : p= &(buf[5]);
3112 : :
3113 : 0 : dot = 1;
3114 [ # # ]: 0 : for (e=p; *e != '\0'; e++)
3115 : : {
3116 [ # # ]: 0 : if (e[0] == ' ')
3117 : : break;
3118 : :
3119 [ # # # # ]: 0 : switch (dot)
3120 : : {
3121 : : case 1:
3122 [ # # ]: 0 : dot = (e[0] == '.') ? 2 : 0;
3123 : 0 : break;
3124 : : case 2:
3125 [ # # ]: 0 : dot = (e[0] == '.') ? 3 : 0;
3126 : 0 : break;
3127 : : case 3:
3128 [ # # ]: 0 : dot = (e[0] == '/') ? -1 : 0;
3129 : 0 : break;
3130 : : }
3131 [ # # ]: 0 : if (dot == 0)
3132 : 0 : dot = (e[0] == '/') ? 1 : 0;
3133 : : }
3134 : 0 : dot = (dot == 3) || (dot == -1); /* filename contains ".." component */
3135 : :
3136 [ # # ]: 0 : if (*e == '\0')
3137 : : {
3138 : 0 : BIO_puts(io,text);
3139 : 0 : BIO_printf(io,"'%s' is an invalid file name\r\n",p);
3140 : 0 : break;
3141 : : }
3142 : 0 : *e='\0';
3143 : :
3144 [ # # ]: 0 : if (dot)
3145 : : {
3146 : 0 : BIO_puts(io,text);
3147 : 0 : BIO_printf(io,"'%s' contains '..' reference\r\n",p);
3148 : 0 : break;
3149 : : }
3150 : :
3151 [ # # ]: 0 : if (*p == '/')
3152 : : {
3153 : 0 : BIO_puts(io,text);
3154 : 0 : BIO_printf(io,"'%s' is an invalid path\r\n",p);
3155 : 0 : break;
3156 : : }
3157 : :
3158 : : #if 0
3159 : : /* append if a directory lookup */
3160 : : if (e[-1] == '/')
3161 : : strcat(p,"index.html");
3162 : : #endif
3163 : :
3164 : : /* if a directory, do the index thang */
3165 [ # # ]: 0 : if (app_isdir(p)>0)
3166 : : {
3167 : : #if 0 /* must check buffer size */
3168 : : strcat(p,"/index.html");
3169 : : #else
3170 : 0 : BIO_puts(io,text);
3171 : 0 : BIO_printf(io,"'%s' is a directory\r\n",p);
3172 : 0 : break;
3173 : : #endif
3174 : : }
3175 : :
3176 [ # # ]: 0 : if ((file=BIO_new_file(p,"r")) == NULL)
3177 : : {
3178 : 0 : BIO_puts(io,text);
3179 : 0 : BIO_printf(io,"Error opening '%s'\r\n",p);
3180 : 0 : ERR_print_errors(io);
3181 : 0 : break;
3182 : : }
3183 : :
3184 [ # # ]: 0 : if (!s_quiet)
3185 : 0 : BIO_printf(bio_err,"FILE:%s\n",p);
3186 : :
3187 [ # # ]: 0 : if (www == 2)
3188 : : {
3189 : 0 : i=strlen(p);
3190 [ # # ][ # # ]: 0 : if ( ((i > 5) && (strcmp(&(p[i-5]),".html") == 0)) ||
[ # # ]
3191 [ # # ][ # # ]: 0 : ((i > 4) && (strcmp(&(p[i-4]),".php") == 0)) ||
3192 [ # # ]: 0 : ((i > 4) && (strcmp(&(p[i-4]),".htm") == 0)))
3193 : 0 : BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/html\r\n\r\n");
3194 : : else
3195 : 0 : BIO_puts(io,"HTTP/1.0 200 ok\r\nContent-type: text/plain\r\n\r\n");
3196 : : }
3197 : : /* send the file */
3198 : : for (;;)
3199 : : {
3200 : 0 : i=BIO_read(file,buf,bufsize);
3201 [ # # ]: 0 : if (i <= 0) break;
3202 : :
3203 : : #ifdef RENEG
3204 : : total_bytes+=i;
3205 : : fprintf(stderr,"%d\n",i);
3206 : : if (total_bytes > 3*1024)
3207 : : {
3208 : : total_bytes=0;
3209 : : fprintf(stderr,"RENEGOTIATE\n");
3210 : : SSL_renegotiate(con);
3211 : : }
3212 : : #endif
3213 : :
3214 [ # # ]: 0 : for (j=0; j<i; )
3215 : : {
3216 : : #ifdef RENEG
3217 : : { static count=0; if (++count == 13) { SSL_renegotiate(con); } }
3218 : : #endif
3219 : 0 : k=BIO_write(io,&(buf[j]),i-j);
3220 [ # # ]: 0 : if (k <= 0)
3221 : : {
3222 [ # # ]: 0 : if (!BIO_should_retry(io))
3223 : : goto write_error;
3224 : : else
3225 : : {
3226 : 0 : BIO_printf(bio_s_out,"rwrite W BLOCK\n");
3227 : : }
3228 : : }
3229 : : else
3230 : : {
3231 : 0 : j+=k;
3232 : : }
3233 : : }
3234 : : }
3235 : : write_error:
3236 : 0 : BIO_free(file);
3237 : 0 : break;
3238 : : }
3239 : : }
3240 : :
3241 : : for (;;)
3242 : : {
3243 : 0 : i=(int)BIO_flush(io);
3244 [ # # ]: 0 : if (i <= 0)
3245 : : {
3246 [ # # ]: 0 : if (!BIO_should_retry(io))
3247 : : break;
3248 : : }
3249 : : else
3250 : : break;
3251 : : }
3252 : : end:
3253 : : #if 1
3254 : : /* make sure we re-use sessions */
3255 : 0 : SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
3256 : : #else
3257 : : /* This kills performance */
3258 : : /* SSL_shutdown(con); A shutdown gets sent in the
3259 : : * BIO_free_all(io) procession */
3260 : : #endif
3261 : :
3262 : : err:
3263 : :
3264 : : if (ret >= 0)
3265 : 0 : BIO_printf(bio_s_out,"ACCEPT\n");
3266 : :
3267 [ # # ]: 0 : if (buf != NULL) OPENSSL_free(buf);
3268 [ # # ]: 0 : if (io != NULL) BIO_free_all(io);
3269 : : /* if (ssl_bio != NULL) BIO_free(ssl_bio);*/
3270 : : return(ret);
3271 : : }
3272 : :
3273 : 0 : static int rev_body(char *hostname, int s, int stype, unsigned char *context)
3274 : : {
3275 : 0 : char *buf=NULL;
3276 : : int i;
3277 : 0 : int ret=1;
3278 : : SSL *con;
3279 : : BIO *io,*ssl_bio,*sbio;
3280 : : #ifndef OPENSSL_NO_KRB5
3281 : : KSSL_CTX *kctx;
3282 : : #endif
3283 : :
3284 : 0 : buf=OPENSSL_malloc(bufsize);
3285 [ # # ]: 0 : if (buf == NULL) return(0);
3286 : 0 : io=BIO_new(BIO_f_buffer());
3287 : 0 : ssl_bio=BIO_new(BIO_f_ssl());
3288 [ # # ]: 0 : if ((io == NULL) || (ssl_bio == NULL)) goto err;
3289 : :
3290 : : /* lets make the output buffer a reasonable size */
3291 [ # # ]: 0 : if (!BIO_set_write_buffer_size(io,bufsize)) goto err;
3292 : :
3293 [ # # ]: 0 : if ((con=SSL_new(ctx)) == NULL) goto err;
3294 : : #ifndef OPENSSL_NO_TLSEXT
3295 [ # # ]: 0 : if (s_tlsextdebug)
3296 : : {
3297 : 0 : SSL_set_tlsext_debug_callback(con, tlsext_cb);
3298 : 0 : SSL_set_tlsext_debug_arg(con, bio_s_out);
3299 : : }
3300 : : #endif
3301 : : #ifndef OPENSSL_NO_KRB5
3302 : : if ((kctx = kssl_ctx_new()) != NULL)
3303 : : {
3304 : : kssl_ctx_setstring(kctx, KSSL_SERVICE, KRB5SVC);
3305 : : kssl_ctx_setstring(kctx, KSSL_KEYTAB, KRB5KEYTAB);
3306 : : }
3307 : : #endif /* OPENSSL_NO_KRB5 */
3308 [ # # ]: 0 : if(context) SSL_set_session_id_context(con, context,
3309 : 0 : strlen((char *)context));
3310 : :
3311 : 0 : sbio=BIO_new_socket(s,BIO_NOCLOSE);
3312 : 0 : SSL_set_bio(con,sbio,sbio);
3313 : 0 : SSL_set_accept_state(con);
3314 : :
3315 : 0 : BIO_set_ssl(ssl_bio,con,BIO_CLOSE);
3316 : 0 : BIO_push(io,ssl_bio);
3317 : : #ifdef CHARSET_EBCDIC
3318 : : io = BIO_push(BIO_new(BIO_f_ebcdic_filter()),io);
3319 : : #endif
3320 : :
3321 [ # # ]: 0 : if (s_debug)
3322 : : {
3323 : 0 : SSL_set_debug(con, 1);
3324 : 0 : BIO_set_callback(SSL_get_rbio(con),bio_dump_callback);
3325 : 0 : BIO_set_callback_arg(SSL_get_rbio(con),(char *)bio_s_out);
3326 : : }
3327 [ # # ]: 0 : if (s_msg)
3328 : : {
3329 : : #ifndef OPENSSL_NO_SSL_TRACE
3330 : : if (s_msg == 2)
3331 : : SSL_set_msg_callback(con, SSL_trace);
3332 : : else
3333 : : #endif
3334 : 0 : SSL_set_msg_callback(con, msg_cb);
3335 [ # # ]: 0 : SSL_set_msg_callback_arg(con, bio_s_msg ? bio_s_msg : bio_s_out);
3336 : : }
3337 : :
3338 : : for (;;)
3339 : : {
3340 : 0 : i = BIO_do_handshake(io);
3341 [ # # ]: 0 : if (i > 0)
3342 : : break;
3343 [ # # ]: 0 : if (!BIO_should_retry(io))
3344 : : {
3345 : 0 : BIO_puts(bio_err, "CONNECTION FAILURE\n");
3346 : 0 : ERR_print_errors(bio_err);
3347 : 0 : goto end;
3348 : : }
3349 : : }
3350 : 0 : BIO_printf(bio_err, "CONNECTION ESTABLISHED\n");
3351 : 0 : print_ssl_summary(bio_err, con);
3352 : :
3353 : : for (;;)
3354 : : {
3355 : 0 : i=BIO_gets(io,buf,bufsize-1);
3356 [ # # ]: 0 : if (i < 0) /* error */
3357 : : {
3358 [ # # ]: 0 : if (!BIO_should_retry(io))
3359 : : {
3360 [ # # ]: 0 : if (!s_quiet)
3361 : 0 : ERR_print_errors(bio_err);
3362 : : goto err;
3363 : : }
3364 : : else
3365 : : {
3366 : 0 : BIO_printf(bio_s_out,"read R BLOCK\n");
3367 : : #if defined(OPENSSL_SYS_NETWARE)
3368 : : delay(1000);
3369 : : #elif !defined(OPENSSL_SYS_MSDOS) && !defined(__DJGPP__)
3370 : 0 : sleep(1);
3371 : : #endif
3372 : 0 : continue;
3373 : : }
3374 : : }
3375 [ # # ]: 0 : else if (i == 0) /* end of input */
3376 : : {
3377 : 0 : ret=1;
3378 : 0 : BIO_printf(bio_err, "CONNECTION CLOSED\n");
3379 : 0 : goto end;
3380 : : }
3381 : : else
3382 : : {
3383 : 0 : char *p = buf + i - 1;
3384 [ # # ][ # # ]: 0 : while(i && (*p == '\n' || *p == '\r'))
3385 : : {
3386 : 0 : p--;
3387 : 0 : i--;
3388 : : }
3389 [ # # ][ # # ]: 0 : if (!s_ign_eof && i == 5 && !strncmp(buf, "CLOSE", 5))
[ # # ]
3390 : : {
3391 : 0 : ret = 1;
3392 : 0 : BIO_printf(bio_err, "CONNECTION CLOSED\n");
3393 : 0 : goto end;
3394 : : }
3395 : 0 : BUF_reverse((unsigned char *)buf, NULL, i);
3396 : 0 : buf[i] = '\n';
3397 : 0 : BIO_write(io, buf, i + 1);
3398 : : for (;;)
3399 : : {
3400 : 0 : i = BIO_flush(io);
3401 [ # # ]: 0 : if (i > 0)
3402 : : break;
3403 [ # # ]: 0 : if (!BIO_should_retry(io))
3404 : : goto end;
3405 : : }
3406 : : }
3407 : : }
3408 : : end:
3409 : : /* make sure we re-use sessions */
3410 : 0 : SSL_set_shutdown(con,SSL_SENT_SHUTDOWN|SSL_RECEIVED_SHUTDOWN);
3411 : :
3412 : : err:
3413 : :
3414 [ # # ]: 0 : if (buf != NULL) OPENSSL_free(buf);
3415 [ # # ]: 0 : if (io != NULL) BIO_free_all(io);
3416 : : return(ret);
3417 : : }
3418 : :
3419 : : #ifndef OPENSSL_NO_RSA
3420 : 0 : static RSA MS_CALLBACK *tmp_rsa_cb(SSL *s, int is_export, int keylength)
3421 : : {
3422 : 0 : BIGNUM *bn = NULL;
3423 : : static RSA *rsa_tmp=NULL;
3424 : :
3425 [ # # ][ # # ]: 0 : if (!rsa_tmp && ((bn = BN_new()) == NULL))
3426 : 0 : BIO_printf(bio_err,"Allocation error in generating RSA key\n");
3427 [ # # ][ # # ]: 0 : if (!rsa_tmp && bn)
3428 : : {
3429 [ # # ]: 0 : if (!s_quiet)
3430 : : {
3431 : 0 : BIO_printf(bio_err,"Generating temp (%d bit) RSA key...",keylength);
3432 : 0 : (void)BIO_flush(bio_err);
3433 : : }
3434 [ # # ]: 0 : if(!BN_set_word(bn, RSA_F4) || ((rsa_tmp = RSA_new()) == NULL) ||
[ # # # # ]
3435 : 0 : !RSA_generate_key_ex(rsa_tmp, keylength, bn, NULL))
3436 : : {
3437 [ # # ]: 0 : if(rsa_tmp) RSA_free(rsa_tmp);
3438 : 0 : rsa_tmp = NULL;
3439 : : }
3440 [ # # ]: 0 : if (!s_quiet)
3441 : : {
3442 : 0 : BIO_printf(bio_err,"\n");
3443 : 0 : (void)BIO_flush(bio_err);
3444 : : }
3445 : 0 : BN_free(bn);
3446 : : }
3447 : 0 : return(rsa_tmp);
3448 : : }
3449 : : #endif
3450 : :
3451 : : #define MAX_SESSION_ID_ATTEMPTS 10
3452 : 0 : static int generate_session_id(const SSL *ssl, unsigned char *id,
3453 : : unsigned int *id_len)
3454 : : {
3455 : 0 : unsigned int count = 0;
3456 : : do {
3457 : 0 : RAND_pseudo_bytes(id, *id_len);
3458 : : /* Prefix the session_id with the required prefix. NB: If our
3459 : : * prefix is too long, clip it - but there will be worse effects
3460 : : * anyway, eg. the server could only possibly create 1 session
3461 : : * ID (ie. the prefix!) so all future session negotiations will
3462 : : * fail due to conflicts. */
3463 [ # # ]: 0 : memcpy(id, session_id_prefix,
3464 : 0 : (strlen(session_id_prefix) < *id_len) ?
3465 : : strlen(session_id_prefix) : *id_len);
3466 : : }
3467 [ # # ]: 0 : while(SSL_has_matching_session_id(ssl, id, *id_len) &&
3468 [ # # ]: 0 : (++count < MAX_SESSION_ID_ATTEMPTS));
3469 [ # # ]: 0 : if(count >= MAX_SESSION_ID_ATTEMPTS)
3470 : : return 0;
3471 : 0 : return 1;
3472 : : }
3473 : :
3474 : : /* By default s_server uses an in-memory cache which caches SSL_SESSION
3475 : : * structures without any serialisation. This hides some bugs which only
3476 : : * become apparent in deployed servers. By implementing a basic external
3477 : : * session cache some issues can be debugged using s_server.
3478 : : */
3479 : :
3480 : : typedef struct simple_ssl_session_st
3481 : : {
3482 : : unsigned char *id;
3483 : : unsigned int idlen;
3484 : : unsigned char *der;
3485 : : int derlen;
3486 : : struct simple_ssl_session_st *next;
3487 : : } simple_ssl_session;
3488 : :
3489 : : static simple_ssl_session *first = NULL;
3490 : :
3491 : 0 : static int add_session(SSL *ssl, SSL_SESSION *session)
3492 : : {
3493 : : simple_ssl_session *sess;
3494 : : unsigned char *p;
3495 : :
3496 : 0 : sess = OPENSSL_malloc(sizeof(simple_ssl_session));
3497 : :
3498 : 0 : SSL_SESSION_get_id(session, &sess->idlen);
3499 : 0 : sess->derlen = i2d_SSL_SESSION(session, NULL);
3500 : :
3501 : 0 : sess->id = BUF_memdup(SSL_SESSION_get_id(session, NULL), sess->idlen);
3502 : :
3503 : 0 : sess->der = OPENSSL_malloc(sess->derlen);
3504 : 0 : p = sess->der;
3505 : 0 : i2d_SSL_SESSION(session, &p);
3506 : :
3507 : 0 : sess->next = first;
3508 : 0 : first = sess;
3509 : 0 : BIO_printf(bio_err, "New session added to external cache\n");
3510 : 0 : return 0;
3511 : : }
3512 : :
3513 : 0 : static SSL_SESSION *get_session(SSL *ssl, unsigned char *id, int idlen,
3514 : : int *do_copy)
3515 : : {
3516 : : simple_ssl_session *sess;
3517 : 0 : *do_copy = 0;
3518 [ # # ]: 0 : for (sess = first; sess; sess = sess->next)
3519 : : {
3520 [ # # ][ # # ]: 0 : if (idlen == (int)sess->idlen && !memcmp(sess->id, id, idlen))
3521 : : {
3522 : 0 : const unsigned char *p = sess->der;
3523 : 0 : BIO_printf(bio_err, "Lookup session: cache hit\n");
3524 : 0 : return d2i_SSL_SESSION(NULL, &p, sess->derlen);
3525 : : }
3526 : : }
3527 : 0 : BIO_printf(bio_err, "Lookup session: cache miss\n");
3528 : 0 : return NULL;
3529 : : }
3530 : :
3531 : 0 : static void del_session(SSL_CTX *sctx, SSL_SESSION *session)
3532 : : {
3533 : 0 : simple_ssl_session *sess, *prev = NULL;
3534 : : const unsigned char *id;
3535 : : unsigned int idlen;
3536 : 0 : id = SSL_SESSION_get_id(session, &idlen);
3537 [ # # ]: 0 : for (sess = first; sess; sess = sess->next)
3538 : : {
3539 [ # # ][ # # ]: 0 : if (idlen == sess->idlen && !memcmp(sess->id, id, idlen))
3540 : : {
3541 [ # # ]: 0 : if(prev)
3542 : 0 : prev->next = sess->next;
3543 : : else
3544 : 0 : first = sess->next;
3545 : 0 : OPENSSL_free(sess->id);
3546 : 0 : OPENSSL_free(sess->der);
3547 : 0 : OPENSSL_free(sess);
3548 : 0 : return;
3549 : : }
3550 : 0 : prev = sess;
3551 : : }
3552 : : }
3553 : :
3554 : 0 : static void init_session_cache_ctx(SSL_CTX *sctx)
3555 : : {
3556 : 0 : SSL_CTX_set_session_cache_mode(sctx,
3557 : : SSL_SESS_CACHE_NO_INTERNAL|SSL_SESS_CACHE_SERVER);
3558 : 0 : SSL_CTX_sess_set_new_cb(sctx, add_session);
3559 : 0 : SSL_CTX_sess_set_get_cb(sctx, get_session);
3560 : 0 : SSL_CTX_sess_set_remove_cb(sctx, del_session);
3561 : 0 : }
3562 : :
3563 : 0 : static void free_sessions(void)
3564 : : {
3565 : : simple_ssl_session *sess, *tsess;
3566 [ # # ]: 0 : for (sess = first; sess;)
3567 : : {
3568 : 0 : OPENSSL_free(sess->id);
3569 : 0 : OPENSSL_free(sess->der);
3570 : 0 : tsess = sess;
3571 : 0 : sess = sess->next;
3572 : 0 : OPENSSL_free(tsess);
3573 : : }
3574 : 0 : first = NULL;
3575 : 0 : }
|