ssl_cli.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. /*
  2. * SSLv3/TLSv1 client-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_CLI_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. static int ssl_write_client_hello( ssl_context *ssl )
  41. {
  42. int ret;
  43. size_t i, n;
  44. unsigned char *buf;
  45. unsigned char *p;
  46. time_t t;
  47. SSL_DEBUG_MSG( 2, ( "=> write client hello" ) );
  48. ssl->major_ver = SSL_MAJOR_VERSION_3;
  49. ssl->minor_ver = SSL_MINOR_VERSION_0;
  50. ssl->max_major_ver = SSL_MAJOR_VERSION_3;
  51. ssl->max_minor_ver = SSL_MINOR_VERSION_2;
  52. /*
  53. * 0 . 0 handshake type
  54. * 1 . 3 handshake length
  55. * 4 . 5 highest version supported
  56. * 6 . 9 current UNIX time
  57. * 10 . 37 random bytes
  58. */
  59. buf = ssl->out_msg;
  60. p = buf + 4;
  61. *p++ = (unsigned char) ssl->max_major_ver;
  62. *p++ = (unsigned char) ssl->max_minor_ver;
  63. SSL_DEBUG_MSG( 3, ( "client hello, max version: [%d:%d]",
  64. buf[4], buf[5] ) );
  65. t = time( NULL );
  66. *p++ = (unsigned char)( t >> 24 );
  67. *p++ = (unsigned char)( t >> 16 );
  68. *p++ = (unsigned char)( t >> 8 );
  69. *p++ = (unsigned char)( t );
  70. SSL_DEBUG_MSG( 3, ( "client hello, current time: %lu", t ) );
  71. for( i = 28; i > 0; i-- )
  72. *p++ = (unsigned char) ssl->f_rng( ssl->p_rng );
  73. memcpy( ssl->randbytes, buf + 6, 32 );
  74. SSL_DEBUG_BUF( 3, "client hello, random bytes", buf + 6, 32 );
  75. /*
  76. * 38 . 38 session id length
  77. * 39 . 39+n session id
  78. * 40+n . 41+n ciphersuitelist length
  79. * 42+n . .. ciphersuitelist
  80. * .. . .. compression alg. (0)
  81. * .. . .. extensions (unused)
  82. */
  83. n = ssl->session->length;
  84. if( n < 16 || n > 32 || ssl->resume == 0 ||
  85. ( ssl->timeout != 0 && t - ssl->session->start > ssl->timeout ) )
  86. n = 0;
  87. *p++ = (unsigned char) n;
  88. for( i = 0; i < n; i++ )
  89. *p++ = ssl->session->id[i];
  90. SSL_DEBUG_MSG( 3, ( "client hello, session id len.: %d", n ) );
  91. SSL_DEBUG_BUF( 3, "client hello, session id", buf + 39, n );
  92. for( n = 0; ssl->ciphersuites[n] != 0; n++ );
  93. *p++ = (unsigned char)( n >> 7 );
  94. *p++ = (unsigned char)( n << 1 );
  95. SSL_DEBUG_MSG( 3, ( "client hello, got %d ciphersuites", n ) );
  96. for( i = 0; i < n; i++ )
  97. {
  98. SSL_DEBUG_MSG( 3, ( "client hello, add ciphersuite: %2d",
  99. ssl->ciphersuites[i] ) );
  100. *p++ = (unsigned char)( ssl->ciphersuites[i] >> 8 );
  101. *p++ = (unsigned char)( ssl->ciphersuites[i] );
  102. }
  103. SSL_DEBUG_MSG( 3, ( "client hello, compress len.: %d", 1 ) );
  104. SSL_DEBUG_MSG( 3, ( "client hello, compress alg.: %d", 0 ) );
  105. *p++ = 1;
  106. *p++ = SSL_COMPRESS_NULL;
  107. if ( ssl->hostname != NULL )
  108. {
  109. SSL_DEBUG_MSG( 3, ( "client hello, server name extension: %s",
  110. ssl->hostname ) );
  111. *p++ = (unsigned char)( ( (ssl->hostname_len + 9) >> 8 ) & 0xFF );
  112. *p++ = (unsigned char)( ( (ssl->hostname_len + 9) ) & 0xFF );
  113. *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME >> 8 ) & 0xFF );
  114. *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME ) & 0xFF );
  115. *p++ = (unsigned char)( ( (ssl->hostname_len + 5) >> 8 ) & 0xFF );
  116. *p++ = (unsigned char)( ( (ssl->hostname_len + 5) ) & 0xFF );
  117. *p++ = (unsigned char)( ( (ssl->hostname_len + 3) >> 8 ) & 0xFF );
  118. *p++ = (unsigned char)( ( (ssl->hostname_len + 3) ) & 0xFF );
  119. *p++ = (unsigned char)( ( TLS_EXT_SERVERNAME_HOSTNAME ) & 0xFF );
  120. *p++ = (unsigned char)( ( ssl->hostname_len >> 8 ) & 0xFF );
  121. *p++ = (unsigned char)( ( ssl->hostname_len ) & 0xFF );
  122. memcpy( p, ssl->hostname, ssl->hostname_len );
  123. p += ssl->hostname_len;
  124. }
  125. ssl->out_msglen = p - buf;
  126. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  127. ssl->out_msg[0] = SSL_HS_CLIENT_HELLO;
  128. ssl->state++;
  129. if( ( ret = ssl_write_record( ssl ) ) != 0 )
  130. {
  131. SSL_DEBUG_RET( 1, "ssl_write_record", ret );
  132. return( ret );
  133. }
  134. SSL_DEBUG_MSG( 2, ( "<= write client hello" ) );
  135. return( 0 );
  136. }
  137. static int ssl_parse_server_hello( ssl_context *ssl )
  138. {
  139. time_t t;
  140. int ret, i;
  141. size_t n;
  142. int ext_len;
  143. unsigned char *buf;
  144. SSL_DEBUG_MSG( 2, ( "=> parse server hello" ) );
  145. /*
  146. * 0 . 0 handshake type
  147. * 1 . 3 handshake length
  148. * 4 . 5 protocol version
  149. * 6 . 9 UNIX time()
  150. * 10 . 37 random bytes
  151. */
  152. buf = ssl->in_msg;
  153. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  154. {
  155. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  156. return( ret );
  157. }
  158. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  159. {
  160. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  161. return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
  162. }
  163. SSL_DEBUG_MSG( 3, ( "server hello, chosen version: [%d:%d]",
  164. buf[4], buf[5] ) );
  165. if( ssl->in_hslen < 42 ||
  166. buf[0] != SSL_HS_SERVER_HELLO ||
  167. buf[4] != SSL_MAJOR_VERSION_3 )
  168. {
  169. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  170. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
  171. }
  172. if( buf[5] > ssl->max_minor_ver )
  173. {
  174. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  175. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
  176. }
  177. ssl->minor_ver = buf[5];
  178. t = ( (time_t) buf[6] << 24 )
  179. | ( (time_t) buf[7] << 16 )
  180. | ( (time_t) buf[8] << 8 )
  181. | ( (time_t) buf[9] );
  182. memcpy( ssl->randbytes + 32, buf + 6, 32 );
  183. n = buf[38];
  184. SSL_DEBUG_MSG( 3, ( "server hello, current time: %lu", t ) );
  185. SSL_DEBUG_BUF( 3, "server hello, random bytes", buf + 6, 32 );
  186. /*
  187. * 38 . 38 session id length
  188. * 39 . 38+n session id
  189. * 39+n . 40+n chosen ciphersuite
  190. * 41+n . 41+n chosen compression alg.
  191. * 42+n . 43+n extensions length
  192. * 44+n . 44+n+m extensions
  193. */
  194. if( n > 32 || ssl->in_hslen > 42 + n )
  195. {
  196. ext_len = ( ( buf[42 + n] << 8 )
  197. | ( buf[43 + n] ) ) + 2;
  198. }
  199. else
  200. {
  201. ext_len = 0;
  202. }
  203. if( n > 32 || ssl->in_hslen != 42 + n + ext_len )
  204. {
  205. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  206. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
  207. }
  208. i = ( buf[39 + n] << 8 ) | buf[40 + n];
  209. SSL_DEBUG_MSG( 3, ( "server hello, session id len.: %d", n ) );
  210. SSL_DEBUG_BUF( 3, "server hello, session id", buf + 39, n );
  211. /*
  212. * Check if the session can be resumed
  213. */
  214. if( ssl->resume == 0 || n == 0 ||
  215. ssl->session->ciphersuite != i ||
  216. ssl->session->length != n ||
  217. memcmp( ssl->session->id, buf + 39, n ) != 0 )
  218. {
  219. ssl->state++;
  220. ssl->resume = 0;
  221. ssl->session->start = time( NULL );
  222. ssl->session->ciphersuite = i;
  223. ssl->session->length = n;
  224. memcpy( ssl->session->id, buf + 39, n );
  225. }
  226. else
  227. {
  228. ssl->state = SSL_SERVER_CHANGE_CIPHER_SPEC;
  229. if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
  230. {
  231. SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
  232. return( ret );
  233. }
  234. }
  235. SSL_DEBUG_MSG( 3, ( "%s session has been resumed",
  236. ssl->resume ? "a" : "no" ) );
  237. SSL_DEBUG_MSG( 3, ( "server hello, chosen ciphersuite: %d", i ) );
  238. SSL_DEBUG_MSG( 3, ( "server hello, compress alg.: %d", buf[41 + n] ) );
  239. i = 0;
  240. while( 1 )
  241. {
  242. if( ssl->ciphersuites[i] == 0 )
  243. {
  244. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  245. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
  246. }
  247. if( ssl->ciphersuites[i++] == ssl->session->ciphersuite )
  248. break;
  249. }
  250. if( buf[41 + n] != SSL_COMPRESS_NULL )
  251. {
  252. SSL_DEBUG_MSG( 1, ( "bad server hello message" ) );
  253. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO );
  254. }
  255. /* TODO: Process extensions */
  256. SSL_DEBUG_MSG( 2, ( "<= parse server hello" ) );
  257. return( 0 );
  258. }
  259. static int ssl_parse_server_key_exchange( ssl_context *ssl )
  260. {
  261. #if defined(POLARSSL_DHM_C)
  262. int ret;
  263. size_t n;
  264. unsigned char *p, *end;
  265. unsigned char hash[36];
  266. md5_context md5;
  267. sha1_context sha1;
  268. #endif
  269. SSL_DEBUG_MSG( 2, ( "=> parse server key exchange" ) );
  270. if( ssl->session->ciphersuite != SSL_EDH_RSA_DES_168_SHA &&
  271. ssl->session->ciphersuite != SSL_EDH_RSA_AES_128_SHA &&
  272. ssl->session->ciphersuite != SSL_EDH_RSA_AES_256_SHA &&
  273. ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_128_SHA &&
  274. ssl->session->ciphersuite != SSL_EDH_RSA_CAMELLIA_256_SHA)
  275. {
  276. SSL_DEBUG_MSG( 2, ( "<= skip parse server key exchange" ) );
  277. ssl->state++;
  278. return( 0 );
  279. }
  280. #if !defined(POLARSSL_DHM_C)
  281. SSL_DEBUG_MSG( 1, ( "support for dhm in not available" ) );
  282. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  283. #else
  284. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  285. {
  286. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  287. return( ret );
  288. }
  289. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  290. {
  291. SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  292. return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
  293. }
  294. if( ssl->in_msg[0] != SSL_HS_SERVER_KEY_EXCHANGE )
  295. {
  296. SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  297. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  298. }
  299. /*
  300. * Ephemeral DH parameters:
  301. *
  302. * struct {
  303. * opaque dh_p<1..2^16-1>;
  304. * opaque dh_g<1..2^16-1>;
  305. * opaque dh_Ys<1..2^16-1>;
  306. * } ServerDHParams;
  307. */
  308. p = ssl->in_msg + 4;
  309. end = ssl->in_msg + ssl->in_hslen;
  310. if( ( ret = dhm_read_params( &ssl->dhm_ctx, &p, end ) ) != 0 )
  311. {
  312. SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  313. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  314. }
  315. if( (unsigned int)( end - p ) != ssl->peer_cert->rsa.len )
  316. {
  317. SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  318. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  319. }
  320. if( ssl->dhm_ctx.len < 64 || ssl->dhm_ctx.len > 256 )
  321. {
  322. SSL_DEBUG_MSG( 1, ( "bad server key exchange message" ) );
  323. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_KEY_EXCHANGE );
  324. }
  325. SSL_DEBUG_MPI( 3, "DHM: P ", &ssl->dhm_ctx.P );
  326. SSL_DEBUG_MPI( 3, "DHM: G ", &ssl->dhm_ctx.G );
  327. SSL_DEBUG_MPI( 3, "DHM: GY", &ssl->dhm_ctx.GY );
  328. /*
  329. * digitally-signed struct {
  330. * opaque md5_hash[16];
  331. * opaque sha_hash[20];
  332. * };
  333. *
  334. * md5_hash
  335. * MD5(ClientHello.random + ServerHello.random
  336. * + ServerParams);
  337. * sha_hash
  338. * SHA(ClientHello.random + ServerHello.random
  339. * + ServerParams);
  340. */
  341. n = ssl->in_hslen - ( end - p ) - 6;
  342. md5_starts( &md5 );
  343. md5_update( &md5, ssl->randbytes, 64 );
  344. md5_update( &md5, ssl->in_msg + 4, n );
  345. md5_finish( &md5, hash );
  346. sha1_starts( &sha1 );
  347. sha1_update( &sha1, ssl->randbytes, 64 );
  348. sha1_update( &sha1, ssl->in_msg + 4, n );
  349. sha1_finish( &sha1, hash + 16 );
  350. SSL_DEBUG_BUF( 3, "parameters hash", hash, 36 );
  351. if( ( ret = rsa_pkcs1_verify( &ssl->peer_cert->rsa, RSA_PUBLIC,
  352. SIG_RSA_RAW, 36, hash, p ) ) != 0 )
  353. {
  354. SSL_DEBUG_RET( 1, "rsa_pkcs1_verify", ret );
  355. return( ret );
  356. }
  357. ssl->state++;
  358. SSL_DEBUG_MSG( 2, ( "<= parse server key exchange" ) );
  359. return( 0 );
  360. #endif
  361. }
  362. static int ssl_parse_certificate_request( ssl_context *ssl )
  363. {
  364. int ret;
  365. SSL_DEBUG_MSG( 2, ( "=> parse certificate request" ) );
  366. /*
  367. * 0 . 0 handshake type
  368. * 1 . 3 handshake length
  369. * 4 . 5 SSL version
  370. * 6 . 6 cert type count
  371. * 7 .. n-1 cert types
  372. * n .. n+1 length of all DNs
  373. * n+2 .. n+3 length of DN 1
  374. * n+4 .. ... Distinguished Name #1
  375. * ... .. ... length of DN 2, etc.
  376. */
  377. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  378. {
  379. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  380. return( ret );
  381. }
  382. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  383. {
  384. SSL_DEBUG_MSG( 1, ( "bad certificate request message" ) );
  385. return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
  386. }
  387. ssl->client_auth = 0;
  388. ssl->state++;
  389. if( ssl->in_msg[0] == SSL_HS_CERTIFICATE_REQUEST )
  390. ssl->client_auth++;
  391. SSL_DEBUG_MSG( 3, ( "got %s certificate request",
  392. ssl->client_auth ? "a" : "no" ) );
  393. SSL_DEBUG_MSG( 2, ( "<= parse certificate request" ) );
  394. return( 0 );
  395. }
  396. static int ssl_parse_server_hello_done( ssl_context *ssl )
  397. {
  398. int ret;
  399. SSL_DEBUG_MSG( 2, ( "=> parse server hello done" ) );
  400. if( ssl->client_auth != 0 )
  401. {
  402. if( ( ret = ssl_read_record( ssl ) ) != 0 )
  403. {
  404. SSL_DEBUG_RET( 1, "ssl_read_record", ret );
  405. return( ret );
  406. }
  407. if( ssl->in_msgtype != SSL_MSG_HANDSHAKE )
  408. {
  409. SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  410. return( POLARSSL_ERR_SSL_UNEXPECTED_MESSAGE );
  411. }
  412. }
  413. if( ssl->in_hslen != 4 ||
  414. ssl->in_msg[0] != SSL_HS_SERVER_HELLO_DONE )
  415. {
  416. SSL_DEBUG_MSG( 1, ( "bad server hello done message" ) );
  417. return( POLARSSL_ERR_SSL_BAD_HS_SERVER_HELLO_DONE );
  418. }
  419. ssl->state++;
  420. SSL_DEBUG_MSG( 2, ( "<= parse server hello done" ) );
  421. return( 0 );
  422. }
  423. static int ssl_write_client_key_exchange( ssl_context *ssl )
  424. {
  425. int ret;
  426. size_t i, n;
  427. SSL_DEBUG_MSG( 2, ( "=> write client key exchange" ) );
  428. if( ssl->session->ciphersuite == SSL_EDH_RSA_DES_168_SHA ||
  429. ssl->session->ciphersuite == SSL_EDH_RSA_AES_128_SHA ||
  430. ssl->session->ciphersuite == SSL_EDH_RSA_AES_256_SHA ||
  431. ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_128_SHA ||
  432. ssl->session->ciphersuite == SSL_EDH_RSA_CAMELLIA_256_SHA)
  433. {
  434. #if !defined(POLARSSL_DHM_C)
  435. SSL_DEBUG_MSG( 1, ( "support for dhm in not available" ) );
  436. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  437. #else
  438. /*
  439. * DHM key exchange -- send G^X mod P
  440. */
  441. n = ssl->dhm_ctx.len;
  442. ssl->out_msg[4] = (unsigned char)( n >> 8 );
  443. ssl->out_msg[5] = (unsigned char)( n );
  444. i = 6;
  445. ret = dhm_make_public( &ssl->dhm_ctx, 256,
  446. &ssl->out_msg[i], n,
  447. ssl->f_rng, ssl->p_rng );
  448. if( ret != 0 )
  449. {
  450. SSL_DEBUG_RET( 1, "dhm_make_public", ret );
  451. return( ret );
  452. }
  453. SSL_DEBUG_MPI( 3, "DHM: X ", &ssl->dhm_ctx.X );
  454. SSL_DEBUG_MPI( 3, "DHM: GX", &ssl->dhm_ctx.GX );
  455. ssl->pmslen = ssl->dhm_ctx.len;
  456. if( ( ret = dhm_calc_secret( &ssl->dhm_ctx,
  457. ssl->premaster,
  458. &ssl->pmslen ) ) != 0 )
  459. {
  460. SSL_DEBUG_RET( 1, "dhm_calc_secret", ret );
  461. return( ret );
  462. }
  463. SSL_DEBUG_MPI( 3, "DHM: K ", &ssl->dhm_ctx.K );
  464. #endif
  465. }
  466. else
  467. {
  468. /*
  469. * RSA key exchange -- send rsa_public(pkcs1 v1.5(premaster))
  470. */
  471. ssl->premaster[0] = (unsigned char) ssl->max_major_ver;
  472. ssl->premaster[1] = (unsigned char) ssl->max_minor_ver;
  473. ssl->pmslen = 48;
  474. for( i = 2; i < ssl->pmslen; i++ )
  475. ssl->premaster[i] = (unsigned char) ssl->f_rng( ssl->p_rng );
  476. i = 4;
  477. n = ssl->peer_cert->rsa.len;
  478. if( ssl->minor_ver != SSL_MINOR_VERSION_0 )
  479. {
  480. i += 2;
  481. ssl->out_msg[4] = (unsigned char)( n >> 8 );
  482. ssl->out_msg[5] = (unsigned char)( n );
  483. }
  484. ret = rsa_pkcs1_encrypt( &ssl->peer_cert->rsa,
  485. ssl->f_rng, ssl->p_rng,
  486. RSA_PUBLIC,
  487. ssl->pmslen, ssl->premaster,
  488. ssl->out_msg + i );
  489. if( ret != 0 )
  490. {
  491. SSL_DEBUG_RET( 1, "rsa_pkcs1_encrypt", ret );
  492. return( ret );
  493. }
  494. }
  495. if( ( ret = ssl_derive_keys( ssl ) ) != 0 )
  496. {
  497. SSL_DEBUG_RET( 1, "ssl_derive_keys", ret );
  498. return( ret );
  499. }
  500. ssl->out_msglen = i + n;
  501. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  502. ssl->out_msg[0] = SSL_HS_CLIENT_KEY_EXCHANGE;
  503. ssl->state++;
  504. if( ( ret = ssl_write_record( ssl ) ) != 0 )
  505. {
  506. SSL_DEBUG_RET( 1, "ssl_write_record", ret );
  507. return( ret );
  508. }
  509. SSL_DEBUG_MSG( 2, ( "<= write client key exchange" ) );
  510. return( 0 );
  511. }
  512. static int ssl_write_certificate_verify( ssl_context *ssl )
  513. {
  514. int ret = 0;
  515. size_t n = 0;
  516. unsigned char hash[36];
  517. SSL_DEBUG_MSG( 2, ( "=> write certificate verify" ) );
  518. if( ssl->client_auth == 0 || ssl->own_cert == NULL )
  519. {
  520. SSL_DEBUG_MSG( 2, ( "<= skip write certificate verify" ) );
  521. ssl->state++;
  522. return( 0 );
  523. }
  524. if( ssl->rsa_key == NULL )
  525. {
  526. #if defined(POLARSSL_PKCS11_C)
  527. if( ssl->pkcs11_key == NULL )
  528. {
  529. #endif /* defined(POLARSSL_PKCS11_C) */
  530. SSL_DEBUG_MSG( 1, ( "got no private key" ) );
  531. return( POLARSSL_ERR_SSL_PRIVATE_KEY_REQUIRED );
  532. #if defined(POLARSSL_PKCS11_C)
  533. }
  534. #endif /* defined(POLARSSL_PKCS11_C) */
  535. }
  536. /*
  537. * Make an RSA signature of the handshake digests
  538. */
  539. ssl_calc_verify( ssl, hash );
  540. if ( ssl->rsa_key )
  541. n = ssl->rsa_key->len;
  542. #if defined(POLARSSL_PKCS11_C)
  543. else
  544. n = ssl->pkcs11_key->len;
  545. #endif /* defined(POLARSSL_PKCS11_C) */
  546. ssl->out_msg[4] = (unsigned char)( n >> 8 );
  547. ssl->out_msg[5] = (unsigned char)( n );
  548. if( ssl->rsa_key )
  549. {
  550. ret = rsa_pkcs1_sign( ssl->rsa_key, ssl->f_rng, ssl->p_rng,
  551. RSA_PRIVATE, SIG_RSA_RAW,
  552. 36, hash, ssl->out_msg + 6 );
  553. } else {
  554. #if defined(POLARSSL_PKCS11_C)
  555. ret = pkcs11_sign( ssl->pkcs11_key, RSA_PRIVATE, SIG_RSA_RAW,
  556. 36, hash, ssl->out_msg + 6 );
  557. #endif /* defined(POLARSSL_PKCS11_C) */
  558. }
  559. if (ret != 0)
  560. {
  561. SSL_DEBUG_RET( 1, "pkcs1_sign", ret );
  562. return( ret );
  563. }
  564. ssl->out_msglen = 6 + n;
  565. ssl->out_msgtype = SSL_MSG_HANDSHAKE;
  566. ssl->out_msg[0] = SSL_HS_CERTIFICATE_VERIFY;
  567. ssl->state++;
  568. if( ( ret = ssl_write_record( ssl ) ) != 0 )
  569. {
  570. SSL_DEBUG_RET( 1, "ssl_write_record", ret );
  571. return( ret );
  572. }
  573. SSL_DEBUG_MSG( 2, ( "<= write certificate verify" ) );
  574. return( 0 );
  575. }
  576. /*
  577. * SSL handshake -- client side
  578. */
  579. int ssl_handshake_client( ssl_context *ssl )
  580. {
  581. int ret = 0;
  582. SSL_DEBUG_MSG( 2, ( "=> handshake client" ) );
  583. while( ssl->state != SSL_HANDSHAKE_OVER )
  584. {
  585. SSL_DEBUG_MSG( 2, ( "client state: %d", ssl->state ) );
  586. if( ( ret = ssl_flush_output( ssl ) ) != 0 )
  587. break;
  588. switch( ssl->state )
  589. {
  590. case SSL_HELLO_REQUEST:
  591. ssl->state = SSL_CLIENT_HELLO;
  592. break;
  593. /*
  594. * ==> ClientHello
  595. */
  596. case SSL_CLIENT_HELLO:
  597. ret = ssl_write_client_hello( ssl );
  598. break;
  599. /*
  600. * <== ServerHello
  601. * Certificate
  602. * ( ServerKeyExchange )
  603. * ( CertificateRequest )
  604. * ServerHelloDone
  605. */
  606. case SSL_SERVER_HELLO:
  607. ret = ssl_parse_server_hello( ssl );
  608. break;
  609. case SSL_SERVER_CERTIFICATE:
  610. ret = ssl_parse_certificate( ssl );
  611. break;
  612. case SSL_SERVER_KEY_EXCHANGE:
  613. ret = ssl_parse_server_key_exchange( ssl );
  614. break;
  615. case SSL_CERTIFICATE_REQUEST:
  616. ret = ssl_parse_certificate_request( ssl );
  617. break;
  618. case SSL_SERVER_HELLO_DONE:
  619. ret = ssl_parse_server_hello_done( ssl );
  620. break;
  621. /*
  622. * ==> ( Certificate/Alert )
  623. * ClientKeyExchange
  624. * ( CertificateVerify )
  625. * ChangeCipherSpec
  626. * Finished
  627. */
  628. case SSL_CLIENT_CERTIFICATE:
  629. ret = ssl_write_certificate( ssl );
  630. break;
  631. case SSL_CLIENT_KEY_EXCHANGE:
  632. ret = ssl_write_client_key_exchange( ssl );
  633. break;
  634. case SSL_CERTIFICATE_VERIFY:
  635. ret = ssl_write_certificate_verify( ssl );
  636. break;
  637. case SSL_CLIENT_CHANGE_CIPHER_SPEC:
  638. ret = ssl_write_change_cipher_spec( ssl );
  639. break;
  640. case SSL_CLIENT_FINISHED:
  641. ret = ssl_write_finished( ssl );
  642. break;
  643. /*
  644. * <== ChangeCipherSpec
  645. * Finished
  646. */
  647. case SSL_SERVER_CHANGE_CIPHER_SPEC:
  648. ret = ssl_parse_change_cipher_spec( ssl );
  649. break;
  650. case SSL_SERVER_FINISHED:
  651. ret = ssl_parse_finished( ssl );
  652. break;
  653. case SSL_FLUSH_BUFFERS:
  654. SSL_DEBUG_MSG( 2, ( "handshake: done" ) );
  655. ssl->state = SSL_HANDSHAKE_OVER;
  656. break;
  657. default:
  658. SSL_DEBUG_MSG( 1, ( "invalid state %d", ssl->state ) );
  659. return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
  660. }
  661. if( ret != 0 )
  662. break;
  663. }
  664. SSL_DEBUG_MSG( 2, ( "<= handshake client" ) );
  665. return( ret );
  666. }
  667. #endif