tlsv1_common.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  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, u8 hash_alg,
  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. enum crypto_hash_alg alg;
  304. switch (hash_alg) {
  305. case TLS_HASH_ALG_SHA256:
  306. alg = CRYPTO_HASH_ALG_SHA256;
  307. hlen = SHA256_MAC_LEN;
  308. break;
  309. case TLS_HASH_ALG_SHA384:
  310. alg = CRYPTO_HASH_ALG_SHA384;
  311. hlen = 48;
  312. break;
  313. case TLS_HASH_ALG_SHA512:
  314. alg = CRYPTO_HASH_ALG_SHA512;
  315. hlen = 64;
  316. break;
  317. default:
  318. return -1;
  319. }
  320. ctx = crypto_hash_init(alg, NULL, 0);
  321. if (ctx == NULL)
  322. return -1;
  323. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  324. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  325. crypto_hash_update(ctx, server_params, server_params_len);
  326. if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  327. return -1;
  328. return hlen;
  329. }
  330. #endif /* CONFIG_TLSV12 */
  331. int tls_key_x_server_params_hash(u16 tls_version, const u8 *client_random,
  332. const u8 *server_random,
  333. const u8 *server_params,
  334. size_t server_params_len, u8 *hash)
  335. {
  336. u8 *hpos;
  337. size_t hlen;
  338. struct crypto_hash *ctx;
  339. hpos = hash;
  340. ctx = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
  341. if (ctx == NULL)
  342. return -1;
  343. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  344. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  345. crypto_hash_update(ctx, server_params, server_params_len);
  346. hlen = MD5_MAC_LEN;
  347. if (crypto_hash_finish(ctx, hash, &hlen) < 0)
  348. return -1;
  349. hpos += hlen;
  350. ctx = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
  351. if (ctx == NULL)
  352. return -1;
  353. crypto_hash_update(ctx, client_random, TLS_RANDOM_LEN);
  354. crypto_hash_update(ctx, server_random, TLS_RANDOM_LEN);
  355. crypto_hash_update(ctx, server_params, server_params_len);
  356. hlen = hash + sizeof(hash) - hpos;
  357. if (crypto_hash_finish(ctx, hpos, &hlen) < 0)
  358. return -1;
  359. hpos += hlen;
  360. return hpos - hash;
  361. }
  362. int tls_verify_signature(u16 tls_version, struct crypto_public_key *pk,
  363. const u8 *data, size_t data_len,
  364. const u8 *pos, size_t len, u8 *alert)
  365. {
  366. u8 *buf;
  367. const u8 *end = pos + len;
  368. const u8 *decrypted;
  369. u16 slen;
  370. size_t buflen;
  371. if (end - pos < 2) {
  372. *alert = TLS_ALERT_DECODE_ERROR;
  373. return -1;
  374. }
  375. slen = WPA_GET_BE16(pos);
  376. pos += 2;
  377. if (end - pos < slen) {
  378. *alert = TLS_ALERT_DECODE_ERROR;
  379. return -1;
  380. }
  381. if (end - pos > slen) {
  382. wpa_hexdump(MSG_MSGDUMP, "Additional data after Signature",
  383. pos + slen, end - pos - slen);
  384. end = pos + slen;
  385. }
  386. wpa_hexdump(MSG_MSGDUMP, "TLSv1: Signature", pos, end - pos);
  387. if (pk == NULL) {
  388. wpa_printf(MSG_DEBUG, "TLSv1: No public key to verify signature");
  389. *alert = TLS_ALERT_INTERNAL_ERROR;
  390. return -1;
  391. }
  392. buflen = end - pos;
  393. buf = os_malloc(end - pos);
  394. if (buf == NULL) {
  395. *alert = TLS_ALERT_INTERNAL_ERROR;
  396. return -1;
  397. }
  398. if (crypto_public_key_decrypt_pkcs1(pk, pos, end - pos, buf, &buflen) <
  399. 0) {
  400. wpa_printf(MSG_DEBUG, "TLSv1: Failed to decrypt signature");
  401. os_free(buf);
  402. *alert = TLS_ALERT_DECRYPT_ERROR;
  403. return -1;
  404. }
  405. decrypted = buf;
  406. wpa_hexdump_key(MSG_MSGDUMP, "TLSv1: Decrypted Signature",
  407. decrypted, buflen);
  408. #ifdef CONFIG_TLSV12
  409. if (tls_version >= TLS_VERSION_1_2) {
  410. /*
  411. * RFC 3447, A.2.4 RSASSA-PKCS1-v1_5
  412. *
  413. * DigestInfo ::= SEQUENCE {
  414. * digestAlgorithm DigestAlgorithm,
  415. * digest OCTET STRING
  416. * }
  417. *
  418. * SHA-256 OID: sha256WithRSAEncryption ::= {pkcs-1 11}
  419. *
  420. * DER encoded DigestInfo for SHA256 per RFC 3447:
  421. * 30 31 30 0d 06 09 60 86 48 01 65 03 04 02 01 05 00 04 20 ||
  422. * H
  423. */
  424. if (buflen >= 19 + 32 &&
  425. os_memcmp(buf, "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01"
  426. "\x65\x03\x04\x02\x01\x05\x00\x04\x20", 19) == 0)
  427. {
  428. wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-256");
  429. decrypted = buf + 19;
  430. buflen -= 19;
  431. } else if (buflen >= 19 + 48 &&
  432. os_memcmp(buf, "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01"
  433. "\x65\x03\x04\x02\x02\x05\x00\x04\x30", 19) == 0)
  434. {
  435. wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-384");
  436. decrypted = buf + 19;
  437. buflen -= 19;
  438. } else if (buflen >= 19 + 64 &&
  439. os_memcmp(buf, "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01"
  440. "\x65\x03\x04\x02\x03\x05\x00\x04\x40", 19) == 0)
  441. {
  442. wpa_printf(MSG_DEBUG, "TLSv1.2: DigestAlgorithm = SHA-512");
  443. decrypted = buf + 19;
  444. buflen -= 19;
  445. } else {
  446. wpa_printf(MSG_DEBUG, "TLSv1.2: Unrecognized DigestInfo");
  447. os_free(buf);
  448. *alert = TLS_ALERT_DECRYPT_ERROR;
  449. return -1;
  450. }
  451. }
  452. #endif /* CONFIG_TLSV12 */
  453. if (buflen != data_len ||
  454. os_memcmp_const(decrypted, data, data_len) != 0) {
  455. wpa_printf(MSG_DEBUG, "TLSv1: Invalid Signature in CertificateVerify - did not match calculated hash");
  456. os_free(buf);
  457. *alert = TLS_ALERT_DECRYPT_ERROR;
  458. return -1;
  459. }
  460. os_free(buf);
  461. return 0;
  462. }