d1_clnt.c 29 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157
  1. /* ssl/d1_clnt.c */
  2. /*
  3. * DTLS implementation written by Nagendra Modadugu
  4. * (nagendra@cs.stanford.edu) for the OpenSSL project 2005.
  5. */
  6. /* ====================================================================
  7. * Copyright (c) 1999-2005 The OpenSSL Project. All rights reserved.
  8. *
  9. * Redistribution and use in source and binary forms, with or without
  10. * modification, are permitted provided that the following conditions
  11. * are met:
  12. *
  13. * 1. Redistributions of source code must retain the above copyright
  14. * notice, this list of conditions and the following disclaimer.
  15. *
  16. * 2. Redistributions in binary form must reproduce the above copyright
  17. * notice, this list of conditions and the following disclaimer in
  18. * the documentation and/or other materials provided with the
  19. * distribution.
  20. *
  21. * 3. All advertising materials mentioning features or use of this
  22. * software must display the following acknowledgment:
  23. * "This product includes software developed by the OpenSSL Project
  24. * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
  25. *
  26. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  27. * endorse or promote products derived from this software without
  28. * prior written permission. For written permission, please contact
  29. * openssl-core@OpenSSL.org.
  30. *
  31. * 5. Products derived from this software may not be called "OpenSSL"
  32. * nor may "OpenSSL" appear in their names without prior written
  33. * permission of the OpenSSL Project.
  34. *
  35. * 6. Redistributions of any form whatsoever must retain the following
  36. * acknowledgment:
  37. * "This product includes software developed by the OpenSSL Project
  38. * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
  39. *
  40. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  41. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  42. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  43. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  44. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  45. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  46. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  47. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  48. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  49. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  50. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  51. * OF THE POSSIBILITY OF SUCH DAMAGE.
  52. * ====================================================================
  53. *
  54. * This product includes cryptographic software written by Eric Young
  55. * (eay@cryptsoft.com). This product includes software written by Tim
  56. * Hudson (tjh@cryptsoft.com).
  57. *
  58. */
  59. /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  60. * All rights reserved.
  61. *
  62. * This package is an SSL implementation written
  63. * by Eric Young (eay@cryptsoft.com).
  64. * The implementation was written so as to conform with Netscapes SSL.
  65. *
  66. * This library is free for commercial and non-commercial use as long as
  67. * the following conditions are aheared to. The following conditions
  68. * apply to all code found in this distribution, be it the RC4, RSA,
  69. * lhash, DES, etc., code; not just the SSL code. The SSL documentation
  70. * included with this distribution is covered by the same copyright terms
  71. * except that the holder is Tim Hudson (tjh@cryptsoft.com).
  72. *
  73. * Copyright remains Eric Young's, and as such any Copyright notices in
  74. * the code are not to be removed.
  75. * If this package is used in a product, Eric Young should be given attribution
  76. * as the author of the parts of the library used.
  77. * This can be in the form of a textual message at program startup or
  78. * in documentation (online or textual) provided with the package.
  79. *
  80. * Redistribution and use in source and binary forms, with or without
  81. * modification, are permitted provided that the following conditions
  82. * are met:
  83. * 1. Redistributions of source code must retain the copyright
  84. * notice, this list of conditions and the following disclaimer.
  85. * 2. Redistributions in binary form must reproduce the above copyright
  86. * notice, this list of conditions and the following disclaimer in the
  87. * documentation and/or other materials provided with the distribution.
  88. * 3. All advertising materials mentioning features or use of this software
  89. * must display the following acknowledgement:
  90. * "This product includes cryptographic software written by
  91. * Eric Young (eay@cryptsoft.com)"
  92. * The word 'cryptographic' can be left out if the rouines from the library
  93. * being used are not cryptographic related :-).
  94. * 4. If you include any Windows specific code (or a derivative thereof) from
  95. * the apps directory (application code) you must include an acknowledgement:
  96. * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
  97. *
  98. * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
  99. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  100. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  101. * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
  102. * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  103. * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  104. * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  105. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  106. * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  107. * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  108. * SUCH DAMAGE.
  109. *
  110. * The licence and distribution terms for any publically available version or
  111. * derivative of this code cannot be changed. i.e. this code cannot simply be
  112. * copied and put under another distribution licence
  113. * [including the GNU Public Licence.]
  114. */
  115. #include <stdio.h>
  116. #include "ssl_locl.h"
  117. #include <openssl/buffer.h>
  118. #include <openssl/rand.h>
  119. #include <openssl/objects.h>
  120. #include <openssl/evp.h>
  121. #include <openssl/md5.h>
  122. #include <openssl/bn.h>
  123. #ifndef OPENSSL_NO_DH
  124. #include <openssl/dh.h>
  125. #endif
  126. static SSL_METHOD *dtls1_get_client_method(int ver);
  127. static int dtls1_get_hello_verify(SSL *s);
  128. static SSL_METHOD *dtls1_get_client_method(int ver)
  129. {
  130. if (ver == DTLS1_VERSION)
  131. return(DTLSv1_client_method());
  132. else
  133. return(NULL);
  134. }
  135. SSL_METHOD *DTLSv1_client_method(void)
  136. {
  137. static int init=1;
  138. static SSL_METHOD DTLSv1_client_data;
  139. if (init)
  140. {
  141. CRYPTO_w_lock(CRYPTO_LOCK_SSL_METHOD);
  142. if (init)
  143. {
  144. memcpy((char *)&DTLSv1_client_data,(char *)dtlsv1_base_method(),
  145. sizeof(SSL_METHOD));
  146. DTLSv1_client_data.ssl_connect=dtls1_connect;
  147. DTLSv1_client_data.get_ssl_method=dtls1_get_client_method;
  148. init=0;
  149. }
  150. CRYPTO_w_unlock(CRYPTO_LOCK_SSL_METHOD);
  151. }
  152. return(&DTLSv1_client_data);
  153. }
  154. int dtls1_connect(SSL *s)
  155. {
  156. BUF_MEM *buf=NULL;
  157. unsigned long Time=time(NULL),l;
  158. long num1;
  159. void (*cb)(const SSL *ssl,int type,int val)=NULL;
  160. int ret= -1;
  161. int new_state,state,skip=0;;
  162. RAND_add(&Time,sizeof(Time),0);
  163. ERR_clear_error();
  164. clear_sys_error();
  165. if (s->info_callback != NULL)
  166. cb=s->info_callback;
  167. else if (s->ctx->info_callback != NULL)
  168. cb=s->ctx->info_callback;
  169. s->in_handshake++;
  170. if (!SSL_in_init(s) || SSL_in_before(s)) SSL_clear(s);
  171. for (;;)
  172. {
  173. state=s->state;
  174. switch(s->state)
  175. {
  176. case SSL_ST_RENEGOTIATE:
  177. s->new_session=1;
  178. s->state=SSL_ST_CONNECT;
  179. s->ctx->stats.sess_connect_renegotiate++;
  180. /* break */
  181. case SSL_ST_BEFORE:
  182. case SSL_ST_CONNECT:
  183. case SSL_ST_BEFORE|SSL_ST_CONNECT:
  184. case SSL_ST_OK|SSL_ST_CONNECT:
  185. s->server=0;
  186. if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_START,1);
  187. if ((s->version & 0xff00 ) != (DTLS1_VERSION & 0xff00))
  188. {
  189. SSLerr(SSL_F_DTLS1_CONNECT, ERR_R_INTERNAL_ERROR);
  190. ret = -1;
  191. goto end;
  192. }
  193. /* s->version=SSL3_VERSION; */
  194. s->type=SSL_ST_CONNECT;
  195. if (s->init_buf == NULL)
  196. {
  197. if ((buf=BUF_MEM_new()) == NULL)
  198. {
  199. ret= -1;
  200. goto end;
  201. }
  202. if (!BUF_MEM_grow(buf,SSL3_RT_MAX_PLAIN_LENGTH))
  203. {
  204. ret= -1;
  205. goto end;
  206. }
  207. s->init_buf=buf;
  208. buf=NULL;
  209. }
  210. if (!ssl3_setup_buffers(s)) { ret= -1; goto end; }
  211. /* setup buffing BIO */
  212. if (!ssl_init_wbio_buffer(s,0)) { ret= -1; goto end; }
  213. /* don't push the buffering BIO quite yet */
  214. ssl3_init_finished_mac(s);
  215. s->state=SSL3_ST_CW_CLNT_HELLO_A;
  216. s->ctx->stats.sess_connect++;
  217. s->init_num=0;
  218. break;
  219. case SSL3_ST_CW_CLNT_HELLO_A:
  220. case SSL3_ST_CW_CLNT_HELLO_B:
  221. s->shutdown=0;
  222. ret=dtls1_client_hello(s);
  223. if (ret <= 0) goto end;
  224. if ( s->d1->send_cookie)
  225. {
  226. s->state=SSL3_ST_CW_FLUSH;
  227. s->s3->tmp.next_state=SSL3_ST_CR_SRVR_HELLO_A;
  228. }
  229. else
  230. s->state=SSL3_ST_CR_SRVR_HELLO_A;
  231. s->init_num=0;
  232. /* turn on buffering for the next lot of output */
  233. if (s->bbio != s->wbio)
  234. s->wbio=BIO_push(s->bbio,s->wbio);
  235. break;
  236. case SSL3_ST_CR_SRVR_HELLO_A:
  237. case SSL3_ST_CR_SRVR_HELLO_B:
  238. ret=ssl3_get_server_hello(s);
  239. if (ret <= 0) goto end;
  240. else
  241. {
  242. if (s->hit)
  243. s->state=SSL3_ST_CR_FINISHED_A;
  244. else
  245. s->state=DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A;
  246. }
  247. s->init_num=0;
  248. break;
  249. case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A:
  250. case DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B:
  251. ret = dtls1_get_hello_verify(s);
  252. if ( ret <= 0)
  253. goto end;
  254. if ( s->d1->send_cookie) /* start again, with a cookie */
  255. s->state=SSL3_ST_CW_CLNT_HELLO_A;
  256. else
  257. s->state = SSL3_ST_CR_CERT_A;
  258. s->init_num = 0;
  259. break;
  260. case SSL3_ST_CR_CERT_A:
  261. case SSL3_ST_CR_CERT_B:
  262. /* Check if it is anon DH */
  263. if (!(s->s3->tmp.new_cipher->algorithms & SSL_aNULL))
  264. {
  265. ret=ssl3_get_server_certificate(s);
  266. if (ret <= 0) goto end;
  267. }
  268. else
  269. skip=1;
  270. s->state=SSL3_ST_CR_KEY_EXCH_A;
  271. s->init_num=0;
  272. break;
  273. case SSL3_ST_CR_KEY_EXCH_A:
  274. case SSL3_ST_CR_KEY_EXCH_B:
  275. ret=ssl3_get_key_exchange(s);
  276. if (ret <= 0) goto end;
  277. s->state=SSL3_ST_CR_CERT_REQ_A;
  278. s->init_num=0;
  279. /* at this point we check that we have the
  280. * required stuff from the server */
  281. if (!ssl3_check_cert_and_algorithm(s))
  282. {
  283. ret= -1;
  284. goto end;
  285. }
  286. break;
  287. case SSL3_ST_CR_CERT_REQ_A:
  288. case SSL3_ST_CR_CERT_REQ_B:
  289. ret=ssl3_get_certificate_request(s);
  290. if (ret <= 0) goto end;
  291. s->state=SSL3_ST_CR_SRVR_DONE_A;
  292. s->init_num=0;
  293. break;
  294. case SSL3_ST_CR_SRVR_DONE_A:
  295. case SSL3_ST_CR_SRVR_DONE_B:
  296. ret=ssl3_get_server_done(s);
  297. if (ret <= 0) goto end;
  298. if (s->s3->tmp.cert_req)
  299. s->state=SSL3_ST_CW_CERT_A;
  300. else
  301. s->state=SSL3_ST_CW_KEY_EXCH_A;
  302. s->init_num=0;
  303. break;
  304. case SSL3_ST_CW_CERT_A:
  305. case SSL3_ST_CW_CERT_B:
  306. case SSL3_ST_CW_CERT_C:
  307. case SSL3_ST_CW_CERT_D:
  308. ret=dtls1_send_client_certificate(s);
  309. if (ret <= 0) goto end;
  310. s->state=SSL3_ST_CW_KEY_EXCH_A;
  311. s->init_num=0;
  312. break;
  313. case SSL3_ST_CW_KEY_EXCH_A:
  314. case SSL3_ST_CW_KEY_EXCH_B:
  315. ret=dtls1_send_client_key_exchange(s);
  316. if (ret <= 0) goto end;
  317. l=s->s3->tmp.new_cipher->algorithms;
  318. /* EAY EAY EAY need to check for DH fix cert
  319. * sent back */
  320. /* For TLS, cert_req is set to 2, so a cert chain
  321. * of nothing is sent, but no verify packet is sent */
  322. if (s->s3->tmp.cert_req == 1)
  323. {
  324. s->state=SSL3_ST_CW_CERT_VRFY_A;
  325. }
  326. else
  327. {
  328. s->state=SSL3_ST_CW_CHANGE_A;
  329. s->s3->change_cipher_spec=0;
  330. }
  331. s->init_num=0;
  332. break;
  333. case SSL3_ST_CW_CERT_VRFY_A:
  334. case SSL3_ST_CW_CERT_VRFY_B:
  335. ret=dtls1_send_client_verify(s);
  336. if (ret <= 0) goto end;
  337. s->state=SSL3_ST_CW_CHANGE_A;
  338. s->init_num=0;
  339. s->s3->change_cipher_spec=0;
  340. break;
  341. case SSL3_ST_CW_CHANGE_A:
  342. case SSL3_ST_CW_CHANGE_B:
  343. ret=dtls1_send_change_cipher_spec(s,
  344. SSL3_ST_CW_CHANGE_A,SSL3_ST_CW_CHANGE_B);
  345. if (ret <= 0) goto end;
  346. s->state=SSL3_ST_CW_FINISHED_A;
  347. s->init_num=0;
  348. s->session->cipher=s->s3->tmp.new_cipher;
  349. if (s->s3->tmp.new_compression == NULL)
  350. s->session->compress_meth=0;
  351. else
  352. s->session->compress_meth=
  353. s->s3->tmp.new_compression->id;
  354. if (!s->method->ssl3_enc->setup_key_block(s))
  355. {
  356. ret= -1;
  357. goto end;
  358. }
  359. if (!s->method->ssl3_enc->change_cipher_state(s,
  360. SSL3_CHANGE_CIPHER_CLIENT_WRITE))
  361. {
  362. ret= -1;
  363. goto end;
  364. }
  365. dtls1_reset_seq_numbers(s, SSL3_CC_WRITE);
  366. break;
  367. case SSL3_ST_CW_FINISHED_A:
  368. case SSL3_ST_CW_FINISHED_B:
  369. ret=dtls1_send_finished(s,
  370. SSL3_ST_CW_FINISHED_A,SSL3_ST_CW_FINISHED_B,
  371. s->method->ssl3_enc->client_finished_label,
  372. s->method->ssl3_enc->client_finished_label_len);
  373. if (ret <= 0) goto end;
  374. s->state=SSL3_ST_CW_FLUSH;
  375. /* clear flags */
  376. s->s3->flags&= ~SSL3_FLAGS_POP_BUFFER;
  377. if (s->hit)
  378. {
  379. s->s3->tmp.next_state=SSL_ST_OK;
  380. if (s->s3->flags & SSL3_FLAGS_DELAY_CLIENT_FINISHED)
  381. {
  382. s->state=SSL_ST_OK;
  383. s->s3->flags|=SSL3_FLAGS_POP_BUFFER;
  384. s->s3->delay_buf_pop_ret=0;
  385. }
  386. }
  387. else
  388. {
  389. s->s3->tmp.next_state=SSL3_ST_CR_FINISHED_A;
  390. }
  391. s->init_num=0;
  392. break;
  393. case SSL3_ST_CR_FINISHED_A:
  394. case SSL3_ST_CR_FINISHED_B:
  395. ret=ssl3_get_finished(s,SSL3_ST_CR_FINISHED_A,
  396. SSL3_ST_CR_FINISHED_B);
  397. if (ret <= 0) goto end;
  398. if (s->hit)
  399. s->state=SSL3_ST_CW_CHANGE_A;
  400. else
  401. s->state=SSL_ST_OK;
  402. s->init_num=0;
  403. break;
  404. case SSL3_ST_CW_FLUSH:
  405. /* number of bytes to be flushed */
  406. num1=BIO_ctrl(s->wbio,BIO_CTRL_INFO,0,NULL);
  407. if (num1 > 0)
  408. {
  409. s->rwstate=SSL_WRITING;
  410. num1=BIO_flush(s->wbio);
  411. if (num1 <= 0) { ret= -1; goto end; }
  412. s->rwstate=SSL_NOTHING;
  413. }
  414. s->state=s->s3->tmp.next_state;
  415. break;
  416. case SSL_ST_OK:
  417. /* clean a few things up */
  418. ssl3_cleanup_key_block(s);
  419. #if 0
  420. if (s->init_buf != NULL)
  421. {
  422. BUF_MEM_free(s->init_buf);
  423. s->init_buf=NULL;
  424. }
  425. #endif
  426. /* If we are not 'joining' the last two packets,
  427. * remove the buffering now */
  428. if (!(s->s3->flags & SSL3_FLAGS_POP_BUFFER))
  429. ssl_free_wbio_buffer(s);
  430. /* else do it later in ssl3_write */
  431. s->init_num=0;
  432. s->new_session=0;
  433. ssl_update_cache(s,SSL_SESS_CACHE_CLIENT);
  434. if (s->hit) s->ctx->stats.sess_hit++;
  435. ret=1;
  436. /* s->server=0; */
  437. s->handshake_func=dtls1_connect;
  438. s->ctx->stats.sess_connect_good++;
  439. if (cb != NULL) cb(s,SSL_CB_HANDSHAKE_DONE,1);
  440. /* done with handshaking */
  441. s->d1->handshake_read_seq = 0;
  442. goto end;
  443. /* break; */
  444. default:
  445. SSLerr(SSL_F_DTLS1_CONNECT,SSL_R_UNKNOWN_STATE);
  446. ret= -1;
  447. goto end;
  448. /* break; */
  449. }
  450. /* did we do anything */
  451. if (!s->s3->tmp.reuse_message && !skip)
  452. {
  453. if (s->debug)
  454. {
  455. if ((ret=BIO_flush(s->wbio)) <= 0)
  456. goto end;
  457. }
  458. if ((cb != NULL) && (s->state != state))
  459. {
  460. new_state=s->state;
  461. s->state=state;
  462. cb(s,SSL_CB_CONNECT_LOOP,1);
  463. s->state=new_state;
  464. }
  465. }
  466. skip=0;
  467. }
  468. end:
  469. s->in_handshake--;
  470. if (buf != NULL)
  471. BUF_MEM_free(buf);
  472. if (cb != NULL)
  473. cb(s,SSL_CB_CONNECT_EXIT,ret);
  474. return(ret);
  475. }
  476. int dtls1_client_hello(SSL *s)
  477. {
  478. unsigned char *buf;
  479. unsigned char *p,*d;
  480. int i,j;
  481. unsigned long Time,l;
  482. SSL_COMP *comp;
  483. buf=(unsigned char *)s->init_buf->data;
  484. if (s->state == SSL3_ST_CW_CLNT_HELLO_A)
  485. {
  486. if ((s->session == NULL) ||
  487. (s->session->ssl_version != s->version) ||
  488. (s->session->not_resumable))
  489. {
  490. if (!ssl_get_new_session(s,0))
  491. goto err;
  492. }
  493. /* else use the pre-loaded session */
  494. p=s->s3->client_random;
  495. Time=time(NULL); /* Time */
  496. l2n(Time,p);
  497. RAND_pseudo_bytes(p,SSL3_RANDOM_SIZE-sizeof(Time));
  498. /* Do the message type and length last */
  499. d=p= &(buf[DTLS1_HM_HEADER_LENGTH]);
  500. *(p++)=s->version>>8;
  501. *(p++)=s->version&0xff;
  502. s->client_version=s->version;
  503. /* Random stuff */
  504. memcpy(p,s->s3->client_random,SSL3_RANDOM_SIZE);
  505. p+=SSL3_RANDOM_SIZE;
  506. /* Session ID */
  507. if (s->new_session)
  508. i=0;
  509. else
  510. i=s->session->session_id_length;
  511. *(p++)=i;
  512. if (i != 0)
  513. {
  514. if (i > sizeof s->session->session_id)
  515. {
  516. SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
  517. goto err;
  518. }
  519. memcpy(p,s->session->session_id,i);
  520. p+=i;
  521. }
  522. /* cookie stuff */
  523. if ( s->d1->cookie_len > sizeof(s->d1->cookie))
  524. {
  525. SSLerr(SSL_F_DTLS1_CLIENT_HELLO, ERR_R_INTERNAL_ERROR);
  526. goto err;
  527. }
  528. *(p++) = s->d1->cookie_len;
  529. memcpy(p, s->d1->cookie, s->d1->cookie_len);
  530. p += s->d1->cookie_len;
  531. /* Ciphers supported */
  532. i=ssl_cipher_list_to_bytes(s,SSL_get_ciphers(s),&(p[2]),0);
  533. if (i == 0)
  534. {
  535. SSLerr(SSL_F_DTLS1_CLIENT_HELLO,SSL_R_NO_CIPHERS_AVAILABLE);
  536. goto err;
  537. }
  538. s2n(i,p);
  539. p+=i;
  540. /* COMPRESSION */
  541. if (s->ctx->comp_methods == NULL)
  542. j=0;
  543. else
  544. j=sk_SSL_COMP_num(s->ctx->comp_methods);
  545. *(p++)=1+j;
  546. for (i=0; i<j; i++)
  547. {
  548. comp=sk_SSL_COMP_value(s->ctx->comp_methods,i);
  549. *(p++)=comp->id;
  550. }
  551. *(p++)=0; /* Add the NULL method */
  552. l=(p-d);
  553. d=buf;
  554. d = dtls1_set_message_header(s, d, SSL3_MT_CLIENT_HELLO, l, 0, l);
  555. s->state=SSL3_ST_CW_CLNT_HELLO_B;
  556. /* number of bytes to write */
  557. s->init_num=p-buf;
  558. s->init_off=0;
  559. /* buffer the message to handle re-xmits */
  560. dtls1_buffer_message(s, 0);
  561. }
  562. /* SSL3_ST_CW_CLNT_HELLO_B */
  563. return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  564. err:
  565. return(-1);
  566. }
  567. static int dtls1_get_hello_verify(SSL *s)
  568. {
  569. int n, al, ok = 0;
  570. unsigned char *data;
  571. unsigned int cookie_len;
  572. n=s->method->ssl_get_message(s,
  573. DTLS1_ST_CR_HELLO_VERIFY_REQUEST_A,
  574. DTLS1_ST_CR_HELLO_VERIFY_REQUEST_B,
  575. -1,
  576. s->max_cert_list,
  577. &ok);
  578. if (!ok) return((int)n);
  579. if (s->s3->tmp.message_type != DTLS1_MT_HELLO_VERIFY_REQUEST)
  580. {
  581. s->d1->send_cookie = 0;
  582. s->s3->tmp.reuse_message=1;
  583. return(1);
  584. }
  585. data = (unsigned char *)s->init_msg;
  586. if ((data[0] != (s->version>>8)) || (data[1] != (s->version&0xff)))
  587. {
  588. SSLerr(SSL_F_DTLS1_GET_HELLO_VERIFY,SSL_R_WRONG_SSL_VERSION);
  589. s->version=(s->version&0xff00)|data[1];
  590. al = SSL_AD_PROTOCOL_VERSION;
  591. goto f_err;
  592. }
  593. data+=2;
  594. cookie_len = *(data++);
  595. if ( cookie_len > sizeof(s->d1->cookie))
  596. {
  597. al=SSL_AD_ILLEGAL_PARAMETER;
  598. goto f_err;
  599. }
  600. memcpy(s->d1->cookie, data, cookie_len);
  601. s->d1->cookie_len = cookie_len;
  602. s->d1->send_cookie = 1;
  603. return 1;
  604. f_err:
  605. ssl3_send_alert(s, SSL3_AL_FATAL, al);
  606. return -1;
  607. }
  608. int dtls1_send_client_key_exchange(SSL *s)
  609. {
  610. unsigned char *p,*d;
  611. int n;
  612. unsigned long l;
  613. #ifndef OPENSSL_NO_RSA
  614. unsigned char *q;
  615. EVP_PKEY *pkey=NULL;
  616. #endif
  617. #ifndef OPENSSL_NO_KRB5
  618. KSSL_ERR kssl_err;
  619. #endif /* OPENSSL_NO_KRB5 */
  620. if (s->state == SSL3_ST_CW_KEY_EXCH_A)
  621. {
  622. d=(unsigned char *)s->init_buf->data;
  623. p= &(d[DTLS1_HM_HEADER_LENGTH]);
  624. l=s->s3->tmp.new_cipher->algorithms;
  625. /* Fool emacs indentation */
  626. if (0) {}
  627. #ifndef OPENSSL_NO_RSA
  628. else if (l & SSL_kRSA)
  629. {
  630. RSA *rsa;
  631. unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
  632. if (s->session->sess_cert->peer_rsa_tmp != NULL)
  633. rsa=s->session->sess_cert->peer_rsa_tmp;
  634. else
  635. {
  636. pkey=X509_get_pubkey(s->session->sess_cert->peer_pkeys[SSL_PKEY_RSA_ENC].x509);
  637. if ((pkey == NULL) ||
  638. (pkey->type != EVP_PKEY_RSA) ||
  639. (pkey->pkey.rsa == NULL))
  640. {
  641. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
  642. goto err;
  643. }
  644. rsa=pkey->pkey.rsa;
  645. EVP_PKEY_free(pkey);
  646. }
  647. tmp_buf[0]=s->client_version>>8;
  648. tmp_buf[1]=s->client_version&0xff;
  649. if (RAND_bytes(&(tmp_buf[2]),sizeof tmp_buf-2) <= 0)
  650. goto err;
  651. s->session->master_key_length=sizeof tmp_buf;
  652. q=p;
  653. /* Fix buf for TLS and beyond */
  654. if (s->version > SSL3_VERSION)
  655. p+=2;
  656. n=RSA_public_encrypt(sizeof tmp_buf,
  657. tmp_buf,p,rsa,RSA_PKCS1_PADDING);
  658. #ifdef PKCS1_CHECK
  659. if (s->options & SSL_OP_PKCS1_CHECK_1) p[1]++;
  660. if (s->options & SSL_OP_PKCS1_CHECK_2) tmp_buf[0]=0x70;
  661. #endif
  662. if (n <= 0)
  663. {
  664. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_BAD_RSA_ENCRYPT);
  665. goto err;
  666. }
  667. /* Fix buf for TLS and beyond */
  668. if (s->version > SSL3_VERSION)
  669. {
  670. s2n(n,q);
  671. n+=2;
  672. }
  673. s->session->master_key_length=
  674. s->method->ssl3_enc->generate_master_secret(s,
  675. s->session->master_key,
  676. tmp_buf,sizeof tmp_buf);
  677. OPENSSL_cleanse(tmp_buf,sizeof tmp_buf);
  678. }
  679. #endif
  680. #ifndef OPENSSL_NO_KRB5
  681. else if (l & SSL_kKRB5)
  682. {
  683. krb5_error_code krb5rc;
  684. KSSL_CTX *kssl_ctx = s->kssl_ctx;
  685. /* krb5_data krb5_ap_req; */
  686. krb5_data *enc_ticket;
  687. krb5_data authenticator, *authp = NULL;
  688. EVP_CIPHER_CTX ciph_ctx;
  689. EVP_CIPHER *enc = NULL;
  690. unsigned char iv[EVP_MAX_IV_LENGTH];
  691. unsigned char tmp_buf[SSL_MAX_MASTER_KEY_LENGTH];
  692. unsigned char epms[SSL_MAX_MASTER_KEY_LENGTH
  693. + EVP_MAX_IV_LENGTH];
  694. int padl, outl = sizeof(epms);
  695. EVP_CIPHER_CTX_init(&ciph_ctx);
  696. #ifdef KSSL_DEBUG
  697. printf("ssl3_send_client_key_exchange(%lx & %lx)\n",
  698. l, SSL_kKRB5);
  699. #endif /* KSSL_DEBUG */
  700. authp = NULL;
  701. #ifdef KRB5SENDAUTH
  702. if (KRB5SENDAUTH) authp = &authenticator;
  703. #endif /* KRB5SENDAUTH */
  704. krb5rc = kssl_cget_tkt(kssl_ctx, &enc_ticket, authp,
  705. &kssl_err);
  706. enc = kssl_map_enc(kssl_ctx->enctype);
  707. if (enc == NULL)
  708. goto err;
  709. #ifdef KSSL_DEBUG
  710. {
  711. printf("kssl_cget_tkt rtn %d\n", krb5rc);
  712. if (krb5rc && kssl_err.text)
  713. printf("kssl_cget_tkt kssl_err=%s\n", kssl_err.text);
  714. }
  715. #endif /* KSSL_DEBUG */
  716. if (krb5rc)
  717. {
  718. ssl3_send_alert(s,SSL3_AL_FATAL,
  719. SSL_AD_HANDSHAKE_FAILURE);
  720. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,
  721. kssl_err.reason);
  722. goto err;
  723. }
  724. /* 20010406 VRS - Earlier versions used KRB5 AP_REQ
  725. ** in place of RFC 2712 KerberosWrapper, as in:
  726. **
  727. ** Send ticket (copy to *p, set n = length)
  728. ** n = krb5_ap_req.length;
  729. ** memcpy(p, krb5_ap_req.data, krb5_ap_req.length);
  730. ** if (krb5_ap_req.data)
  731. ** kssl_krb5_free_data_contents(NULL,&krb5_ap_req);
  732. **
  733. ** Now using real RFC 2712 KerberosWrapper
  734. ** (Thanks to Simon Wilkinson <sxw@sxw.org.uk>)
  735. ** Note: 2712 "opaque" types are here replaced
  736. ** with a 2-byte length followed by the value.
  737. ** Example:
  738. ** KerberosWrapper= xx xx asn1ticket 0 0 xx xx encpms
  739. ** Where "xx xx" = length bytes. Shown here with
  740. ** optional authenticator omitted.
  741. */
  742. /* KerberosWrapper.Ticket */
  743. s2n(enc_ticket->length,p);
  744. memcpy(p, enc_ticket->data, enc_ticket->length);
  745. p+= enc_ticket->length;
  746. n = enc_ticket->length + 2;
  747. /* KerberosWrapper.Authenticator */
  748. if (authp && authp->length)
  749. {
  750. s2n(authp->length,p);
  751. memcpy(p, authp->data, authp->length);
  752. p+= authp->length;
  753. n+= authp->length + 2;
  754. free(authp->data);
  755. authp->data = NULL;
  756. authp->length = 0;
  757. }
  758. else
  759. {
  760. s2n(0,p);/* null authenticator length */
  761. n+=2;
  762. }
  763. if (RAND_bytes(tmp_buf,sizeof tmp_buf) <= 0)
  764. goto err;
  765. /* 20010420 VRS. Tried it this way; failed.
  766. ** EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,NULL);
  767. ** EVP_CIPHER_CTX_set_key_length(&ciph_ctx,
  768. ** kssl_ctx->length);
  769. ** EVP_EncryptInit_ex(&ciph_ctx,NULL, key,iv);
  770. */
  771. memset(iv, 0, sizeof iv); /* per RFC 1510 */
  772. EVP_EncryptInit_ex(&ciph_ctx,enc, NULL,
  773. kssl_ctx->key,iv);
  774. EVP_EncryptUpdate(&ciph_ctx,epms,&outl,tmp_buf,
  775. sizeof tmp_buf);
  776. EVP_EncryptFinal_ex(&ciph_ctx,&(epms[outl]),&padl);
  777. outl += padl;
  778. if (outl > sizeof epms)
  779. {
  780. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE, ERR_R_INTERNAL_ERROR);
  781. goto err;
  782. }
  783. EVP_CIPHER_CTX_cleanup(&ciph_ctx);
  784. /* KerberosWrapper.EncryptedPreMasterSecret */
  785. s2n(outl,p);
  786. memcpy(p, epms, outl);
  787. p+=outl;
  788. n+=outl + 2;
  789. s->session->master_key_length=
  790. s->method->ssl3_enc->generate_master_secret(s,
  791. s->session->master_key,
  792. tmp_buf, sizeof tmp_buf);
  793. OPENSSL_cleanse(tmp_buf, sizeof tmp_buf);
  794. OPENSSL_cleanse(epms, outl);
  795. }
  796. #endif
  797. #ifndef OPENSSL_NO_DH
  798. else if (l & (SSL_kEDH|SSL_kDHr|SSL_kDHd))
  799. {
  800. DH *dh_srvr,*dh_clnt;
  801. if (s->session->sess_cert->peer_dh_tmp != NULL)
  802. dh_srvr=s->session->sess_cert->peer_dh_tmp;
  803. else
  804. {
  805. /* we get them from the cert */
  806. ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
  807. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,SSL_R_UNABLE_TO_FIND_DH_PARAMETERS);
  808. goto err;
  809. }
  810. /* generate a new random key */
  811. if ((dh_clnt=DHparams_dup(dh_srvr)) == NULL)
  812. {
  813. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
  814. goto err;
  815. }
  816. if (!DH_generate_key(dh_clnt))
  817. {
  818. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
  819. goto err;
  820. }
  821. /* use the 'p' output buffer for the DH key, but
  822. * make sure to clear it out afterwards */
  823. n=DH_compute_key(p,dh_srvr->pub_key,dh_clnt);
  824. if (n <= 0)
  825. {
  826. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_DH_LIB);
  827. goto err;
  828. }
  829. /* generate master key from the result */
  830. s->session->master_key_length=
  831. s->method->ssl3_enc->generate_master_secret(s,
  832. s->session->master_key,p,n);
  833. /* clean up */
  834. memset(p,0,n);
  835. /* send off the data */
  836. n=BN_num_bytes(dh_clnt->pub_key);
  837. s2n(n,p);
  838. BN_bn2bin(dh_clnt->pub_key,p);
  839. n+=2;
  840. DH_free(dh_clnt);
  841. /* perhaps clean things up a bit EAY EAY EAY EAY*/
  842. }
  843. #endif
  844. else
  845. {
  846. ssl3_send_alert(s,SSL3_AL_FATAL,SSL_AD_HANDSHAKE_FAILURE);
  847. SSLerr(SSL_F_DTLS1_SEND_CLIENT_KEY_EXCHANGE,ERR_R_INTERNAL_ERROR);
  848. goto err;
  849. }
  850. d = dtls1_set_message_header(s, d,
  851. SSL3_MT_CLIENT_KEY_EXCHANGE, n, 0, n);
  852. /*
  853. *(d++)=SSL3_MT_CLIENT_KEY_EXCHANGE;
  854. l2n3(n,d);
  855. l2n(s->d1->handshake_write_seq,d);
  856. s->d1->handshake_write_seq++;
  857. */
  858. s->state=SSL3_ST_CW_KEY_EXCH_B;
  859. /* number of bytes to write */
  860. s->init_num=n+DTLS1_HM_HEADER_LENGTH;
  861. s->init_off=0;
  862. /* buffer the message to handle re-xmits */
  863. dtls1_buffer_message(s, 0);
  864. }
  865. /* SSL3_ST_CW_KEY_EXCH_B */
  866. return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  867. err:
  868. return(-1);
  869. }
  870. int dtls1_send_client_verify(SSL *s)
  871. {
  872. unsigned char *p,*d;
  873. unsigned char data[MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH];
  874. EVP_PKEY *pkey;
  875. #ifndef OPENSSL_NO_RSA
  876. unsigned u=0;
  877. #endif
  878. unsigned long n;
  879. #ifndef OPENSSL_NO_DSA
  880. int j;
  881. #endif
  882. if (s->state == SSL3_ST_CW_CERT_VRFY_A)
  883. {
  884. d=(unsigned char *)s->init_buf->data;
  885. p= &(d[DTLS1_HM_HEADER_LENGTH]);
  886. pkey=s->cert->key->privatekey;
  887. s->method->ssl3_enc->cert_verify_mac(s,&(s->s3->finish_dgst2),
  888. &(data[MD5_DIGEST_LENGTH]));
  889. #ifndef OPENSSL_NO_RSA
  890. if (pkey->type == EVP_PKEY_RSA)
  891. {
  892. s->method->ssl3_enc->cert_verify_mac(s,
  893. &(s->s3->finish_dgst1),&(data[0]));
  894. if (RSA_sign(NID_md5_sha1, data,
  895. MD5_DIGEST_LENGTH+SHA_DIGEST_LENGTH,
  896. &(p[2]), &u, pkey->pkey.rsa) <= 0 )
  897. {
  898. SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_RSA_LIB);
  899. goto err;
  900. }
  901. s2n(u,p);
  902. n=u+2;
  903. }
  904. else
  905. #endif
  906. #ifndef OPENSSL_NO_DSA
  907. if (pkey->type == EVP_PKEY_DSA)
  908. {
  909. if (!DSA_sign(pkey->save_type,
  910. &(data[MD5_DIGEST_LENGTH]),
  911. SHA_DIGEST_LENGTH,&(p[2]),
  912. (unsigned int *)&j,pkey->pkey.dsa))
  913. {
  914. SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_DSA_LIB);
  915. goto err;
  916. }
  917. s2n(j,p);
  918. n=j+2;
  919. }
  920. else
  921. #endif
  922. {
  923. SSLerr(SSL_F_DTLS1_SEND_CLIENT_VERIFY,ERR_R_INTERNAL_ERROR);
  924. goto err;
  925. }
  926. d = dtls1_set_message_header(s, d,
  927. SSL3_MT_CERTIFICATE_VERIFY, n, 0, n) ;
  928. s->init_num=(int)n+DTLS1_HM_HEADER_LENGTH;
  929. s->init_off=0;
  930. /* buffer the message to handle re-xmits */
  931. dtls1_buffer_message(s, 0);
  932. s->state = SSL3_ST_CW_CERT_VRFY_B;
  933. }
  934. /* s->state = SSL3_ST_CW_CERT_VRFY_B */
  935. return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  936. err:
  937. return(-1);
  938. }
  939. int dtls1_send_client_certificate(SSL *s)
  940. {
  941. X509 *x509=NULL;
  942. EVP_PKEY *pkey=NULL;
  943. int i;
  944. unsigned long l;
  945. if (s->state == SSL3_ST_CW_CERT_A)
  946. {
  947. if ((s->cert == NULL) ||
  948. (s->cert->key->x509 == NULL) ||
  949. (s->cert->key->privatekey == NULL))
  950. s->state=SSL3_ST_CW_CERT_B;
  951. else
  952. s->state=SSL3_ST_CW_CERT_C;
  953. }
  954. /* We need to get a client cert */
  955. if (s->state == SSL3_ST_CW_CERT_B)
  956. {
  957. /* If we get an error, we need to
  958. * ssl->rwstate=SSL_X509_LOOKUP; return(-1);
  959. * We then get retied later */
  960. i=0;
  961. if (s->ctx->client_cert_cb != NULL)
  962. i=s->ctx->client_cert_cb(s,&(x509),&(pkey));
  963. if (i < 0)
  964. {
  965. s->rwstate=SSL_X509_LOOKUP;
  966. return(-1);
  967. }
  968. s->rwstate=SSL_NOTHING;
  969. if ((i == 1) && (pkey != NULL) && (x509 != NULL))
  970. {
  971. s->state=SSL3_ST_CW_CERT_B;
  972. if ( !SSL_use_certificate(s,x509) ||
  973. !SSL_use_PrivateKey(s,pkey))
  974. i=0;
  975. }
  976. else if (i == 1)
  977. {
  978. i=0;
  979. SSLerr(SSL_F_DTLS1_SEND_CLIENT_CERTIFICATE,SSL_R_BAD_DATA_RETURNED_BY_CALLBACK);
  980. }
  981. if (x509 != NULL) X509_free(x509);
  982. if (pkey != NULL) EVP_PKEY_free(pkey);
  983. if (i == 0)
  984. {
  985. if (s->version == SSL3_VERSION)
  986. {
  987. s->s3->tmp.cert_req=0;
  988. ssl3_send_alert(s,SSL3_AL_WARNING,SSL_AD_NO_CERTIFICATE);
  989. return(1);
  990. }
  991. else
  992. {
  993. s->s3->tmp.cert_req=2;
  994. }
  995. }
  996. /* Ok, we have a cert */
  997. s->state=SSL3_ST_CW_CERT_C;
  998. }
  999. if (s->state == SSL3_ST_CW_CERT_C)
  1000. {
  1001. s->state=SSL3_ST_CW_CERT_D;
  1002. l=dtls1_output_cert_chain(s,
  1003. (s->s3->tmp.cert_req == 2)?NULL:s->cert->key->x509);
  1004. s->init_num=(int)l;
  1005. s->init_off=0;
  1006. /* set header called by dtls1_output_cert_chain() */
  1007. /* buffer the message to handle re-xmits */
  1008. dtls1_buffer_message(s, 0);
  1009. }
  1010. /* SSL3_ST_CW_CERT_D */
  1011. return(dtls1_do_write(s,SSL3_RT_HANDSHAKE));
  1012. }