tlsv1_common.c 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. /*
  2. * TLSv1 common routines
  3. * Copyright (c) 2006-2007, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. #include "includes.h"
  15. #include "common.h"
  16. #include "x509v3.h"
  17. #include "tlsv1_common.h"
  18. /*
  19. * TODO:
  20. * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
  21. * Add support for commonly used cipher suites; don't bother with exportable
  22. * suites.
  23. */
  24. static const struct tls_cipher_suite tls_cipher_suites[] = {
  25. { TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
  26. TLS_HASH_NULL },
  27. { TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  28. TLS_HASH_MD5 },
  29. { TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
  30. TLS_HASH_SHA },
  31. { TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
  32. TLS_HASH_SHA },
  33. { TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
  34. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  35. { TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
  36. TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
  37. { TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
  38. TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
  39. { TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
  40. TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
  41. { TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
  42. TLS_HASH_SHA },
  43. { TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
  44. TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
  45. { TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
  46. TLS_HASH_SHA },
  47. { TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
  48. TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA }
  49. };
  50. #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
  51. #define NUM_TLS_CIPHER_SUITES NUM_ELEMS(tls_cipher_suites)
  52. static const struct tls_cipher_data tls_ciphers[] = {
  53. { TLS_CIPHER_NULL, TLS_CIPHER_STREAM, 0, 0, 0,
  54. CRYPTO_CIPHER_NULL },
  55. { TLS_CIPHER_IDEA_CBC, TLS_CIPHER_BLOCK, 16, 16, 8,
  56. CRYPTO_CIPHER_NULL },
  57. { TLS_CIPHER_RC2_CBC_40, TLS_CIPHER_BLOCK, 5, 16, 0,
  58. CRYPTO_CIPHER_ALG_RC2 },
  59. { TLS_CIPHER_RC4_40, TLS_CIPHER_STREAM, 5, 16, 0,
  60. CRYPTO_CIPHER_ALG_RC4 },
  61. { TLS_CIPHER_RC4_128, TLS_CIPHER_STREAM, 16, 16, 0,
  62. CRYPTO_CIPHER_ALG_RC4 },
  63. { TLS_CIPHER_DES40_CBC, TLS_CIPHER_BLOCK, 5, 8, 8,
  64. CRYPTO_CIPHER_ALG_DES },
  65. { TLS_CIPHER_DES_CBC, TLS_CIPHER_BLOCK, 8, 8, 8,
  66. CRYPTO_CIPHER_ALG_DES },
  67. { TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK, 24, 24, 8,
  68. CRYPTO_CIPHER_ALG_3DES },
  69. { TLS_CIPHER_AES_128_CBC, TLS_CIPHER_BLOCK, 16, 16, 16,
  70. CRYPTO_CIPHER_ALG_AES },
  71. { TLS_CIPHER_AES_256_CBC, TLS_CIPHER_BLOCK, 32, 32, 16,
  72. CRYPTO_CIPHER_ALG_AES }
  73. };
  74. #define NUM_TLS_CIPHER_DATA NUM_ELEMS(tls_ciphers)
  75. /**
  76. * tls_get_cipher_suite - Get TLS cipher suite
  77. * @suite: Cipher suite identifier
  78. * Returns: Pointer to the cipher data or %NULL if not found
  79. */
  80. const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
  81. {
  82. size_t i;
  83. for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
  84. if (tls_cipher_suites[i].suite == suite)
  85. return &tls_cipher_suites[i];
  86. return NULL;
  87. }
  88. const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
  89. {
  90. size_t i;
  91. for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
  92. if (tls_ciphers[i].cipher == cipher)
  93. return &tls_ciphers[i];
  94. return NULL;
  95. }
  96. int tls_server_key_exchange_allowed(tls_cipher cipher)
  97. {
  98. const struct tls_cipher_suite *suite;
  99. /* RFC 2246, Section 7.4.3 */
  100. suite = tls_get_cipher_suite(cipher);
  101. if (suite == NULL)
  102. return 0;
  103. switch (suite->key_exchange) {
  104. case TLS_KEY_X_DHE_DSS:
  105. case TLS_KEY_X_DHE_DSS_EXPORT:
  106. case TLS_KEY_X_DHE_RSA:
  107. case TLS_KEY_X_DHE_RSA_EXPORT:
  108. case TLS_KEY_X_DH_anon_EXPORT:
  109. case TLS_KEY_X_DH_anon:
  110. return 1;
  111. case TLS_KEY_X_RSA_EXPORT:
  112. return 1 /* FIX: public key len > 512 bits */;
  113. default:
  114. return 0;
  115. }
  116. }
  117. /**
  118. * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
  119. * @buf: ASN.1 DER encoded certificate
  120. * @len: Length of the buffer
  121. * @pk: Buffer for returning the allocated public key
  122. * Returns: 0 on success, -1 on failure
  123. *
  124. * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
  125. * the public key from it. The caller is responsible for freeing the public key
  126. * by calling crypto_public_key_free().
  127. */
  128. int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
  129. {
  130. struct x509_certificate *cert;
  131. wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
  132. buf, len);
  133. *pk = crypto_public_key_from_cert(buf, len);
  134. if (*pk)
  135. return 0;
  136. cert = x509_certificate_parse(buf, len);
  137. if (cert == NULL) {
  138. wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
  139. "certificate");
  140. return -1;
  141. }
  142. /* TODO
  143. * verify key usage (must allow encryption)
  144. *
  145. * All certificate profiles, key and cryptographic formats are
  146. * defined by the IETF PKIX working group [PKIX]. When a key
  147. * usage extension is present, the digitalSignature bit must be
  148. * set for the key to be eligible for signing, as described
  149. * above, and the keyEncipherment bit must be present to allow
  150. * encryption, as described above. The keyAgreement bit must be
  151. * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
  152. */
  153. *pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
  154. x509_certificate_free(cert);
  155. if (*pk == NULL) {
  156. wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
  157. "server public key");
  158. return -1;
  159. }
  160. return 0;
  161. }
  162. int tls_verify_hash_init(struct tls_verify_hash *verify)
  163. {
  164. tls_verify_hash_free(verify);
  165. verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  166. verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  167. verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  168. verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  169. verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  170. verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  171. if (verify->md5_client == NULL || verify->md5_server == NULL ||
  172. verify->md5_cert == NULL || verify->sha1_client == NULL ||
  173. verify->sha1_server == NULL || verify->sha1_cert == NULL) {
  174. tls_verify_hash_free(verify);
  175. return -1;
  176. }
  177. return 0;
  178. }
  179. void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
  180. size_t len)
  181. {
  182. if (verify->md5_client && verify->sha1_client) {
  183. crypto_hash_update(verify->md5_client, buf, len);
  184. crypto_hash_update(verify->sha1_client, buf, len);
  185. }
  186. if (verify->md5_server && verify->sha1_server) {
  187. crypto_hash_update(verify->md5_server, buf, len);
  188. crypto_hash_update(verify->sha1_server, buf, len);
  189. }
  190. if (verify->md5_cert && verify->sha1_cert) {
  191. crypto_hash_update(verify->md5_cert, buf, len);
  192. crypto_hash_update(verify->sha1_cert, buf, len);
  193. }
  194. }
  195. void tls_verify_hash_free(struct tls_verify_hash *verify)
  196. {
  197. crypto_hash_finish(verify->md5_client, NULL, NULL);
  198. crypto_hash_finish(verify->md5_server, NULL, NULL);
  199. crypto_hash_finish(verify->md5_cert, NULL, NULL);
  200. crypto_hash_finish(verify->sha1_client, NULL, NULL);
  201. crypto_hash_finish(verify->sha1_server, NULL, NULL);
  202. crypto_hash_finish(verify->sha1_cert, NULL, NULL);
  203. verify->md5_client = NULL;
  204. verify->md5_server = NULL;
  205. verify->md5_cert = NULL;
  206. verify->sha1_client = NULL;
  207. verify->sha1_server = NULL;
  208. verify->sha1_cert = NULL;
  209. }