tlsv1_common.c 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322
  1. /*
  2. * TLSv1 common routines
  3. * Copyright (c) 2006-2011, 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/sha1.h"
  11. #include "crypto/sha256.h"
  12. #include "x509v3.h"
  13. #include "tlsv1_common.h"
  14. /*
  15. * TODO:
  16. * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  17. * Add support for commonly used cipher suites; don't bother with exportable
  18. * suites.
  19. */
  20. static const struct tls_cipher_suite tls_cipher_suites[] = {
  21. { TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
  22. TLS_HASH_NULL },
  23. { TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  24. TLS_HASH_MD5 },
  25. { TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  26. TLS_HASH_SHA },
  27. { TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
  28. TLS_HASH_SHA },
  29. { TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
  30. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  31. { TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
  32. TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
  33. { TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
  34. TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
  35. { TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
  36. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  37. { TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
  38. TLS_HASH_SHA },
  39. { TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
  40. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
  41. { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
  42. TLS_HASH_SHA },
  43. { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
  44. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
  45. { TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
  46. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
  47. { TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
  48. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
  49. { TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
  50. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
  51. { TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
  52. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
  53. };
  54. #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
  55. #define NUM_TLS_CIPHER_SUITES NUM_ELEMS(tls_cipher_suites)
  56. static const struct tls_cipher_data tls_ciphers[] = {
  57. { TLS_CIPHER_NULL, TLS_CIPHER_STREAM, 0, 0, 0,
  58. CRYPTO_CIPHER_NULL },
  59. { TLS_CIPHER_IDEA_CBC, TLS_CIPHER_BLOCK, 16, 16, 8,
  60. CRYPTO_CIPHER_NULL },
  61. { TLS_CIPHER_RC2_CBC_40, TLS_CIPHER_BLOCK, 5, 16, 0,
  62. CRYPTO_CIPHER_ALG_RC2 },
  63. { TLS_CIPHER_RC4_40, TLS_CIPHER_STREAM, 5, 16, 0,
  64. CRYPTO_CIPHER_ALG_RC4 },
  65. { TLS_CIPHER_RC4_128, TLS_CIPHER_STREAM, 16, 16, 0,
  66. CRYPTO_CIPHER_ALG_RC4 },
  67. { TLS_CIPHER_DES40_CBC, TLS_CIPHER_BLOCK, 5, 8, 8,
  68. CRYPTO_CIPHER_ALG_DES },
  69. { TLS_CIPHER_DES_CBC, TLS_CIPHER_BLOCK, 8, 8, 8,
  70. CRYPTO_CIPHER_ALG_DES },
  71. { TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK, 24, 24, 8,
  72. CRYPTO_CIPHER_ALG_3DES },
  73. { TLS_CIPHER_AES_128_CBC, TLS_CIPHER_BLOCK, 16, 16, 16,
  74. CRYPTO_CIPHER_ALG_AES },
  75. { TLS_CIPHER_AES_256_CBC, TLS_CIPHER_BLOCK, 32, 32, 16,
  76. CRYPTO_CIPHER_ALG_AES }
  77. };
  78. #define NUM_TLS_CIPHER_DATA NUM_ELEMS(tls_ciphers)
  79. /**
  80. * tls_get_cipher_suite - Get TLS cipher suite
  81. * @suite: Cipher suite identifier
  82. * Returns: Pointer to the cipher data or %NULL if not found
  83. */
  84. const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
  85. {
  86. size_t i;
  87. for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
  88. if (tls_cipher_suites[i].suite == suite)
  89. return &tls_cipher_suites[i];
  90. return NULL;
  91. }
  92. const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
  93. {
  94. size_t i;
  95. for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
  96. if (tls_ciphers[i].cipher == cipher)
  97. return &tls_ciphers[i];
  98. return NULL;
  99. }
  100. int tls_server_key_exchange_allowed(tls_cipher cipher)
  101. {
  102. const struct tls_cipher_suite *suite;
  103. /* RFC 2246, Section 7.4.3 */
  104. suite = tls_get_cipher_suite(cipher);
  105. if (suite == NULL)
  106. return 0;
  107. switch (suite->key_exchange) {
  108. case TLS_KEY_X_DHE_DSS:
  109. case TLS_KEY_X_DHE_DSS_EXPORT:
  110. case TLS_KEY_X_DHE_RSA:
  111. case TLS_KEY_X_DHE_RSA_EXPORT:
  112. case TLS_KEY_X_DH_anon_EXPORT:
  113. case TLS_KEY_X_DH_anon:
  114. return 1;
  115. case TLS_KEY_X_RSA_EXPORT:
  116. return 1 /* FIX: public key len > 512 bits */;
  117. default:
  118. return 0;
  119. }
  120. }
  121. /**
  122. * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
  123. * @buf: ASN.1 DER encoded certificate
  124. * @len: Length of the buffer
  125. * @pk: Buffer for returning the allocated public key
  126. * Returns: 0 on success, -1 on failure
  127. *
  128. * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
  129. * the public key from it. The caller is responsible for freeing the public key
  130. * by calling crypto_public_key_free().
  131. */
  132. int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
  133. {
  134. struct x509_certificate *cert;
  135. wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
  136. buf, len);
  137. *pk = crypto_public_key_from_cert(buf, len);
  138. if (*pk)
  139. return 0;
  140. cert = x509_certificate_parse(buf, len);
  141. if (cert == NULL) {
  142. wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
  143. "certificate");
  144. return -1;
  145. }
  146. /* TODO
  147. * verify key usage (must allow encryption)
  148. *
  149. * All certificate profiles, key and cryptographic formats are
  150. * defined by the IETF PKIX working group [PKIX]. When a key
  151. * usage extension is present, the digitalSignature bit must be
  152. * set for the key to be eligible for signing, as described
  153. * above, and the keyEncipherment bit must be present to allow
  154. * encryption, as described above. The keyAgreement bit must be
  155. * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
  156. */
  157. *pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
  158. x509_certificate_free(cert);
  159. if (*pk == NULL) {
  160. wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
  161. "server public key");
  162. return -1;
  163. }
  164. return 0;
  165. }
  166. int tls_verify_hash_init(struct tls_verify_hash *verify)
  167. {
  168. tls_verify_hash_free(verify);
  169. verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  170. verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  171. verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  172. verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  173. verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  174. verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  175. if (verify->md5_client == NULL || verify->md5_server == NULL ||
  176. verify->md5_cert == NULL || verify->sha1_client == NULL ||
  177. verify->sha1_server == NULL || verify->sha1_cert == NULL) {
  178. tls_verify_hash_free(verify);
  179. return -1;
  180. }
  181. #ifdef CONFIG_TLSV12
  182. verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  183. 0);
  184. verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  185. 0);
  186. verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
  187. 0);
  188. if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
  189. verify->sha256_cert == NULL) {
  190. tls_verify_hash_free(verify);
  191. return -1;
  192. }
  193. #endif /* CONFIG_TLSV12 */
  194. return 0;
  195. }
  196. void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
  197. size_t len)
  198. {
  199. if (verify->md5_client && verify->sha1_client) {
  200. crypto_hash_update(verify->md5_client, buf, len);
  201. crypto_hash_update(verify->sha1_client, buf, len);
  202. }
  203. if (verify->md5_server && verify->sha1_server) {
  204. crypto_hash_update(verify->md5_server, buf, len);
  205. crypto_hash_update(verify->sha1_server, buf, len);
  206. }
  207. if (verify->md5_cert && verify->sha1_cert) {
  208. crypto_hash_update(verify->md5_cert, buf, len);
  209. crypto_hash_update(verify->sha1_cert, buf, len);
  210. }
  211. #ifdef CONFIG_TLSV12
  212. if (verify->sha256_client)
  213. crypto_hash_update(verify->sha256_client, buf, len);
  214. if (verify->sha256_server)
  215. crypto_hash_update(verify->sha256_server, buf, len);
  216. if (verify->sha256_cert)
  217. crypto_hash_update(verify->sha256_cert, buf, len);
  218. #endif /* CONFIG_TLSV12 */
  219. }
  220. void tls_verify_hash_free(struct tls_verify_hash *verify)
  221. {
  222. crypto_hash_finish(verify->md5_client, NULL, NULL);
  223. crypto_hash_finish(verify->md5_server, NULL, NULL);
  224. crypto_hash_finish(verify->md5_cert, NULL, NULL);
  225. crypto_hash_finish(verify->sha1_client, NULL, NULL);
  226. crypto_hash_finish(verify->sha1_server, NULL, NULL);
  227. crypto_hash_finish(verify->sha1_cert, NULL, NULL);
  228. verify->md5_client = NULL;
  229. verify->md5_server = NULL;
  230. verify->md5_cert = NULL;
  231. verify->sha1_client = NULL;
  232. verify->sha1_server = NULL;
  233. verify->sha1_cert = NULL;
  234. #ifdef CONFIG_TLSV12
  235. crypto_hash_finish(verify->sha256_client, NULL, NULL);
  236. crypto_hash_finish(verify->sha256_server, NULL, NULL);
  237. crypto_hash_finish(verify->sha256_cert, NULL, NULL);
  238. verify->sha256_client = NULL;
  239. verify->sha256_server = NULL;
  240. verify->sha256_cert = NULL;
  241. #endif /* CONFIG_TLSV12 */
  242. }
  243. int tls_version_ok(u16 ver)
  244. {
  245. if (ver == TLS_VERSION_1)
  246. return 1;
  247. #ifdef CONFIG_TLSV11
  248. if (ver == TLS_VERSION_1_1)
  249. return 1;
  250. #endif /* CONFIG_TLSV11 */
  251. #ifdef CONFIG_TLSV12
  252. if (ver == TLS_VERSION_1_2)
  253. return 1;
  254. #endif /* CONFIG_TLSV12 */
  255. return 0;
  256. }
  257. const char * tls_version_str(u16 ver)
  258. {
  259. switch (ver) {
  260. case TLS_VERSION_1:
  261. return "1.0";
  262. case TLS_VERSION_1_1:
  263. return "1.1";
  264. case TLS_VERSION_1_2:
  265. return "1.2";
  266. }
  267. return "?";
  268. }
  269. int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label,
  270. const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
  271. {
  272. #ifdef CONFIG_TLSV12
  273. if (ver >= TLS_VERSION_1_2) {
  274. tls_prf_sha256(secret, secret_len, label, seed, seed_len,
  275. out, outlen);
  276. return 0;
  277. }
  278. #endif /* CONFIG_TLSV12 */
  279. return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
  280. outlen);
  281. }