tlsv1_common.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. /*
  2. * TLSv1 common routines
  3. * Copyright (c) 2006-2014, Jouni Malinen <j@w1.fi>
  4. *
  5. * This software may be distributed under the terms of the BSD license.
  6. * See README for more details.
  7. */
  8. #include "includes.h"
  9. #include "common.h"
  10. #include "crypto/md5.h"
  11. #include "crypto/sha1.h"
  12. #include "crypto/sha256.h"
  13. #include "x509v3.h"
  14. #include "tlsv1_common.h"
  15. /*
  16. * TODO:
  17. * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  18. * Add support for commonly used cipher suites; don't bother with exportable
  19. * suites.
  20. */
  21. static const struct tls_cipher_suite tls_cipher_suites[] = {
  22. { TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
  23. TLS_HASH_NULL },
  24. { TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  25. TLS_HASH_MD5 },
  26. { TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  27. TLS_HASH_SHA },
  28. { TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
  29. TLS_HASH_SHA },
  30. { TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
  31. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  32. { TLS_DHE_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_DHE_RSA, TLS_CIPHER_DES_CBC,
  33. TLS_HASH_SHA},
  34. { TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DHE_RSA,
  35. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  36. { TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
  37. TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
  38. { TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
  39. TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
  40. { TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
  41. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  42. { TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
  43. TLS_HASH_SHA },
  44. { TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_DHE_RSA,
  45. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
  46. { TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
  47. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
  48. { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
  49. TLS_HASH_SHA },
  50. { TLS_DHE_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_DHE_RSA,
  51. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
  52. { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
  53. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
  54. { TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
  55. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
  56. { TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
  57. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
  58. { TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DHE_RSA,
  59. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
  60. { TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DHE_RSA,
  61. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
  62. { TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
  63. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
  64. { TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
  65. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
  66. };
  67. #define NUM_TLS_CIPHER_SUITES ARRAY_SIZE(tls_cipher_suites)
  68. static const struct tls_cipher_data tls_ciphers[] = {
  69. { TLS_CIPHER_NULL, TLS_CIPHER_STREAM, 0, 0, 0,
  70. CRYPTO_CIPHER_NULL },
  71. { TLS_CIPHER_IDEA_CBC, TLS_CIPHER_BLOCK, 16, 16, 8,
  72. CRYPTO_CIPHER_NULL },
  73. { TLS_CIPHER_RC2_CBC_40, TLS_CIPHER_BLOCK, 5, 16, 0,
  74. CRYPTO_CIPHER_ALG_RC2 },
  75. { TLS_CIPHER_RC4_40, TLS_CIPHER_STREAM, 5, 16, 0,
  76. CRYPTO_CIPHER_ALG_RC4 },
  77. { TLS_CIPHER_RC4_128, TLS_CIPHER_STREAM, 16, 16, 0,
  78. CRYPTO_CIPHER_ALG_RC4 },
  79. { TLS_CIPHER_DES40_CBC, TLS_CIPHER_BLOCK, 5, 8, 8,
  80. CRYPTO_CIPHER_ALG_DES },
  81. { TLS_CIPHER_DES_CBC, TLS_CIPHER_BLOCK, 8, 8, 8,
  82. CRYPTO_CIPHER_ALG_DES },
  83. { TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK, 24, 24, 8,
  84. CRYPTO_CIPHER_ALG_3DES },
  85. { TLS_CIPHER_AES_128_CBC, TLS_CIPHER_BLOCK, 16, 16, 16,
  86. CRYPTO_CIPHER_ALG_AES },
  87. { TLS_CIPHER_AES_256_CBC, TLS_CIPHER_BLOCK, 32, 32, 16,
  88. CRYPTO_CIPHER_ALG_AES }
  89. };
  90. #define NUM_TLS_CIPHER_DATA ARRAY_SIZE(tls_ciphers)
  91. /**
  92. * tls_get_cipher_suite - Get TLS cipher suite
  93. * @suite: Cipher suite identifier
  94. * Returns: Pointer to the cipher data or %NULL if not found
  95. */
  96. const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
  97. {
  98. size_t i;
  99. for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
  100. if (tls_cipher_suites[i].suite == suite)
  101. return &tls_cipher_suites[i];
  102. return NULL;
  103. }
  104. const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
  105. {
  106. size_t i;
  107. for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
  108. if (tls_ciphers[i].cipher == cipher)
  109. return &tls_ciphers[i];
  110. return NULL;
  111. }
  112. int tls_server_key_exchange_allowed(tls_cipher cipher)
  113. {
  114. const struct tls_cipher_suite *suite;
  115. /* RFC 2246, Section 7.4.3 */
  116. suite = tls_get_cipher_suite(cipher);
  117. if (suite == NULL)
  118. return 0;
  119. switch (suite->key_exchange) {
  120. case TLS_KEY_X_DHE_DSS:
  121. case TLS_KEY_X_DHE_DSS_EXPORT:
  122. case TLS_KEY_X_DHE_RSA:
  123. case TLS_KEY_X_DHE_RSA_EXPORT:
  124. case TLS_KEY_X_DH_anon_EXPORT:
  125. case TLS_KEY_X_DH_anon:
  126. return 1;
  127. case TLS_KEY_X_RSA_EXPORT:
  128. return 1 /* FIX: public key len > 512 bits */;
  129. default:
  130. return 0;
  131. }
  132. }
  133. /**
  134. * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
  135. * @buf: ASN.1 DER encoded certificate
  136. * @len: Length of the buffer
  137. * @pk: Buffer for returning the allocated public key
  138. * Returns: 0 on success, -1 on failure
  139. *
  140. * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
  141. * the public key from it. The caller is responsible for freeing the public key
  142. * by calling crypto_public_key_free().
  143. */
  144. int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
  145. {
  146. struct x509_certificate *cert;
  147. wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
  148. buf, len);
  149. *pk = crypto_public_key_from_cert(buf, len);
  150. if (*pk)
  151. return 0;
  152. cert = x509_certificate_parse(buf, len);
  153. if (cert == NULL) {
  154. wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
  155. "certificate");
  156. return -1;
  157. }
  158. /* TODO
  159. * verify key usage (must allow encryption)
  160. *
  161. * All certificate profiles, key and cryptographic formats are
  162. * defined by the IETF PKIX working group [PKIX]. When a key
  163. * usage extension is present, the digitalSignature bit must be
  164. * set for the key to be eligible for signing, as described
  165. * above, and the keyEncipherment bit must be present to allow
  166. * encryption, as described above. The keyAgreement bit must be
  167. * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
  168. */
  169. *pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
  170. x509_certificate_free(cert);
  171. if (*pk == NULL) {
  172. wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
  173. "server public key");
  174. return -1;
  175. }
  176. return 0;
  177. }
  178. int tls_verify_hash_init(struct tls_verify_hash *verify)
  179. {
  180. tls_verify_hash_free(verify);
  181. verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  182. verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  183. verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  184. verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  185. verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  186. verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  187. if (verify->md5_client == NULL || verify->md5_server == NULL ||
  188. verify->md5_cert == NULL || verify->sha1_client == NULL ||
  189. verify->sha1_server == NULL || verify->sha1_cert == NULL) {
  190. tls_verify_hash_free(verify);
  191. return -1;
  192. }
  193. #ifdef CONFIG_TLSV12
  194. verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  195. 0);
  196. verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  197. 0);
  198. verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  199. 0);
  200. if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
  201. verify->sha256_cert == NULL) {
  202. tls_verify_hash_free(verify);
  203. return -1;
  204. }
  205. #endif /* CONFIG_TLSV12 */
  206. return 0;
  207. }
  208. void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
  209. size_t len)
  210. {
  211. if (verify->md5_client && verify->sha1_client) {
  212. crypto_hash_update(verify->md5_client, buf, len);
  213. crypto_hash_update(verify->sha1_client, buf, len);
  214. }
  215. if (verify->md5_server && verify->sha1_server) {
  216. crypto_hash_update(verify->md5_server, buf, len);
  217. crypto_hash_update(verify->sha1_server, buf, len);
  218. }
  219. if (verify->md5_cert && verify->sha1_cert) {
  220. crypto_hash_update(verify->md5_cert, buf, len);
  221. crypto_hash_update(verify->sha1_cert, buf, len);
  222. }
  223. #ifdef CONFIG_TLSV12
  224. if (verify->sha256_client)
  225. crypto_hash_update(verify->sha256_client, buf, len);
  226. if (verify->sha256_server)
  227. crypto_hash_update(verify->sha256_server, buf, len);
  228. if (verify->sha256_cert)
  229. crypto_hash_update(verify->sha256_cert, buf, len);
  230. #endif /* CONFIG_TLSV12 */
  231. }
  232. void tls_verify_hash_free(struct tls_verify_hash *verify)
  233. {
  234. crypto_hash_finish(verify->md5_client, NULL, NULL);
  235. crypto_hash_finish(verify->md5_server, NULL, NULL);
  236. crypto_hash_finish(verify->md5_cert, NULL, NULL);
  237. crypto_hash_finish(verify->sha1_client, NULL, NULL);
  238. crypto_hash_finish(verify->sha1_server, NULL, NULL);
  239. crypto_hash_finish(verify->sha1_cert, NULL, NULL);
  240. verify->md5_client = NULL;
  241. verify->md5_server = NULL;
  242. verify->md5_cert = NULL;
  243. verify->sha1_client = NULL;
  244. verify->sha1_server = NULL;
  245. verify->sha1_cert = NULL;
  246. #ifdef CONFIG_TLSV12
  247. crypto_hash_finish(verify->sha256_client, NULL, NULL);
  248. crypto_hash_finish(verify->sha256_server, NULL, NULL);
  249. crypto_hash_finish(verify->sha256_cert, NULL, NULL);
  250. verify->sha256_client = NULL;
  251. verify->sha256_server = NULL;
  252. verify->sha256_cert = NULL;
  253. #endif /* CONFIG_TLSV12 */
  254. }
  255. int tls_version_ok(u16 ver)
  256. {
  257. if (ver == TLS_VERSION_1)
  258. return 1;
  259. #ifdef CONFIG_TLSV11
  260. if (ver == TLS_VERSION_1_1)
  261. return 1;
  262. #endif /* CONFIG_TLSV11 */
  263. #ifdef CONFIG_TLSV12
  264. if (ver == TLS_VERSION_1_2)
  265. return 1;
  266. #endif /* CONFIG_TLSV12 */
  267. return 0;
  268. }
  269. const char * tls_version_str(u16 ver)
  270. {
  271. switch (ver) {
  272. case TLS_VERSION_1:
  273. return "1.0";
  274. case TLS_VERSION_1_1:
  275. return "1.1";
  276. case TLS_VERSION_1_2:
  277. return "1.2";
  278. }
  279. return "?";
  280. }
  281. int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label,
  282. const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
  283. {
  284. #ifdef CONFIG_TLSV12
  285. if (ver >= TLS_VERSION_1_2) {
  286. tls_prf_sha256(secret, secret_len, label, seed, seed_len,
  287. out, outlen);
  288. return 0;
  289. }
  290. #endif /* CONFIG_TLSV12 */
  291. return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
  292. outlen);
  293. }
  294. #ifdef CONFIG_TLSV12
  295. int tlsv12_key_x_server_params_hash(u16 tls_version,
  296. const u8 *client_random,
  297. const u8 *server_random,
  298. const u8 *server_params,
  299. size_t server_params_len, u8 *hash)
  300. {
  301. size_t hlen;
  302. struct crypto_hash *ctx;
  303. ctx = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL, 0);
  304. if (ctx == NULL)
  305. return -1;
  306. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  307. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  308. crypto_hash_update(ctx, server_params, server_params_len);
  309. hlen = SHA256_MAC_LEN;
  310. if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  311. return -1;
  312. return hlen;
  313. }
  314. #endif /* CONFIG_TLSV12 */
  315. int tls_key_x_server_params_hash(u16 tls_version, const u8 *client_random,
  316. const u8 *server_random,
  317. const u8 *server_params,
  318. size_t server_params_len, u8 *hash)
  319. {
  320. u8 *hpos;
  321. size_t hlen;
  322. struct crypto_hash *ctx;
  323. hpos = hash;
  324. ctx = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  325. if (ctx == NULL)
  326. return -1;
  327. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  328. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  329. crypto_hash_update(ctx, server_params, server_params_len);
  330. hlen = MD5_MAC_LEN;
  331. if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  332. return -1;
  333. hpos += hlen;
  334. ctx = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  335. if (ctx == NULL)
  336. return -1;
  337. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  338. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  339. crypto_hash_update(ctx, server_params, server_params_len);
  340. hlen = hash + sizeof(hash) - hpos;
  341. if (crypto_hash_finish(ctx, hpos, &hlen) < 0)
  342. return -1;
  343. hpos += hlen;
  344. return hpos - hash;
  345. }
  346. int tls_verify_signature(u16 tls_version, struct crypto_public_key *pk,
  347. const u8 *data, size_t data_len,
  348. const u8 *pos, size_t len, u8 *alert)
  349. {
  350. u8 *buf;
  351. const u8 *end = pos + len;
  352. const u8 *decrypted;
  353. u16 slen;
  354. size_t buflen;
  355. if (end - pos < 2) {
  356. *alert = TLS_ALERT_DECODE_ERROR;
  357. return -1;
  358. }
  359. slen = WPA_GET_BE16(pos);
  360. pos += 2;
  361. if (end - pos < slen) {
  362. *alert = TLS_ALERT_DECODE_ERROR;
  363. return -1;
  364. }
  365. if (end - pos > slen) {
  366. wpa_hexdump(MSG_MSGDUMP, "Additional data after Signature",
  367. pos + slen, end - pos - slen);
  368. end = pos + slen;
  369. }
  370. wpa_hexdump(MSG_MSGDUMP, "TLSv1: Signature", pos, end - pos);
  371. if (pk == NULL) {
  372. wpa_printf(MSG_DEBUG, "TLSv1: No public key to verify signature");
  373. *alert = TLS_ALERT_INTERNAL_ERROR;
  374. return -1;
  375. }
  376. buflen = end - pos;
  377. buf = os_malloc(end - pos);
  378. if (buf == NULL) {
  379. *alert = TLS_ALERT_INTERNAL_ERROR;
  380. return -1;
  381. }
  382. if (crypto_public_key_decrypt_pkcs1(pk, pos, end - pos, buf, &buflen) <
  383. 0) {
  384. wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt signature");
  385. os_free(buf);
  386. *alert = TLS_ALERT_DECRYPT_ERROR;
  387. return -1;
  388. }
  389. decrypted = buf;
  390. wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Decrypted Signature",
  391. decrypted, buflen);
  392. #ifdef CONFIG_TLSV12
  393. if (tls_version >= TLS_VERSION_1_2) {
  394. /*
  395. * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
  396. *
  397. * DigestInfo ::= SEQUENCE {
  398. * digestAlgorithm DigestAlgorithm,
  399. * digest OCTET STRING
  400. * }
  401. *
  402. * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
  403. *
  404. * DER encoded DigestInfo for SHA256 per RFC 3447:
  405. * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 ||
  406. * H
  407. */
  408. if (buflen >= 19 + 32 &&
  409. os_memcmp(buf, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01"
  410. "\x65\x03\x04\x02\x01\x05\x00\x04\x20", 19) == 0)
  411. {
  412. wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithn = SHA-256");
  413. decrypted = buf + 19;
  414. buflen -= 19;
  415. } else {
  416. wpa_printf(MSG_DEBUG, "TLSv1.2: Unrecognized DigestInfo");
  417. os_free(buf);
  418. *alert = TLS_ALERT_DECRYPT_ERROR;
  419. return -1;
  420. }
  421. }
  422. #endif /* CONFIG_TLSV12 */
  423. if (buflen != data_len ||
  424. os_memcmp_const(decrypted, data, data_len) != 0) {
  425. wpa_printf(MSG_DEBUG, "TLSv1: Invalid Signature in CertificateVerify - did not match calculated hash");
  426. os_free(buf);
  427. *alert = TLS_ALERT_DECRYPT_ERROR;
  428. return -1;
  429. }
  430. os_free(buf);
  431. return 0;
  432. }