PageRenderTime 56ms CodeModel.GetById 12ms RepoModel.GetById 0ms app.codeStats 1ms

/deps/openssl/openssl/apps/s_client.c

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