s3_both.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854
  1. /* ssl/s3_both.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-2002 The OpenSSL Project. All rights reserved.
  60. *
  61. * Redistribution and use in source and binary forms, with or without
  62. * modification, are permitted provided that the following conditions
  63. * are met:
  64. *
  65. * 1. Redistributions of source code must retain the above copyright
  66. * notice, this list of conditions and the following disclaimer.
  67. *
  68. * 2. Redistributions in binary form must reproduce the above copyright
  69. * notice, this list of conditions and the following disclaimer in
  70. * the documentation and/or other materials provided with the
  71. * distribution.
  72. *
  73. * 3. All advertising materials mentioning features or use of this
  74. * software must display the following acknowledgment:
  75. * "This product includes software developed by the OpenSSL Project
  76. * for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
  77. *
  78. * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
  79. * endorse or promote products derived from this software without
  80. * prior written permission. For written permission, please contact
  81. * openssl-core@openssl.org.
  82. *
  83. * 5. Products derived from this software may not be called "OpenSSL"
  84. * nor may "OpenSSL" appear in their names without prior written
  85. * permission of the OpenSSL Project.
  86. *
  87. * 6. Redistributions of any form whatsoever must retain the following
  88. * acknowledgment:
  89. * "This product includes software developed by the OpenSSL Project
  90. * for use in the OpenSSL Toolkit (http://www.openssl.org/)"
  91. *
  92. * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
  93. * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  94. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  95. * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
  96. * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  97. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  98. * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  99. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  100. * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  101. * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  102. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  103. * OF THE POSSIBILITY OF SUCH DAMAGE.
  104. * ====================================================================
  105. *
  106. * This product includes cryptographic software written by Eric Young
  107. * (eay@cryptsoft.com). This product includes software written by Tim
  108. * Hudson (tjh@cryptsoft.com).
  109. *
  110. */
  111. /* ====================================================================
  112. * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
  113. * ECC cipher suite support in OpenSSL originally developed by
  114. * SUN MICROSYSTEMS, INC., and contributed to the OpenSSL project.
  115. */
  116. #include <limits.h>
  117. #include <string.h>
  118. #include <stdio.h>
  119. #include "ssl_locl.h"
  120. #include <openssl/buffer.h>
  121. #include <openssl/rand.h>
  122. #include <openssl/objects.h>
  123. #include <openssl/evp.h>
  124. #include <openssl/x509.h>
  125. /* send s->init_buf in records of type 'type' (SSL3_RT_HANDSHAKE or SSL3_RT_CHANGE_CIPHER_SPEC) */
  126. int ssl3_do_write(SSL *s, int type)
  127. {
  128. int ret;
  129. ret=ssl3_write_bytes(s,type,&s->init_buf->data[s->init_off],
  130. s->init_num);
  131. if (ret < 0) return(-1);
  132. if (type == SSL3_RT_HANDSHAKE)
  133. /* should not be done for 'Hello Request's, but in that case
  134. * we'll ignore the result anyway */
  135. ssl3_finish_mac(s,(unsigned char *)&s->init_buf->data[s->init_off],ret);
  136. if (ret == s->init_num)
  137. {
  138. if (s->msg_callback)
  139. s->msg_callback(1, s->version, type, s->init_buf->data, (size_t)(s->init_off + s->init_num), s, s->msg_callback_arg);
  140. return(1);
  141. }
  142. s->init_off+=ret;
  143. s->init_num-=ret;
  144. return(0);
  145. }
  146. int ssl3_send_finished(SSL *s, int a, int b, const char *sender, int slen)
  147. {
  148. unsigned char *p,*d;
  149. int i;
  150. unsigned long l;
  151. if (s->state == a)
  152. {
  153. d=(unsigned char *)s->init_buf->data;
  154. p= &(d[4]);
  155. i=s->method->ssl3_enc->final_finish_mac(s,
  156. sender,slen,s->s3->tmp.finish_md);
  157. if (i == 0)
  158. return 0;
  159. s->s3->tmp.finish_md_len = i;
  160. memcpy(p, s->s3->tmp.finish_md, i);
  161. p+=i;
  162. l=i;
  163. /* Copy the finished so we can use it for
  164. renegotiation checks */
  165. if(s->type == SSL_ST_CONNECT)
  166. {
  167. OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
  168. memcpy(s->s3->previous_client_finished,
  169. s->s3->tmp.finish_md, i);
  170. s->s3->previous_client_finished_len=i;
  171. }
  172. else
  173. {
  174. OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
  175. memcpy(s->s3->previous_server_finished,
  176. s->s3->tmp.finish_md, i);
  177. s->s3->previous_server_finished_len=i;
  178. }
  179. #ifdef OPENSSL_SYS_WIN16
  180. /* MSVC 1.5 does not clear the top bytes of the word unless
  181. * I do this.
  182. */
  183. l&=0xffff;
  184. #endif
  185. *(d++)=SSL3_MT_FINISHED;
  186. l2n3(l,d);
  187. s->init_num=(int)l+4;
  188. s->init_off=0;
  189. s->state=b;
  190. }
  191. /* SSL3_ST_SEND_xxxxxx_HELLO_B */
  192. return(ssl3_do_write(s,SSL3_RT_HANDSHAKE));
  193. }
  194. #ifndef OPENSSL_NO_NEXTPROTONEG
  195. /* ssl3_take_mac calculates the Finished MAC for the handshakes messages seen to far. */
  196. static void ssl3_take_mac(SSL *s)
  197. {
  198. const char *sender;
  199. int slen;
  200. /* If no new cipher setup return immediately: other functions will
  201. * set the appropriate error.
  202. */
  203. if (s->s3->tmp.new_cipher == NULL)
  204. return;
  205. if (s->state & SSL_ST_CONNECT)
  206. {
  207. sender=s->method->ssl3_enc->server_finished_label;
  208. slen=s->method->ssl3_enc->server_finished_label_len;
  209. }
  210. else
  211. {
  212. sender=s->method->ssl3_enc->client_finished_label;
  213. slen=s->method->ssl3_enc->client_finished_label_len;
  214. }
  215. s->s3->tmp.peer_finish_md_len = s->method->ssl3_enc->final_finish_mac(s,
  216. sender,slen,s->s3->tmp.peer_finish_md);
  217. }
  218. #endif
  219. int ssl3_get_finished(SSL *s, int a, int b)
  220. {
  221. int al,i,ok;
  222. long n;
  223. unsigned char *p;
  224. #ifdef OPENSSL_NO_NEXTPROTONEG
  225. /* the mac has already been generated when we received the
  226. * change cipher spec message and is in s->s3->tmp.peer_finish_md.
  227. */
  228. #endif
  229. n=s->method->ssl_get_message(s,
  230. a,
  231. b,
  232. SSL3_MT_FINISHED,
  233. 64, /* should actually be 36+4 :-) */
  234. &ok);
  235. if (!ok) return((int)n);
  236. /* If this occurs, we have missed a message */
  237. if (!s->s3->change_cipher_spec)
  238. {
  239. al=SSL_AD_UNEXPECTED_MESSAGE;
  240. SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_GOT_A_FIN_BEFORE_A_CCS);
  241. goto f_err;
  242. }
  243. s->s3->change_cipher_spec=0;
  244. p = (unsigned char *)s->init_msg;
  245. i = s->s3->tmp.peer_finish_md_len;
  246. if (i != n)
  247. {
  248. al=SSL_AD_DECODE_ERROR;
  249. SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_BAD_DIGEST_LENGTH);
  250. goto f_err;
  251. }
  252. if (CRYPTO_memcmp(p, s->s3->tmp.peer_finish_md, i) != 0)
  253. {
  254. al=SSL_AD_DECRYPT_ERROR;
  255. SSLerr(SSL_F_SSL3_GET_FINISHED,SSL_R_DIGEST_CHECK_FAILED);
  256. goto f_err;
  257. }
  258. /* Copy the finished so we can use it for
  259. renegotiation checks */
  260. if(s->type == SSL_ST_ACCEPT)
  261. {
  262. OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
  263. memcpy(s->s3->previous_client_finished,
  264. s->s3->tmp.peer_finish_md, i);
  265. s->s3->previous_client_finished_len=i;
  266. }
  267. else
  268. {
  269. OPENSSL_assert(i <= EVP_MAX_MD_SIZE);
  270. memcpy(s->s3->previous_server_finished,
  271. s->s3->tmp.peer_finish_md, i);
  272. s->s3->previous_server_finished_len=i;
  273. }
  274. return(1);
  275. f_err:
  276. ssl3_send_alert(s,SSL3_AL_FATAL,al);
  277. return(0);
  278. }
  279. /* for these 2 messages, we need to
  280. * ssl->enc_read_ctx re-init
  281. * ssl->s3->read_sequence zero
  282. * ssl->s3->read_mac_secret re-init
  283. * ssl->session->read_sym_enc assign
  284. * ssl->session->read_compression assign
  285. * ssl->session->read_hash assign
  286. */
  287. int ssl3_send_change_cipher_spec(SSL *s, int a, int b)
  288. {
  289. unsigned char *p;
  290. if (s->state == a)
  291. {
  292. p=(unsigned char *)s->init_buf->data;
  293. *p=SSL3_MT_CCS;
  294. s->init_num=1;
  295. s->init_off=0;
  296. s->state=b;
  297. }
  298. /* SSL3_ST_CW_CHANGE_B */
  299. return(ssl3_do_write(s,SSL3_RT_CHANGE_CIPHER_SPEC));
  300. }
  301. static int ssl3_add_cert_to_buf(BUF_MEM *buf, unsigned long *l, X509 *x)
  302. {
  303. int n;
  304. unsigned char *p;
  305. n=i2d_X509(x,NULL);
  306. if (!BUF_MEM_grow_clean(buf,(int)(n+(*l)+3)))
  307. {
  308. SSLerr(SSL_F_SSL3_ADD_CERT_TO_BUF,ERR_R_BUF_LIB);
  309. return(-1);
  310. }
  311. p=(unsigned char *)&(buf->data[*l]);
  312. l2n3(n,p);
  313. i2d_X509(x,&p);
  314. *l+=n+3;
  315. return(0);
  316. }
  317. unsigned long ssl3_output_cert_chain(SSL *s, X509 *x)
  318. {
  319. unsigned char *p;
  320. int i;
  321. unsigned long l=7;
  322. BUF_MEM *buf;
  323. int no_chain;
  324. if ((s->mode & SSL_MODE_NO_AUTO_CHAIN) || s->ctx->extra_certs)
  325. no_chain = 1;
  326. else
  327. no_chain = 0;
  328. /* TLSv1 sends a chain with nothing in it, instead of an alert */
  329. buf=s->init_buf;
  330. if (!BUF_MEM_grow_clean(buf,10))
  331. {
  332. SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_BUF_LIB);
  333. return(0);
  334. }
  335. if (x != NULL)
  336. {
  337. if (no_chain)
  338. {
  339. if (ssl3_add_cert_to_buf(buf, &l, x))
  340. return(0);
  341. }
  342. else
  343. {
  344. X509_STORE_CTX xs_ctx;
  345. if (!X509_STORE_CTX_init(&xs_ctx,s->ctx->cert_store,x,NULL))
  346. {
  347. SSLerr(SSL_F_SSL3_OUTPUT_CERT_CHAIN,ERR_R_X509_LIB);
  348. return(0);
  349. }
  350. X509_verify_cert(&xs_ctx);
  351. /* Don't leave errors in the queue */
  352. ERR_clear_error();
  353. for (i=0; i < sk_X509_num(xs_ctx.chain); i++)
  354. {
  355. x = sk_X509_value(xs_ctx.chain, i);
  356. if (ssl3_add_cert_to_buf(buf, &l, x))
  357. {
  358. X509_STORE_CTX_cleanup(&xs_ctx);
  359. return 0;
  360. }
  361. }
  362. X509_STORE_CTX_cleanup(&xs_ctx);
  363. }
  364. }
  365. /* Thawte special :-) */
  366. for (i=0; i<sk_X509_num(s->ctx->extra_certs); i++)
  367. {
  368. x=sk_X509_value(s->ctx->extra_certs,i);
  369. if (ssl3_add_cert_to_buf(buf, &l, x))
  370. return(0);
  371. }
  372. l-=7;
  373. p=(unsigned char *)&(buf->data[4]);
  374. l2n3(l,p);
  375. l+=3;
  376. p=(unsigned char *)&(buf->data[0]);
  377. *(p++)=SSL3_MT_CERTIFICATE;
  378. l2n3(l,p);
  379. l+=4;
  380. return(l);
  381. }
  382. /* Obtain handshake message of message type 'mt' (any if mt == -1),
  383. * maximum acceptable body length 'max'.
  384. * The first four bytes (msg_type and length) are read in state 'st1',
  385. * the body is read in state 'stn'.
  386. */
  387. long ssl3_get_message(SSL *s, int st1, int stn, int mt, long max, int *ok)
  388. {
  389. unsigned char *p;
  390. unsigned long l;
  391. long n;
  392. int i,al;
  393. if (s->s3->tmp.reuse_message)
  394. {
  395. s->s3->tmp.reuse_message=0;
  396. if ((mt >= 0) && (s->s3->tmp.message_type != mt))
  397. {
  398. al=SSL_AD_UNEXPECTED_MESSAGE;
  399. SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
  400. goto f_err;
  401. }
  402. *ok=1;
  403. s->init_msg = s->init_buf->data + 4;
  404. s->init_num = (int)s->s3->tmp.message_size;
  405. return s->init_num;
  406. }
  407. p=(unsigned char *)s->init_buf->data;
  408. if (s->state == st1) /* s->init_num < 4 */
  409. {
  410. int skip_message;
  411. do
  412. {
  413. while (s->init_num < 4)
  414. {
  415. i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,
  416. &p[s->init_num],4 - s->init_num, 0);
  417. if (i <= 0)
  418. {
  419. s->rwstate=SSL_READING;
  420. *ok = 0;
  421. return i;
  422. }
  423. s->init_num+=i;
  424. }
  425. skip_message = 0;
  426. if (!s->server)
  427. if (p[0] == SSL3_MT_HELLO_REQUEST)
  428. /* The server may always send 'Hello Request' messages --
  429. * we are doing a handshake anyway now, so ignore them
  430. * if their format is correct. Does not count for
  431. * 'Finished' MAC. */
  432. if (p[1] == 0 && p[2] == 0 &&p[3] == 0)
  433. {
  434. s->init_num = 0;
  435. skip_message = 1;
  436. if (s->msg_callback)
  437. s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, p, 4, s, s->msg_callback_arg);
  438. }
  439. }
  440. while (skip_message);
  441. /* s->init_num == 4 */
  442. if ((mt >= 0) && (*p != mt))
  443. {
  444. al=SSL_AD_UNEXPECTED_MESSAGE;
  445. SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_UNEXPECTED_MESSAGE);
  446. goto f_err;
  447. }
  448. if ((mt < 0) && (*p == SSL3_MT_CLIENT_HELLO) &&
  449. (st1 == SSL3_ST_SR_CERT_A) &&
  450. (stn == SSL3_ST_SR_CERT_B))
  451. {
  452. /* At this point we have got an MS SGC second client
  453. * hello (maybe we should always allow the client to
  454. * start a new handshake?). We need to restart the mac.
  455. * Don't increment {num,total}_renegotiations because
  456. * we have not completed the handshake. */
  457. ssl3_init_finished_mac(s);
  458. }
  459. s->s3->tmp.message_type= *(p++);
  460. n2l3(p,l);
  461. if (l > (unsigned long)max)
  462. {
  463. al=SSL_AD_ILLEGAL_PARAMETER;
  464. SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
  465. goto f_err;
  466. }
  467. if (l > (INT_MAX-4)) /* BUF_MEM_grow takes an 'int' parameter */
  468. {
  469. al=SSL_AD_ILLEGAL_PARAMETER;
  470. SSLerr(SSL_F_SSL3_GET_MESSAGE,SSL_R_EXCESSIVE_MESSAGE_SIZE);
  471. goto f_err;
  472. }
  473. if (l && !BUF_MEM_grow_clean(s->init_buf,(int)l+4))
  474. {
  475. SSLerr(SSL_F_SSL3_GET_MESSAGE,ERR_R_BUF_LIB);
  476. goto err;
  477. }
  478. s->s3->tmp.message_size=l;
  479. s->state=stn;
  480. s->init_msg = s->init_buf->data + 4;
  481. s->init_num = 0;
  482. }
  483. /* next state (stn) */
  484. p = s->init_msg;
  485. n = s->s3->tmp.message_size - s->init_num;
  486. while (n > 0)
  487. {
  488. i=s->method->ssl_read_bytes(s,SSL3_RT_HANDSHAKE,&p[s->init_num],n,0);
  489. if (i <= 0)
  490. {
  491. s->rwstate=SSL_READING;
  492. *ok = 0;
  493. return i;
  494. }
  495. s->init_num += i;
  496. n -= i;
  497. }
  498. #ifndef OPENSSL_NO_NEXTPROTONEG
  499. /* If receiving Finished, record MAC of prior handshake messages for
  500. * Finished verification. */
  501. if (*s->init_buf->data == SSL3_MT_FINISHED)
  502. ssl3_take_mac(s);
  503. #endif
  504. /* Feed this message into MAC computation. */
  505. ssl3_finish_mac(s, (unsigned char *)s->init_buf->data, s->init_num + 4);
  506. if (s->msg_callback)
  507. s->msg_callback(0, s->version, SSL3_RT_HANDSHAKE, s->init_buf->data, (size_t)s->init_num + 4, s, s->msg_callback_arg);
  508. *ok=1;
  509. return s->init_num;
  510. f_err:
  511. ssl3_send_alert(s,SSL3_AL_FATAL,al);
  512. err:
  513. *ok=0;
  514. return(-1);
  515. }
  516. int ssl_cert_type(X509 *x, EVP_PKEY *pkey)
  517. {
  518. EVP_PKEY *pk;
  519. int ret= -1,i;
  520. if (pkey == NULL)
  521. pk=X509_get_pubkey(x);
  522. else
  523. pk=pkey;
  524. if (pk == NULL) goto err;
  525. i=pk->type;
  526. if (i == EVP_PKEY_RSA)
  527. {
  528. ret=SSL_PKEY_RSA_ENC;
  529. }
  530. else if (i == EVP_PKEY_DSA)
  531. {
  532. ret=SSL_PKEY_DSA_SIGN;
  533. }
  534. #ifndef OPENSSL_NO_EC
  535. else if (i == EVP_PKEY_EC)
  536. {
  537. ret = SSL_PKEY_ECC;
  538. }
  539. #endif
  540. else if (i == NID_id_GostR3410_94 || i == NID_id_GostR3410_94_cc)
  541. {
  542. ret = SSL_PKEY_GOST94;
  543. }
  544. else if (i == NID_id_GostR3410_2001 || i == NID_id_GostR3410_2001_cc)
  545. {
  546. ret = SSL_PKEY_GOST01;
  547. }
  548. err:
  549. if(!pkey) EVP_PKEY_free(pk);
  550. return(ret);
  551. }
  552. int ssl_verify_alarm_type(long type)
  553. {
  554. int al;
  555. switch(type)
  556. {
  557. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT:
  558. case X509_V_ERR_UNABLE_TO_GET_CRL:
  559. case X509_V_ERR_UNABLE_TO_GET_CRL_ISSUER:
  560. al=SSL_AD_UNKNOWN_CA;
  561. break;
  562. case X509_V_ERR_UNABLE_TO_DECRYPT_CERT_SIGNATURE:
  563. case X509_V_ERR_UNABLE_TO_DECRYPT_CRL_SIGNATURE:
  564. case X509_V_ERR_UNABLE_TO_DECODE_ISSUER_PUBLIC_KEY:
  565. case X509_V_ERR_ERROR_IN_CERT_NOT_BEFORE_FIELD:
  566. case X509_V_ERR_ERROR_IN_CERT_NOT_AFTER_FIELD:
  567. case X509_V_ERR_ERROR_IN_CRL_LAST_UPDATE_FIELD:
  568. case X509_V_ERR_ERROR_IN_CRL_NEXT_UPDATE_FIELD:
  569. case X509_V_ERR_CERT_NOT_YET_VALID:
  570. case X509_V_ERR_CRL_NOT_YET_VALID:
  571. case X509_V_ERR_CERT_UNTRUSTED:
  572. case X509_V_ERR_CERT_REJECTED:
  573. al=SSL_AD_BAD_CERTIFICATE;
  574. break;
  575. case X509_V_ERR_CERT_SIGNATURE_FAILURE:
  576. case X509_V_ERR_CRL_SIGNATURE_FAILURE:
  577. al=SSL_AD_DECRYPT_ERROR;
  578. break;
  579. case X509_V_ERR_CERT_HAS_EXPIRED:
  580. case X509_V_ERR_CRL_HAS_EXPIRED:
  581. al=SSL_AD_CERTIFICATE_EXPIRED;
  582. break;
  583. case X509_V_ERR_CERT_REVOKED:
  584. al=SSL_AD_CERTIFICATE_REVOKED;
  585. break;
  586. case X509_V_ERR_OUT_OF_MEM:
  587. al=SSL_AD_INTERNAL_ERROR;
  588. break;
  589. case X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT:
  590. case X509_V_ERR_SELF_SIGNED_CERT_IN_CHAIN:
  591. case X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY:
  592. case X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE:
  593. case X509_V_ERR_CERT_CHAIN_TOO_LONG:
  594. case X509_V_ERR_PATH_LENGTH_EXCEEDED:
  595. case X509_V_ERR_INVALID_CA:
  596. al=SSL_AD_UNKNOWN_CA;
  597. break;
  598. case X509_V_ERR_APPLICATION_VERIFICATION:
  599. al=SSL_AD_HANDSHAKE_FAILURE;
  600. break;
  601. case X509_V_ERR_INVALID_PURPOSE:
  602. al=SSL_AD_UNSUPPORTED_CERTIFICATE;
  603. break;
  604. default:
  605. al=SSL_AD_CERTIFICATE_UNKNOWN;
  606. break;
  607. }
  608. return(al);
  609. }
  610. #ifndef OPENSSL_NO_BUF_FREELISTS
  611. /* On some platforms, malloc() performance is bad enough that you can't just
  612. * free() and malloc() buffers all the time, so we need to use freelists from
  613. * unused buffers. Currently, each freelist holds memory chunks of only a
  614. * given size (list->chunklen); other sized chunks are freed and malloced.
  615. * This doesn't help much if you're using many different SSL option settings
  616. * with a given context. (The options affecting buffer size are
  617. * max_send_fragment, read buffer vs write buffer,
  618. * SSL_OP_MICROSOFT_BIG_WRITE_BUFFER, SSL_OP_NO_COMPRESSION, and
  619. * SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS.) Using a separate freelist for every
  620. * possible size is not an option, since max_send_fragment can take on many
  621. * different values.
  622. *
  623. * If you are on a platform with a slow malloc(), and you're using SSL
  624. * connections with many different settings for these options, and you need to
  625. * use the SSL_MOD_RELEASE_BUFFERS feature, you have a few options:
  626. * - Link against a faster malloc implementation.
  627. * - Use a separate SSL_CTX for each option set.
  628. * - Improve this code.
  629. */
  630. static void *
  631. freelist_extract(SSL_CTX *ctx, int for_read, int sz)
  632. {
  633. SSL3_BUF_FREELIST *list;
  634. SSL3_BUF_FREELIST_ENTRY *ent = NULL;
  635. void *result = NULL;
  636. CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
  637. list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist;
  638. if (list != NULL && sz == (int)list->chunklen)
  639. ent = list->head;
  640. if (ent != NULL)
  641. {
  642. list->head = ent->next;
  643. result = ent;
  644. if (--list->len == 0)
  645. list->chunklen = 0;
  646. }
  647. CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
  648. if (!result)
  649. result = OPENSSL_malloc(sz);
  650. return result;
  651. }
  652. static void
  653. freelist_insert(SSL_CTX *ctx, int for_read, size_t sz, void *mem)
  654. {
  655. SSL3_BUF_FREELIST *list;
  656. SSL3_BUF_FREELIST_ENTRY *ent;
  657. CRYPTO_w_lock(CRYPTO_LOCK_SSL_CTX);
  658. list = for_read ? ctx->rbuf_freelist : ctx->wbuf_freelist;
  659. if (list != NULL &&
  660. (sz == list->chunklen || list->chunklen == 0) &&
  661. list->len < ctx->freelist_max_len &&
  662. sz >= sizeof(*ent))
  663. {
  664. list->chunklen = sz;
  665. ent = mem;
  666. ent->next = list->head;
  667. list->head = ent;
  668. ++list->len;
  669. mem = NULL;
  670. }
  671. CRYPTO_w_unlock(CRYPTO_LOCK_SSL_CTX);
  672. if (mem)
  673. OPENSSL_free(mem);
  674. }
  675. #else
  676. #define freelist_extract(c,fr,sz) OPENSSL_malloc(sz)
  677. #define freelist_insert(c,fr,sz,m) OPENSSL_free(m)
  678. #endif
  679. int ssl3_setup_read_buffer(SSL *s)
  680. {
  681. unsigned char *p;
  682. size_t len,align=0,headerlen;
  683. if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
  684. headerlen = DTLS1_RT_HEADER_LENGTH;
  685. else
  686. headerlen = SSL3_RT_HEADER_LENGTH;
  687. #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
  688. align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
  689. #endif
  690. if (s->s3->rbuf.buf == NULL)
  691. {
  692. len = SSL3_RT_MAX_PLAIN_LENGTH
  693. + SSL3_RT_MAX_ENCRYPTED_OVERHEAD
  694. + headerlen + align;
  695. if (s->options & SSL_OP_MICROSOFT_BIG_SSLV3_BUFFER)
  696. {
  697. s->s3->init_extra = 1;
  698. len += SSL3_RT_MAX_EXTRA;
  699. }
  700. #ifndef OPENSSL_NO_COMP
  701. if (!(s->options & SSL_OP_NO_COMPRESSION))
  702. len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
  703. #endif
  704. if ((p=freelist_extract(s->ctx, 1, len)) == NULL)
  705. goto err;
  706. s->s3->rbuf.buf = p;
  707. s->s3->rbuf.len = len;
  708. }
  709. s->packet= &(s->s3->rbuf.buf[0]);
  710. return 1;
  711. err:
  712. SSLerr(SSL_F_SSL3_SETUP_READ_BUFFER,ERR_R_MALLOC_FAILURE);
  713. return 0;
  714. }
  715. int ssl3_setup_write_buffer(SSL *s)
  716. {
  717. unsigned char *p;
  718. size_t len,align=0,headerlen;
  719. if (SSL_version(s) == DTLS1_VERSION || SSL_version(s) == DTLS1_BAD_VER)
  720. headerlen = DTLS1_RT_HEADER_LENGTH + 1;
  721. else
  722. headerlen = SSL3_RT_HEADER_LENGTH;
  723. #if defined(SSL3_ALIGN_PAYLOAD) && SSL3_ALIGN_PAYLOAD!=0
  724. align = (-SSL3_RT_HEADER_LENGTH)&(SSL3_ALIGN_PAYLOAD-1);
  725. #endif
  726. if (s->s3->wbuf.buf == NULL)
  727. {
  728. len = s->max_send_fragment
  729. + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD
  730. + headerlen + align;
  731. #ifndef OPENSSL_NO_COMP
  732. if (!(s->options & SSL_OP_NO_COMPRESSION))
  733. len += SSL3_RT_MAX_COMPRESSED_OVERHEAD;
  734. #endif
  735. if (!(s->options & SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS))
  736. len += headerlen + align
  737. + SSL3_RT_SEND_MAX_ENCRYPTED_OVERHEAD;
  738. if ((p=freelist_extract(s->ctx, 0, len)) == NULL)
  739. goto err;
  740. s->s3->wbuf.buf = p;
  741. s->s3->wbuf.len = len;
  742. }
  743. return 1;
  744. err:
  745. SSLerr(SSL_F_SSL3_SETUP_WRITE_BUFFER,ERR_R_MALLOC_FAILURE);
  746. return 0;
  747. }
  748. int ssl3_setup_buffers(SSL *s)
  749. {
  750. if (!ssl3_setup_read_buffer(s))
  751. return 0;
  752. if (!ssl3_setup_write_buffer(s))
  753. return 0;
  754. return 1;
  755. }
  756. int ssl3_release_write_buffer(SSL *s)
  757. {
  758. if (s->s3->wbuf.buf != NULL)
  759. {
  760. freelist_insert(s->ctx, 0, s->s3->wbuf.len, s->s3->wbuf.buf);
  761. s->s3->wbuf.buf = NULL;
  762. }
  763. return 1;
  764. }
  765. int ssl3_release_read_buffer(SSL *s)
  766. {
  767. if (s->s3->rbuf.buf != NULL)
  768. {
  769. freelist_insert(s->ctx, 1, s->s3->rbuf.len, s->s3->rbuf.buf);
  770. s->s3->rbuf.buf = NULL;
  771. }
  772. return 1;
  773. }