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