PageRenderTime 61ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 1ms

/library/ssl_tls.c

https://github.com/leg0/polarssl
C | 3928 lines | 2932 code | 683 blank | 313 comment | 607 complexity | 504bfd6a3b35637d9b6b914116e0df85 MD5 | raw file
Possible License(s): GPL-2.0

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. * SSLv3/TLSv1 shared functions
  3. *
  4. * Copyright (C) 2006-2012, 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. /*
  26. * The SSL 3.0 specification was drafted by Netscape in 1996,
  27. * and became an IETF standard in 1999.
  28. *
  29. * http://wp.netscape.com/eng/ssl3/
  30. * http://www.ietf.org/rfc/rfc2246.txt
  31. * http://www.ietf.org/rfc/rfc4346.txt
  32. */
  33. #include "polarssl/config.h"
  34. #if defined(POLARSSL_SSL_TLS_C)
  35. #include "polarssl/aes.h"
  36. #include "polarssl/arc4.h"
  37. #include "polarssl/camellia.h"
  38. #include "polarssl/des.h"
  39. #include "polarssl/debug.h"
  40. #include "polarssl/ssl.h"
  41. #include "polarssl/sha2.h"
  42. #if defined(POLARSSL_GCM_C)
  43. #include "polarssl/gcm.h"
  44. #endif
  45. #include <stdlib.h>
  46. #include <time.h>
  47. #if defined _MSC_VER && !defined strcasecmp
  48. #define strcasecmp _stricmp
  49. #endif
  50. #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
  51. int (*ssl_hw_record_init)(ssl_context *ssl,
  52. const unsigned char *key_enc, const unsigned char *key_dec,
  53. const unsigned char *iv_enc, const unsigned char *iv_dec,
  54. const unsigned char *mac_enc, const unsigned char *mac_dec) = NULL;
  55. int (*ssl_hw_record_reset)(ssl_context *ssl) = NULL;
  56. int (*ssl_hw_record_write)(ssl_context *ssl) = NULL;
  57. int (*ssl_hw_record_read)(ssl_context *ssl) = NULL;
  58. int (*ssl_hw_record_finish)(ssl_context *ssl) = NULL;
  59. #endif
  60. static int ssl_rsa_decrypt( void *ctx, int mode, size_t *olen,
  61. const unsigned char *input, unsigned char *output,
  62. size_t output_max_len )
  63. {
  64. return rsa_pkcs1_decrypt( (rsa_context *) ctx, mode, olen, input, output,
  65. output_max_len );
  66. }
  67. static int ssl_rsa_sign( void *ctx,
  68. int (*f_rng)(void *, unsigned char *, size_t), void *p_rng,
  69. int mode, int hash_id, unsigned int hashlen,
  70. const unsigned char *hash, unsigned char *sig )
  71. {
  72. return rsa_pkcs1_sign( (rsa_context *) ctx, f_rng, p_rng, mode, hash_id,
  73. hashlen, hash, sig );
  74. }
  75. static size_t ssl_rsa_key_len( void *ctx )
  76. {
  77. return ( (rsa_context *) ctx )->len;
  78. }
  79. /*
  80. * Key material generation
  81. */
  82. static int ssl3_prf( unsigned char *secret, size_t slen, char *label,
  83. unsigned char *random, size_t rlen,
  84. unsigned char *dstbuf, size_t dlen )
  85. {
  86. size_t i;
  87. md5_context md5;
  88. sha1_context sha1;
  89. unsigned char padding[16];
  90. unsigned char sha1sum[20];
  91. ((void)label);
  92. /*
  93. * SSLv3:
  94. * block =
  95. * MD5( secret + SHA1( 'A' + secret + random ) ) +
  96. * MD5( secret + SHA1( 'BB' + secret + random ) ) +
  97. * MD5( secret + SHA1( 'CCC' + secret + random ) ) +
  98. * ...
  99. */
  100. for( i = 0; i < dlen / 16; i++ )
  101. {
  102. memset( padding, 'A' + i, 1 + i );
  103. sha1_starts( &sha1 );
  104. sha1_update( &sha1, padding, 1 + i );
  105. sha1_update( &sha1, secret, slen );
  106. sha1_update( &sha1, random, rlen );
  107. sha1_finish( &sha1, sha1sum );
  108. md5_starts( &md5 );
  109. md5_update( &md5, secret, slen );
  110. md5_update( &md5, sha1sum, 20 );
  111. md5_finish( &md5, dstbuf + i * 16 );
  112. }
  113. memset( &md5, 0, sizeof( md5 ) );
  114. memset( &sha1, 0, sizeof( sha1 ) );
  115. memset( padding, 0, sizeof( padding ) );
  116. memset( sha1sum, 0, sizeof( sha1sum ) );
  117. return( 0 );
  118. }
  119. static int tls1_prf( unsigned char *secret, size_t slen, char *label,
  120. unsigned char *random, size_t rlen,
  121. unsigned char *dstbuf, size_t dlen )
  122. {
  123. size_t nb, hs;
  124. size_t i, j, k;
  125. unsigned char *S1, *S2;
  126. unsigned char tmp[128];
  127. unsigned char h_i[20];
  128. if( sizeof( tmp ) < 20 + strlen( label ) + rlen )
  129. return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
  130. hs = ( slen + 1 ) / 2;
  131. S1 = secret;
  132. S2 = secret + slen - hs;
  133. nb = strlen( label );
  134. memcpy( tmp + 20, label, nb );
  135. memcpy( tmp + 20 + nb, random, rlen );
  136. nb += rlen;
  137. /*
  138. * First compute P_md5(secret,label+random)[0..dlen]
  139. */
  140. md5_hmac( S1, hs, tmp + 20, nb, 4 + tmp );
  141. for( i = 0; i < dlen; i += 16 )
  142. {
  143. md5_hmac( S1, hs, 4 + tmp, 16 + nb, h_i );
  144. md5_hmac( S1, hs, 4 + tmp, 16, 4 + tmp );
  145. k = ( i + 16 > dlen ) ? dlen % 16 : 16;
  146. for( j = 0; j < k; j++ )
  147. dstbuf[i + j] = h_i[j];
  148. }
  149. /*
  150. * XOR out with P_sha1(secret,label+random)[0..dlen]
  151. */
  152. sha1_hmac( S2, hs, tmp + 20, nb, tmp );
  153. for( i = 0; i < dlen; i += 20 )
  154. {
  155. sha1_hmac( S2, hs, tmp, 20 + nb, h_i );
  156. sha1_hmac( S2, hs, tmp, 20, tmp );
  157. k = ( i + 20 > dlen ) ? dlen % 20 : 20;
  158. for( j = 0; j < k; j++ )
  159. dstbuf[i + j] = (unsigned char)( dstbuf[i + j] ^ h_i[j] );
  160. }
  161. memset( tmp, 0, sizeof( tmp ) );
  162. memset( h_i, 0, sizeof( h_i ) );
  163. return( 0 );
  164. }
  165. static int tls_prf_sha256( unsigned char *secret, size_t slen, char *label,
  166. unsigned char *random, size_t rlen,
  167. unsigned char *dstbuf, size_t dlen )
  168. {
  169. size_t nb;
  170. size_t i, j, k;
  171. unsigned char tmp[128];
  172. unsigned char h_i[32];
  173. if( sizeof( tmp ) < 32 + strlen( label ) + rlen )
  174. return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
  175. nb = strlen( label );
  176. memcpy( tmp + 32, label, nb );
  177. memcpy( tmp + 32 + nb, random, rlen );
  178. nb += rlen;
  179. /*
  180. * Compute P_<hash>(secret, label + random)[0..dlen]
  181. */
  182. sha2_hmac( secret, slen, tmp + 32, nb, tmp, 0 );
  183. for( i = 0; i < dlen; i += 32 )
  184. {
  185. sha2_hmac( secret, slen, tmp, 32 + nb, h_i, 0 );
  186. sha2_hmac( secret, slen, tmp, 32, tmp, 0 );
  187. k = ( i + 32 > dlen ) ? dlen % 32 : 32;
  188. for( j = 0; j < k; j++ )
  189. dstbuf[i + j] = h_i[j];
  190. }
  191. memset( tmp, 0, sizeof( tmp ) );
  192. memset( h_i, 0, sizeof( h_i ) );
  193. return( 0 );
  194. }
  195. #if defined(POLARSSL_SHA4_C)
  196. static int tls_prf_sha384( unsigned char *secret, size_t slen, char *label,
  197. unsigned char *random, size_t rlen,
  198. unsigned char *dstbuf, size_t dlen )
  199. {
  200. size_t nb;
  201. size_t i, j, k;
  202. unsigned char tmp[128];
  203. unsigned char h_i[48];
  204. if( sizeof( tmp ) < 48 + strlen( label ) + rlen )
  205. return( POLARSSL_ERR_SSL_BAD_INPUT_DATA );
  206. nb = strlen( label );
  207. memcpy( tmp + 48, label, nb );
  208. memcpy( tmp + 48 + nb, random, rlen );
  209. nb += rlen;
  210. /*
  211. * Compute P_<hash>(secret, label + random)[0..dlen]
  212. */
  213. sha4_hmac( secret, slen, tmp + 48, nb, tmp, 1 );
  214. for( i = 0; i < dlen; i += 48 )
  215. {
  216. sha4_hmac( secret, slen, tmp, 48 + nb, h_i, 1 );
  217. sha4_hmac( secret, slen, tmp, 48, tmp, 1 );
  218. k = ( i + 48 > dlen ) ? dlen % 48 : 48;
  219. for( j = 0; j < k; j++ )
  220. dstbuf[i + j] = h_i[j];
  221. }
  222. memset( tmp, 0, sizeof( tmp ) );
  223. memset( h_i, 0, sizeof( h_i ) );
  224. return( 0 );
  225. }
  226. #endif
  227. static void ssl_update_checksum_start(ssl_context *, unsigned char *, size_t);
  228. static void ssl_update_checksum_md5sha1(ssl_context *, unsigned char *, size_t);
  229. static void ssl_update_checksum_sha256(ssl_context *, unsigned char *, size_t);
  230. static void ssl_calc_verify_ssl(ssl_context *,unsigned char *);
  231. static void ssl_calc_verify_tls(ssl_context *,unsigned char *);
  232. static void ssl_calc_verify_tls_sha256(ssl_context *,unsigned char *);
  233. static void ssl_calc_finished_ssl(ssl_context *,unsigned char *,int);
  234. static void ssl_calc_finished_tls(ssl_context *,unsigned char *,int);
  235. static void ssl_calc_finished_tls_sha256(ssl_context *,unsigned char *,int);
  236. #if defined(POLARSSL_SHA4_C)
  237. static void ssl_update_checksum_sha384(ssl_context *, unsigned char *, size_t);
  238. static void ssl_calc_verify_tls_sha384(ssl_context *,unsigned char *);
  239. static void ssl_calc_finished_tls_sha384(ssl_context *,unsigned char *,int);
  240. #endif
  241. int ssl_derive_keys( ssl_context *ssl )
  242. {
  243. unsigned char tmp[64];
  244. unsigned char keyblk[256];
  245. unsigned char *key1;
  246. unsigned char *key2;
  247. unsigned int iv_copy_len;
  248. ssl_session *session = ssl->session_negotiate;
  249. ssl_transform *transform = ssl->transform_negotiate;
  250. ssl_handshake_params *handshake = ssl->handshake;
  251. SSL_DEBUG_MSG( 2, ( "=> derive keys" ) );
  252. /*
  253. * Set appropriate PRF function and other SSL / TLS / TLS1.2 functions
  254. */
  255. if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
  256. {
  257. handshake->tls_prf = ssl3_prf;
  258. handshake->calc_verify = ssl_calc_verify_ssl;
  259. handshake->calc_finished = ssl_calc_finished_ssl;
  260. }
  261. else if( ssl->minor_ver < SSL_MINOR_VERSION_3 )
  262. {
  263. handshake->tls_prf = tls1_prf;
  264. handshake->calc_verify = ssl_calc_verify_tls;
  265. handshake->calc_finished = ssl_calc_finished_tls;
  266. }
  267. #if defined(POLARSSL_SHA4_C)
  268. else if( session->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
  269. session->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
  270. {
  271. handshake->tls_prf = tls_prf_sha384;
  272. handshake->calc_verify = ssl_calc_verify_tls_sha384;
  273. handshake->calc_finished = ssl_calc_finished_tls_sha384;
  274. }
  275. #endif
  276. else
  277. {
  278. handshake->tls_prf = tls_prf_sha256;
  279. handshake->calc_verify = ssl_calc_verify_tls_sha256;
  280. handshake->calc_finished = ssl_calc_finished_tls_sha256;
  281. }
  282. /*
  283. * SSLv3:
  284. * master =
  285. * MD5( premaster + SHA1( 'A' + premaster + randbytes ) ) +
  286. * MD5( premaster + SHA1( 'BB' + premaster + randbytes ) ) +
  287. * MD5( premaster + SHA1( 'CCC' + premaster + randbytes ) )
  288. *
  289. * TLSv1:
  290. * master = PRF( premaster, "master secret", randbytes )[0..47]
  291. */
  292. if( handshake->resume == 0 )
  293. {
  294. SSL_DEBUG_BUF( 3, "premaster secret", handshake->premaster,
  295. handshake->pmslen );
  296. handshake->tls_prf( handshake->premaster, handshake->pmslen,
  297. "master secret",
  298. handshake->randbytes, 64, session->master, 48 );
  299. memset( handshake->premaster, 0, sizeof( handshake->premaster ) );
  300. }
  301. else
  302. SSL_DEBUG_MSG( 3, ( "no premaster (session resumed)" ) );
  303. /*
  304. * Swap the client and server random values.
  305. */
  306. memcpy( tmp, handshake->randbytes, 64 );
  307. memcpy( handshake->randbytes, tmp + 32, 32 );
  308. memcpy( handshake->randbytes + 32, tmp, 32 );
  309. memset( tmp, 0, sizeof( tmp ) );
  310. /*
  311. * SSLv3:
  312. * key block =
  313. * MD5( master + SHA1( 'A' + master + randbytes ) ) +
  314. * MD5( master + SHA1( 'BB' + master + randbytes ) ) +
  315. * MD5( master + SHA1( 'CCC' + master + randbytes ) ) +
  316. * MD5( master + SHA1( 'DDDD' + master + randbytes ) ) +
  317. * ...
  318. *
  319. * TLSv1:
  320. * key block = PRF( master, "key expansion", randbytes )
  321. */
  322. handshake->tls_prf( session->master, 48, "key expansion",
  323. handshake->randbytes, 64, keyblk, 256 );
  324. SSL_DEBUG_MSG( 3, ( "ciphersuite = %s",
  325. ssl_get_ciphersuite_name( session->ciphersuite ) ) );
  326. SSL_DEBUG_BUF( 3, "master secret", session->master, 48 );
  327. SSL_DEBUG_BUF( 4, "random bytes", handshake->randbytes, 64 );
  328. SSL_DEBUG_BUF( 4, "key block", keyblk, 256 );
  329. memset( handshake->randbytes, 0, sizeof( handshake->randbytes ) );
  330. /*
  331. * Determine the appropriate key, IV and MAC length.
  332. */
  333. switch( session->ciphersuite )
  334. {
  335. #if defined(POLARSSL_ARC4_C)
  336. case TLS_RSA_WITH_RC4_128_MD5:
  337. transform->keylen = 16; transform->minlen = 16;
  338. transform->ivlen = 0; transform->maclen = 16;
  339. break;
  340. case TLS_RSA_WITH_RC4_128_SHA:
  341. transform->keylen = 16; transform->minlen = 20;
  342. transform->ivlen = 0; transform->maclen = 20;
  343. break;
  344. #endif
  345. #if defined(POLARSSL_DES_C)
  346. case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  347. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  348. transform->keylen = 24; transform->minlen = 24;
  349. transform->ivlen = 8; transform->maclen = 20;
  350. break;
  351. #endif
  352. #if defined(POLARSSL_AES_C)
  353. case TLS_RSA_WITH_AES_128_CBC_SHA:
  354. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  355. transform->keylen = 16; transform->minlen = 32;
  356. transform->ivlen = 16; transform->maclen = 20;
  357. break;
  358. case TLS_RSA_WITH_AES_256_CBC_SHA:
  359. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  360. transform->keylen = 32; transform->minlen = 32;
  361. transform->ivlen = 16; transform->maclen = 20;
  362. break;
  363. #if defined(POLARSSL_SHA2_C)
  364. case TLS_RSA_WITH_AES_128_CBC_SHA256:
  365. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  366. transform->keylen = 16; transform->minlen = 32;
  367. transform->ivlen = 16; transform->maclen = 32;
  368. break;
  369. case TLS_RSA_WITH_AES_256_CBC_SHA256:
  370. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  371. transform->keylen = 32; transform->minlen = 32;
  372. transform->ivlen = 16; transform->maclen = 32;
  373. break;
  374. #endif
  375. #if defined(POLARSSL_GCM_C)
  376. case TLS_RSA_WITH_AES_128_GCM_SHA256:
  377. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  378. transform->keylen = 16; transform->minlen = 1;
  379. transform->ivlen = 12; transform->maclen = 0;
  380. transform->fixed_ivlen = 4;
  381. break;
  382. case TLS_RSA_WITH_AES_256_GCM_SHA384:
  383. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  384. transform->keylen = 32; transform->minlen = 1;
  385. transform->ivlen = 12; transform->maclen = 0;
  386. transform->fixed_ivlen = 4;
  387. break;
  388. #endif
  389. #endif
  390. #if defined(POLARSSL_CAMELLIA_C)
  391. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
  392. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  393. transform->keylen = 16; transform->minlen = 32;
  394. transform->ivlen = 16; transform->maclen = 20;
  395. break;
  396. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
  397. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  398. transform->keylen = 32; transform->minlen = 32;
  399. transform->ivlen = 16; transform->maclen = 20;
  400. break;
  401. #if defined(POLARSSL_SHA2_C)
  402. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  403. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  404. transform->keylen = 16; transform->minlen = 32;
  405. transform->ivlen = 16; transform->maclen = 32;
  406. break;
  407. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  408. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  409. transform->keylen = 32; transform->minlen = 32;
  410. transform->ivlen = 16; transform->maclen = 32;
  411. break;
  412. #endif
  413. #endif
  414. #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
  415. #if defined(POLARSSL_CIPHER_NULL_CIPHER)
  416. case TLS_RSA_WITH_NULL_MD5:
  417. transform->keylen = 0; transform->minlen = 0;
  418. transform->ivlen = 0; transform->maclen = 16;
  419. break;
  420. case TLS_RSA_WITH_NULL_SHA:
  421. transform->keylen = 0; transform->minlen = 0;
  422. transform->ivlen = 0; transform->maclen = 20;
  423. break;
  424. case TLS_RSA_WITH_NULL_SHA256:
  425. transform->keylen = 0; transform->minlen = 0;
  426. transform->ivlen = 0; transform->maclen = 32;
  427. break;
  428. #endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
  429. #if defined(POLARSSL_DES_C)
  430. case TLS_RSA_WITH_DES_CBC_SHA:
  431. case TLS_DHE_RSA_WITH_DES_CBC_SHA:
  432. transform->keylen = 8; transform->minlen = 8;
  433. transform->ivlen = 8; transform->maclen = 20;
  434. break;
  435. #endif
  436. #endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
  437. default:
  438. SSL_DEBUG_MSG( 1, ( "ciphersuite %s is not available",
  439. ssl_get_ciphersuite_name( session->ciphersuite ) ) );
  440. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  441. }
  442. SSL_DEBUG_MSG( 3, ( "keylen: %d, minlen: %d, ivlen: %d, maclen: %d",
  443. transform->keylen, transform->minlen, transform->ivlen,
  444. transform->maclen ) );
  445. /*
  446. * Finally setup the cipher contexts, IVs and MAC secrets.
  447. */
  448. if( ssl->endpoint == SSL_IS_CLIENT )
  449. {
  450. key1 = keyblk + transform->maclen * 2;
  451. key2 = keyblk + transform->maclen * 2 + transform->keylen;
  452. memcpy( transform->mac_enc, keyblk, transform->maclen );
  453. memcpy( transform->mac_dec, keyblk + transform->maclen,
  454. transform->maclen );
  455. /*
  456. * This is not used in TLS v1.1.
  457. */
  458. iv_copy_len = ( transform->fixed_ivlen ) ?
  459. transform->fixed_ivlen : transform->ivlen;
  460. memcpy( transform->iv_enc, key2 + transform->keylen, iv_copy_len );
  461. memcpy( transform->iv_dec, key2 + transform->keylen + iv_copy_len,
  462. iv_copy_len );
  463. }
  464. else
  465. {
  466. key1 = keyblk + transform->maclen * 2 + transform->keylen;
  467. key2 = keyblk + transform->maclen * 2;
  468. memcpy( transform->mac_dec, keyblk, transform->maclen );
  469. memcpy( transform->mac_enc, keyblk + transform->maclen,
  470. transform->maclen );
  471. /*
  472. * This is not used in TLS v1.1.
  473. */
  474. iv_copy_len = ( transform->fixed_ivlen ) ?
  475. transform->fixed_ivlen : transform->ivlen;
  476. memcpy( transform->iv_dec, key1 + transform->keylen, iv_copy_len );
  477. memcpy( transform->iv_enc, key1 + transform->keylen + iv_copy_len,
  478. iv_copy_len );
  479. }
  480. #if defined(POLARSSL_SSL_HW_RECORD_ACCEL)
  481. if( ssl_hw_record_init != NULL)
  482. {
  483. int ret = 0;
  484. SSL_DEBUG_MSG( 2, ( "going for ssl_hw_record_init()" ) );
  485. if( ( ret = ssl_hw_record_init( ssl, key1, key2, transform->iv_enc,
  486. transform->iv_dec, transform->mac_enc,
  487. transform->mac_dec ) ) != 0 )
  488. {
  489. SSL_DEBUG_RET( 1, "ssl_hw_record_init", ret );
  490. return POLARSSL_ERR_SSL_HW_ACCEL_FAILED;
  491. }
  492. }
  493. #endif
  494. switch( session->ciphersuite )
  495. {
  496. #if defined(POLARSSL_ARC4_C)
  497. case TLS_RSA_WITH_RC4_128_MD5:
  498. case TLS_RSA_WITH_RC4_128_SHA:
  499. arc4_setup( (arc4_context *) transform->ctx_enc, key1,
  500. transform->keylen );
  501. arc4_setup( (arc4_context *) transform->ctx_dec, key2,
  502. transform->keylen );
  503. break;
  504. #endif
  505. #if defined(POLARSSL_DES_C)
  506. case TLS_RSA_WITH_3DES_EDE_CBC_SHA:
  507. case TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA:
  508. des3_set3key_enc( (des3_context *) transform->ctx_enc, key1 );
  509. des3_set3key_dec( (des3_context *) transform->ctx_dec, key2 );
  510. break;
  511. #endif
  512. #if defined(POLARSSL_AES_C)
  513. case TLS_RSA_WITH_AES_128_CBC_SHA:
  514. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA:
  515. case TLS_RSA_WITH_AES_128_CBC_SHA256:
  516. case TLS_DHE_RSA_WITH_AES_128_CBC_SHA256:
  517. aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 128 );
  518. aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 128 );
  519. break;
  520. case TLS_RSA_WITH_AES_256_CBC_SHA:
  521. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA:
  522. case TLS_RSA_WITH_AES_256_CBC_SHA256:
  523. case TLS_DHE_RSA_WITH_AES_256_CBC_SHA256:
  524. aes_setkey_enc( (aes_context *) transform->ctx_enc, key1, 256 );
  525. aes_setkey_dec( (aes_context *) transform->ctx_dec, key2, 256 );
  526. break;
  527. #if defined(POLARSSL_GCM_C)
  528. case TLS_RSA_WITH_AES_128_GCM_SHA256:
  529. case TLS_DHE_RSA_WITH_AES_128_GCM_SHA256:
  530. gcm_init( (gcm_context *) transform->ctx_enc, key1, 128 );
  531. gcm_init( (gcm_context *) transform->ctx_dec, key2, 128 );
  532. break;
  533. case TLS_RSA_WITH_AES_256_GCM_SHA384:
  534. case TLS_DHE_RSA_WITH_AES_256_GCM_SHA384:
  535. gcm_init( (gcm_context *) transform->ctx_enc, key1, 256 );
  536. gcm_init( (gcm_context *) transform->ctx_dec, key2, 256 );
  537. break;
  538. #endif
  539. #endif
  540. #if defined(POLARSSL_CAMELLIA_C)
  541. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA:
  542. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA:
  543. case TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  544. case TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256:
  545. camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 128 );
  546. camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 128 );
  547. break;
  548. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA:
  549. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA:
  550. case TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  551. case TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256:
  552. camellia_setkey_enc( (camellia_context *) transform->ctx_enc, key1, 256 );
  553. camellia_setkey_dec( (camellia_context *) transform->ctx_dec, key2, 256 );
  554. break;
  555. #endif
  556. #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
  557. #if defined(POLARSSL_CIPHER_NULL_CIPHER)
  558. case TLS_RSA_WITH_NULL_MD5:
  559. case TLS_RSA_WITH_NULL_SHA:
  560. case TLS_RSA_WITH_NULL_SHA256:
  561. break;
  562. #endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
  563. #if defined(POLARSSL_DES_C)
  564. case TLS_RSA_WITH_DES_CBC_SHA:
  565. case TLS_DHE_RSA_WITH_DES_CBC_SHA:
  566. des_setkey_enc( (des_context *) transform->ctx_enc, key1 );
  567. des_setkey_dec( (des_context *) transform->ctx_dec, key2 );
  568. break;
  569. #endif
  570. #endif /* defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES) */
  571. default:
  572. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  573. }
  574. memset( keyblk, 0, sizeof( keyblk ) );
  575. #if defined(POLARSSL_ZLIB_SUPPORT)
  576. // Initialize compression
  577. //
  578. if( session->compression == SSL_COMPRESS_DEFLATE )
  579. {
  580. SSL_DEBUG_MSG( 3, ( "Initializing zlib states" ) );
  581. memset( &transform->ctx_deflate, 0, sizeof( transform->ctx_deflate ) );
  582. memset( &transform->ctx_inflate, 0, sizeof( transform->ctx_inflate ) );
  583. if( deflateInit( &transform->ctx_deflate, Z_DEFAULT_COMPRESSION ) != Z_OK ||
  584. inflateInit( &transform->ctx_inflate ) != Z_OK )
  585. {
  586. SSL_DEBUG_MSG( 1, ( "Failed to initialize compression" ) );
  587. return( POLARSSL_ERR_SSL_COMPRESSION_FAILED );
  588. }
  589. }
  590. #endif /* POLARSSL_ZLIB_SUPPORT */
  591. SSL_DEBUG_MSG( 2, ( "<= derive keys" ) );
  592. return( 0 );
  593. }
  594. void ssl_calc_verify_ssl( ssl_context *ssl, unsigned char hash[36] )
  595. {
  596. md5_context md5;
  597. sha1_context sha1;
  598. unsigned char pad_1[48];
  599. unsigned char pad_2[48];
  600. SSL_DEBUG_MSG( 2, ( "=> calc verify ssl" ) );
  601. memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
  602. memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
  603. memset( pad_1, 0x36, 48 );
  604. memset( pad_2, 0x5C, 48 );
  605. md5_update( &md5, ssl->session_negotiate->master, 48 );
  606. md5_update( &md5, pad_1, 48 );
  607. md5_finish( &md5, hash );
  608. md5_starts( &md5 );
  609. md5_update( &md5, ssl->session_negotiate->master, 48 );
  610. md5_update( &md5, pad_2, 48 );
  611. md5_update( &md5, hash, 16 );
  612. md5_finish( &md5, hash );
  613. sha1_update( &sha1, ssl->session_negotiate->master, 48 );
  614. sha1_update( &sha1, pad_1, 40 );
  615. sha1_finish( &sha1, hash + 16 );
  616. sha1_starts( &sha1 );
  617. sha1_update( &sha1, ssl->session_negotiate->master, 48 );
  618. sha1_update( &sha1, pad_2, 40 );
  619. sha1_update( &sha1, hash + 16, 20 );
  620. sha1_finish( &sha1, hash + 16 );
  621. SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
  622. SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  623. return;
  624. }
  625. void ssl_calc_verify_tls( ssl_context *ssl, unsigned char hash[36] )
  626. {
  627. md5_context md5;
  628. sha1_context sha1;
  629. SSL_DEBUG_MSG( 2, ( "=> calc verify tls" ) );
  630. memcpy( &md5 , &ssl->handshake->fin_md5 , sizeof(md5_context) );
  631. memcpy( &sha1, &ssl->handshake->fin_sha1, sizeof(sha1_context) );
  632. md5_finish( &md5, hash );
  633. sha1_finish( &sha1, hash + 16 );
  634. SSL_DEBUG_BUF( 3, "calculated verify result", hash, 36 );
  635. SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  636. return;
  637. }
  638. void ssl_calc_verify_tls_sha256( ssl_context *ssl, unsigned char hash[32] )
  639. {
  640. sha2_context sha2;
  641. SSL_DEBUG_MSG( 2, ( "=> calc verify sha256" ) );
  642. memcpy( &sha2, &ssl->handshake->fin_sha2, sizeof(sha2_context) );
  643. sha2_finish( &sha2, hash );
  644. SSL_DEBUG_BUF( 3, "calculated verify result", hash, 32 );
  645. SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  646. return;
  647. }
  648. #if defined(POLARSSL_SHA4_C)
  649. void ssl_calc_verify_tls_sha384( ssl_context *ssl, unsigned char hash[48] )
  650. {
  651. sha4_context sha4;
  652. SSL_DEBUG_MSG( 2, ( "=> calc verify sha384" ) );
  653. memcpy( &sha4, &ssl->handshake->fin_sha4, sizeof(sha4_context) );
  654. sha4_finish( &sha4, hash );
  655. SSL_DEBUG_BUF( 3, "calculated verify result", hash, 48 );
  656. SSL_DEBUG_MSG( 2, ( "<= calc verify" ) );
  657. return;
  658. }
  659. #endif
  660. /*
  661. * SSLv3.0 MAC functions
  662. */
  663. static void ssl_mac_md5( unsigned char *secret,
  664. unsigned char *buf, size_t len,
  665. unsigned char *ctr, int type )
  666. {
  667. unsigned char header[11];
  668. unsigned char padding[48];
  669. md5_context md5;
  670. memcpy( header, ctr, 8 );
  671. header[ 8] = (unsigned char) type;
  672. header[ 9] = (unsigned char)( len >> 8 );
  673. header[10] = (unsigned char)( len );
  674. memset( padding, 0x36, 48 );
  675. md5_starts( &md5 );
  676. md5_update( &md5, secret, 16 );
  677. md5_update( &md5, padding, 48 );
  678. md5_update( &md5, header, 11 );
  679. md5_update( &md5, buf, len );
  680. md5_finish( &md5, buf + len );
  681. memset( padding, 0x5C, 48 );
  682. md5_starts( &md5 );
  683. md5_update( &md5, secret, 16 );
  684. md5_update( &md5, padding, 48 );
  685. md5_update( &md5, buf + len, 16 );
  686. md5_finish( &md5, buf + len );
  687. }
  688. static void ssl_mac_sha1( unsigned char *secret,
  689. unsigned char *buf, size_t len,
  690. unsigned char *ctr, int type )
  691. {
  692. unsigned char header[11];
  693. unsigned char padding[40];
  694. sha1_context sha1;
  695. memcpy( header, ctr, 8 );
  696. header[ 8] = (unsigned char) type;
  697. header[ 9] = (unsigned char)( len >> 8 );
  698. header[10] = (unsigned char)( len );
  699. memset( padding, 0x36, 40 );
  700. sha1_starts( &sha1 );
  701. sha1_update( &sha1, secret, 20 );
  702. sha1_update( &sha1, padding, 40 );
  703. sha1_update( &sha1, header, 11 );
  704. sha1_update( &sha1, buf, len );
  705. sha1_finish( &sha1, buf + len );
  706. memset( padding, 0x5C, 40 );
  707. sha1_starts( &sha1 );
  708. sha1_update( &sha1, secret, 20 );
  709. sha1_update( &sha1, padding, 40 );
  710. sha1_update( &sha1, buf + len, 20 );
  711. sha1_finish( &sha1, buf + len );
  712. }
  713. static void ssl_mac_sha2( unsigned char *secret,
  714. unsigned char *buf, size_t len,
  715. unsigned char *ctr, int type )
  716. {
  717. unsigned char header[11];
  718. unsigned char padding[32];
  719. sha2_context sha2;
  720. memcpy( header, ctr, 8 );
  721. header[ 8] = (unsigned char) type;
  722. header[ 9] = (unsigned char)( len >> 8 );
  723. header[10] = (unsigned char)( len );
  724. memset( padding, 0x36, 32 );
  725. sha2_starts( &sha2, 0 );
  726. sha2_update( &sha2, secret, 32 );
  727. sha2_update( &sha2, padding, 32 );
  728. sha2_update( &sha2, header, 11 );
  729. sha2_update( &sha2, buf, len );
  730. sha2_finish( &sha2, buf + len );
  731. memset( padding, 0x5C, 32 );
  732. sha2_starts( &sha2, 0 );
  733. sha2_update( &sha2, secret, 32 );
  734. sha2_update( &sha2, padding, 32 );
  735. sha2_update( &sha2, buf + len, 32 );
  736. sha2_finish( &sha2, buf + len );
  737. }
  738. /*
  739. * Encryption/decryption functions
  740. */
  741. static int ssl_encrypt_buf( ssl_context *ssl )
  742. {
  743. size_t i, padlen;
  744. SSL_DEBUG_MSG( 2, ( "=> encrypt buf" ) );
  745. /*
  746. * Add MAC then encrypt
  747. */
  748. if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
  749. {
  750. if( ssl->transform_out->maclen == 16 )
  751. ssl_mac_md5( ssl->transform_out->mac_enc,
  752. ssl->out_msg, ssl->out_msglen,
  753. ssl->out_ctr, ssl->out_msgtype );
  754. else if( ssl->transform_out->maclen == 20 )
  755. ssl_mac_sha1( ssl->transform_out->mac_enc,
  756. ssl->out_msg, ssl->out_msglen,
  757. ssl->out_ctr, ssl->out_msgtype );
  758. else if( ssl->transform_out->maclen == 32 )
  759. ssl_mac_sha2( ssl->transform_out->mac_enc,
  760. ssl->out_msg, ssl->out_msglen,
  761. ssl->out_ctr, ssl->out_msgtype );
  762. else if( ssl->transform_out->maclen != 0 )
  763. {
  764. SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
  765. ssl->transform_out->maclen ) );
  766. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  767. }
  768. }
  769. else
  770. {
  771. if( ssl->transform_out->maclen == 16 )
  772. {
  773. md5_context ctx;
  774. md5_hmac_starts( &ctx, ssl->transform_out->mac_enc, 16 );
  775. md5_hmac_update( &ctx, ssl->out_ctr, 13 );
  776. md5_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen );
  777. md5_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen );
  778. memset( &ctx, 0, sizeof(md5_context));
  779. }
  780. else if( ssl->transform_out->maclen == 20 )
  781. {
  782. sha1_context ctx;
  783. sha1_hmac_starts( &ctx, ssl->transform_out->mac_enc, 20 );
  784. sha1_hmac_update( &ctx, ssl->out_ctr, 13 );
  785. sha1_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen );
  786. sha1_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen );
  787. memset( &ctx, 0, sizeof(sha1_context));
  788. }
  789. else if( ssl->transform_out->maclen == 32 )
  790. {
  791. sha2_context ctx;
  792. sha2_hmac_starts( &ctx, ssl->transform_out->mac_enc, 32, 0 );
  793. sha2_hmac_update( &ctx, ssl->out_ctr, 13 );
  794. sha2_hmac_update( &ctx, ssl->out_msg, ssl->out_msglen );
  795. sha2_hmac_finish( &ctx, ssl->out_msg + ssl->out_msglen );
  796. memset( &ctx, 0, sizeof(sha2_context));
  797. }
  798. else if( ssl->transform_out->maclen != 0 )
  799. {
  800. SSL_DEBUG_MSG( 1, ( "invalid MAC len: %d",
  801. ssl->transform_out->maclen ) );
  802. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  803. }
  804. }
  805. SSL_DEBUG_BUF( 4, "computed mac",
  806. ssl->out_msg + ssl->out_msglen, ssl->transform_out->maclen );
  807. ssl->out_msglen += ssl->transform_out->maclen;
  808. if( ssl->transform_out->ivlen == 0 )
  809. {
  810. padlen = 0;
  811. SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  812. "including %d bytes of padding",
  813. ssl->out_msglen, 0 ) );
  814. SSL_DEBUG_BUF( 4, "before encrypt: output payload",
  815. ssl->out_msg, ssl->out_msglen );
  816. #if defined(POLARSSL_ARC4_C)
  817. if( ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 ||
  818. ssl->session_out->ciphersuite == TLS_RSA_WITH_RC4_128_SHA )
  819. {
  820. arc4_crypt( (arc4_context *) ssl->transform_out->ctx_enc,
  821. ssl->out_msglen, ssl->out_msg,
  822. ssl->out_msg );
  823. } else
  824. #endif
  825. #if defined(POLARSSL_CIPHER_NULL_CIPHER)
  826. if( ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_MD5 ||
  827. ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA ||
  828. ssl->session_out->ciphersuite == TLS_RSA_WITH_NULL_SHA256 )
  829. {
  830. } else
  831. #endif
  832. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  833. }
  834. else if( ssl->transform_out->ivlen == 12 )
  835. {
  836. size_t enc_msglen;
  837. unsigned char *enc_msg;
  838. unsigned char add_data[13];
  839. int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
  840. padlen = 0;
  841. enc_msglen = ssl->out_msglen;
  842. memcpy( add_data, ssl->out_ctr, 8 );
  843. add_data[8] = ssl->out_msgtype;
  844. add_data[9] = ssl->major_ver;
  845. add_data[10] = ssl->minor_ver;
  846. add_data[11] = ( ssl->out_msglen >> 8 ) & 0xFF;
  847. add_data[12] = ssl->out_msglen & 0xFF;
  848. SSL_DEBUG_BUF( 4, "additional data used for AEAD",
  849. add_data, 13 );
  850. #if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
  851. if( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 ||
  852. ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
  853. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
  854. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
  855. {
  856. /*
  857. * Generate IV
  858. */
  859. ret = ssl->f_rng( ssl->p_rng,
  860. ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
  861. ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
  862. if( ret != 0 )
  863. return( ret );
  864. /*
  865. * Shift message for ivlen bytes and prepend IV
  866. */
  867. memmove( ssl->out_msg + ssl->transform_out->ivlen -
  868. ssl->transform_out->fixed_ivlen,
  869. ssl->out_msg, ssl->out_msglen );
  870. memcpy( ssl->out_msg,
  871. ssl->transform_out->iv_enc + ssl->transform_out->fixed_ivlen,
  872. ssl->transform_out->ivlen - ssl->transform_out->fixed_ivlen );
  873. /*
  874. * Fix pointer positions and message length with added IV
  875. */
  876. enc_msg = ssl->out_msg + ssl->transform_out->ivlen -
  877. ssl->transform_out->fixed_ivlen;
  878. enc_msglen = ssl->out_msglen;
  879. ssl->out_msglen += ssl->transform_out->ivlen -
  880. ssl->transform_out->fixed_ivlen;
  881. SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  882. "including %d bytes of padding",
  883. ssl->out_msglen, 0 ) );
  884. SSL_DEBUG_BUF( 4, "before encrypt: output payload",
  885. ssl->out_msg, ssl->out_msglen );
  886. /*
  887. * Adjust for tag
  888. */
  889. ssl->out_msglen += 16;
  890. gcm_crypt_and_tag( (gcm_context *) ssl->transform_out->ctx_enc,
  891. GCM_ENCRYPT, enc_msglen,
  892. ssl->transform_out->iv_enc, ssl->transform_out->ivlen,
  893. add_data, 13,
  894. enc_msg, enc_msg,
  895. 16, enc_msg + enc_msglen );
  896. SSL_DEBUG_BUF( 4, "after encrypt: tag",
  897. enc_msg + enc_msglen, 16 );
  898. } else
  899. #endif
  900. return( ret );
  901. }
  902. else
  903. {
  904. unsigned char *enc_msg;
  905. size_t enc_msglen;
  906. padlen = ssl->transform_out->ivlen - ( ssl->out_msglen + 1 ) %
  907. ssl->transform_out->ivlen;
  908. if( padlen == ssl->transform_out->ivlen )
  909. padlen = 0;
  910. for( i = 0; i <= padlen; i++ )
  911. ssl->out_msg[ssl->out_msglen + i] = (unsigned char) padlen;
  912. ssl->out_msglen += padlen + 1;
  913. enc_msglen = ssl->out_msglen;
  914. enc_msg = ssl->out_msg;
  915. /*
  916. * Prepend per-record IV for block cipher in TLS v1.1 and up as per
  917. * Method 1 (6.2.3.2. in RFC4346 and RFC5246)
  918. */
  919. if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
  920. {
  921. /*
  922. * Generate IV
  923. */
  924. int ret = ssl->f_rng( ssl->p_rng, ssl->transform_out->iv_enc,
  925. ssl->transform_out->ivlen );
  926. if( ret != 0 )
  927. return( ret );
  928. /*
  929. * Shift message for ivlen bytes and prepend IV
  930. */
  931. memmove( ssl->out_msg + ssl->transform_out->ivlen, ssl->out_msg,
  932. ssl->out_msglen );
  933. memcpy( ssl->out_msg, ssl->transform_out->iv_enc,
  934. ssl->transform_out->ivlen );
  935. /*
  936. * Fix pointer positions and message length with added IV
  937. */
  938. enc_msg = ssl->out_msg + ssl->transform_out->ivlen;
  939. enc_msglen = ssl->out_msglen;
  940. ssl->out_msglen += ssl->transform_out->ivlen;
  941. }
  942. SSL_DEBUG_MSG( 3, ( "before encrypt: msglen = %d, "
  943. "including %d bytes of IV and %d bytes of padding",
  944. ssl->out_msglen, ssl->transform_out->ivlen, padlen + 1 ) );
  945. SSL_DEBUG_BUF( 4, "before encrypt: output payload",
  946. ssl->out_msg, ssl->out_msglen );
  947. switch( ssl->transform_out->ivlen )
  948. {
  949. #if defined(POLARSSL_DES_C)
  950. case 8:
  951. #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
  952. if( ssl->session_out->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA ||
  953. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA )
  954. {
  955. des_crypt_cbc( (des_context *) ssl->transform_out->ctx_enc,
  956. DES_ENCRYPT, enc_msglen,
  957. ssl->transform_out->iv_enc, enc_msg, enc_msg );
  958. }
  959. else
  960. #endif
  961. des3_crypt_cbc( (des3_context *) ssl->transform_out->ctx_enc,
  962. DES_ENCRYPT, enc_msglen,
  963. ssl->transform_out->iv_enc, enc_msg, enc_msg );
  964. break;
  965. #endif
  966. case 16:
  967. #if defined(POLARSSL_AES_C)
  968. if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA ||
  969. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA ||
  970. ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA ||
  971. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA ||
  972. ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 ||
  973. ssl->session_out->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 ||
  974. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ||
  975. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 )
  976. {
  977. aes_crypt_cbc( (aes_context *) ssl->transform_out->ctx_enc,
  978. AES_ENCRYPT, enc_msglen,
  979. ssl->transform_out->iv_enc, enc_msg, enc_msg);
  980. break;
  981. }
  982. #endif
  983. #if defined(POLARSSL_CAMELLIA_C)
  984. if ( ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA ||
  985. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA ||
  986. ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA ||
  987. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA ||
  988. ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
  989. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
  990. ssl->session_out->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 ||
  991. ssl->session_out->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 )
  992. {
  993. camellia_crypt_cbc( (camellia_context *) ssl->transform_out->ctx_enc,
  994. CAMELLIA_ENCRYPT, enc_msglen,
  995. ssl->transform_out->iv_enc, enc_msg, enc_msg );
  996. break;
  997. }
  998. #endif
  999. default:
  1000. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  1001. }
  1002. }
  1003. for( i = 8; i > 0; i-- )
  1004. if( ++ssl->out_ctr[i - 1] != 0 )
  1005. break;
  1006. SSL_DEBUG_MSG( 2, ( "<= encrypt buf" ) );
  1007. return( 0 );
  1008. }
  1009. /*
  1010. * TODO: Use digest version when integrated!
  1011. */
  1012. #define POLARSSL_SSL_MAX_MAC_SIZE 32
  1013. static int ssl_decrypt_buf( ssl_context *ssl )
  1014. {
  1015. size_t i, padlen = 0, correct = 1;
  1016. unsigned char tmp[POLARSSL_SSL_MAX_MAC_SIZE];
  1017. SSL_DEBUG_MSG( 2, ( "=> decrypt buf" ) );
  1018. if( ssl->in_msglen < ssl->transform_in->minlen )
  1019. {
  1020. SSL_DEBUG_MSG( 1, ( "in_msglen (%d) < minlen (%d)",
  1021. ssl->in_msglen, ssl->transform_in->minlen ) );
  1022. return( POLARSSL_ERR_SSL_INVALID_MAC );
  1023. }
  1024. if( ssl->transform_in->ivlen == 0 )
  1025. {
  1026. #if defined(POLARSSL_ARC4_C)
  1027. if( ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_MD5 ||
  1028. ssl->session_in->ciphersuite == TLS_RSA_WITH_RC4_128_SHA )
  1029. {
  1030. arc4_crypt( (arc4_context *) ssl->transform_in->ctx_dec,
  1031. ssl->in_msglen, ssl->in_msg,
  1032. ssl->in_msg );
  1033. } else
  1034. #endif
  1035. #if defined(POLARSSL_CIPHER_NULL_CIPHER)
  1036. if( ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_MD5 ||
  1037. ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA ||
  1038. ssl->session_in->ciphersuite == TLS_RSA_WITH_NULL_SHA256 )
  1039. {
  1040. } else
  1041. #endif
  1042. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  1043. }
  1044. else if( ssl->transform_in->ivlen == 12 )
  1045. {
  1046. unsigned char *dec_msg;
  1047. unsigned char *dec_msg_result;
  1048. size_t dec_msglen;
  1049. unsigned char add_data[13];
  1050. int ret = POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE;
  1051. #if defined(POLARSSL_AES_C) && defined(POLARSSL_GCM_C)
  1052. if( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_GCM_SHA256 ||
  1053. ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_GCM_SHA384 ||
  1054. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
  1055. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_GCM_SHA384 )
  1056. {
  1057. dec_msglen = ssl->in_msglen - ( ssl->transform_in->ivlen -
  1058. ssl->transform_in->fixed_ivlen );
  1059. dec_msglen -= 16;
  1060. dec_msg = ssl->in_msg + ( ssl->transform_in->ivlen -
  1061. ssl->transform_in->fixed_ivlen );
  1062. dec_msg_result = ssl->in_msg;
  1063. ssl->in_msglen = dec_msglen;
  1064. memcpy( add_data, ssl->in_ctr, 8 );
  1065. add_data[8] = ssl->in_msgtype;
  1066. add_data[9] = ssl->major_ver;
  1067. add_data[10] = ssl->minor_ver;
  1068. add_data[11] = ( ssl->in_msglen >> 8 ) & 0xFF;
  1069. add_data[12] = ssl->in_msglen & 0xFF;
  1070. SSL_DEBUG_BUF( 4, "additional data used for AEAD",
  1071. add_data, 13 );
  1072. memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
  1073. ssl->in_msg,
  1074. ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
  1075. SSL_DEBUG_BUF( 4, "IV used", ssl->transform_in->iv_dec,
  1076. ssl->transform_in->ivlen );
  1077. SSL_DEBUG_BUF( 4, "TAG used", dec_msg + dec_msglen, 16 );
  1078. memcpy( ssl->transform_in->iv_dec + ssl->transform_in->fixed_ivlen,
  1079. ssl->in_msg,
  1080. ssl->transform_in->ivlen - ssl->transform_in->fixed_ivlen );
  1081. ret = gcm_auth_decrypt( (gcm_context *) ssl->transform_in->ctx_dec,
  1082. dec_msglen,
  1083. ssl->transform_in->iv_dec,
  1084. ssl->transform_in->ivlen,
  1085. add_data, 13,
  1086. dec_msg + dec_msglen, 16,
  1087. dec_msg, dec_msg_result );
  1088. if( ret != 0 )
  1089. {
  1090. SSL_DEBUG_MSG( 1, ( "AEAD decrypt failed on validation (ret = -0x%02x)",
  1091. -ret ) );
  1092. return( POLARSSL_ERR_SSL_INVALID_MAC );
  1093. }
  1094. } else
  1095. #endif
  1096. return( ret );
  1097. }
  1098. else
  1099. {
  1100. /*
  1101. * Decrypt and check the padding
  1102. */
  1103. unsigned char *dec_msg;
  1104. unsigned char *dec_msg_result;
  1105. size_t dec_msglen;
  1106. size_t minlen = 0, fake_padlen;
  1107. /*
  1108. * Check immediate ciphertext sanity
  1109. */
  1110. if( ssl->in_msglen % ssl->transform_in->ivlen != 0 )
  1111. {
  1112. SSL_DEBUG_MSG( 1, ( "msglen (%d) %% ivlen (%d) != 0",
  1113. ssl->in_msglen, ssl->transform_in->ivlen ) );
  1114. return( POLARSSL_ERR_SSL_INVALID_MAC );
  1115. }
  1116. if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
  1117. minlen += ssl->transform_in->ivlen;
  1118. if( ssl->in_msglen < minlen + ssl->transform_in->ivlen ||
  1119. ssl->in_msglen < minlen + ssl->transform_in->maclen + 1 )
  1120. {
  1121. SSL_DEBUG_MSG( 1, ( "msglen (%d) < max( ivlen(%d), maclen (%d) + 1 ) ( + expl IV )",
  1122. ssl->in_msglen, ssl->transform_in->ivlen, ssl->transform_in->maclen ) );
  1123. return( POLARSSL_ERR_SSL_INVALID_MAC );
  1124. }
  1125. dec_msglen = ssl->in_msglen;
  1126. dec_msg = ssl->in_msg;
  1127. dec_msg_result = ssl->in_msg;
  1128. /*
  1129. * Initialize for prepended IV for block cipher in TLS v1.1 and up
  1130. */
  1131. if( ssl->minor_ver >= SSL_MINOR_VERSION_2 )
  1132. {
  1133. dec_msg += ssl->transform_in->ivlen;
  1134. dec_msglen -= ssl->transform_in->ivlen;
  1135. ssl->in_msglen -= ssl->transform_in->ivlen;
  1136. for( i = 0; i < ssl->transform_in->ivlen; i++ )
  1137. ssl->transform_in->iv_dec[i] = ssl->in_msg[i];
  1138. }
  1139. switch( ssl->transform_in->ivlen )
  1140. {
  1141. #if defined(POLARSSL_DES_C)
  1142. case 8:
  1143. #if defined(POLARSSL_ENABLE_WEAK_CIPHERSUITES)
  1144. if( ssl->session_in->ciphersuite == TLS_RSA_WITH_DES_CBC_SHA ||
  1145. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_DES_CBC_SHA )
  1146. {
  1147. des_crypt_cbc( (des_context *) ssl->transform_in->ctx_dec,
  1148. DES_DECRYPT, dec_msglen,
  1149. ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
  1150. }
  1151. else
  1152. #endif
  1153. des3_crypt_cbc( (des3_context *) ssl->transform_in->ctx_dec,
  1154. DES_DECRYPT, dec_msglen,
  1155. ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
  1156. break;
  1157. #endif
  1158. case 16:
  1159. #if defined(POLARSSL_AES_C)
  1160. if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA ||
  1161. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA ||
  1162. ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA ||
  1163. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA ||
  1164. ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_128_CBC_SHA256 ||
  1165. ssl->session_in->ciphersuite == TLS_RSA_WITH_AES_256_CBC_SHA256 ||
  1166. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_128_CBC_SHA256 ||
  1167. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_AES_256_CBC_SHA256 )
  1168. {
  1169. aes_crypt_cbc( (aes_context *) ssl->transform_in->ctx_dec,
  1170. AES_DECRYPT, dec_msglen,
  1171. ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
  1172. break;
  1173. }
  1174. #endif
  1175. #if defined(POLARSSL_CAMELLIA_C)
  1176. if ( ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA ||
  1177. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA ||
  1178. ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA ||
  1179. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA ||
  1180. ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
  1181. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256 ||
  1182. ssl->session_in->ciphersuite == TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256 ||
  1183. ssl->session_in->ciphersuite == TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256 )
  1184. {
  1185. camellia_crypt_cbc( (camellia_context *) ssl->transform_in->ctx_dec,
  1186. CAMELLIA_DECRYPT, dec_msglen,
  1187. ssl->transform_in->iv_dec, dec_msg, dec_msg_result );
  1188. break;
  1189. }
  1190. #endif
  1191. default:
  1192. return( POLARSSL_ERR_SSL_FEATURE_UNAVAILABLE );
  1193. }
  1194. padlen = 1 + ssl->in_msg[ssl->in_msglen - 1];
  1195. fake_padlen = 256 - padlen;
  1196. if( ssl->in_msglen < ssl->transform_in->maclen + padlen )
  1197. {
  1198. #if defined(POLARSSL_SSL_DEBUG_ALL)
  1199. SSL_DEBUG_MSG( 1, ( "msglen (%d) < maclen (%d) + padlen (%d)",
  1200. ssl->in_msglen, ssl->transform_in->maclen, padlen ) );
  1201. #endif
  1202. padlen = 0;
  1203. fake_padlen = 256;
  1204. correct = 0;
  1205. }
  1206. if( ssl->minor_ver == SSL_MINOR_VERSION_0 )
  1207. {
  1208. if( padlen > ssl->transform_in->ivlen )
  1209. {
  1210. #if defined(POLARSSL_SSL_DEBUG_ALL)
  1211. SSL_DEBUG_MSG( 1, ( "bad padding length: is %d, "
  1212. "should be no more than %d",
  1213. padlen, ssl->transform_in->ivlen ) );
  1214. #endif
  1215. correct = 0;
  1216. }

Large files files are truncated, but you can click here to view the full file