New functions to check a hostname email or IP address against a
[openssl.git] / apps / s_client.c
1 /* apps/s_client.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 2005 Nokia. All rights reserved.
113  *
114  * The portions of the attached software ("Contribution") is developed by
115  * Nokia Corporation and is licensed pursuant to the OpenSSL open source
116  * license.
117  *
118  * The Contribution, originally written by Mika Kousa and Pasi Eronen of
119  * Nokia Corporation, consists of the "PSK" (Pre-Shared Key) ciphersuites
120  * support (see RFC 4279) to OpenSSL.
121  *
122  * No patent licenses or other rights except those expressly stated in
123  * the OpenSSL open source license shall be deemed granted or received
124  * expressly, by implication, estoppel, or otherwise.
125  *
126  * No assurances are provided by Nokia that the Contribution does not
127  * infringe the patent or other intellectual property rights of any third
128  * party or that the license provides you with all the necessary rights
129  * to make use of the Contribution.
130  *
131  * THE SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. IN
132  * ADDITION TO THE DISCLAIMERS INCLUDED IN THE LICENSE, NOKIA
133  * SPECIFICALLY DISCLAIMS ANY LIABILITY FOR CLAIMS BROUGHT BY YOU OR ANY
134  * OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS OR
135  * OTHERWISE.
136  */
137
138 #include <assert.h>
139 #include <ctype.h>
140 #include <stdio.h>
141 #include <stdlib.h>
142 #include <string.h>
143 #include <openssl/e_os2.h>
144 #ifdef OPENSSL_NO_STDIO
145 #define APPS_WIN16
146 #endif
147
148 /* With IPv6, it looks like Digital has mixed up the proper order of
149    recursive header file inclusion, resulting in the compiler complaining
150    that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
151    is needed to have fileno() declared correctly...  So let's define u_int */
152 #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
153 #define __U_INT
154 typedef unsigned int u_int;
155 #endif
156
157 #define USE_SOCKETS
158 #include "apps.h"
159 #include <openssl/x509.h>
160 #include <openssl/ssl.h>
161 #include <openssl/err.h>
162 #include <openssl/pem.h>
163 #include <openssl/rand.h>
164 #include <openssl/ocsp.h>
165 #include <openssl/bn.h>
166 #ifndef OPENSSL_NO_SRP
167 #include <openssl/srp.h>
168 #endif
169 #include "s_apps.h"
170 #include "timeouts.h"
171
172 #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
173 /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
174 #undef FIONBIO
175 #endif
176
177 #if defined(OPENSSL_SYS_BEOS_R5)
178 #include <fcntl.h>
179 #endif
180
181 #undef PROG
182 #define PROG    s_client_main
183
184 /*#define SSL_HOST_NAME "www.netscape.com" */
185 /*#define SSL_HOST_NAME "193.118.187.102" */
186 #define SSL_HOST_NAME   "localhost"
187
188 /*#define TEST_CERT "client.pem" */ /* no default cert. */
189
190 #undef BUFSIZZ
191 #define BUFSIZZ 1024*8
192
193 extern int verify_depth;
194 extern int verify_error;
195 extern int verify_return_error;
196 extern int verify_quiet;
197
198 #ifdef FIONBIO
199 static int c_nbio=0;
200 #endif
201 static int c_Pause=0;
202 static int c_debug=0;
203 #ifndef OPENSSL_NO_TLSEXT
204 static int c_tlsextdebug=0;
205 static int c_status_req=0;
206 static int c_proof_debug=0;
207 #endif
208 static int c_msg=0;
209 static int c_showcerts=0;
210
211 static char *keymatexportlabel=NULL;
212 static int keymatexportlen=20;
213
214 static void sc_usage(void);
215 static void print_stuff(BIO *berr,SSL *con,int full);
216 #ifndef OPENSSL_NO_TLSEXT
217 static int ocsp_resp_cb(SSL *s, void *arg);
218 static int audit_proof_cb(SSL *s, void *arg);
219 #endif
220 static BIO *bio_c_out=NULL;
221 static BIO *bio_c_msg=NULL;
222 static int c_quiet=0;
223 static int c_ign_eof=0;
224 static int c_brief=0;
225
226 #ifndef OPENSSL_NO_PSK
227 /* Default PSK identity and key */
228 static char *psk_identity="Client_identity";
229 /*char *psk_key=NULL;  by default PSK is not used */
230
231 static unsigned int psk_client_cb(SSL *ssl, const char *hint, char *identity,
232         unsigned int max_identity_len, unsigned char *psk,
233         unsigned int max_psk_len)
234         {
235         unsigned int psk_len = 0;
236         int ret;
237         BIGNUM *bn=NULL;
238
239         if (c_debug)
240                 BIO_printf(bio_c_out, "psk_client_cb\n");
241         if (!hint)
242                 {
243                 /* no ServerKeyExchange message*/
244                 if (c_debug)
245                         BIO_printf(bio_c_out,"NULL received PSK identity hint, continuing anyway\n");
246                 }
247         else if (c_debug)
248                 BIO_printf(bio_c_out, "Received PSK identity hint '%s'\n", hint);
249
250         /* lookup PSK identity and PSK key based on the given identity hint here */
251         ret = BIO_snprintf(identity, max_identity_len, "%s", psk_identity);
252         if (ret < 0 || (unsigned int)ret > max_identity_len)
253                 goto out_err;
254         if (c_debug)
255                 BIO_printf(bio_c_out, "created identity '%s' len=%d\n", identity, ret);
256         ret=BN_hex2bn(&bn, psk_key);
257         if (!ret)
258                 {
259                 BIO_printf(bio_err,"Could not convert PSK key '%s' to BIGNUM\n", psk_key);
260                 if (bn)
261                         BN_free(bn);
262                 return 0;
263                 }
264
265         if ((unsigned int)BN_num_bytes(bn) > max_psk_len)
266                 {
267                 BIO_printf(bio_err,"psk buffer of callback is too small (%d) for key (%d)\n",
268                         max_psk_len, BN_num_bytes(bn));
269                 BN_free(bn);
270                 return 0;
271                 }
272
273         psk_len=BN_bn2bin(bn, psk);
274         BN_free(bn);
275         if (psk_len == 0)
276                 goto out_err;
277
278         if (c_debug)
279                 BIO_printf(bio_c_out, "created PSK len=%d\n", psk_len);
280
281         return psk_len;
282  out_err:
283         if (c_debug)
284                 BIO_printf(bio_err, "Error in PSK client callback\n");
285         return 0;
286         }
287 #endif
288
289 static void sc_usage(void)
290         {
291         BIO_printf(bio_err,"usage: s_client args\n");
292         BIO_printf(bio_err,"\n");
293         BIO_printf(bio_err," -host host     - use -connect instead\n");
294         BIO_printf(bio_err," -port port     - use -connect instead\n");
295         BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
296
297         BIO_printf(bio_err," -verify arg   - turn on peer certificate verification\n");
298         BIO_printf(bio_err," -cert arg     - certificate file to use, PEM format assumed\n");
299         BIO_printf(bio_err," -certform arg - certificate format (PEM or DER) PEM default\n");
300         BIO_printf(bio_err," -key arg      - Private key file to use, in cert file if\n");
301         BIO_printf(bio_err,"                 not specified but cert file is.\n");
302         BIO_printf(bio_err," -keyform arg  - key format (PEM or DER) PEM default\n");
303         BIO_printf(bio_err," -pass arg     - private key file pass phrase source\n");
304         BIO_printf(bio_err," -CApath arg   - PEM format directory of CA's\n");
305         BIO_printf(bio_err," -CAfile arg   - PEM format file of CA's\n");
306         BIO_printf(bio_err," -reconnect    - Drop and re-make the connection with the same Session-ID\n");
307         BIO_printf(bio_err," -pause        - sleep(1) after each read(2) and write(2) system call\n");
308         BIO_printf(bio_err," -showcerts    - show all certificates in the chain\n");
309         BIO_printf(bio_err," -debug        - extra output\n");
310 #ifdef WATT32
311         BIO_printf(bio_err," -wdebug       - WATT-32 tcp debugging\n");
312 #endif
313         BIO_printf(bio_err," -msg          - Show protocol messages\n");
314         BIO_printf(bio_err," -nbio_test    - more ssl protocol testing\n");
315         BIO_printf(bio_err," -state        - print the 'ssl' states\n");
316 #ifdef FIONBIO
317         BIO_printf(bio_err," -nbio         - Run with non-blocking IO\n");
318 #endif
319         BIO_printf(bio_err," -crlf         - convert LF from terminal into CRLF\n");
320         BIO_printf(bio_err," -quiet        - no s_client output\n");
321         BIO_printf(bio_err," -ign_eof      - ignore input eof (default when -quiet)\n");
322         BIO_printf(bio_err," -no_ign_eof   - don't ignore input eof\n");
323 #ifndef OPENSSL_NO_PSK
324         BIO_printf(bio_err," -psk_identity arg - PSK identity\n");
325         BIO_printf(bio_err," -psk arg      - PSK in hex (without 0x)\n");
326 # ifndef OPENSSL_NO_JPAKE
327         BIO_printf(bio_err," -jpake arg    - JPAKE secret to use\n");
328 # endif
329 #endif
330 #ifndef OPENSSL_NO_SRP
331         BIO_printf(bio_err," -srpuser user     - SRP authentification for 'user'\n");
332         BIO_printf(bio_err," -srppass arg      - password for 'user'\n");
333         BIO_printf(bio_err," -srp_lateuser     - SRP username into second ClientHello message\n");
334         BIO_printf(bio_err," -srp_moregroups   - Tolerate other than the known g N values.\n");
335         BIO_printf(bio_err," -srp_strength int - minimal mength in bits for N (default %d).\n",SRP_MINIMAL_N);
336 #endif
337         BIO_printf(bio_err," -ssl2         - just use SSLv2\n");
338         BIO_printf(bio_err," -ssl3         - just use SSLv3\n");
339         BIO_printf(bio_err," -tls1_2       - just use TLSv1.2\n");
340         BIO_printf(bio_err," -tls1_1       - just use TLSv1.1\n");
341         BIO_printf(bio_err," -tls1         - just use TLSv1\n");
342         BIO_printf(bio_err," -dtls1        - just use DTLSv1\n");    
343         BIO_printf(bio_err," -mtu          - set the link layer MTU\n");
344         BIO_printf(bio_err," -no_tls1_2/-no_tls1_1/-no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
345         BIO_printf(bio_err," -bugs         - Switch on all SSL implementation bug workarounds\n");
346         BIO_printf(bio_err," -serverpref   - Use server's cipher preferences (only SSLv2)\n");
347         BIO_printf(bio_err," -cipher       - preferred cipher to use, use the 'openssl ciphers'\n");
348         BIO_printf(bio_err,"                 command to see what is available\n");
349         BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
350         BIO_printf(bio_err,"                 for those protocols that support it, where\n");
351         BIO_printf(bio_err,"                 'prot' defines which one to assume.  Currently,\n");
352         BIO_printf(bio_err,"                 only \"smtp\", \"pop3\", \"imap\", \"ftp\" and \"xmpp\"\n");
353         BIO_printf(bio_err,"                 are supported.\n");
354 #ifndef OPENSSL_NO_ENGINE
355         BIO_printf(bio_err," -engine id    - Initialise and use the specified engine\n");
356 #endif
357         BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
358         BIO_printf(bio_err," -sess_out arg - file to write SSL session to\n");
359         BIO_printf(bio_err," -sess_in arg  - file to read SSL session from\n");
360 #ifndef OPENSSL_NO_TLSEXT
361         BIO_printf(bio_err," -servername host  - Set TLS extension servername in ClientHello\n");
362         BIO_printf(bio_err," -tlsextdebug      - hex dump of all TLS extensions received\n");
363         BIO_printf(bio_err," -status           - request certificate status from server\n");
364         BIO_printf(bio_err," -no_ticket        - disable use of RFC4507bis session tickets\n");
365         BIO_printf(bio_err," -proof_debug      - request an audit proof and print its hex dump\n");
366 # ifndef OPENSSL_NO_NEXTPROTONEG
367         BIO_printf(bio_err," -nextprotoneg arg - enable NPN extension, considering named protocols supported (comma-separated list)\n");
368 # endif
369 #endif
370         BIO_printf(bio_err," -legacy_renegotiation - enable use of legacy renegotiation (dangerous)\n");
371         BIO_printf(bio_err," -use_srtp profiles - Offer SRTP key management with a colon-separated profile list\n");
372         BIO_printf(bio_err," -keymatexport label   - Export keying material using label\n");
373         BIO_printf(bio_err," -keymatexportlen len  - Export len bytes of keying material (default 20)\n");
374         }
375
376 #ifndef OPENSSL_NO_TLSEXT
377
378 /* This is a context that we pass to callbacks */
379 typedef struct tlsextctx_st {
380    BIO * biodebug;
381    int ack;
382 } tlsextctx;
383
384
385 static int MS_CALLBACK ssl_servername_cb(SSL *s, int *ad, void *arg)
386         {
387         tlsextctx * p = (tlsextctx *) arg;
388         const char * hn= SSL_get_servername(s, TLSEXT_NAMETYPE_host_name);
389         if (SSL_get_servername_type(s) != -1) 
390                 p->ack = !SSL_session_reused(s) && hn != NULL;
391         else 
392                 BIO_printf(bio_err,"Can't use SSL_get_servername\n");
393         
394         return SSL_TLSEXT_ERR_OK;
395         }
396
397 #ifndef OPENSSL_NO_SRP
398
399 /* This is a context that we pass to all callbacks */
400 typedef struct srp_arg_st
401         {
402         char *srppassin;
403         char *srplogin;
404         int msg;   /* copy from c_msg */
405         int debug; /* copy from c_debug */
406         int amp;   /* allow more groups */
407         int strength /* minimal size for N */ ;
408         } SRP_ARG;
409
410 #define SRP_NUMBER_ITERATIONS_FOR_PRIME 64
411
412 static int srp_Verify_N_and_g(const BIGNUM *N, const BIGNUM *g)
413         {
414         BN_CTX *bn_ctx = BN_CTX_new();
415         BIGNUM *p = BN_new();
416         BIGNUM *r = BN_new();
417         int ret =
418                 g != NULL && N != NULL && bn_ctx != NULL && BN_is_odd(N) &&
419                 BN_is_prime_ex(N, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
420                 p != NULL && BN_rshift1(p, N) &&
421
422                 /* p = (N-1)/2 */
423                 BN_is_prime_ex(p, SRP_NUMBER_ITERATIONS_FOR_PRIME, bn_ctx, NULL) &&
424                 r != NULL &&
425
426                 /* verify g^((N-1)/2) == -1 (mod N) */
427                 BN_mod_exp(r, g, p, N, bn_ctx) &&
428                 BN_add_word(r, 1) &&
429                 BN_cmp(r, N) == 0;
430
431         if(r)
432                 BN_free(r);
433         if(p)
434                 BN_free(p);
435         if(bn_ctx)
436                 BN_CTX_free(bn_ctx);
437         return ret;
438         }
439
440 /* This callback is used here for two purposes:
441    - extended debugging
442    - making some primality tests for unknown groups
443    The callback is only called for a non default group.
444
445    An application does not need the call back at all if
446    only the stanard groups are used.  In real life situations, 
447    client and server already share well known groups, 
448    thus there is no need to verify them. 
449    Furthermore, in case that a server actually proposes a group that
450    is not one of those defined in RFC 5054, it is more appropriate 
451    to add the group to a static list and then compare since 
452    primality tests are rather cpu consuming.
453 */
454
455 static int MS_CALLBACK ssl_srp_verify_param_cb(SSL *s, void *arg)
456         {
457         SRP_ARG *srp_arg = (SRP_ARG *)arg;
458         BIGNUM *N = NULL, *g = NULL;
459         if (!(N = SSL_get_srp_N(s)) || !(g = SSL_get_srp_g(s)))
460                 return 0;
461         if (srp_arg->debug || srp_arg->msg || srp_arg->amp == 1)
462                 {
463                 BIO_printf(bio_err, "SRP parameters:\n"); 
464                 BIO_printf(bio_err,"\tN="); BN_print(bio_err,N);
465                 BIO_printf(bio_err,"\n\tg="); BN_print(bio_err,g);
466                 BIO_printf(bio_err,"\n");
467                 }
468
469         if (SRP_check_known_gN_param(g,N))
470                 return 1;
471
472         if (srp_arg->amp == 1)
473                 {
474                 if (srp_arg->debug)
475                         BIO_printf(bio_err, "SRP param N and g are not known params, going to check deeper.\n");
476
477 /* The srp_moregroups is a real debugging feature.
478    Implementors should rather add the value to the known ones.
479    The minimal size has already been tested.
480 */
481                 if (BN_num_bits(g) <= BN_BITS && srp_Verify_N_and_g(N,g))
482                         return 1;
483                 }       
484         BIO_printf(bio_err, "SRP param N and g rejected.\n");
485         return 0;
486         }
487
488 #define PWD_STRLEN 1024
489
490 static char * MS_CALLBACK ssl_give_srp_client_pwd_cb(SSL *s, void *arg)
491         {
492         SRP_ARG *srp_arg = (SRP_ARG *)arg;
493         char *pass = (char *)OPENSSL_malloc(PWD_STRLEN+1);
494         PW_CB_DATA cb_tmp;
495         int l;
496
497         cb_tmp.password = (char *)srp_arg->srppassin;
498         cb_tmp.prompt_info = "SRP user";
499         if ((l = password_callback(pass, PWD_STRLEN, 0, &cb_tmp))<0)
500                 {
501                 BIO_printf (bio_err, "Can't read Password\n");
502                 OPENSSL_free(pass);
503                 return NULL;
504                 }
505         *(pass+l)= '\0';
506
507         return pass;
508         }
509
510 #endif
511         char *srtp_profiles = NULL;
512
513 # ifndef OPENSSL_NO_NEXTPROTONEG
514 /* This the context that we pass to next_proto_cb */
515 typedef struct tlsextnextprotoctx_st {
516         unsigned char *data;
517         unsigned short len;
518         int status;
519 } tlsextnextprotoctx;
520
521 static tlsextnextprotoctx next_proto;
522
523 static int next_proto_cb(SSL *s, unsigned char **out, unsigned char *outlen, const unsigned char *in, unsigned int inlen, void *arg)
524         {
525         tlsextnextprotoctx *ctx = arg;
526
527         if (!c_quiet)
528                 {
529                 /* We can assume that |in| is syntactically valid. */
530                 unsigned i;
531                 BIO_printf(bio_c_out, "Protocols advertised by server: ");
532                 for (i = 0; i < inlen; )
533                         {
534                         if (i)
535                                 BIO_write(bio_c_out, ", ", 2);
536                         BIO_write(bio_c_out, &in[i + 1], in[i]);
537                         i += in[i] + 1;
538                         }
539                 BIO_write(bio_c_out, "\n", 1);
540                 }
541
542         ctx->status = SSL_select_next_proto(out, outlen, in, inlen, ctx->data, ctx->len);
543         return SSL_TLSEXT_ERR_OK;
544         }
545 # endif  /* ndef OPENSSL_NO_NEXTPROTONEG */
546 #endif
547
548 enum
549 {
550         PROTO_OFF       = 0,
551         PROTO_SMTP,
552         PROTO_POP3,
553         PROTO_IMAP,
554         PROTO_FTP,
555         PROTO_XMPP
556 };
557
558 int MAIN(int, char **);
559
560 int MAIN(int argc, char **argv)
561         {
562         unsigned int off=0, clr=0;
563         unsigned int cert_flags=0;
564         int build_chain = 0;
565         SSL *con=NULL;
566 #ifndef OPENSSL_NO_KRB5
567         KSSL_CTX *kctx;
568 #endif
569         int s,k,width,state=0;
570         char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
571         int cbuf_len,cbuf_off;
572         int sbuf_len,sbuf_off;
573         fd_set readfds,writefds;
574         short port=PORT;
575         int full_log=1;
576         char *host=SSL_HOST_NAME;
577         char *cert_file=NULL,*key_file=NULL;
578         int cert_format = FORMAT_PEM, key_format = FORMAT_PEM;
579         char *passarg = NULL, *pass = NULL;
580         X509 *cert = NULL;
581         EVP_PKEY *key = NULL;
582         char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
583         int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
584         int crlf=0;
585         int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
586         SSL_CTX *ctx=NULL;
587         int ret=1,in_init=1,i,nbio_test=0;
588         int starttls_proto = PROTO_OFF;
589         int prexit = 0;
590         X509_VERIFY_PARAM *vpm = NULL;
591         int badarg = 0;
592         const SSL_METHOD *meth=NULL;
593         int socket_type=SOCK_STREAM;
594         BIO *sbio;
595         char *inrand=NULL;
596         int mbuf_len=0;
597         struct timeval timeout, *timeoutp;
598 #ifndef OPENSSL_NO_ENGINE
599         char *engine_id=NULL;
600         char *ssl_client_engine_id=NULL;
601         ENGINE *ssl_client_engine=NULL;
602 #endif
603         ENGINE *e=NULL;
604 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
605         struct timeval tv;
606 #if defined(OPENSSL_SYS_BEOS_R5)
607         int stdin_set = 0;
608 #endif
609 #endif
610 #ifndef OPENSSL_NO_TLSEXT
611         char *servername = NULL; 
612         char *curves=NULL;
613         char *sigalgs=NULL;
614         char *client_sigalgs=NULL;
615         tlsextctx tlsextcbp = 
616         {NULL,0};
617 # ifndef OPENSSL_NO_NEXTPROTONEG
618         const char *next_proto_neg_in = NULL;
619 # endif
620 #endif
621         char *sess_in = NULL;
622         char *sess_out = NULL;
623         struct sockaddr peer;
624         int peerlen = sizeof(peer);
625         int enable_timeouts = 0 ;
626         long socket_mtu = 0;
627 #ifndef OPENSSL_NO_JPAKE
628         char *jpake_secret = NULL;
629 #endif
630 #ifndef OPENSSL_NO_SRP
631         char * srppass = NULL;
632         int srp_lateuser = 0;
633         SRP_ARG srp_arg = {NULL,NULL,0,0,0,1024};
634 #endif
635         SSL_EXCERT *exc = NULL;
636
637         unsigned char *checkhost = NULL, *checkemail = NULL;
638         char *checkip = NULL;
639
640         meth=SSLv23_client_method();
641
642         apps_startup();
643         c_Pause=0;
644         c_quiet=0;
645         c_ign_eof=0;
646         c_debug=0;
647         c_msg=0;
648         c_showcerts=0;
649
650         if (bio_err == NULL)
651                 bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
652
653         if (!load_config(bio_err, NULL))
654                 goto end;
655
656         if (    ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
657                 ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
658                 ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
659                 {
660                 BIO_printf(bio_err,"out of memory\n");
661                 goto end;
662                 }
663
664         verify_depth=0;
665         verify_error=X509_V_OK;
666 #ifdef FIONBIO
667         c_nbio=0;
668 #endif
669
670         argc--;
671         argv++;
672         while (argc >= 1)
673                 {
674                 if      (strcmp(*argv,"-host") == 0)
675                         {
676                         if (--argc < 1) goto bad;
677                         host= *(++argv);
678                         }
679                 else if (strcmp(*argv,"-port") == 0)
680                         {
681                         if (--argc < 1) goto bad;
682                         port=atoi(*(++argv));
683                         if (port == 0) goto bad;
684                         }
685                 else if (strcmp(*argv,"-connect") == 0)
686                         {
687                         if (--argc < 1) goto bad;
688                         if (!extract_host_port(*(++argv),&host,NULL,&port))
689                                 goto bad;
690                         }
691                 else if (strcmp(*argv,"-verify") == 0)
692                         {
693                         verify=SSL_VERIFY_PEER;
694                         if (--argc < 1) goto bad;
695                         verify_depth=atoi(*(++argv));
696                         if (!c_quiet)
697                                 BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
698                         }
699                 else if (strcmp(*argv,"-cert") == 0)
700                         {
701                         if (--argc < 1) goto bad;
702                         cert_file= *(++argv);
703                         }
704                 else if (strcmp(*argv,"-sess_out") == 0)
705                         {
706                         if (--argc < 1) goto bad;
707                         sess_out = *(++argv);
708                         }
709                 else if (strcmp(*argv,"-sess_in") == 0)
710                         {
711                         if (--argc < 1) goto bad;
712                         sess_in = *(++argv);
713                         }
714                 else if (strcmp(*argv,"-certform") == 0)
715                         {
716                         if (--argc < 1) goto bad;
717                         cert_format = str2fmt(*(++argv));
718                         }
719                 else if (args_verify(&argv, &argc, &badarg, bio_err, &vpm))
720                         {
721                         if (badarg)
722                                 goto bad;
723                         continue;
724                         }
725                 else if (strcmp(*argv,"-verify_return_error") == 0)
726                         verify_return_error = 1;
727                 else if (strcmp(*argv,"-verify_quiet") == 0)
728                         verify_quiet = 1;
729                 else if (strcmp(*argv,"-brief") == 0)
730                         {
731                         c_brief = 1;
732                         verify_quiet = 1;
733                         c_quiet = 1;
734                         }
735                 else if (args_excert(&argv, &argc, &badarg, bio_err, &exc))
736                         {
737                         if (badarg)
738                                 goto bad;
739                         continue;
740                         }
741                 else if (strcmp(*argv,"-prexit") == 0)
742                         prexit=1;
743                 else if (strcmp(*argv,"-crlf") == 0)
744                         crlf=1;
745                 else if (strcmp(*argv,"-quiet") == 0)
746                         {
747                         c_quiet=1;
748                         c_ign_eof=1;
749                         }
750                 else if (strcmp(*argv,"-ign_eof") == 0)
751                         c_ign_eof=1;
752                 else if (strcmp(*argv,"-no_ign_eof") == 0)
753                         c_ign_eof=0;
754                 else if (strcmp(*argv,"-pause") == 0)
755                         c_Pause=1;
756                 else if (strcmp(*argv,"-debug") == 0)
757                         c_debug=1;
758 #ifndef OPENSSL_NO_TLSEXT
759                 else if (strcmp(*argv,"-tlsextdebug") == 0)
760                         c_tlsextdebug=1;
761                 else if (strcmp(*argv,"-status") == 0)
762                         c_status_req=1;
763                 else if (strcmp(*argv,"-proof_debug") == 0)
764                         c_proof_debug=1;
765 #endif
766 #ifdef WATT32
767                 else if (strcmp(*argv,"-wdebug") == 0)
768                         dbug_init();
769 #endif
770                 else if (strcmp(*argv,"-msg") == 0)
771                         c_msg=1;
772                 else if (strcmp(*argv,"-msgfile") == 0)
773                         {
774                         if (--argc < 1) goto bad;
775                         bio_c_msg = BIO_new_file(*(++argv), "w");
776                         }
777 #ifndef OPENSSL_NO_SSL_TRACE
778                 else if (strcmp(*argv,"-trace") == 0)
779                         c_msg=2;
780 #endif
781                 else if (strcmp(*argv,"-showcerts") == 0)
782                         c_showcerts=1;
783                 else if (strcmp(*argv,"-nbio_test") == 0)
784                         nbio_test=1;
785                 else if (strcmp(*argv,"-state") == 0)
786                         state=1;
787 #ifndef OPENSSL_NO_PSK
788                 else if (strcmp(*argv,"-psk_identity") == 0)
789                         {
790                         if (--argc < 1) goto bad;
791                         psk_identity=*(++argv);
792                         }
793                 else if (strcmp(*argv,"-psk") == 0)
794                         {
795                         size_t j;
796
797                         if (--argc < 1) goto bad;
798                         psk_key=*(++argv);
799                         for (j = 0; j < strlen(psk_key); j++)
800                                 {
801                                 if (isxdigit((unsigned char)psk_key[j]))
802                                         continue;
803                                 BIO_printf(bio_err,"Not a hex number '%s'\n",*argv);
804                                 goto bad;
805                                 }
806                         }
807 #endif
808 #ifndef OPENSSL_NO_SRP
809                 else if (strcmp(*argv,"-srpuser") == 0)
810                         {
811                         if (--argc < 1) goto bad;
812                         srp_arg.srplogin= *(++argv);
813                         meth=TLSv1_client_method();
814                         }
815                 else if (strcmp(*argv,"-srppass") == 0)
816                         {
817                         if (--argc < 1) goto bad;
818                         srppass= *(++argv);
819                         meth=TLSv1_client_method();
820                         }
821                 else if (strcmp(*argv,"-srp_strength") == 0)
822                         {
823                         if (--argc < 1) goto bad;
824                         srp_arg.strength=atoi(*(++argv));
825                         BIO_printf(bio_err,"SRP minimal length for N is %d\n",srp_arg.strength);
826                         meth=TLSv1_client_method();
827                         }
828                 else if (strcmp(*argv,"-srp_lateuser") == 0)
829                         {
830                         srp_lateuser= 1;
831                         meth=TLSv1_client_method();
832                         }
833                 else if (strcmp(*argv,"-srp_moregroups") == 0)
834                         {
835                         srp_arg.amp=1;
836                         meth=TLSv1_client_method();
837                         }
838 #endif
839 #ifndef OPENSSL_NO_SSL2
840                 else if (strcmp(*argv,"-ssl2") == 0)
841                         meth=SSLv2_client_method();
842 #endif
843 #ifndef OPENSSL_NO_SSL3
844                 else if (strcmp(*argv,"-ssl3") == 0)
845                         meth=SSLv3_client_method();
846 #endif
847 #ifndef OPENSSL_NO_TLS1
848                 else if (strcmp(*argv,"-tls1_2") == 0)
849                         meth=TLSv1_2_client_method();
850                 else if (strcmp(*argv,"-tls1_1") == 0)
851                         meth=TLSv1_1_client_method();
852                 else if (strcmp(*argv,"-tls1") == 0)
853                         meth=TLSv1_client_method();
854 #endif
855 #ifndef OPENSSL_NO_DTLS1
856                 else if (strcmp(*argv,"-dtls1") == 0)
857                         {
858                         meth=DTLSv1_client_method();
859                         socket_type=SOCK_DGRAM;
860                         }
861                 else if (strcmp(*argv,"-timeout") == 0)
862                         enable_timeouts=1;
863                 else if (strcmp(*argv,"-mtu") == 0)
864                         {
865                         if (--argc < 1) goto bad;
866                         socket_mtu = atol(*(++argv));
867                         }
868 #endif
869                 else if (strcmp(*argv,"-bugs") == 0)
870                         bugs=1;
871                 else if (strcmp(*argv,"-keyform") == 0)
872                         {
873                         if (--argc < 1) goto bad;
874                         key_format = str2fmt(*(++argv));
875                         }
876                 else if (strcmp(*argv,"-pass") == 0)
877                         {
878                         if (--argc < 1) goto bad;
879                         passarg = *(++argv);
880                         }
881                 else if (strcmp(*argv,"-key") == 0)
882                         {
883                         if (--argc < 1) goto bad;
884                         key_file= *(++argv);
885                         }
886                 else if (strcmp(*argv,"-reconnect") == 0)
887                         {
888                         reconnect=5;
889                         }
890                 else if (strcmp(*argv,"-CApath") == 0)
891                         {
892                         if (--argc < 1) goto bad;
893                         CApath= *(++argv);
894                         }
895                 else if (strcmp(*argv,"-build_chain") == 0)
896                         build_chain = 1;
897                 else if (strcmp(*argv,"-CAfile") == 0)
898                         {
899                         if (--argc < 1) goto bad;
900                         CAfile= *(++argv);
901                         }
902                 else if (strcmp(*argv,"-no_tls1_2") == 0)
903                         off|=SSL_OP_NO_TLSv1_2;
904                 else if (strcmp(*argv,"-no_tls1_1") == 0)
905                         off|=SSL_OP_NO_TLSv1_1;
906                 else if (strcmp(*argv,"-no_tls1") == 0)
907                         off|=SSL_OP_NO_TLSv1;
908                 else if (strcmp(*argv,"-no_ssl3") == 0)
909                         off|=SSL_OP_NO_SSLv3;
910                 else if (strcmp(*argv,"-no_ssl2") == 0)
911                         off|=SSL_OP_NO_SSLv2;
912                 else if (strcmp(*argv,"-no_comp") == 0)
913                         { off|=SSL_OP_NO_COMPRESSION; }
914 #ifndef OPENSSL_NO_TLSEXT
915                 else if (strcmp(*argv,"-no_ticket") == 0)
916                         { off|=SSL_OP_NO_TICKET; }
917 # ifndef OPENSSL_NO_NEXTPROTONEG
918                 else if (strcmp(*argv,"-nextprotoneg") == 0)
919                         {
920                         if (--argc < 1) goto bad;
921                         next_proto_neg_in = *(++argv);
922                         }
923 # endif
924 #endif
925                 else if (strcmp(*argv,"-serverpref") == 0)
926                         off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
927                 else if (strcmp(*argv,"-legacy_renegotiation") == 0)
928                         off|=SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION;
929                 else if (strcmp(*argv,"-legacy_server_connect") == 0)
930                         { off|=SSL_OP_LEGACY_SERVER_CONNECT; }
931                 else if (strcmp(*argv,"-no_legacy_server_connect") == 0)
932                         { clr|=SSL_OP_LEGACY_SERVER_CONNECT; }
933                 else if (strcmp(*argv,"-cipher") == 0)
934                         {
935                         if (--argc < 1) goto bad;
936                         cipher= *(++argv);
937                         }
938 #ifdef FIONBIO
939                 else if (strcmp(*argv,"-nbio") == 0)
940                         { c_nbio=1; }
941 #endif
942                 else if (strcmp(*argv,"-starttls") == 0)
943                         {
944                         if (--argc < 1) goto bad;
945                         ++argv;
946                         if (strcmp(*argv,"smtp") == 0)
947                                 starttls_proto = PROTO_SMTP;
948                         else if (strcmp(*argv,"pop3") == 0)
949                                 starttls_proto = PROTO_POP3;
950                         else if (strcmp(*argv,"imap") == 0)
951                                 starttls_proto = PROTO_IMAP;
952                         else if (strcmp(*argv,"ftp") == 0)
953                                 starttls_proto = PROTO_FTP;
954                         else if (strcmp(*argv, "xmpp") == 0)
955                                 starttls_proto = PROTO_XMPP;
956                         else
957                                 goto bad;
958                         }
959 #ifndef OPENSSL_NO_ENGINE
960                 else if (strcmp(*argv,"-engine") == 0)
961                         {
962                         if (--argc < 1) goto bad;
963                         engine_id = *(++argv);
964                         }
965                 else if (strcmp(*argv,"-ssl_client_engine") == 0)
966                         {
967                         if (--argc < 1) goto bad;
968                         ssl_client_engine_id = *(++argv);
969                         }
970 #endif
971                 else if (strcmp(*argv,"-rand") == 0)
972                         {
973                         if (--argc < 1) goto bad;
974                         inrand= *(++argv);
975                         }
976 #ifndef OPENSSL_NO_TLSEXT
977                 else if (strcmp(*argv,"-servername") == 0)
978                         {
979                         if (--argc < 1) goto bad;
980                         servername= *(++argv);
981                         /* meth=TLSv1_client_method(); */
982                         }
983                 else if (strcmp(*argv,"-curves") == 0)
984                         {
985                         if (--argc < 1) goto bad;
986                         curves= *(++argv);
987                         }
988                 else if (strcmp(*argv,"-sigalgs") == 0)
989                         {
990                         if (--argc < 1) goto bad;
991                         sigalgs= *(++argv);
992                         }
993                 else if (strcmp(*argv,"-client_sigalgs") == 0)
994                         {
995                         if (--argc < 1) goto bad;
996                         client_sigalgs= *(++argv);
997                         }
998 #endif
999                 else if (strcmp(*argv,"-checkhost") == 0)
1000                         {
1001                         if (--argc < 1) goto bad;
1002                         checkhost=(unsigned char *)*(++argv);
1003                         }
1004                 else if (strcmp(*argv,"-checkemail") == 0)
1005                         {
1006                         if (--argc < 1) goto bad;
1007                         checkemail=(unsigned char *)*(++argv);
1008                         }
1009                 else if (strcmp(*argv,"-checkip") == 0)
1010                         {
1011                         if (--argc < 1) goto bad;
1012                         checkip=*(++argv);
1013                         }
1014 #ifndef OPENSSL_NO_JPAKE
1015                 else if (strcmp(*argv,"-jpake") == 0)
1016                         {
1017                         if (--argc < 1) goto bad;
1018                         jpake_secret = *++argv;
1019                         }
1020 #endif
1021                 else if (strcmp(*argv,"-use_srtp") == 0)
1022                         {
1023                         if (--argc < 1) goto bad;
1024                         srtp_profiles = *(++argv);
1025                         }
1026                 else if (strcmp(*argv,"-keymatexport") == 0)
1027                         {
1028                         if (--argc < 1) goto bad;
1029                         keymatexportlabel= *(++argv);
1030                         }
1031                 else if (strcmp(*argv,"-keymatexportlen") == 0)
1032                         {
1033                         if (--argc < 1) goto bad;
1034                         keymatexportlen=atoi(*(++argv));
1035                         if (keymatexportlen == 0) goto bad;
1036                         }
1037                 else if (strcmp(*argv, "-cert_strict") == 0)
1038                         cert_flags |= SSL_CERT_FLAG_TLS_STRICT;
1039 #ifdef OPENSSL_SSL_DEBUG_BROKEN_PROTOCOL
1040                 else if (strcmp(*argv, "-debug_broken_protocol") == 0)
1041                         cert_flags |= SSL_CERT_FLAG_BROKEN_PROTCOL;
1042 #endif
1043                 else
1044                         {
1045                         BIO_printf(bio_err,"unknown option %s\n",*argv);
1046                         badop=1;
1047                         break;
1048                         }
1049                 argc--;
1050                 argv++;
1051                 }
1052         if (badop)
1053                 {
1054 bad:
1055                 sc_usage();
1056                 goto end;
1057                 }
1058
1059 #if !defined(OPENSSL_NO_JPAKE) && !defined(OPENSSL_NO_PSK)
1060         if (jpake_secret)
1061                 {
1062                 if (psk_key)
1063                         {
1064                         BIO_printf(bio_err,
1065                                    "Can't use JPAKE and PSK together\n");
1066                         goto end;
1067                         }
1068                 psk_identity = "JPAKE";
1069                 }
1070
1071         if (cipher)
1072                 {
1073                 BIO_printf(bio_err, "JPAKE sets cipher to PSK\n");
1074                 goto end;
1075                 }
1076         cipher = "PSK";
1077 #endif
1078
1079         OpenSSL_add_ssl_algorithms();
1080         SSL_load_error_strings();
1081
1082 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1083         next_proto.status = -1;
1084         if (next_proto_neg_in)
1085                 {
1086                 next_proto.data = next_protos_parse(&next_proto.len, next_proto_neg_in);
1087                 if (next_proto.data == NULL)
1088                         {
1089                         BIO_printf(bio_err, "Error parsing -nextprotoneg argument\n");
1090                         goto end;
1091                         }
1092                 }
1093         else
1094                 next_proto.data = NULL;
1095 #endif
1096
1097 #ifndef OPENSSL_NO_ENGINE
1098         e = setup_engine(bio_err, engine_id, 1);
1099         if (ssl_client_engine_id)
1100                 {
1101                 ssl_client_engine = ENGINE_by_id(ssl_client_engine_id);
1102                 if (!ssl_client_engine)
1103                         {
1104                         BIO_printf(bio_err,
1105                                         "Error getting client auth engine\n");
1106                         goto end;
1107                         }
1108                 }
1109
1110 #endif
1111         if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))
1112                 {
1113                 BIO_printf(bio_err, "Error getting password\n");
1114                 goto end;
1115                 }
1116
1117         if (key_file == NULL)
1118                 key_file = cert_file;
1119
1120
1121         if (key_file)
1122
1123                 {
1124
1125                 key = load_key(bio_err, key_file, key_format, 0, pass, e,
1126                                "client certificate private key file");
1127                 if (!key)
1128                         {
1129                         ERR_print_errors(bio_err);
1130                         goto end;
1131                         }
1132
1133                 }
1134
1135         if (cert_file)
1136
1137                 {
1138                 cert = load_cert(bio_err,cert_file,cert_format,
1139                                 NULL, e, "client certificate file");
1140
1141                 if (!cert)
1142                         {
1143                         ERR_print_errors(bio_err);
1144                         goto end;
1145                         }
1146                 }
1147
1148         if (!load_excert(&exc, bio_err))
1149                 goto end;
1150
1151         if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
1152                 && !RAND_status())
1153                 {
1154                 BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
1155                 }
1156         if (inrand != NULL)
1157                 BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
1158                         app_RAND_load_files(inrand));
1159
1160         if (bio_c_out == NULL)
1161                 {
1162                 if (c_quiet && !c_debug && !c_msg)
1163                         {
1164                         bio_c_out=BIO_new(BIO_s_null());
1165                         }
1166                 else
1167                         {
1168                         if (bio_c_out == NULL)
1169                                 bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
1170                         }
1171                 }
1172
1173 #ifndef OPENSSL_NO_SRP
1174         if(!app_passwd(bio_err, srppass, NULL, &srp_arg.srppassin, NULL))
1175                 {
1176                 BIO_printf(bio_err, "Error getting password\n");
1177                 goto end;
1178                 }
1179 #endif
1180
1181         ctx=SSL_CTX_new(meth);
1182         if (ctx == NULL)
1183                 {
1184                 ERR_print_errors(bio_err);
1185                 goto end;
1186                 }
1187
1188         if (vpm)
1189                 SSL_CTX_set1_param(ctx, vpm);
1190
1191 #ifndef OPENSSL_NO_ENGINE
1192         if (ssl_client_engine)
1193                 {
1194                 if (!SSL_CTX_set_client_cert_engine(ctx, ssl_client_engine))
1195                         {
1196                         BIO_puts(bio_err, "Error setting client auth engine\n");
1197                         ERR_print_errors(bio_err);
1198                         ENGINE_free(ssl_client_engine);
1199                         goto end;
1200                         }
1201                 ENGINE_free(ssl_client_engine);
1202                 }
1203 #endif
1204
1205 #ifndef OPENSSL_NO_PSK
1206 #ifdef OPENSSL_NO_JPAKE
1207         if (psk_key != NULL)
1208 #else
1209         if (psk_key != NULL || jpake_secret)
1210 #endif
1211                 {
1212                 if (c_debug)
1213                         BIO_printf(bio_c_out, "PSK key given or JPAKE in use, setting client callback\n");
1214                 SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
1215                 }
1216         if (srtp_profiles != NULL)
1217                 SSL_CTX_set_tlsext_use_srtp(ctx, srtp_profiles);
1218 #endif
1219         if (bugs)
1220                 SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
1221         else
1222                 SSL_CTX_set_options(ctx,off);
1223
1224         if (clr)
1225                 SSL_CTX_clear_options(ctx, clr);
1226         if (cert_flags) SSL_CTX_set_cert_flags(ctx, cert_flags);
1227         if (exc) ssl_ctx_set_excert(ctx, exc);
1228         /* DTLS: partial reads end up discarding unread UDP bytes :-( 
1229          * Setting read ahead solves this problem.
1230          */
1231         if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
1232
1233 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
1234         if (next_proto.data)
1235                 SSL_CTX_set_next_proto_select_cb(ctx, next_proto_cb, &next_proto);
1236 #endif
1237
1238         if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
1239         if (cipher != NULL)
1240                 if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
1241                 BIO_printf(bio_err,"error setting cipher list\n");
1242                 ERR_print_errors(bio_err);
1243                 goto end;
1244         }
1245 #if 0
1246         else
1247                 SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
1248 #endif
1249
1250         SSL_CTX_set_verify(ctx,verify,verify_callback);
1251
1252         if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
1253                 (!SSL_CTX_set_default_verify_paths(ctx)))
1254                 {
1255                 /* BIO_printf(bio_err,"error setting default verify locations\n"); */
1256                 ERR_print_errors(bio_err);
1257                 /* goto end; */
1258                 }
1259
1260         if (!set_cert_key_stuff(ctx,cert,key, NULL, build_chain))
1261                 goto end;
1262
1263 #ifndef OPENSSL_NO_TLSEXT
1264         if (curves != NULL)
1265                 if(!SSL_CTX_set1_curves_list(ctx,curves)) {
1266                 BIO_printf(bio_err,"error setting curve list\n");
1267                 ERR_print_errors(bio_err);
1268                 goto end;
1269         }
1270         if (sigalgs != NULL)
1271                 if(!SSL_CTX_set1_sigalgs_list(ctx,sigalgs)) {
1272                 BIO_printf(bio_err,"error setting signature algorithms list\n");
1273                 ERR_print_errors(bio_err);
1274                 goto end;
1275         }
1276         if (client_sigalgs != NULL)
1277                 if(!SSL_CTX_set1_client_sigalgs_list(ctx,client_sigalgs)) {
1278                 BIO_printf(bio_err,"error setting client signature algorithms list\n");
1279                 ERR_print_errors(bio_err);
1280                 goto end;
1281         }
1282         if (servername != NULL)
1283                 {
1284                 tlsextcbp.biodebug = bio_err;
1285                 SSL_CTX_set_tlsext_servername_callback(ctx, ssl_servername_cb);
1286                 SSL_CTX_set_tlsext_servername_arg(ctx, &tlsextcbp);
1287                 }
1288 #ifndef OPENSSL_NO_SRP
1289         if (srp_arg.srplogin)
1290                 {
1291                 if (!srp_lateuser && !SSL_CTX_set_srp_username(ctx, srp_arg.srplogin))
1292                         {
1293                         BIO_printf(bio_err,"Unable to set SRP username\n");
1294                         goto end;
1295                         }
1296                 srp_arg.msg = c_msg;
1297                 srp_arg.debug = c_debug ;
1298                 SSL_CTX_set_srp_cb_arg(ctx,&srp_arg);
1299                 SSL_CTX_set_srp_client_pwd_callback(ctx, ssl_give_srp_client_pwd_cb);
1300                 SSL_CTX_set_srp_strength(ctx, srp_arg.strength);
1301                 if (c_msg || c_debug || srp_arg.amp == 0)
1302                         SSL_CTX_set_srp_verify_param_callback(ctx, ssl_srp_verify_param_cb);
1303                 }
1304
1305 #endif
1306         if (c_proof_debug)
1307                 SSL_CTX_set_tlsext_authz_server_audit_proof_cb(ctx,
1308                                                                audit_proof_cb);
1309 #endif
1310
1311         con=SSL_new(ctx);
1312         if (sess_in)
1313                 {
1314                 SSL_SESSION *sess;
1315                 BIO *stmp = BIO_new_file(sess_in, "r");
1316                 if (!stmp)
1317                         {
1318                         BIO_printf(bio_err, "Can't open session file %s\n",
1319                                                 sess_in);
1320                         ERR_print_errors(bio_err);
1321                         goto end;
1322                         }
1323                 sess = PEM_read_bio_SSL_SESSION(stmp, NULL, 0, NULL);
1324                 BIO_free(stmp);
1325                 if (!sess)
1326                         {
1327                         BIO_printf(bio_err, "Can't open session file %s\n",
1328                                                 sess_in);
1329                         ERR_print_errors(bio_err);
1330                         goto end;
1331                         }
1332                 SSL_set_session(con, sess);
1333                 SSL_SESSION_free(sess);
1334                 }
1335 #ifndef OPENSSL_NO_TLSEXT
1336         if (servername != NULL)
1337                 {
1338                 if (!SSL_set_tlsext_host_name(con,servername))
1339                         {
1340                         BIO_printf(bio_err,"Unable to set TLS servername extension.\n");
1341                         ERR_print_errors(bio_err);
1342                         goto end;
1343                         }
1344                 }
1345 #endif
1346 #ifndef OPENSSL_NO_KRB5
1347         if (con  &&  (kctx = kssl_ctx_new()) != NULL)
1348                 {
1349                 SSL_set0_kssl_ctx(con, kctx);
1350                 kssl_ctx_setstring(kctx, KSSL_SERVER, host);
1351                 }
1352 #endif  /* OPENSSL_NO_KRB5  */
1353 /*      SSL_set_cipher_list(con,"RC4-MD5"); */
1354 #if 0
1355 #ifdef TLSEXT_TYPE_opaque_prf_input
1356         SSL_set_tlsext_opaque_prf_input(con, "Test client", 11);
1357 #endif
1358 #endif
1359
1360 re_start:
1361
1362         if (init_client(&s,host,port,socket_type) == 0)
1363                 {
1364                 BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
1365                 SHUTDOWN(s);
1366                 goto end;
1367                 }
1368         BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
1369
1370 #ifdef FIONBIO
1371         if (c_nbio)
1372                 {
1373                 unsigned long l=1;
1374                 BIO_printf(bio_c_out,"turning on non blocking io\n");
1375                 if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
1376                         {
1377                         ERR_print_errors(bio_err);
1378                         goto end;
1379                         }
1380                 }
1381 #endif                                              
1382         if (c_Pause & 0x01) SSL_set_debug(con, 1);
1383
1384         if ( SSL_version(con) == DTLS1_VERSION)
1385                 {
1386
1387                 sbio=BIO_new_dgram(s,BIO_NOCLOSE);
1388                 if (getsockname(s, &peer, (void *)&peerlen) < 0)
1389                         {
1390                         BIO_printf(bio_err, "getsockname:errno=%d\n",
1391                                 get_last_socket_error());
1392                         SHUTDOWN(s);
1393                         goto end;
1394                         }
1395
1396                 (void)BIO_ctrl_set_connected(sbio, 1, &peer);
1397
1398                 if (enable_timeouts)
1399                         {
1400                         timeout.tv_sec = 0;
1401                         timeout.tv_usec = DGRAM_RCV_TIMEOUT;
1402                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);
1403                         
1404                         timeout.tv_sec = 0;
1405                         timeout.tv_usec = DGRAM_SND_TIMEOUT;
1406                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);
1407                         }
1408
1409                 if (socket_mtu > 28)
1410                         {
1411                         SSL_set_options(con, SSL_OP_NO_QUERY_MTU);
1412                         SSL_set_mtu(con, socket_mtu - 28);
1413                         }
1414                 else
1415                         /* want to do MTU discovery */
1416                         BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);
1417                 }
1418         else
1419                 sbio=BIO_new_socket(s,BIO_NOCLOSE);
1420
1421         if (nbio_test)
1422                 {
1423                 BIO *test;
1424
1425                 test=BIO_new(BIO_f_nbio_test());
1426                 sbio=BIO_push(test,sbio);
1427                 }
1428
1429         if (c_debug)
1430                 {
1431                 SSL_set_debug(con, 1);
1432                 BIO_set_callback(sbio,bio_dump_callback);
1433                 BIO_set_callback_arg(sbio,(char *)bio_c_out);
1434                 }
1435         if (c_msg)
1436                 {
1437 #ifndef OPENSSL_NO_SSL_TRACE
1438                 if (c_msg == 2)
1439                         SSL_set_msg_callback(con, SSL_trace);
1440                 else
1441 #endif
1442                         SSL_set_msg_callback(con, msg_cb);
1443                 SSL_set_msg_callback_arg(con, bio_c_msg ? bio_c_msg : bio_c_out);
1444                 }
1445 #ifndef OPENSSL_NO_TLSEXT
1446         if (c_tlsextdebug)
1447                 {
1448                 SSL_set_tlsext_debug_callback(con, tlsext_cb);
1449                 SSL_set_tlsext_debug_arg(con, bio_c_out);
1450                 }
1451         if (c_status_req)
1452                 {
1453                 SSL_set_tlsext_status_type(con, TLSEXT_STATUSTYPE_ocsp);
1454                 SSL_CTX_set_tlsext_status_cb(ctx, ocsp_resp_cb);
1455                 SSL_CTX_set_tlsext_status_arg(ctx, bio_c_out);
1456 #if 0
1457 {
1458 STACK_OF(OCSP_RESPID) *ids = sk_OCSP_RESPID_new_null();
1459 OCSP_RESPID *id = OCSP_RESPID_new();
1460 id->value.byKey = ASN1_OCTET_STRING_new();
1461 id->type = V_OCSP_RESPID_KEY;
1462 ASN1_STRING_set(id->value.byKey, "Hello World", -1);
1463 sk_OCSP_RESPID_push(ids, id);
1464 SSL_set_tlsext_status_ids(con, ids);
1465 }
1466 #endif
1467                 }
1468 #endif
1469 #ifndef OPENSSL_NO_JPAKE
1470         if (jpake_secret)
1471                 jpake_client_auth(bio_c_out, sbio, jpake_secret);
1472 #endif
1473
1474         SSL_set_bio(con,sbio,sbio);
1475         SSL_set_connect_state(con);
1476
1477         /* ok, lets connect */
1478         width=SSL_get_fd(con)+1;
1479
1480         read_tty=1;
1481         write_tty=0;
1482         tty_on=0;
1483         read_ssl=1;
1484         write_ssl=1;
1485         
1486         cbuf_len=0;
1487         cbuf_off=0;
1488         sbuf_len=0;
1489         sbuf_off=0;
1490
1491         /* This is an ugly hack that does a lot of assumptions */
1492         /* We do have to handle multi-line responses which may come
1493            in a single packet or not. We therefore have to use
1494            BIO_gets() which does need a buffering BIO. So during
1495            the initial chitchat we do push a buffering BIO into the
1496            chain that is removed again later on to not disturb the
1497            rest of the s_client operation. */
1498         if (starttls_proto == PROTO_SMTP)
1499                 {
1500                 int foundit=0;
1501                 BIO *fbio = BIO_new(BIO_f_buffer());
1502                 BIO_push(fbio, sbio);
1503                 /* wait for multi-line response to end from SMTP */
1504                 do
1505                         {
1506                         mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1507                         }
1508                 while (mbuf_len>3 && mbuf[3]=='-');
1509                 /* STARTTLS command requires EHLO... */
1510                 BIO_printf(fbio,"EHLO openssl.client.net\r\n");
1511                 (void)BIO_flush(fbio);
1512                 /* wait for multi-line response to end EHLO SMTP response */
1513                 do
1514                         {
1515                         mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1516                         if (strstr(mbuf,"STARTTLS"))
1517                                 foundit=1;
1518                         }
1519                 while (mbuf_len>3 && mbuf[3]=='-');
1520                 (void)BIO_flush(fbio);
1521                 BIO_pop(fbio);
1522                 BIO_free(fbio);
1523                 if (!foundit)
1524                         BIO_printf(bio_err,
1525                                    "didn't found starttls in server response,"
1526                                    " try anyway...\n");
1527                 BIO_printf(sbio,"STARTTLS\r\n");
1528                 BIO_read(sbio,sbuf,BUFSIZZ);
1529                 }
1530         else if (starttls_proto == PROTO_POP3)
1531                 {
1532                 BIO_read(sbio,mbuf,BUFSIZZ);
1533                 BIO_printf(sbio,"STLS\r\n");
1534                 BIO_read(sbio,sbuf,BUFSIZZ);
1535                 }
1536         else if (starttls_proto == PROTO_IMAP)
1537                 {
1538                 int foundit=0;
1539                 BIO *fbio = BIO_new(BIO_f_buffer());
1540                 BIO_push(fbio, sbio);
1541                 BIO_gets(fbio,mbuf,BUFSIZZ);
1542                 /* STARTTLS command requires CAPABILITY... */
1543                 BIO_printf(fbio,". CAPABILITY\r\n");
1544                 (void)BIO_flush(fbio);
1545                 /* wait for multi-line CAPABILITY response */
1546                 do
1547                         {
1548                         mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1549                         if (strstr(mbuf,"STARTTLS"))
1550                                 foundit=1;
1551                         }
1552                 while (mbuf_len>3 && mbuf[0]!='.');
1553                 (void)BIO_flush(fbio);
1554                 BIO_pop(fbio);
1555                 BIO_free(fbio);
1556                 if (!foundit)
1557                         BIO_printf(bio_err,
1558                                    "didn't found STARTTLS in server response,"
1559                                    " try anyway...\n");
1560                 BIO_printf(sbio,". STARTTLS\r\n");
1561                 BIO_read(sbio,sbuf,BUFSIZZ);
1562                 }
1563         else if (starttls_proto == PROTO_FTP)
1564                 {
1565                 BIO *fbio = BIO_new(BIO_f_buffer());
1566                 BIO_push(fbio, sbio);
1567                 /* wait for multi-line response to end from FTP */
1568                 do
1569                         {
1570                         mbuf_len = BIO_gets(fbio,mbuf,BUFSIZZ);
1571                         }
1572                 while (mbuf_len>3 && mbuf[3]=='-');
1573                 (void)BIO_flush(fbio);
1574                 BIO_pop(fbio);
1575                 BIO_free(fbio);
1576                 BIO_printf(sbio,"AUTH TLS\r\n");
1577                 BIO_read(sbio,sbuf,BUFSIZZ);
1578                 }
1579         if (starttls_proto == PROTO_XMPP)
1580                 {
1581                 int seen = 0;
1582                 BIO_printf(sbio,"<stream:stream "
1583                     "xmlns:stream='http://etherx.jabber.org/streams' "
1584                     "xmlns='jabber:client' to='%s' version='1.0'>", host);
1585                 seen = BIO_read(sbio,mbuf,BUFSIZZ);
1586                 mbuf[seen] = 0;
1587                 while (!strstr(mbuf, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'"))
1588                         {
1589                         if (strstr(mbuf, "/stream:features>"))
1590                                 goto shut;
1591                         seen = BIO_read(sbio,mbuf,BUFSIZZ);
1592                         mbuf[seen] = 0;
1593                         }
1594                 BIO_printf(sbio, "<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
1595                 seen = BIO_read(sbio,sbuf,BUFSIZZ);
1596                 sbuf[seen] = 0;
1597                 if (!strstr(sbuf, "<proceed"))
1598                         goto shut;
1599                 mbuf[0] = 0;
1600                 }
1601
1602         for (;;)
1603                 {
1604                 FD_ZERO(&readfds);
1605                 FD_ZERO(&writefds);
1606
1607                 if ((SSL_version(con) == DTLS1_VERSION) &&
1608                         DTLSv1_get_timeout(con, &timeout))
1609                         timeoutp = &timeout;
1610                 else
1611                         timeoutp = NULL;
1612
1613                 if (SSL_in_init(con) && !SSL_total_renegotiations(con))
1614                         {
1615                         in_init=1;
1616                         tty_on=0;
1617                         }
1618                 else
1619                         {
1620                         tty_on=1;
1621                         if (in_init)
1622                                 {
1623                                 in_init=0;
1624 #if 0 /* This test doesn't really work as intended (needs to be fixed) */
1625 #ifndef OPENSSL_NO_TLSEXT
1626                                 if (servername != NULL && !SSL_session_reused(con))
1627                                         {
1628                                         BIO_printf(bio_c_out,"Server did %sacknowledge servername extension.\n",tlsextcbp.ack?"":"not ");
1629                                         }
1630 #endif
1631 #endif
1632                                 if (sess_out)
1633                                         {
1634                                         BIO *stmp = BIO_new_file(sess_out, "w");
1635                                         if (stmp)
1636                                                 {
1637                                                 PEM_write_bio_SSL_SESSION(stmp, SSL_get_session(con));
1638                                                 BIO_free(stmp);
1639                                                 }
1640                                         else 
1641                                                 BIO_printf(bio_err, "Error writing session file %s\n", sess_out);
1642                                         }
1643                                 if (c_brief)
1644                                         {
1645                                         BIO_puts(bio_err,
1646                                                 "CONNECTION ESTABLISHED\n");
1647                                         print_ssl_summary(bio_err, con);
1648                                         }
1649                                 print_ssl_cert_checks(bio_err, con, checkhost,
1650                                                         checkemail, checkip);
1651                                 print_stuff(bio_c_out,con,full_log);
1652                                 if (full_log > 0) full_log--;
1653
1654                                 if (starttls_proto)
1655                                         {
1656                                         BIO_printf(bio_err,"%s",mbuf);
1657                                         /* We don't need to know any more */
1658                                         starttls_proto = PROTO_OFF;
1659                                         }
1660
1661                                 if (reconnect)
1662                                         {
1663                                         reconnect--;
1664                                         BIO_printf(bio_c_out,"drop connection and then reconnect\n");
1665                                         SSL_shutdown(con);
1666                                         SSL_set_connect_state(con);
1667                                         SHUTDOWN(SSL_get_fd(con));
1668                                         goto re_start;
1669                                         }
1670                                 }
1671                         }
1672
1673                 ssl_pending = read_ssl && SSL_pending(con);
1674
1675                 if (!ssl_pending)
1676                         {
1677 #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE) && !defined (OPENSSL_SYS_BEOS_R5)
1678                         if (tty_on)
1679                                 {
1680                                 if (read_tty)  openssl_fdset(fileno(stdin),&readfds);
1681                                 if (write_tty) openssl_fdset(fileno(stdout),&writefds);
1682                                 }
1683                         if (read_ssl)
1684                                 openssl_fdset(SSL_get_fd(con),&readfds);
1685                         if (write_ssl)
1686                                 openssl_fdset(SSL_get_fd(con),&writefds);
1687 #else
1688                         if(!tty_on || !write_tty) {
1689                                 if (read_ssl)
1690                                         openssl_fdset(SSL_get_fd(con),&readfds);
1691                                 if (write_ssl)
1692                                         openssl_fdset(SSL_get_fd(con),&writefds);
1693                         }
1694 #endif
1695 /*                      printf("mode tty(%d %d%d) ssl(%d%d)\n",
1696                                 tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
1697
1698                         /* Note: under VMS with SOCKETSHR the second parameter
1699                          * is currently of type (int *) whereas under other
1700                          * systems it is (void *) if you don't have a cast it
1701                          * will choke the compiler: if you do have a cast then
1702                          * you can either go for (int *) or (void *).
1703                          */
1704 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1705                         /* Under Windows/DOS we make the assumption that we can
1706                          * always write to the tty: therefore if we need to
1707                          * write to the tty we just fall through. Otherwise
1708                          * we timeout the select every second and see if there
1709                          * are any keypresses. Note: this is a hack, in a proper
1710                          * Windows application we wouldn't do this.
1711                          */
1712                         i=0;
1713                         if(!write_tty) {
1714                                 if(read_tty) {
1715                                         tv.tv_sec = 1;
1716                                         tv.tv_usec = 0;
1717                                         i=select(width,(void *)&readfds,(void *)&writefds,
1718                                                  NULL,&tv);
1719 #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1720                                         if(!i && (!_kbhit() || !read_tty) ) continue;
1721 #else
1722                                         if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
1723 #endif
1724                                 } else  i=select(width,(void *)&readfds,(void *)&writefds,
1725                                          NULL,timeoutp);
1726                         }
1727 #elif defined(OPENSSL_SYS_NETWARE)
1728                         if(!write_tty) {
1729                                 if(read_tty) {
1730                                         tv.tv_sec = 1;
1731                                         tv.tv_usec = 0;
1732                                         i=select(width,(void *)&readfds,(void *)&writefds,
1733                                                 NULL,&tv);
1734                                 } else  i=select(width,(void *)&readfds,(void *)&writefds,
1735                                         NULL,timeoutp);
1736                         }
1737 #elif defined(OPENSSL_SYS_BEOS_R5)
1738                         /* Under BeOS-R5 the situation is similar to DOS */
1739                         i=0;
1740                         stdin_set = 0;
1741                         (void)fcntl(fileno(stdin), F_SETFL, O_NONBLOCK);
1742                         if(!write_tty) {
1743                                 if(read_tty) {
1744                                         tv.tv_sec = 1;
1745                                         tv.tv_usec = 0;
1746                                         i=select(width,(void *)&readfds,(void *)&writefds,
1747                                                  NULL,&tv);
1748                                         if (read(fileno(stdin), sbuf, 0) >= 0)
1749                                                 stdin_set = 1;
1750                                         if (!i && (stdin_set != 1 || !read_tty))
1751                                                 continue;
1752                                 } else  i=select(width,(void *)&readfds,(void *)&writefds,
1753                                          NULL,timeoutp);
1754                         }
1755                         (void)fcntl(fileno(stdin), F_SETFL, 0);
1756 #else
1757                         i=select(width,(void *)&readfds,(void *)&writefds,
1758                                  NULL,timeoutp);
1759 #endif
1760                         if ( i < 0)
1761                                 {
1762                                 BIO_printf(bio_err,"bad select %d\n",
1763                                 get_last_socket_error());
1764                                 goto shut;
1765                                 /* goto end; */
1766                                 }
1767                         }
1768
1769                 if ((SSL_version(con) == DTLS1_VERSION) && DTLSv1_handle_timeout(con) > 0)
1770                         {
1771                         BIO_printf(bio_err,"TIMEOUT occured\n");
1772                         }
1773
1774                 if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
1775                         {
1776                         k=SSL_write(con,&(cbuf[cbuf_off]),
1777                                 (unsigned int)cbuf_len);
1778                         switch (SSL_get_error(con,k))
1779                                 {
1780                         case SSL_ERROR_NONE:
1781                                 cbuf_off+=k;
1782                                 cbuf_len-=k;
1783                                 if (k <= 0) goto end;
1784                                 /* we have done a  write(con,NULL,0); */
1785                                 if (cbuf_len <= 0)
1786                                         {
1787                                         read_tty=1;
1788                                         write_ssl=0;
1789                                         }
1790                                 else /* if (cbuf_len > 0) */
1791                                         {
1792                                         read_tty=0;
1793                                         write_ssl=1;
1794                                         }
1795                                 break;
1796                         case SSL_ERROR_WANT_WRITE:
1797                                 BIO_printf(bio_c_out,"write W BLOCK\n");
1798                                 write_ssl=1;
1799                                 read_tty=0;
1800                                 break;
1801                         case SSL_ERROR_WANT_READ:
1802                                 BIO_printf(bio_c_out,"write R BLOCK\n");
1803                                 write_tty=0;
1804                                 read_ssl=1;
1805                                 write_ssl=0;
1806                                 break;
1807                         case SSL_ERROR_WANT_X509_LOOKUP:
1808                                 BIO_printf(bio_c_out,"write X BLOCK\n");
1809                                 break;
1810                         case SSL_ERROR_ZERO_RETURN:
1811                                 if (cbuf_len != 0)
1812                                         {
1813                                         BIO_printf(bio_c_out,"shutdown\n");
1814                                         ret = 0;
1815                                         goto shut;
1816                                         }
1817                                 else
1818                                         {
1819                                         read_tty=1;
1820                                         write_ssl=0;
1821                                         break;
1822                                         }
1823                                 
1824                         case SSL_ERROR_SYSCALL:
1825                                 if ((k != 0) || (cbuf_len != 0))
1826                                         {
1827                                         BIO_printf(bio_err,"write:errno=%d\n",
1828                                                 get_last_socket_error());
1829                                         goto shut;
1830                                         }
1831                                 else
1832                                         {
1833                                         read_tty=1;
1834                                         write_ssl=0;
1835                                         }
1836                                 break;
1837                         case SSL_ERROR_SSL:
1838                                 ERR_print_errors(bio_err);
1839                                 goto shut;
1840                                 }
1841                         }
1842 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS) || defined(OPENSSL_SYS_NETWARE) || defined(OPENSSL_SYS_BEOS_R5)
1843                 /* Assume Windows/DOS/BeOS can always write */
1844                 else if (!ssl_pending && write_tty)
1845 #else
1846                 else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
1847 #endif
1848                         {
1849 #ifdef CHARSET_EBCDIC
1850                         ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
1851 #endif
1852                         i=raw_write_stdout(&(sbuf[sbuf_off]),sbuf_len);
1853
1854                         if (i <= 0)
1855                                 {
1856                                 BIO_printf(bio_c_out,"DONE\n");
1857                                 ret = 0;
1858                                 goto shut;
1859                                 /* goto end; */
1860                                 }
1861
1862                         sbuf_len-=i;;
1863                         sbuf_off+=i;
1864                         if (sbuf_len <= 0)
1865                                 {
1866                                 read_ssl=1;
1867                                 write_tty=0;
1868                                 }
1869                         }
1870                 else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
1871                         {
1872 #ifdef RENEG
1873 { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
1874 #endif
1875 #if 1
1876                         k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
1877 #else
1878 /* Demo for pending and peek :-) */
1879                         k=SSL_read(con,sbuf,16);
1880 { char zbuf[10240]; 
1881 printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
1882 }
1883 #endif
1884
1885                         switch (SSL_get_error(con,k))
1886                                 {
1887                         case SSL_ERROR_NONE:
1888                                 if (k <= 0)
1889                                         goto end;
1890                                 sbuf_off=0;
1891                                 sbuf_len=k;
1892
1893                                 read_ssl=0;
1894                                 write_tty=1;
1895                                 break;
1896                         case SSL_ERROR_WANT_WRITE:
1897                                 BIO_printf(bio_c_out,"read W BLOCK\n");
1898                                 write_ssl=1;
1899                                 read_tty=0;
1900                                 break;
1901                         case SSL_ERROR_WANT_READ:
1902                                 BIO_printf(bio_c_out,"read R BLOCK\n");
1903                                 write_tty=0;
1904                                 read_ssl=1;
1905                                 if ((read_tty == 0) && (write_ssl == 0))
1906                                         write_ssl=1;
1907                                 break;
1908                         case SSL_ERROR_WANT_X509_LOOKUP:
1909                                 BIO_printf(bio_c_out,"read X BLOCK\n");
1910                                 break;
1911                         case SSL_ERROR_SYSCALL:
1912                                 ret=get_last_socket_error();
1913                                 BIO_printf(bio_err,"read:errno=%d\n",ret);
1914                                 goto shut;
1915                         case SSL_ERROR_ZERO_RETURN:
1916                                 BIO_printf(bio_c_out,"closed\n");
1917                                 ret=0;
1918                                 goto shut;
1919                         case SSL_ERROR_SSL:
1920                                 ERR_print_errors(bio_err);
1921                                 goto shut;
1922                                 /* break; */
1923                                 }
1924                         }
1925
1926 #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
1927 #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
1928                 else if (_kbhit())
1929 #else
1930                 else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
1931 #endif
1932 #elif defined (OPENSSL_SYS_NETWARE)
1933                 else if (_kbhit())
1934 #elif defined(OPENSSL_SYS_BEOS_R5)
1935                 else if (stdin_set)
1936 #else
1937                 else if (FD_ISSET(fileno(stdin),&readfds))
1938 #endif
1939                         {
1940                         if (crlf)
1941                                 {
1942                                 int j, lf_num;
1943
1944                                 i=raw_read_stdin(cbuf,BUFSIZZ/2);
1945                                 lf_num = 0;
1946                                 /* both loops are skipped when i <= 0 */
1947                                 for (j = 0; j < i; j++)
1948                                         if (cbuf[j] == '\n')
1949                                                 lf_num++;
1950                                 for (j = i-1; j >= 0; j--)
1951                                         {
1952                                         cbuf[j+lf_num] = cbuf[j];
1953                                         if (cbuf[j] == '\n')
1954                                                 {
1955                                                 lf_num--;
1956                                                 i++;
1957                                                 cbuf[j+lf_num] = '\r';
1958                                                 }
1959                                         }
1960                                 assert(lf_num == 0);
1961                                 }
1962                         else
1963                                 i=raw_read_stdin(cbuf,BUFSIZZ);
1964
1965                         if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
1966                                 {
1967                                 BIO_printf(bio_err,"DONE\n");
1968                                 ret=0;
1969                                 goto shut;
1970                                 }
1971
1972                         if ((!c_ign_eof) && (cbuf[0] == 'R'))
1973                                 {
1974                                 BIO_printf(bio_err,"RENEGOTIATING\n");
1975                                 SSL_renegotiate(con);
1976                                 cbuf_len=0;
1977                                 }
1978 #ifndef OPENSSL_NO_HEARTBEATS
1979                         else if ((!c_ign_eof) && (cbuf[0] == 'B'))
1980                                 {
1981                                 BIO_printf(bio_err,"HEARTBEATING\n");
1982                                 SSL_heartbeat(con);
1983                                 cbuf_len=0;
1984                                 }
1985 #endif
1986                         else
1987                                 {
1988                                 cbuf_len=i;
1989                                 cbuf_off=0;
1990 #ifdef CHARSET_EBCDIC
1991                                 ebcdic2ascii(cbuf, cbuf, i);
1992 #endif
1993                                 }
1994
1995                         write_ssl=1;
1996                         read_tty=0;
1997                         }
1998                 }
1999
2000         ret=0;
2001 shut:
2002         if (in_init)
2003                 print_stuff(bio_c_out,con,full_log);
2004         SSL_shutdown(con);
2005         SHUTDOWN(SSL_get_fd(con));
2006 end:
2007         if (con != NULL)
2008                 {
2009                 if (prexit != 0)
2010                         print_stuff(bio_c_out,con,1);
2011                 SSL_free(con);
2012                 }
2013 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2014         if (next_proto.data)
2015                 OPENSSL_free(next_proto.data);
2016 #endif
2017         if (ctx != NULL) SSL_CTX_free(ctx);
2018         if (cert)
2019                 X509_free(cert);
2020         if (key)
2021                 EVP_PKEY_free(key);
2022         if (pass)
2023                 OPENSSL_free(pass);
2024         ssl_excert_free(exc);
2025         if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
2026         if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
2027         if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
2028         if (bio_c_out != NULL)
2029                 {
2030                 BIO_free(bio_c_out);
2031                 bio_c_out=NULL;
2032                 }
2033         if (bio_c_msg != NULL)
2034                 {
2035                 BIO_free(bio_c_msg);
2036                 bio_c_msg=NULL;
2037                 }
2038         apps_shutdown();
2039         OPENSSL_EXIT(ret);
2040         }
2041
2042
2043 static void print_stuff(BIO *bio, SSL *s, int full)
2044         {
2045         X509 *peer=NULL;
2046         char *p;
2047         static const char *space="                ";
2048         char buf[BUFSIZ];
2049         STACK_OF(X509) *sk;
2050         STACK_OF(X509_NAME) *sk2;
2051         const SSL_CIPHER *c;
2052         X509_NAME *xn;
2053         int j,i;
2054 #ifndef OPENSSL_NO_COMP
2055         const COMP_METHOD *comp, *expansion;
2056 #endif
2057         unsigned char *exportedkeymat;
2058
2059         if (full)
2060                 {
2061                 int got_a_chain = 0;
2062
2063                 sk=SSL_get_peer_cert_chain(s);
2064                 if (sk != NULL)
2065                         {
2066                         got_a_chain = 1; /* we don't have it for SSL2 (yet) */
2067
2068                         BIO_printf(bio,"---\nCertificate chain\n");
2069                         for (i=0; i<sk_X509_num(sk); i++)
2070                                 {
2071                                 X509_NAME_oneline(X509_get_subject_name(
2072                                         sk_X509_value(sk,i)),buf,sizeof buf);
2073                                 BIO_printf(bio,"%2d s:%s\n",i,buf);
2074                                 X509_NAME_oneline(X509_get_issuer_name(
2075                                         sk_X509_value(sk,i)),buf,sizeof buf);
2076                                 BIO_printf(bio,"   i:%s\n",buf);
2077                                 if (c_showcerts)
2078                                         PEM_write_bio_X509(bio,sk_X509_value(sk,i));
2079                                 }
2080                         }
2081
2082                 BIO_printf(bio,"---\n");
2083                 peer=SSL_get_peer_certificate(s);
2084                 if (peer != NULL)
2085                         {
2086                         BIO_printf(bio,"Server certificate\n");
2087                         if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
2088                                 PEM_write_bio_X509(bio,peer);
2089                         X509_NAME_oneline(X509_get_subject_name(peer),
2090                                 buf,sizeof buf);
2091                         BIO_printf(bio,"subject=%s\n",buf);
2092                         X509_NAME_oneline(X509_get_issuer_name(peer),
2093                                 buf,sizeof buf);
2094                         BIO_printf(bio,"issuer=%s\n",buf);
2095                         }
2096                 else
2097                         BIO_printf(bio,"no peer certificate available\n");
2098
2099                 sk2=SSL_get_client_CA_list(s);
2100                 if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
2101                         {
2102                         BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
2103                         for (i=0; i<sk_X509_NAME_num(sk2); i++)
2104                                 {
2105                                 xn=sk_X509_NAME_value(sk2,i);
2106                                 X509_NAME_oneline(xn,buf,sizeof(buf));
2107                                 BIO_write(bio,buf,strlen(buf));
2108                                 BIO_write(bio,"\n",1);
2109                                 }
2110                         }
2111                 else
2112                         {
2113                         BIO_printf(bio,"---\nNo client certificate CA names sent\n");
2114                         }
2115                 p=SSL_get_shared_ciphers(s,buf,sizeof buf);
2116                 if (p != NULL)
2117                         {
2118                         /* This works only for SSL 2.  In later protocol
2119                          * versions, the client does not know what other
2120                          * ciphers (in addition to the one to be used
2121                          * in the current connection) the server supports. */
2122
2123                         BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
2124                         j=i=0;
2125                         while (*p)
2126                                 {
2127                                 if (*p == ':')
2128                                         {
2129                                         BIO_write(bio,space,15-j%25);
2130                                         i++;
2131                                         j=0;
2132                                         BIO_write(bio,((i%3)?" ":"\n"),1);
2133                                         }
2134                                 else
2135                                         {
2136                                         BIO_write(bio,p,1);
2137                                         j++;
2138                                         }
2139                                 p++;
2140                                 }
2141                         BIO_write(bio,"\n",1);
2142                         }
2143
2144                 ssl_print_sigalgs(bio, s);
2145                 ssl_print_tmp_key(bio, s);
2146
2147                 BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
2148                         BIO_number_read(SSL_get_rbio(s)),
2149                         BIO_number_written(SSL_get_wbio(s)));
2150                 }
2151         BIO_printf(bio,(SSL_cache_hit(s)?"---\nReused, ":"---\nNew, "));
2152         c=SSL_get_current_cipher(s);
2153         BIO_printf(bio,"%s, Cipher is %s\n",
2154                 SSL_CIPHER_get_version(c),
2155                 SSL_CIPHER_get_name(c));
2156         if (peer != NULL) {
2157                 EVP_PKEY *pktmp;
2158                 pktmp = X509_get_pubkey(peer);
2159                 BIO_printf(bio,"Server public key is %d bit\n",
2160                                                          EVP_PKEY_bits(pktmp));
2161                 EVP_PKEY_free(pktmp);
2162         }
2163         BIO_printf(bio, "Secure Renegotiation IS%s supported\n",
2164                         SSL_get_secure_renegotiation_support(s) ? "" : " NOT");
2165 #ifndef OPENSSL_NO_COMP
2166         comp=SSL_get_current_compression(s);
2167         expansion=SSL_get_current_expansion(s);
2168         BIO_printf(bio,"Compression: %s\n",
2169                 comp ? SSL_COMP_get_name(comp) : "NONE");
2170         BIO_printf(bio,"Expansion: %s\n",
2171                 expansion ? SSL_COMP_get_name(expansion) : "NONE");
2172 #endif
2173  
2174 #ifdef SSL_DEBUG
2175         {
2176         /* Print out local port of connection: useful for debugging */
2177         int sock;
2178         struct sockaddr_in ladd;
2179         socklen_t ladd_size = sizeof(ladd);
2180         sock = SSL_get_fd(s);
2181         getsockname(sock, (struct sockaddr *)&ladd, &ladd_size);
2182         BIO_printf(bio_c_out, "LOCAL PORT is %u\n", ntohs(ladd.sin_port));
2183         }
2184 #endif
2185
2186 #if !defined(OPENSSL_NO_TLSEXT) && !defined(OPENSSL_NO_NEXTPROTONEG)
2187         if (next_proto.status != -1) {
2188                 const unsigned char *proto;
2189                 unsigned int proto_len;
2190                 SSL_get0_next_proto_negotiated(s, &proto, &proto_len);
2191                 BIO_printf(bio, "Next protocol: (%d) ", next_proto.status);
2192                 BIO_write(bio, proto, proto_len);
2193                 BIO_write(bio, "\n", 1);
2194         }
2195 #endif
2196
2197         {
2198         SRTP_PROTECTION_PROFILE *srtp_profile=SSL_get_selected_srtp_profile(s);
2199  
2200         if(srtp_profile)
2201                 BIO_printf(bio,"SRTP Extension negotiated, profile=%s\n",
2202                            srtp_profile->name);
2203         }
2204  
2205         SSL_SESSION_print(bio,SSL_get_session(s));
2206         if (keymatexportlabel != NULL)
2207                 {
2208                 BIO_printf(bio, "Keying material exporter:\n");
2209                 BIO_printf(bio, "    Label: '%s'\n", keymatexportlabel);
2210                 BIO_printf(bio, "    Length: %i bytes\n", keymatexportlen);
2211                 exportedkeymat = OPENSSL_malloc(keymatexportlen);
2212                 if (exportedkeymat != NULL)
2213                         {
2214                         if (!SSL_export_keying_material(s, exportedkeymat,
2215                                                         keymatexportlen,
2216                                                         keymatexportlabel,
2217                                                         strlen(keymatexportlabel),
2218                                                         NULL, 0, 0))
2219                                 {
2220                                 BIO_printf(bio, "    Error\n");
2221                                 }
2222                         else
2223                                 {
2224                                 BIO_printf(bio, "    Keying material: ");
2225                                 for (i=0; i<keymatexportlen; i++)
2226                                         BIO_printf(bio, "%02X",
2227                                                    exportedkeymat[i]);
2228                                 BIO_printf(bio, "\n");
2229                                 }
2230                         OPENSSL_free(exportedkeymat);
2231                         }
2232                 }
2233         BIO_printf(bio,"---\n");
2234         if (peer != NULL)
2235                 X509_free(peer);
2236         /* flush, or debugging output gets mixed with http response */
2237         (void)BIO_flush(bio);
2238         }
2239
2240 #ifndef OPENSSL_NO_TLSEXT
2241
2242 static int ocsp_resp_cb(SSL *s, void *arg)
2243         {
2244         const unsigned char *p;
2245         int len;
2246         OCSP_RESPONSE *rsp;
2247         len = SSL_get_tlsext_status_ocsp_resp(s, &p);
2248         BIO_puts(arg, "OCSP response: ");
2249         if (!p)
2250                 {
2251                 BIO_puts(arg, "no response sent\n");
2252                 return 1;
2253                 }
2254         rsp = d2i_OCSP_RESPONSE(NULL, &p, len);
2255         if (!rsp)
2256                 {
2257                 BIO_puts(arg, "response parse error\n");
2258                 BIO_dump_indent(arg, (char *)p, len, 4);
2259                 return 0;
2260                 }
2261         BIO_puts(arg, "\n======================================\n");
2262         OCSP_RESPONSE_print(arg, rsp, 0);
2263         BIO_puts(arg, "======================================\n");
2264         OCSP_RESPONSE_free(rsp);
2265         return 1;
2266         }
2267
2268 static int audit_proof_cb(SSL *s, void *arg)
2269         {
2270         const unsigned char *proof;
2271         size_t proof_len;
2272         size_t i;
2273         SSL_SESSION *sess = SSL_get_session(s);
2274
2275         proof = SSL_SESSION_get_tlsext_authz_server_audit_proof(sess,
2276                                                                 &proof_len);
2277         if (proof != NULL)
2278                 {
2279                 BIO_printf(bio_c_out, "Audit proof: ");
2280                 for (i = 0; i < proof_len; ++i)
2281                         BIO_printf(bio_c_out, "%02X", proof[i]);
2282                 BIO_printf(bio_c_out, "\n");
2283                 }
2284         else
2285                 {
2286                 BIO_printf(bio_c_out, "No audit proof found.\n");
2287                 }
2288         return 1;
2289         }
2290 #endif