s_client.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065
  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-2001 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. #include <assert.h>
  112. #include <stdio.h>
  113. #include <stdlib.h>
  114. #include <string.h>
  115. #include <openssl/e_os2.h>
  116. #ifdef OPENSSL_NO_STDIO
  117. #define APPS_WIN16
  118. #endif
  119. /* With IPv6, it looks like Digital has mixed up the proper order of
  120. recursive header file inclusion, resulting in the compiler complaining
  121. that u_int isn't defined, but only if _POSIX_C_SOURCE is defined, which
  122. is needed to have fileno() declared correctly... So let's define u_int */
  123. #if defined(OPENSSL_SYS_VMS_DECC) && !defined(__U_INT)
  124. #define __U_INT
  125. typedef unsigned int u_int;
  126. #endif
  127. #define USE_SOCKETS
  128. #include "apps.h"
  129. #include <openssl/x509.h>
  130. #include <openssl/ssl.h>
  131. #include <openssl/err.h>
  132. #include <openssl/pem.h>
  133. #include <openssl/rand.h>
  134. #include "s_apps.h"
  135. #ifdef OPENSSL_SYS_WINCE
  136. /* Windows CE incorrectly defines fileno as returning void*, so to avoid problems below... */
  137. #ifdef fileno
  138. #undef fileno
  139. #endif
  140. #define fileno(a) (int)_fileno(a)
  141. #endif
  142. #if (defined(OPENSSL_SYS_VMS) && __VMS_VER < 70000000)
  143. /* FIONBIO used as a switch to enable ioctl, and that isn't in VMS < 7.0 */
  144. #undef FIONBIO
  145. #endif
  146. #undef PROG
  147. #define PROG s_client_main
  148. /*#define SSL_HOST_NAME "www.netscape.com" */
  149. /*#define SSL_HOST_NAME "193.118.187.102" */
  150. #define SSL_HOST_NAME "localhost"
  151. /*#define TEST_CERT "client.pem" */ /* no default cert. */
  152. #undef BUFSIZZ
  153. #define BUFSIZZ 1024*8
  154. extern int verify_depth;
  155. extern int verify_error;
  156. #ifdef FIONBIO
  157. static int c_nbio=0;
  158. #endif
  159. static int c_Pause=0;
  160. static int c_debug=0;
  161. static int c_msg=0;
  162. static int c_showcerts=0;
  163. static void sc_usage(void);
  164. static void print_stuff(BIO *berr,SSL *con,int full);
  165. static BIO *bio_c_out=NULL;
  166. static int c_quiet=0;
  167. static int c_ign_eof=0;
  168. static void sc_usage(void)
  169. {
  170. BIO_printf(bio_err,"usage: s_client args\n");
  171. BIO_printf(bio_err,"\n");
  172. BIO_printf(bio_err," -host host - use -connect instead\n");
  173. BIO_printf(bio_err," -port port - use -connect instead\n");
  174. BIO_printf(bio_err," -connect host:port - who to connect to (default is %s:%s)\n",SSL_HOST_NAME,PORT_STR);
  175. BIO_printf(bio_err," -verify depth - turn on peer certificate verification\n");
  176. BIO_printf(bio_err," -cert arg - certificate file to use, PEM format assumed\n");
  177. BIO_printf(bio_err," -key arg - Private key file to use, PEM format assumed, in cert file if\n");
  178. BIO_printf(bio_err," not specified but cert file is.\n");
  179. BIO_printf(bio_err," -CApath arg - PEM format directory of CA's\n");
  180. BIO_printf(bio_err," -CAfile arg - PEM format file of CA's\n");
  181. BIO_printf(bio_err," -reconnect - Drop and re-make the connection with the same Session-ID\n");
  182. BIO_printf(bio_err," -pause - sleep(1) after each read(2) and write(2) system call\n");
  183. BIO_printf(bio_err," -showcerts - show all certificates in the chain\n");
  184. BIO_printf(bio_err," -debug - extra output\n");
  185. #ifdef WATT32
  186. BIO_printf(bio_err," -wdebug - WATT-32 tcp debugging\n");
  187. #endif
  188. BIO_printf(bio_err," -msg - Show protocol messages\n");
  189. BIO_printf(bio_err," -nbio_test - more ssl protocol testing\n");
  190. BIO_printf(bio_err," -state - print the 'ssl' states\n");
  191. #ifdef FIONBIO
  192. BIO_printf(bio_err," -nbio - Run with non-blocking IO\n");
  193. #endif
  194. BIO_printf(bio_err," -crlf - convert LF from terminal into CRLF\n");
  195. BIO_printf(bio_err," -quiet - no s_client output\n");
  196. BIO_printf(bio_err," -ign_eof - ignore input eof (default when -quiet)\n");
  197. BIO_printf(bio_err," -ssl2 - just use SSLv2\n");
  198. BIO_printf(bio_err," -ssl3 - just use SSLv3\n");
  199. BIO_printf(bio_err," -tls1 - just use TLSv1\n");
  200. BIO_printf(bio_err," -no_tls1/-no_ssl3/-no_ssl2 - turn off that protocol\n");
  201. BIO_printf(bio_err," -bugs - Switch on all SSL implementation bug workarounds\n");
  202. BIO_printf(bio_err," -serverpref - Use server's cipher preferences (only SSLv2)\n");
  203. BIO_printf(bio_err," -cipher - preferred cipher to use, use the 'openssl ciphers'\n");
  204. BIO_printf(bio_err," command to see what is available\n");
  205. BIO_printf(bio_err," -starttls prot - use the STARTTLS command before starting TLS\n");
  206. BIO_printf(bio_err," for those protocols that support it, where\n");
  207. BIO_printf(bio_err," 'prot' defines which one to assume. Currently,\n");
  208. BIO_printf(bio_err," only \"smtp\" and \"pop3\" are supported.\n");
  209. #ifndef OPENSSL_NO_ENGINE
  210. BIO_printf(bio_err," -engine id - Initialise and use the specified engine\n");
  211. #endif
  212. BIO_printf(bio_err," -rand file%cfile%c...\n", LIST_SEPARATOR_CHAR, LIST_SEPARATOR_CHAR);
  213. }
  214. int MAIN(int, char **);
  215. int MAIN(int argc, char **argv)
  216. {
  217. int off=0;
  218. SSL *con=NULL,*con2=NULL;
  219. X509_STORE *store = NULL;
  220. int s,k,width,state=0;
  221. char *cbuf=NULL,*sbuf=NULL,*mbuf=NULL;
  222. int cbuf_len,cbuf_off;
  223. int sbuf_len,sbuf_off;
  224. fd_set readfds,writefds;
  225. short port=PORT;
  226. int full_log=1;
  227. char *host=SSL_HOST_NAME;
  228. char *cert_file=NULL,*key_file=NULL;
  229. char *CApath=NULL,*CAfile=NULL,*cipher=NULL;
  230. int reconnect=0,badop=0,verify=SSL_VERIFY_NONE,bugs=0;
  231. int crlf=0;
  232. int write_tty,read_tty,write_ssl,read_ssl,tty_on,ssl_pending;
  233. SSL_CTX *ctx=NULL;
  234. int ret=1,in_init=1,i,nbio_test=0;
  235. int starttls_proto = 0;
  236. int prexit = 0, vflags = 0;
  237. SSL_METHOD *meth=NULL;
  238. BIO *sbio;
  239. char *inrand=NULL;
  240. #ifndef OPENSSL_NO_ENGINE
  241. char *engine_id=NULL;
  242. ENGINE *e=NULL;
  243. #endif
  244. #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  245. struct timeval tv;
  246. #endif
  247. #if !defined(OPENSSL_NO_SSL2) && !defined(OPENSSL_NO_SSL3)
  248. meth=SSLv23_client_method();
  249. #elif !defined(OPENSSL_NO_SSL3)
  250. meth=SSLv3_client_method();
  251. #elif !defined(OPENSSL_NO_SSL2)
  252. meth=SSLv2_client_method();
  253. #endif
  254. apps_startup();
  255. c_Pause=0;
  256. c_quiet=0;
  257. c_ign_eof=0;
  258. c_debug=0;
  259. c_msg=0;
  260. c_showcerts=0;
  261. if (bio_err == NULL)
  262. bio_err=BIO_new_fp(stderr,BIO_NOCLOSE);
  263. if (!load_config(bio_err, NULL))
  264. goto end;
  265. if ( ((cbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
  266. ((sbuf=OPENSSL_malloc(BUFSIZZ)) == NULL) ||
  267. ((mbuf=OPENSSL_malloc(BUFSIZZ)) == NULL))
  268. {
  269. BIO_printf(bio_err,"out of memory\n");
  270. goto end;
  271. }
  272. verify_depth=0;
  273. verify_error=X509_V_OK;
  274. #ifdef FIONBIO
  275. c_nbio=0;
  276. #endif
  277. argc--;
  278. argv++;
  279. while (argc >= 1)
  280. {
  281. if (strcmp(*argv,"-host") == 0)
  282. {
  283. if (--argc < 1) goto bad;
  284. host= *(++argv);
  285. }
  286. else if (strcmp(*argv,"-port") == 0)
  287. {
  288. if (--argc < 1) goto bad;
  289. port=atoi(*(++argv));
  290. if (port == 0) goto bad;
  291. }
  292. else if (strcmp(*argv,"-connect") == 0)
  293. {
  294. if (--argc < 1) goto bad;
  295. if (!extract_host_port(*(++argv),&host,NULL,&port))
  296. goto bad;
  297. }
  298. else if (strcmp(*argv,"-verify") == 0)
  299. {
  300. verify=SSL_VERIFY_PEER;
  301. if (--argc < 1) goto bad;
  302. verify_depth=atoi(*(++argv));
  303. BIO_printf(bio_err,"verify depth is %d\n",verify_depth);
  304. }
  305. else if (strcmp(*argv,"-cert") == 0)
  306. {
  307. if (--argc < 1) goto bad;
  308. cert_file= *(++argv);
  309. }
  310. else if (strcmp(*argv,"-crl_check") == 0)
  311. vflags |= X509_V_FLAG_CRL_CHECK;
  312. else if (strcmp(*argv,"-crl_check_all") == 0)
  313. vflags |= X509_V_FLAG_CRL_CHECK|X509_V_FLAG_CRL_CHECK_ALL;
  314. else if (strcmp(*argv,"-prexit") == 0)
  315. prexit=1;
  316. else if (strcmp(*argv,"-crlf") == 0)
  317. crlf=1;
  318. else if (strcmp(*argv,"-quiet") == 0)
  319. {
  320. c_quiet=1;
  321. c_ign_eof=1;
  322. }
  323. else if (strcmp(*argv,"-ign_eof") == 0)
  324. c_ign_eof=1;
  325. else if (strcmp(*argv,"-pause") == 0)
  326. c_Pause=1;
  327. else if (strcmp(*argv,"-debug") == 0)
  328. c_debug=1;
  329. #ifdef WATT32
  330. else if (strcmp(*argv,"-wdebug") == 0)
  331. dbug_init();
  332. #endif
  333. else if (strcmp(*argv,"-msg") == 0)
  334. c_msg=1;
  335. else if (strcmp(*argv,"-showcerts") == 0)
  336. c_showcerts=1;
  337. else if (strcmp(*argv,"-nbio_test") == 0)
  338. nbio_test=1;
  339. else if (strcmp(*argv,"-state") == 0)
  340. state=1;
  341. #ifndef OPENSSL_NO_SSL2
  342. else if (strcmp(*argv,"-ssl2") == 0)
  343. meth=SSLv2_client_method();
  344. #endif
  345. #ifndef OPENSSL_NO_SSL3
  346. else if (strcmp(*argv,"-ssl3") == 0)
  347. meth=SSLv3_client_method();
  348. #endif
  349. #ifndef OPENSSL_NO_TLS1
  350. else if (strcmp(*argv,"-tls1") == 0)
  351. meth=TLSv1_client_method();
  352. #endif
  353. else if (strcmp(*argv,"-bugs") == 0)
  354. bugs=1;
  355. else if (strcmp(*argv,"-key") == 0)
  356. {
  357. if (--argc < 1) goto bad;
  358. key_file= *(++argv);
  359. }
  360. else if (strcmp(*argv,"-reconnect") == 0)
  361. {
  362. reconnect=5;
  363. }
  364. else if (strcmp(*argv,"-CApath") == 0)
  365. {
  366. if (--argc < 1) goto bad;
  367. CApath= *(++argv);
  368. }
  369. else if (strcmp(*argv,"-CAfile") == 0)
  370. {
  371. if (--argc < 1) goto bad;
  372. CAfile= *(++argv);
  373. }
  374. else if (strcmp(*argv,"-no_tls1") == 0)
  375. off|=SSL_OP_NO_TLSv1;
  376. else if (strcmp(*argv,"-no_ssl3") == 0)
  377. off|=SSL_OP_NO_SSLv3;
  378. else if (strcmp(*argv,"-no_ssl2") == 0)
  379. off|=SSL_OP_NO_SSLv2;
  380. else if (strcmp(*argv,"-serverpref") == 0)
  381. off|=SSL_OP_CIPHER_SERVER_PREFERENCE;
  382. else if (strcmp(*argv,"-cipher") == 0)
  383. {
  384. if (--argc < 1) goto bad;
  385. cipher= *(++argv);
  386. }
  387. #ifdef FIONBIO
  388. else if (strcmp(*argv,"-nbio") == 0)
  389. { c_nbio=1; }
  390. #endif
  391. else if (strcmp(*argv,"-starttls") == 0)
  392. {
  393. if (--argc < 1) goto bad;
  394. ++argv;
  395. if (strcmp(*argv,"smtp") == 0)
  396. starttls_proto = 1;
  397. else if (strcmp(*argv,"pop3") == 0)
  398. starttls_proto = 2;
  399. else
  400. goto bad;
  401. }
  402. #ifndef OPENSSL_NO_ENGINE
  403. else if (strcmp(*argv,"-engine") == 0)
  404. {
  405. if (--argc < 1) goto bad;
  406. engine_id = *(++argv);
  407. }
  408. #endif
  409. else if (strcmp(*argv,"-rand") == 0)
  410. {
  411. if (--argc < 1) goto bad;
  412. inrand= *(++argv);
  413. }
  414. else
  415. {
  416. BIO_printf(bio_err,"unknown option %s\n",*argv);
  417. badop=1;
  418. break;
  419. }
  420. argc--;
  421. argv++;
  422. }
  423. if (badop)
  424. {
  425. bad:
  426. sc_usage();
  427. goto end;
  428. }
  429. OpenSSL_add_ssl_algorithms();
  430. SSL_load_error_strings();
  431. #ifndef OPENSSL_NO_ENGINE
  432. e = setup_engine(bio_err, engine_id, 1);
  433. #endif
  434. if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL
  435. && !RAND_status())
  436. {
  437. BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");
  438. }
  439. if (inrand != NULL)
  440. BIO_printf(bio_err,"%ld semi-random bytes loaded\n",
  441. app_RAND_load_files(inrand));
  442. if (bio_c_out == NULL)
  443. {
  444. if (c_quiet && !c_debug && !c_msg)
  445. {
  446. bio_c_out=BIO_new(BIO_s_null());
  447. }
  448. else
  449. {
  450. if (bio_c_out == NULL)
  451. bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);
  452. }
  453. }
  454. ctx=SSL_CTX_new(meth);
  455. if (ctx == NULL)
  456. {
  457. ERR_print_errors(bio_err);
  458. goto end;
  459. }
  460. if (bugs)
  461. SSL_CTX_set_options(ctx,SSL_OP_ALL|off);
  462. else
  463. SSL_CTX_set_options(ctx,off);
  464. if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
  465. if (cipher != NULL)
  466. if(!SSL_CTX_set_cipher_list(ctx,cipher)) {
  467. BIO_printf(bio_err,"error setting cipher list\n");
  468. ERR_print_errors(bio_err);
  469. goto end;
  470. }
  471. #if 0
  472. else
  473. SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));
  474. #endif
  475. SSL_CTX_set_verify(ctx,verify,verify_callback);
  476. if (!set_cert_stuff(ctx,cert_file,key_file))
  477. goto end;
  478. if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||
  479. (!SSL_CTX_set_default_verify_paths(ctx)))
  480. {
  481. /* BIO_printf(bio_err,"error setting default verify locations\n"); */
  482. ERR_print_errors(bio_err);
  483. /* goto end; */
  484. }
  485. store = SSL_CTX_get_cert_store(ctx);
  486. X509_STORE_set_flags(store, vflags);
  487. con=SSL_new(ctx);
  488. #ifndef OPENSSL_NO_KRB5
  489. if (con && (con->kssl_ctx = kssl_ctx_new()) != NULL)
  490. {
  491. kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);
  492. }
  493. #endif /* OPENSSL_NO_KRB5 */
  494. /* SSL_set_cipher_list(con,"RC4-MD5"); */
  495. re_start:
  496. if (init_client(&s,host,port) == 0)
  497. {
  498. BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());
  499. SHUTDOWN(s);
  500. goto end;
  501. }
  502. BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);
  503. #ifdef FIONBIO
  504. if (c_nbio)
  505. {
  506. unsigned long l=1;
  507. BIO_printf(bio_c_out,"turning on non blocking io\n");
  508. if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)
  509. {
  510. ERR_print_errors(bio_err);
  511. goto end;
  512. }
  513. }
  514. #endif
  515. if (c_Pause & 0x01) con->debug=1;
  516. sbio=BIO_new_socket(s,BIO_NOCLOSE);
  517. if (nbio_test)
  518. {
  519. BIO *test;
  520. test=BIO_new(BIO_f_nbio_test());
  521. sbio=BIO_push(test,sbio);
  522. }
  523. if (c_debug)
  524. {
  525. con->debug=1;
  526. BIO_set_callback(sbio,bio_dump_cb);
  527. BIO_set_callback_arg(sbio,bio_c_out);
  528. }
  529. if (c_msg)
  530. {
  531. SSL_set_msg_callback(con, msg_cb);
  532. SSL_set_msg_callback_arg(con, bio_c_out);
  533. }
  534. SSL_set_bio(con,sbio,sbio);
  535. SSL_set_connect_state(con);
  536. /* ok, lets connect */
  537. width=SSL_get_fd(con)+1;
  538. read_tty=1;
  539. write_tty=0;
  540. tty_on=0;
  541. read_ssl=1;
  542. write_ssl=1;
  543. cbuf_len=0;
  544. cbuf_off=0;
  545. sbuf_len=0;
  546. sbuf_off=0;
  547. /* This is an ugly hack that does a lot of assumptions */
  548. if (starttls_proto == 1)
  549. {
  550. BIO_read(sbio,mbuf,BUFSIZZ);
  551. BIO_printf(sbio,"EHLO some.host.name\r\n");
  552. BIO_read(sbio,mbuf,BUFSIZZ);
  553. BIO_printf(sbio,"STARTTLS\r\n");
  554. BIO_read(sbio,sbuf,BUFSIZZ);
  555. }
  556. if (starttls_proto == 2)
  557. {
  558. BIO_read(sbio,mbuf,BUFSIZZ);
  559. BIO_printf(sbio,"STLS\r\n");
  560. BIO_read(sbio,sbuf,BUFSIZZ);
  561. }
  562. for (;;)
  563. {
  564. FD_ZERO(&readfds);
  565. FD_ZERO(&writefds);
  566. if (SSL_in_init(con) && !SSL_total_renegotiations(con))
  567. {
  568. in_init=1;
  569. tty_on=0;
  570. }
  571. else
  572. {
  573. tty_on=1;
  574. if (in_init)
  575. {
  576. in_init=0;
  577. print_stuff(bio_c_out,con,full_log);
  578. if (full_log > 0) full_log--;
  579. if (starttls_proto)
  580. {
  581. BIO_printf(bio_err,"%s",mbuf);
  582. /* We don't need to know any more */
  583. starttls_proto = 0;
  584. }
  585. if (reconnect)
  586. {
  587. reconnect--;
  588. BIO_printf(bio_c_out,"drop connection and then reconnect\n");
  589. SSL_shutdown(con);
  590. SSL_set_connect_state(con);
  591. SHUTDOWN(SSL_get_fd(con));
  592. goto re_start;
  593. }
  594. }
  595. }
  596. ssl_pending = read_ssl && SSL_pending(con);
  597. if (!ssl_pending)
  598. {
  599. #if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS)
  600. if (tty_on)
  601. {
  602. if (read_tty) FD_SET(fileno(stdin),&readfds);
  603. if (write_tty) FD_SET(fileno(stdout),&writefds);
  604. }
  605. if (read_ssl)
  606. FD_SET(SSL_get_fd(con),&readfds);
  607. if (write_ssl)
  608. FD_SET(SSL_get_fd(con),&writefds);
  609. #else
  610. if(!tty_on || !write_tty) {
  611. if (read_ssl)
  612. FD_SET(SSL_get_fd(con),&readfds);
  613. if (write_ssl)
  614. FD_SET(SSL_get_fd(con),&writefds);
  615. }
  616. #endif
  617. /* printf("mode tty(%d %d%d) ssl(%d%d)\n",
  618. tty_on,read_tty,write_tty,read_ssl,write_ssl);*/
  619. /* Note: under VMS with SOCKETSHR the second parameter
  620. * is currently of type (int *) whereas under other
  621. * systems it is (void *) if you don't have a cast it
  622. * will choke the compiler: if you do have a cast then
  623. * you can either go for (int *) or (void *).
  624. */
  625. #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  626. /* Under Windows/DOS we make the assumption that we can
  627. * always write to the tty: therefore if we need to
  628. * write to the tty we just fall through. Otherwise
  629. * we timeout the select every second and see if there
  630. * are any keypresses. Note: this is a hack, in a proper
  631. * Windows application we wouldn't do this.
  632. */
  633. i=0;
  634. if(!write_tty) {
  635. if(read_tty) {
  636. tv.tv_sec = 1;
  637. tv.tv_usec = 0;
  638. i=select(width,(void *)&readfds,(void *)&writefds,
  639. NULL,&tv);
  640. #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
  641. if(!i && (!_kbhit() || !read_tty) ) continue;
  642. #else
  643. if(!i && (!((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0))) || !read_tty) ) continue;
  644. #endif
  645. } else i=select(width,(void *)&readfds,(void *)&writefds,
  646. NULL,NULL);
  647. }
  648. #else
  649. i=select(width,(void *)&readfds,(void *)&writefds,
  650. NULL,NULL);
  651. #endif
  652. if ( i < 0)
  653. {
  654. BIO_printf(bio_err,"bad select %d\n",
  655. get_last_socket_error());
  656. goto shut;
  657. /* goto end; */
  658. }
  659. }
  660. if (!ssl_pending && FD_ISSET(SSL_get_fd(con),&writefds))
  661. {
  662. k=SSL_write(con,&(cbuf[cbuf_off]),
  663. (unsigned int)cbuf_len);
  664. switch (SSL_get_error(con,k))
  665. {
  666. case SSL_ERROR_NONE:
  667. cbuf_off+=k;
  668. cbuf_len-=k;
  669. if (k <= 0) goto end;
  670. /* we have done a write(con,NULL,0); */
  671. if (cbuf_len <= 0)
  672. {
  673. read_tty=1;
  674. write_ssl=0;
  675. }
  676. else /* if (cbuf_len > 0) */
  677. {
  678. read_tty=0;
  679. write_ssl=1;
  680. }
  681. break;
  682. case SSL_ERROR_WANT_WRITE:
  683. BIO_printf(bio_c_out,"write W BLOCK\n");
  684. write_ssl=1;
  685. read_tty=0;
  686. break;
  687. case SSL_ERROR_WANT_READ:
  688. BIO_printf(bio_c_out,"write R BLOCK\n");
  689. write_tty=0;
  690. read_ssl=1;
  691. write_ssl=0;
  692. break;
  693. case SSL_ERROR_WANT_X509_LOOKUP:
  694. BIO_printf(bio_c_out,"write X BLOCK\n");
  695. break;
  696. case SSL_ERROR_ZERO_RETURN:
  697. if (cbuf_len != 0)
  698. {
  699. BIO_printf(bio_c_out,"shutdown\n");
  700. goto shut;
  701. }
  702. else
  703. {
  704. read_tty=1;
  705. write_ssl=0;
  706. break;
  707. }
  708. case SSL_ERROR_SYSCALL:
  709. if ((k != 0) || (cbuf_len != 0))
  710. {
  711. BIO_printf(bio_err,"write:errno=%d\n",
  712. get_last_socket_error());
  713. goto shut;
  714. }
  715. else
  716. {
  717. read_tty=1;
  718. write_ssl=0;
  719. }
  720. break;
  721. case SSL_ERROR_SSL:
  722. ERR_print_errors(bio_err);
  723. goto shut;
  724. }
  725. }
  726. #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  727. /* Assume Windows/DOS can always write */
  728. else if (!ssl_pending && write_tty)
  729. #else
  730. else if (!ssl_pending && FD_ISSET(fileno(stdout),&writefds))
  731. #endif
  732. {
  733. #ifdef CHARSET_EBCDIC
  734. ascii2ebcdic(&(sbuf[sbuf_off]),&(sbuf[sbuf_off]),sbuf_len);
  735. #endif
  736. i=write(fileno(stdout),&(sbuf[sbuf_off]),sbuf_len);
  737. if (i <= 0)
  738. {
  739. BIO_printf(bio_c_out,"DONE\n");
  740. goto shut;
  741. /* goto end; */
  742. }
  743. sbuf_len-=i;;
  744. sbuf_off+=i;
  745. if (sbuf_len <= 0)
  746. {
  747. read_ssl=1;
  748. write_tty=0;
  749. }
  750. }
  751. else if (ssl_pending || FD_ISSET(SSL_get_fd(con),&readfds))
  752. {
  753. #ifdef RENEG
  754. { static int iiii; if (++iiii == 52) { SSL_renegotiate(con); iiii=0; } }
  755. #endif
  756. #if 1
  757. k=SSL_read(con,sbuf,1024 /* BUFSIZZ */ );
  758. #else
  759. /* Demo for pending and peek :-) */
  760. k=SSL_read(con,sbuf,16);
  761. { char zbuf[10240];
  762. printf("read=%d pending=%d peek=%d\n",k,SSL_pending(con),SSL_peek(con,zbuf,10240));
  763. }
  764. #endif
  765. switch (SSL_get_error(con,k))
  766. {
  767. case SSL_ERROR_NONE:
  768. if (k <= 0)
  769. goto end;
  770. sbuf_off=0;
  771. sbuf_len=k;
  772. read_ssl=0;
  773. write_tty=1;
  774. break;
  775. case SSL_ERROR_WANT_WRITE:
  776. BIO_printf(bio_c_out,"read W BLOCK\n");
  777. write_ssl=1;
  778. read_tty=0;
  779. break;
  780. case SSL_ERROR_WANT_READ:
  781. BIO_printf(bio_c_out,"read R BLOCK\n");
  782. write_tty=0;
  783. read_ssl=1;
  784. if ((read_tty == 0) && (write_ssl == 0))
  785. write_ssl=1;
  786. break;
  787. case SSL_ERROR_WANT_X509_LOOKUP:
  788. BIO_printf(bio_c_out,"read X BLOCK\n");
  789. break;
  790. case SSL_ERROR_SYSCALL:
  791. BIO_printf(bio_err,"read:errno=%d\n",get_last_socket_error());
  792. goto shut;
  793. case SSL_ERROR_ZERO_RETURN:
  794. BIO_printf(bio_c_out,"closed\n");
  795. goto shut;
  796. case SSL_ERROR_SSL:
  797. ERR_print_errors(bio_err);
  798. goto shut;
  799. /* break; */
  800. }
  801. }
  802. #if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)
  803. #if defined(OPENSSL_SYS_WINCE) || defined(OPENSSL_SYS_MSDOS)
  804. else if (_kbhit())
  805. #else
  806. else if ((_kbhit()) || (WAIT_OBJECT_0 == WaitForSingleObject(GetStdHandle(STD_INPUT_HANDLE), 0)))
  807. #endif
  808. #else
  809. else if (FD_ISSET(fileno(stdin),&readfds))
  810. #endif
  811. {
  812. if (crlf)
  813. {
  814. int j, lf_num;
  815. i=read(fileno(stdin),cbuf,BUFSIZZ/2);
  816. lf_num = 0;
  817. /* both loops are skipped when i <= 0 */
  818. for (j = 0; j < i; j++)
  819. if (cbuf[j] == '\n')
  820. lf_num++;
  821. for (j = i-1; j >= 0; j--)
  822. {
  823. cbuf[j+lf_num] = cbuf[j];
  824. if (cbuf[j] == '\n')
  825. {
  826. lf_num--;
  827. i++;
  828. cbuf[j+lf_num] = '\r';
  829. }
  830. }
  831. assert(lf_num == 0);
  832. }
  833. else
  834. i=read(fileno(stdin),cbuf,BUFSIZZ);
  835. if ((!c_ign_eof) && ((i <= 0) || (cbuf[0] == 'Q')))
  836. {
  837. BIO_printf(bio_err,"DONE\n");
  838. goto shut;
  839. }
  840. if ((!c_ign_eof) && (cbuf[0] == 'R'))
  841. {
  842. BIO_printf(bio_err,"RENEGOTIATING\n");
  843. SSL_renegotiate(con);
  844. cbuf_len=0;
  845. }
  846. else
  847. {
  848. cbuf_len=i;
  849. cbuf_off=0;
  850. #ifdef CHARSET_EBCDIC
  851. ebcdic2ascii(cbuf, cbuf, i);
  852. #endif
  853. }
  854. write_ssl=1;
  855. read_tty=0;
  856. }
  857. }
  858. shut:
  859. SSL_shutdown(con);
  860. SHUTDOWN(SSL_get_fd(con));
  861. ret=0;
  862. end:
  863. if(prexit) print_stuff(bio_c_out,con,1);
  864. if (con != NULL) SSL_free(con);
  865. if (con2 != NULL) SSL_free(con2);
  866. if (ctx != NULL) SSL_CTX_free(ctx);
  867. if (cbuf != NULL) { OPENSSL_cleanse(cbuf,BUFSIZZ); OPENSSL_free(cbuf); }
  868. if (sbuf != NULL) { OPENSSL_cleanse(sbuf,BUFSIZZ); OPENSSL_free(sbuf); }
  869. if (mbuf != NULL) { OPENSSL_cleanse(mbuf,BUFSIZZ); OPENSSL_free(mbuf); }
  870. if (bio_c_out != NULL)
  871. {
  872. BIO_free(bio_c_out);
  873. bio_c_out=NULL;
  874. }
  875. apps_shutdown();
  876. OPENSSL_EXIT(ret);
  877. }
  878. static void print_stuff(BIO *bio, SSL *s, int full)
  879. {
  880. X509 *peer=NULL;
  881. char *p;
  882. static char *space=" ";
  883. char buf[BUFSIZ];
  884. STACK_OF(X509) *sk;
  885. STACK_OF(X509_NAME) *sk2;
  886. SSL_CIPHER *c;
  887. X509_NAME *xn;
  888. int j,i;
  889. if (full)
  890. {
  891. int got_a_chain = 0;
  892. sk=SSL_get_peer_cert_chain(s);
  893. if (sk != NULL)
  894. {
  895. got_a_chain = 1; /* we don't have it for SSL2 (yet) */
  896. BIO_printf(bio,"---\nCertificate chain\n");
  897. for (i=0; i<sk_X509_num(sk); i++)
  898. {
  899. X509_NAME_oneline(X509_get_subject_name(
  900. sk_X509_value(sk,i)),buf,sizeof buf);
  901. BIO_printf(bio,"%2d s:%s\n",i,buf);
  902. X509_NAME_oneline(X509_get_issuer_name(
  903. sk_X509_value(sk,i)),buf,sizeof buf);
  904. BIO_printf(bio," i:%s\n",buf);
  905. if (c_showcerts)
  906. PEM_write_bio_X509(bio,sk_X509_value(sk,i));
  907. }
  908. }
  909. BIO_printf(bio,"---\n");
  910. peer=SSL_get_peer_certificate(s);
  911. if (peer != NULL)
  912. {
  913. BIO_printf(bio,"Server certificate\n");
  914. if (!(c_showcerts && got_a_chain)) /* Redundant if we showed the whole chain */
  915. PEM_write_bio_X509(bio,peer);
  916. X509_NAME_oneline(X509_get_subject_name(peer),
  917. buf,sizeof buf);
  918. BIO_printf(bio,"subject=%s\n",buf);
  919. X509_NAME_oneline(X509_get_issuer_name(peer),
  920. buf,sizeof buf);
  921. BIO_printf(bio,"issuer=%s\n",buf);
  922. }
  923. else
  924. BIO_printf(bio,"no peer certificate available\n");
  925. sk2=SSL_get_client_CA_list(s);
  926. if ((sk2 != NULL) && (sk_X509_NAME_num(sk2) > 0))
  927. {
  928. BIO_printf(bio,"---\nAcceptable client certificate CA names\n");
  929. for (i=0; i<sk_X509_NAME_num(sk2); i++)
  930. {
  931. xn=sk_X509_NAME_value(sk2,i);
  932. X509_NAME_oneline(xn,buf,sizeof(buf));
  933. BIO_write(bio,buf,strlen(buf));
  934. BIO_write(bio,"\n",1);
  935. }
  936. }
  937. else
  938. {
  939. BIO_printf(bio,"---\nNo client certificate CA names sent\n");
  940. }
  941. p=SSL_get_shared_ciphers(s,buf,sizeof buf);
  942. if (p != NULL)
  943. {
  944. /* This works only for SSL 2. In later protocol
  945. * versions, the client does not know what other
  946. * ciphers (in addition to the one to be used
  947. * in the current connection) the server supports. */
  948. BIO_printf(bio,"---\nCiphers common between both SSL endpoints:\n");
  949. j=i=0;
  950. while (*p)
  951. {
  952. if (*p == ':')
  953. {
  954. BIO_write(bio,space,15-j%25);
  955. i++;
  956. j=0;
  957. BIO_write(bio,((i%3)?" ":"\n"),1);
  958. }
  959. else
  960. {
  961. BIO_write(bio,p,1);
  962. j++;
  963. }
  964. p++;
  965. }
  966. BIO_write(bio,"\n",1);
  967. }
  968. BIO_printf(bio,"---\nSSL handshake has read %ld bytes and written %ld bytes\n",
  969. BIO_number_read(SSL_get_rbio(s)),
  970. BIO_number_written(SSL_get_wbio(s)));
  971. }
  972. BIO_printf(bio,((s->hit)?"---\nReused, ":"---\nNew, "));
  973. c=SSL_get_current_cipher(s);
  974. BIO_printf(bio,"%s, Cipher is %s\n",
  975. SSL_CIPHER_get_version(c),
  976. SSL_CIPHER_get_name(c));
  977. if (peer != NULL) {
  978. EVP_PKEY *pktmp;
  979. pktmp = X509_get_pubkey(peer);
  980. BIO_printf(bio,"Server public key is %d bit\n",
  981. EVP_PKEY_bits(pktmp));
  982. EVP_PKEY_free(pktmp);
  983. }
  984. SSL_SESSION_print(bio,SSL_get_session(s));
  985. BIO_printf(bio,"---\n");
  986. if (peer != NULL)
  987. X509_free(peer);
  988. /* flush, or debugging output gets mixed with http response */
  989. BIO_flush(bio);
  990. }