ssl_srv.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. /*
  2. * SSLv3/TLSv1 server-side functions
  3. *
  4. * Copyright (C) 2006-2010, Brainspark B.V.
  5. *
  6. * This file is part of PolarSSL (http://www.polarssl.org)
  7. * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
  8. *
  9. * All rights reserved.
  10. *
  11. * This program is free software; you can redistribute it and/or modify
  12. * it under the terms of the GNU General Public License as published by
  13. * the Free Software Foundation; either version 2 of the License, or
  14. * (at your option) any later version.
  15. *
  16. * This program is distributed in the hope that it will be useful,
  17. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  18. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  19. * GNU General Public License for more details.
  20. *
  21. * You should have received a copy of the GNU General Public License along
  22. * with this program; if not, write to the Free Software Foundation, Inc.,
  23. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  24. */
  25. #include "config.h"
  26. #if defined(POLARSSL_SSL_SRV_C)
  27. #include "polarssl/debug.h"
  28. #include "polarssl/ssl.h"
  29. #if defined(POLARSSL_PKCS11_C)
  30. #include "polarssl/pkcs11.h"
  31. #endif /* defined(POLARSSL_PKCS11_C) */
  32. #include <stdlib.h>
  33. #ifdef PRINTF_STDLIB
  34. #include <stdio.h>
  35. #endif
  36. #ifdef PRINTF_CUSTOM
  37. #include "tinystdio.h"
  38. #endif
  39. #include <time.h>
  40. #include "rtc.h"
  41. static int ssl_parse_client_hello( ssl_context *ssl )
  42. {
  43. int ret;
  44. unsigned int i, j;
  45. size_t n;
  46. unsigned int ciph_len, sess_len;
  47. unsigned int chal_len, comp_len;
  48. unsigned char *buf, *p;
  49. SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) );
  50. if( ( ret = ssl_fetch_input( ssl, 5 ) ) != 0 )
  51. {
  52. SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
  53. return( ret );
  54. }
  55. buf = ssl->in_hdr;
  56. if( ( buf[0] & 0x80 ) != 0 )
  57. {
  58. SSL_DEBUG_BUF( 4, "record header", buf, 5 );
  59. SSL_DEBUG_MSG( 3, ( "client hello v2, message type: %d",
  60. buf[2] ) );
  61. SSL_DEBUG_MSG( 3, ( "client hello v2, message len.: %d",
  62. ( ( buf[0] & 0x7F ) << 8 ) | buf[1] ) );
  63. SSL_DEBUG_MSG( 3, ( "client hello v2, max. version: [%d:%d]",
  64. buf[3], buf[4] ) );
  65. /*
  66. * SSLv2 Client Hello
  67. *
  68. * Record layer:
  69. * 0 . 1 message length
  70. *
  71. * SSL layer:
  72. * 2 . 2 message type
  73. * 3 . 4 protocol version
  74. */
  75. if( buf[2] != SSL_HS_CLIENT_HELLO ||
  76. buf[3] != SSL_MAJOR_VERSION_3 )
  77. {
  78. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  79. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  80. }
  81. n = ( ( buf[0] << 8 ) | buf[1] ) & 0x7FFF;
  82. if( n < 17 || n > 512 )
  83. {
  84. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  85. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  86. }
  87. ssl->max_major_ver = buf[3];
  88. ssl->max_minor_ver = buf[4];
  89. ssl->major_ver = SSL_MAJOR_VERSION_3;
  90. ssl->minor_ver = ( buf[4] <= SSL_MINOR_VERSION_2 )
  91. ? buf[4] : SSL_MINOR_VERSION_2;
  92. if( ( ret = ssl_fetch_input( ssl, 2 + n ) ) != 0 )
  93. {
  94. SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
  95. return( ret );
  96. }
  97. md5_update( &ssl->fin_md5 , buf + 2, n );
  98. sha1_update( &ssl->fin_sha1, buf + 2, n );
  99. buf = ssl->in_msg;
  100. n = ssl->in_left - 5;
  101. /*
  102. * 0 . 1 ciphersuitelist length
  103. * 2 . 3 session id length
  104. * 4 . 5 challenge length
  105. * 6 . .. ciphersuitelist
  106. * .. . .. session id
  107. * .. . .. challenge
  108. */
  109. SSL_DEBUG_BUF( 4, "record contents", buf, n );
  110. ciph_len = ( buf[0] << 8 ) | buf[1];
  111. sess_len = ( buf[2] << 8 ) | buf[3];
  112. chal_len = ( buf[4] << 8 ) | buf[5];
  113. SSL_DEBUG_MSG( 3, ( "ciph_len: %d, sess_len: %d, chal_len: %d",
  114. ciph_len, sess_len, chal_len ) );
  115. /*
  116. * Make sure each parameter length is valid
  117. */
  118. if( ciph_len < 3 || ( ciph_len % 3 ) != 0 )
  119. {
  120. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  121. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  122. }
  123. if( sess_len > 32 )
  124. {
  125. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  126. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  127. }
  128. if( chal_len < 8 || chal_len > 32 )
  129. {
  130. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  131. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  132. }
  133. if( n != 6 + ciph_len + sess_len + chal_len )
  134. {
  135. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  136. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  137. }
  138. SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
  139. buf + 6, ciph_len );
  140. SSL_DEBUG_BUF( 3, "client hello, session id",
  141. buf + 6 + ciph_len, sess_len );
  142. SSL_DEBUG_BUF( 3, "client hello, challenge",
  143. buf + 6 + ciph_len + sess_len, chal_len );
  144. p = buf + 6 + ciph_len;
  145. ssl->session->length = sess_len;
  146. memset( ssl->session->id, 0, sizeof( ssl->session->id ) );
  147. memcpy( ssl->session->id, p, ssl->session->length );
  148. p += sess_len;
  149. memset( ssl->randbytes, 0, 64 );
  150. memcpy( ssl->randbytes + 32 - chal_len, p, chal_len );
  151. for( i = 0; ssl->ciphersuites[i] != 0; i++ )
  152. {
  153. for( j = 0, p = buf + 6; j < ciph_len; j += 3, p += 3 )
  154. {
  155. if( p[0] == 0 &&
  156. p[1] == 0 &&
  157. p[2] == ssl->ciphersuites[i] )
  158. goto have_ciphersuite;
  159. }
  160. }
  161. }
  162. else
  163. {
  164. SSL_DEBUG_BUF( 4, "record header", buf, 5 );
  165. SSL_DEBUG_MSG( 3, ( "client hello v3, message type: %d",
  166. buf[0] ) );
  167. SSL_DEBUG_MSG( 3, ( "client hello v3, message len.: %d",
  168. ( buf[3] << 8 ) | buf[4] ) );
  169. SSL_DEBUG_MSG( 3, ( "client hello v3, protocol ver: [%d:%d]",
  170. buf[1], buf[2] ) );
  171. /*
  172. * SSLv3 Client Hello
  173. *
  174. * Record layer:
  175. * 0 . 0 message type
  176. * 1 . 2 protocol version
  177. * 3 . 4 message length
  178. */
  179. if( buf[0] != SSL_MSG_HANDSHAKE ||
  180. buf[1] != SSL_MAJOR_VERSION_3 )
  181. {
  182. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  183. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  184. }
  185. n = ( buf[3] << 8 ) | buf[4];
  186. if( n < 45 || n > 512 )
  187. {
  188. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  189. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  190. }
  191. if( ( ret = ssl_fetch_input( ssl, 5 + n ) ) != 0 )
  192. {
  193. SSL_DEBUG_RET( 1, "ssl_fetch_input", ret );
  194. return( ret );
  195. }
  196. buf = ssl->in_msg;
  197. n = ssl->in_left - 5;
  198. md5_update( &ssl->fin_md5 , buf, n );
  199. sha1_update( &ssl->fin_sha1, buf, n );
  200. /*
  201. * SSL layer:
  202. * 0 . 0 handshake type
  203. * 1 . 3 handshake length
  204. * 4 . 5 protocol version
  205. * 6 . 9 UNIX time()
  206. * 10 . 37 random bytes
  207. * 38 . 38 session id length
  208. * 39 . 38+x session id
  209. * 39+x . 40+x ciphersuitelist length
  210. * 41+x . .. ciphersuitelist
  211. * .. . .. compression alg.
  212. * .. . .. extensions
  213. */
  214. SSL_DEBUG_BUF( 4, "record contents", buf, n );
  215. SSL_DEBUG_MSG( 3, ( "client hello v3, handshake type: %d",
  216. buf[0] ) );
  217. SSL_DEBUG_MSG( 3, ( "client hello v3, handshake len.: %d",
  218. ( buf[1] << 16 ) | ( buf[2] << 8 ) | buf[3] ) );
  219. SSL_DEBUG_MSG( 3, ( "client hello v3, max. version: [%d:%d]",
  220. buf[4], buf[5] ) );
  221. /*
  222. * Check the handshake type and protocol version
  223. */
  224. if( buf[0] != SSL_HS_CLIENT_HELLO ||
  225. buf[4] != SSL_MAJOR_VERSION_3 )
  226. {
  227. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  228. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  229. }
  230. ssl->major_ver = SSL_MAJOR_VERSION_3;
  231. ssl->minor_ver = ( buf[5] <= SSL_MINOR_VERSION_2 )
  232. ? buf[5] : SSL_MINOR_VERSION_2;
  233. ssl->max_major_ver = buf[4];
  234. ssl->max_minor_ver = buf[5];
  235. memcpy( ssl->randbytes, buf + 6, 32 );
  236. /*
  237. * Check the handshake message length
  238. */
  239. if( buf[1] != 0 || n != (unsigned int) 4 + ( ( buf[2] << 8 ) | buf[3] ) )
  240. {
  241. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  242. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  243. }
  244. /*
  245. * Check the session length
  246. */
  247. sess_len = buf[38];
  248. if( sess_len > 32 )
  249. {
  250. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  251. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  252. }
  253. ssl->session->length = sess_len;
  254. memset( ssl->session->id, 0, sizeof( ssl->session->id ) );
  255. memcpy( ssl->session->id, buf + 39 , ssl->session->length );
  256. /*
  257. * Check the ciphersuitelist length
  258. */
  259. ciph_len = ( buf[39 + sess_len] << 8 )
  260. | ( buf[40 + sess_len] );
  261. if( ciph_len < 2 || ciph_len > 256 || ( ciph_len % 2 ) != 0 )
  262. {
  263. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  264. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  265. }
  266. /*
  267. * Check the compression algorithms length
  268. */
  269. comp_len = buf[41 + sess_len + ciph_len];
  270. if( comp_len < 1 || comp_len > 16 )
  271. {
  272. SSL_DEBUG_MSG( 1, ( "bad client hello message" ) );
  273. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_HELLO );
  274. }
  275. SSL_DEBUG_BUF( 3, "client hello, random bytes",
  276. buf + 6, 32 );
  277. SSL_DEBUG_BUF( 3, "client hello, session id",
  278. buf + 38, sess_len );
  279. SSL_DEBUG_BUF( 3, "client hello, ciphersuitelist",
  280. buf + 41 + sess_len, ciph_len );
  281. SSL_DEBUG_BUF( 3, "client hello, compression",
  282. buf + 42 + sess_len + ciph_len, comp_len );
  283. /*
  284. * Search for a matching ciphersuite
  285. */
  286. for( i = 0; ssl->ciphersuites[i] != 0; i++ )
  287. {
  288. for( j = 0, p = buf + 41 + sess_len; j < ciph_len;
  289. j += 2, p += 2 )
  290. {
  291. if( p[0] == 0 && p[1] == ssl->ciphersuites[i] )
  292. goto have_ciphersuite;
  293. }
  294. }
  295. }
  296. SSL_DEBUG_MSG( 1, ( "got no ciphersuites in common" ) );
  297. return( POLARSSL_ERR_SSL_NO_CIPHER_CHOSEN );
  298. have_ciphersuite:
  299. ssl->session->ciphersuite = ssl->ciphersuites[i];
  300. ssl->in_left = 0;
  301. ssl->state++;
  302. SSL_DEBUG_MSG( 2, ( "<= parse client hello" ) );
  303. return( 0 );
  304. }
  305. static int ssl_write_server_hello( ssl_context *ssl )
  306. {
  307. time_t t;
  308. int ret, i, n;
  309. unsigned char *buf, *p;
  310. SSL_DEBUG_MSG( 2, ( "=> write server hello" ) );
  311. /*
  312. * 0 . 0 handshake type
  313. * 1 . 3 handshake length
  314. * 4 . 5 protocol version
  315. * 6 . 9 UNIX time()
  316. * 10 . 37 random bytes
  317. */
  318. buf = ssl->out_msg;
  319. p = buf + 4;
  320. *p++ = (unsigned char) ssl->major_ver;
  321. *p++ = (unsigned char) ssl->minor_ver;
  322. SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
  323. buf[4], buf[5] ) );
  324. //t = time( NULL );
  325. t = RTC_GetUnixTime();
  326. //t = 100000;
  327. *p++ = (unsigned char)( t >> 24 );
  328. *p++ = (unsigned char)( t >> 16 );
  329. *p++ = (unsigned char)( t >> 8 );
  330. *p++ = (unsigned char)( t );
  331. SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
  332. for( i = 28; i > 0; i-- )
  333. *p++ = (unsigned char) ssl->f_rng( ssl->p_rng );
  334. memcpy( ssl->randbytes + 32, buf + 6, 32 );
  335. SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
  336. /*
  337. * 38 . 38 session id length
  338. * 39 . 38+n session id
  339. * 39+n . 40+n chosen ciphersuite
  340. * 41+n . 41+n chosen compression alg.
  341. */
  342. ssl->session->length = n = 32;
  343. *p++ = (unsigned char) ssl->session->length;
  344. if( ssl->s_get == NULL ||
  345. ssl->s_get( ssl ) != 0 )
  346. {
  347. /*
  348. * Not found, create a new session id
  349. */
  350. ssl->resume = 0;
  351. ssl->state++;
  352. for( i = 0; i < n; i++ )
  353. ssl->session->id[i] =
  354. (unsigned char) ssl->f_rng( ssl->p_rng );
  355. }
  356. else
  357. {
  358. /*
  359. * Found a matching session, resume it
  360. */
  361. ssl->resume = 1;
  362. ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
  363. if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
  364. {
  365. SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
  366. return( ret );
  367. }
  368. }
  369. memcpy( p, ssl->session->id, ssl->session->length );
  370. p += ssl->session->length;
  371. SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
  372. SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
  373. SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
  374. ssl->resume ? "a" : "no" ) );
  375. *p++ = (unsigned char)( ssl->session->ciphersuite >> 8 );
  376. *p++ = (unsigned char)( ssl->session->ciphersuite );
  377. *p++ = SSL_COMPRESS_NULL;
  378. SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d",
  379. ssl->session->ciphersuite ) );
  380. SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", 0 ) );
  381. ssl->out_msglen = p - buf;
  382. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  383. ssl->out_msg[0] = SSL_HS_SERVER_HELLO;
  384. ret = ssl_write_record( ssl );
  385. SSL_DEBUG_MSG( 2, ( "<= write server hello" ) );
  386. return( ret );
  387. }
  388. static int ssl_write_certificate_request( ssl_context *ssl )
  389. {
  390. int ret;
  391. size_t n;
  392. unsigned char *buf, *p;
  393. const x509_cert *crt;
  394. SSL_DEBUG_MSG( 2, ( "=> write certificate request" ) );
  395. ssl->state++;
  396. if( ssl->authmode == SSL_VERIFY_NONE )
  397. {
  398. SSL_DEBUG_MSG( 2, ( "<= skip write certificate request" ) );
  399. return( 0 );
  400. }
  401. /*
  402. * 0 . 0 handshake type
  403. * 1 . 3 handshake length
  404. * 4 . 4 cert type count
  405. * 5 .. n-1 cert types
  406. * n .. n+1 length of all DNs
  407. * n+2 .. n+3 length of DN 1
  408. * n+4 .. ... Distinguished Name #1
  409. * ... .. ... length of DN 2, etc.
  410. */
  411. buf = ssl->out_msg;
  412. p = buf + 4;
  413. /*
  414. * At the moment, only RSA certificates are supported
  415. */
  416. *p++ = 1;
  417. *p++ = 1;
  418. p += 2;
  419. crt = ssl->ca_chain;
  420. while( crt != NULL )
  421. {
  422. if( p - buf > 4096 )
  423. break;
  424. n = crt->subject_raw.len;
  425. *p++ = (unsigned char)( n >> 8 );
  426. *p++ = (unsigned char)( n );
  427. memcpy( p, crt->subject_raw.p, n );
  428. SSL_DEBUG_BUF( 3, "requested DN", p, n );
  429. p += n; crt = crt->next;
  430. }
  431. ssl->out_msglen = n = p - buf;
  432. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  433. ssl->out_msg[0] = SSL_HS_CERTIFICATE_REQUEST;
  434. ssl->out_msg[6] = (unsigned char)( ( n - 8 ) >> 8 );
  435. ssl->out_msg[7] = (unsigned char)( ( n - 8 ) );
  436. ret = ssl_write_record( ssl );
  437. SSL_DEBUG_MSG( 2, ( "<= write certificate request" ) );
  438. return( ret );
  439. }
  440. static int ssl_write_server_key_exchange( ssl_context *ssl )
  441. {
  442. #if defined(POLARSSL_DHM_C)
  443. int ret;
  444. size_t n, rsa_key_len = 0;
  445. unsigned char hash[36];
  446. md5_context md5;
  447. sha1_context sha1;
  448. #endif
  449. SSL_DEBUG_MSG( 2, ( "=> write server key exchange" ) );
  450. if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
  451. ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
  452. ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
  453. ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
  454. ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA)
  455. {
  456. SSL_DEBUG_MSG( 2, ( "<= skip write server key exchange" ) );
  457. ssl->state++;
  458. return( 0 );
  459. }
  460. #if !defined(POLARSSL_DHM_C)
  461. SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
  462. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  463. #else
  464. if( ssl->rsa_key == NULL )
  465. {
  466. #if defined(POLARSSL_PKCS11_C)
  467. if( ssl->pkcs11_key == NULL )
  468. {
  469. #endif /* defined(POLARSSL_PKCS11_C) */
  470. SSL_DEBUG_MSG( 1, ( "got no private key" ) );
  471. return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
  472. #if defined(POLARSSL_PKCS11_C)
  473. }
  474. #endif /* defined(POLARSSL_PKCS11_C) */
  475. }
  476. /*
  477. * Ephemeral DH parameters:
  478. *
  479. * struct {
  480. * opaque dh_p<1..2^16-1>;
  481. * opaque dh_g<1..2^16-1>;
  482. * opaque dh_Ys<1..2^16-1>;
  483. * } ServerDHParams;
  484. */
  485. if( ( ret = dhm_make_params( &ssl->dhm_ctx, 256, ssl->out_msg + 4,
  486. &n, ssl->f_rng, ssl->p_rng ) ) != 0 )
  487. {
  488. SSL_DEBUG_RET( 1, "dhm_make_params", ret );
  489. return( ret );
  490. }
  491. SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->dhm_ctx.X );
  492. SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->dhm_ctx.P );
  493. SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->dhm_ctx.G );
  494. SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->dhm_ctx.GX );
  495. /*
  496. * digitally-signed struct {
  497. * opaque md5_hash[16];
  498. * opaque sha_hash[20];
  499. * };
  500. *
  501. * md5_hash
  502. * MD5(ClientHello.random + ServerHello.random
  503. * + ServerParams);
  504. * sha_hash
  505. * SHA(ClientHello.random + ServerHello.random
  506. * + ServerParams);
  507. */
  508. md5_starts( &md5 );
  509. md5_update( &md5, ssl->randbytes, 64 );
  510. md5_update( &md5, ssl->out_msg + 4, n );
  511. md5_finish( &md5, hash );
  512. sha1_starts( &sha1 );
  513. sha1_update( &sha1, ssl->randbytes, 64 );
  514. sha1_update( &sha1, ssl->out_msg + 4, n );
  515. sha1_finish( &sha1, hash + 16 );
  516. SSL_DEBUG_BUF( 3, "parameters hash", hash, 36 );
  517. if ( ssl->rsa_key )
  518. rsa_key_len = ssl->rsa_key->len;
  519. #if defined(POLARSSL_PKCS11_C)
  520. else
  521. rsa_key_len = ssl->pkcs11_key->len;
  522. #endif /* defined(POLARSSL_PKCS11_C) */
  523. ssl->out_msg[4 + n] = (unsigned char)( rsa_key_len >> 8 );
  524. ssl->out_msg[5 + n] = (unsigned char)( rsa_key_len );
  525. if ( ssl->rsa_key )
  526. {
  527. ret = rsa_pkcs1_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
  528. RSA_PRIVATE,
  529. SIG_RSA_RAW, 36, hash, ssl->out_msg + 6 + n );
  530. }
  531. #if defined(POLARSSL_PKCS11_C)
  532. else {
  533. ret = pkcs11_sign( ssl->pkcs11_key, RSA_PRIVATE,
  534. SIG_RSA_RAW, 36, hash, ssl->out_msg + 6 + n );
  535. }
  536. #endif /* defined(POLARSSL_PKCS11_C) */
  537. if( ret != 0 )
  538. {
  539. SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
  540. return( ret );
  541. }
  542. SSL_DEBUG_BUF( 3, "my RSA sig", ssl->out_msg + 6 + n, rsa_key_len );
  543. ssl->out_msglen = 6 + n + rsa_key_len;
  544. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  545. ssl->out_msg[0] = SSL_HS_SERVER_KEY_EXCHANGE;
  546. ssl->state++;
  547. if( ( ret = ssl_write_record( ssl ) ) != 0 )
  548. {
  549. SSL_DEBUG_RET( 1, "ssl_write_record", ret );
  550. return( ret );
  551. }
  552. SSL_DEBUG_MSG( 2, ( "<= write server key exchange" ) );
  553. return( 0 );
  554. #endif
  555. }
  556. static int ssl_write_server_hello_done( ssl_context *ssl )
  557. {
  558. int ret;
  559. SSL_DEBUG_MSG( 2, ( "=> write server hello done" ) );
  560. ssl->out_msglen = 4;
  561. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  562. ssl->out_msg[0] = SSL_HS_SERVER_HELLO_DONE;
  563. ssl->state++;
  564. if( ( ret = ssl_write_record( ssl ) ) != 0 )
  565. {
  566. SSL_DEBUG_RET( 1, "ssl_write_record", ret );
  567. return( ret );
  568. }
  569. SSL_DEBUG_MSG( 2, ( "<= write server hello done" ) );
  570. return( 0 );
  571. }
  572. static int ssl_parse_client_key_exchange( ssl_context *ssl )
  573. {
  574. int ret;
  575. size_t i, n = 0;
  576. SSL_DEBUG_MSG( 2, ( "=> parse client key exchange" ) );
  577. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  578. {
  579. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  580. return( ret );
  581. }
  582. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  583. {
  584. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  585. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  586. }
  587. if( ssl->in_msg[0] != SSL_HS_CLIENT_KEY_EXCHANGE )
  588. {
  589. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  590. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  591. }
  592. if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
  593. ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
  594. ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
  595. ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
  596. ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
  597. {
  598. #if !defined(POLARSSL_DHM_C)
  599. SSL_DEBUG_MSG( 1, ( "support for dhm is not available" ) );
  600. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  601. #else
  602. /*
  603. * Receive G^Y mod P, premaster = (G^Y)^X mod P
  604. */
  605. n = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
  606. if( n < 1 || n > ssl->dhm_ctx.len ||
  607. n + 6 != ssl->in_hslen )
  608. {
  609. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  610. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  611. }
  612. if( ( ret = dhm_read_public( &ssl->dhm_ctx,
  613. ssl->in_msg + 6, n ) ) != 0 )
  614. {
  615. SSL_DEBUG_RET( 1, "dhm_read_public", ret );
  616. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_RP );
  617. }
  618. SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->dhm_ctx.GY );
  619. ssl->pmslen = ssl->dhm_ctx.len;
  620. if( ( ret = dhm_calc_secret( &ssl->dhm_ctx,
  621. ssl->premaster, &ssl->pmslen ) ) != 0 )
  622. {
  623. SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
  624. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE_DHM_CS );
  625. }
  626. SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->dhm_ctx.K );
  627. #endif
  628. }
  629. else
  630. {
  631. if( ssl->rsa_key == NULL )
  632. {
  633. #if defined(POLARSSL_PKCS11_C)
  634. if( ssl->pkcs11_key == NULL )
  635. {
  636. #endif
  637. SSL_DEBUG_MSG( 1, ( "got no private key" ) );
  638. return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
  639. #if defined(POLARSSL_PKCS11_C)
  640. }
  641. #endif
  642. }
  643. /*
  644. * Decrypt the premaster using own private RSA key
  645. */
  646. i = 4;
  647. if( ssl->rsa_key )
  648. n = ssl->rsa_key->len;
  649. #if defined(POLARSSL_PKCS11_C)
  650. else
  651. n = ssl->pkcs11_key->len;
  652. #endif
  653. ssl->pmslen = 48;
  654. if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
  655. {
  656. i += 2;
  657. if( ssl->in_msg[4] != ( ( n >> 8 ) & 0xFF ) ||
  658. ssl->in_msg[5] != ( ( n ) & 0xFF ) )
  659. {
  660. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  661. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  662. }
  663. }
  664. if( ssl->in_hslen != i + n )
  665. {
  666. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  667. return( POLARSSL_ERR_SSL_BAD_HS_CLIENT_KEY_EXCHANGE );
  668. }
  669. if( ssl->rsa_key ) {
  670. ret = rsa_pkcs1_decrypt( ssl->rsa_key, RSA_PRIVATE, &ssl->pmslen,
  671. ssl->in_msg + i, ssl->premaster,
  672. sizeof(ssl->premaster) );
  673. }
  674. #if defined(POLARSSL_PKCS11_C)
  675. else {
  676. ret = pkcs11_decrypt( ssl->pkcs11_key, RSA_PRIVATE, &ssl->pmslen,
  677. ssl->in_msg + i, ssl->premaster,
  678. sizeof(ssl->premaster) );
  679. }
  680. #endif /* defined(POLARSSL_PKCS11_C) */
  681. if( ret != 0 || ssl->pmslen != 48 ||
  682. ssl->premaster[0] != ssl->max_major_ver ||
  683. ssl->premaster[1] != ssl->max_minor_ver )
  684. {
  685. SSL_DEBUG_MSG( 1, ( "bad client key exchange message" ) );
  686. /*
  687. * Protection against Bleichenbacher's attack:
  688. * invalid PKCS#1 v1.5 padding must not cause
  689. * the connection to end immediately; instead,
  690. * send a bad_record_mac later in the handshake.
  691. */
  692. ssl->pmslen = 48;
  693. for( i = 0; i < ssl->pmslen; i++ )
  694. ssl->premaster[i] = (unsigned char) ssl->f_rng( ssl->p_rng );
  695. }
  696. }
  697. if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
  698. {
  699. SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
  700. return( ret );
  701. }
  702. if( ssl->s_set != NULL )
  703. ssl->s_set( ssl );
  704. ssl->state++;
  705. SSL_DEBUG_MSG( 2, ( "<= parse client key exchange" ) );
  706. return( 0 );
  707. }
  708. static int ssl_parse_certificate_verify( ssl_context *ssl )
  709. {
  710. int ret;
  711. size_t n1, n2;
  712. unsigned char hash[36];
  713. SSL_DEBUG_MSG( 2, ( "=> parse certificate verify" ) );
  714. if( ssl->peer_cert == NULL )
  715. {
  716. SSL_DEBUG_MSG( 2, ( "<= skip parse certificate verify" ) );
  717. ssl->state++;
  718. return( 0 );
  719. }
  720. ssl_calc_verify( ssl, hash );
  721. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  722. {
  723. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  724. return( ret );
  725. }
  726. ssl->state++;
  727. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  728. {
  729. SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  730. return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  731. }
  732. if( ssl->in_msg[0] != SSL_HS_CERTIFICATE_VERIFY )
  733. {
  734. SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  735. return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  736. }
  737. n1 = ssl->peer_cert->rsa.len;
  738. n2 = ( ssl->in_msg[4] << 8 ) | ssl->in_msg[5];
  739. if( n1 + 6 != ssl->in_hslen || n1 != n2 )
  740. {
  741. SSL_DEBUG_MSG( 1, ( "bad certificate verify message" ) );
  742. return( POLARSSL_ERR_SSL_BAD_HS_CERTIFICATE_VERIFY );
  743. }
  744. ret = rsa_pkcs1_verify( &ssl->peer_cert->rsa, RSA_PUBLIC,
  745. SIG_RSA_RAW, 36, hash, ssl->in_msg + 6 );
  746. if( ret != 0 )
  747. {
  748. SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
  749. return( ret );
  750. }
  751. SSL_DEBUG_MSG( 2, ( "<= parse certificate verify" ) );
  752. return( 0 );
  753. }
  754. /*
  755. * SSL handshake -- server side
  756. */
  757. int ssl_handshake_server( ssl_context *ssl )
  758. {
  759. int ret = 0;
  760. SSL_DEBUG_MSG( 2, ( "=> handshake server" ) );
  761. while( ssl->state != SSL_HANDSHAKE_OVER )
  762. {
  763. SSL_DEBUG_MSG( 2, ( "server state: %d", ssl->state ) );
  764. if( ( ret = ssl_flush_output( ssl ) ) != 0 )
  765. break;
  766. switch( ssl->state )
  767. {
  768. case SSL_HELLO_REQUEST:
  769. ssl->state = SSL_CLIENT_HELLO;
  770. break;
  771. /*
  772. * <== ClientHello
  773. */
  774. case SSL_CLIENT_HELLO:
  775. ret = ssl_parse_client_hello( ssl );
  776. break;
  777. /*
  778. * ==> ServerHello
  779. * Certificate
  780. * ( ServerKeyExchange )
  781. * ( CertificateRequest )
  782. * ServerHelloDone
  783. */
  784. case SSL_SERVER_HELLO:
  785. ret = ssl_write_server_hello( ssl );
  786. break;
  787. case SSL_SERVER_CERTIFICATE:
  788. ret = ssl_write_certificate( ssl );
  789. break;
  790. case SSL_SERVER_KEY_EXCHANGE:
  791. ret = ssl_write_server_key_exchange( ssl );
  792. break;
  793. case SSL_CERTIFICATE_REQUEST:
  794. ret = ssl_write_certificate_request( ssl );
  795. break;
  796. case SSL_SERVER_HELLO_DONE:
  797. ret = ssl_write_server_hello_done( ssl );
  798. break;
  799. /*
  800. * <== ( Certificate/Alert )
  801. * ClientKeyExchange
  802. * ( CertificateVerify )
  803. * ChangeCipherSpec
  804. * Finished
  805. */
  806. case SSL_CLIENT_CERTIFICATE:
  807. ret = ssl_parse_certificate( ssl );
  808. break;
  809. case SSL_CLIENT_KEY_EXCHANGE:
  810. ret = ssl_parse_client_key_exchange( ssl );
  811. break;
  812. case SSL_CERTIFICATE_VERIFY:
  813. ret = ssl_parse_certificate_verify( ssl );
  814. break;
  815. case SSL_CLIENT_CHANGE_CIPHER_SPEC:
  816. ret = ssl_parse_change_cipher_spec( ssl );
  817. break;
  818. case SSL_CLIENT_FINISHED:
  819. ret = ssl_parse_finished( ssl );
  820. break;
  821. /*
  822. * ==> ChangeCipherSpec
  823. * Finished
  824. */
  825. case SSL_SERVER_CHANGE_CIPHER_SPEC:
  826. ret = ssl_write_change_cipher_spec( ssl );
  827. break;
  828. case SSL_SERVER_FINISHED:
  829. ret = ssl_write_finished( ssl );
  830. break;
  831. case SSL_FLUSH_BUFFERS:
  832. SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
  833. ssl->state = SSL_HANDSHAKE_OVER;
  834. break;
  835. default:
  836. SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
  837. return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
  838. }
  839. if( ret != 0 )
  840. break;
  841. }
  842. SSL_DEBUG_MSG( 2, ( "<= handshake server" ) );
  843. return( ret );
  844. }
  845. #endif