xref: /freebsd/contrib/wpa/src/tls/tlsv1_common.c (revision f05cddf940dbfc5b657f5e9beb9de2c31e509e5b)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * TLSv1 common routines
3*f05cddf9SRui Paulo  * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
5*f05cddf9SRui Paulo  * This software may be distributed under the terms of the BSD license.
6*f05cddf9SRui Paulo  * See README for more details.
739beb93cSSam Leffler  */
839beb93cSSam Leffler 
939beb93cSSam Leffler #include "includes.h"
1039beb93cSSam Leffler 
1139beb93cSSam Leffler #include "common.h"
12*f05cddf9SRui Paulo #include "crypto/sha1.h"
13*f05cddf9SRui Paulo #include "crypto/sha256.h"
1439beb93cSSam Leffler #include "x509v3.h"
1539beb93cSSam Leffler #include "tlsv1_common.h"
1639beb93cSSam Leffler 
1739beb93cSSam Leffler 
1839beb93cSSam Leffler /*
1939beb93cSSam Leffler  * TODO:
2039beb93cSSam Leffler  * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
2139beb93cSSam Leffler  * Add support for commonly used cipher suites; don't bother with exportable
2239beb93cSSam Leffler  * suites.
2339beb93cSSam Leffler  */
2439beb93cSSam Leffler 
2539beb93cSSam Leffler static const struct tls_cipher_suite tls_cipher_suites[] = {
2639beb93cSSam Leffler 	{ TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
2739beb93cSSam Leffler 	  TLS_HASH_NULL },
2839beb93cSSam Leffler 	{ TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
2939beb93cSSam Leffler 	  TLS_HASH_MD5 },
3039beb93cSSam Leffler 	{ TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
3139beb93cSSam Leffler 	  TLS_HASH_SHA },
3239beb93cSSam Leffler 	{ TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
3339beb93cSSam Leffler 	  TLS_HASH_SHA },
3439beb93cSSam Leffler 	{ TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
3539beb93cSSam Leffler 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
3639beb93cSSam Leffler  	{ TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
3739beb93cSSam Leffler 	  TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
3839beb93cSSam Leffler  	{ TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
3939beb93cSSam Leffler 	  TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
4039beb93cSSam Leffler  	{ TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
4139beb93cSSam Leffler 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
4239beb93cSSam Leffler 	{ TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
4339beb93cSSam Leffler 	  TLS_HASH_SHA },
4439beb93cSSam Leffler 	{ TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
4539beb93cSSam Leffler 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
4639beb93cSSam Leffler 	{ TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
4739beb93cSSam Leffler 	  TLS_HASH_SHA },
4839beb93cSSam Leffler 	{ TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
49*f05cddf9SRui Paulo 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
50*f05cddf9SRui Paulo 	{ TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
51*f05cddf9SRui Paulo 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
52*f05cddf9SRui Paulo 	{ TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
53*f05cddf9SRui Paulo 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
54*f05cddf9SRui Paulo 	{ TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
55*f05cddf9SRui Paulo 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
56*f05cddf9SRui Paulo 	{ TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
57*f05cddf9SRui Paulo 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
5839beb93cSSam Leffler };
5939beb93cSSam Leffler 
6039beb93cSSam Leffler #define NUM_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
6139beb93cSSam Leffler #define NUM_TLS_CIPHER_SUITES NUM_ELEMS(tls_cipher_suites)
6239beb93cSSam Leffler 
6339beb93cSSam Leffler 
6439beb93cSSam Leffler static const struct tls_cipher_data tls_ciphers[] = {
6539beb93cSSam Leffler 	{ TLS_CIPHER_NULL,         TLS_CIPHER_STREAM,  0,  0,  0,
6639beb93cSSam Leffler 	  CRYPTO_CIPHER_NULL },
6739beb93cSSam Leffler 	{ TLS_CIPHER_IDEA_CBC,     TLS_CIPHER_BLOCK,  16, 16,  8,
6839beb93cSSam Leffler 	  CRYPTO_CIPHER_NULL },
6939beb93cSSam Leffler 	{ TLS_CIPHER_RC2_CBC_40,   TLS_CIPHER_BLOCK,   5, 16,  0,
7039beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_RC2 },
7139beb93cSSam Leffler 	{ TLS_CIPHER_RC4_40,       TLS_CIPHER_STREAM,  5, 16,  0,
7239beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_RC4 },
7339beb93cSSam Leffler 	{ TLS_CIPHER_RC4_128,      TLS_CIPHER_STREAM, 16, 16,  0,
7439beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_RC4 },
7539beb93cSSam Leffler 	{ TLS_CIPHER_DES40_CBC,    TLS_CIPHER_BLOCK,   5,  8,  8,
7639beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_DES },
7739beb93cSSam Leffler 	{ TLS_CIPHER_DES_CBC,      TLS_CIPHER_BLOCK,   8,  8,  8,
7839beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_DES },
7939beb93cSSam Leffler 	{ TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK,  24, 24,  8,
8039beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_3DES },
8139beb93cSSam Leffler 	{ TLS_CIPHER_AES_128_CBC,  TLS_CIPHER_BLOCK,  16, 16, 16,
8239beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_AES },
8339beb93cSSam Leffler 	{ TLS_CIPHER_AES_256_CBC,  TLS_CIPHER_BLOCK,  32, 32, 16,
8439beb93cSSam Leffler 	  CRYPTO_CIPHER_ALG_AES }
8539beb93cSSam Leffler };
8639beb93cSSam Leffler 
8739beb93cSSam Leffler #define NUM_TLS_CIPHER_DATA NUM_ELEMS(tls_ciphers)
8839beb93cSSam Leffler 
8939beb93cSSam Leffler 
9039beb93cSSam Leffler /**
9139beb93cSSam Leffler  * tls_get_cipher_suite - Get TLS cipher suite
9239beb93cSSam Leffler  * @suite: Cipher suite identifier
9339beb93cSSam Leffler  * Returns: Pointer to the cipher data or %NULL if not found
9439beb93cSSam Leffler  */
9539beb93cSSam Leffler const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
9639beb93cSSam Leffler {
9739beb93cSSam Leffler 	size_t i;
9839beb93cSSam Leffler 	for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
9939beb93cSSam Leffler 		if (tls_cipher_suites[i].suite == suite)
10039beb93cSSam Leffler 			return &tls_cipher_suites[i];
10139beb93cSSam Leffler 	return NULL;
10239beb93cSSam Leffler }
10339beb93cSSam Leffler 
10439beb93cSSam Leffler 
10539beb93cSSam Leffler const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
10639beb93cSSam Leffler {
10739beb93cSSam Leffler 	size_t i;
10839beb93cSSam Leffler 	for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
10939beb93cSSam Leffler 		if (tls_ciphers[i].cipher == cipher)
11039beb93cSSam Leffler 			return &tls_ciphers[i];
11139beb93cSSam Leffler 	return NULL;
11239beb93cSSam Leffler }
11339beb93cSSam Leffler 
11439beb93cSSam Leffler 
11539beb93cSSam Leffler int tls_server_key_exchange_allowed(tls_cipher cipher)
11639beb93cSSam Leffler {
11739beb93cSSam Leffler 	const struct tls_cipher_suite *suite;
11839beb93cSSam Leffler 
11939beb93cSSam Leffler 	/* RFC 2246, Section 7.4.3 */
12039beb93cSSam Leffler 	suite = tls_get_cipher_suite(cipher);
12139beb93cSSam Leffler 	if (suite == NULL)
12239beb93cSSam Leffler 		return 0;
12339beb93cSSam Leffler 
12439beb93cSSam Leffler 	switch (suite->key_exchange) {
12539beb93cSSam Leffler 	case TLS_KEY_X_DHE_DSS:
12639beb93cSSam Leffler 	case TLS_KEY_X_DHE_DSS_EXPORT:
12739beb93cSSam Leffler 	case TLS_KEY_X_DHE_RSA:
12839beb93cSSam Leffler 	case TLS_KEY_X_DHE_RSA_EXPORT:
12939beb93cSSam Leffler 	case TLS_KEY_X_DH_anon_EXPORT:
13039beb93cSSam Leffler 	case TLS_KEY_X_DH_anon:
13139beb93cSSam Leffler 		return 1;
13239beb93cSSam Leffler 	case TLS_KEY_X_RSA_EXPORT:
13339beb93cSSam Leffler 		return 1 /* FIX: public key len > 512 bits */;
13439beb93cSSam Leffler 	default:
13539beb93cSSam Leffler 		return 0;
13639beb93cSSam Leffler 	}
13739beb93cSSam Leffler }
13839beb93cSSam Leffler 
13939beb93cSSam Leffler 
14039beb93cSSam Leffler /**
14139beb93cSSam Leffler  * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
14239beb93cSSam Leffler  * @buf: ASN.1 DER encoded certificate
14339beb93cSSam Leffler  * @len: Length of the buffer
14439beb93cSSam Leffler  * @pk: Buffer for returning the allocated public key
14539beb93cSSam Leffler  * Returns: 0 on success, -1 on failure
14639beb93cSSam Leffler  *
14739beb93cSSam Leffler  * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
14839beb93cSSam Leffler  * the public key from it. The caller is responsible for freeing the public key
14939beb93cSSam Leffler  * by calling crypto_public_key_free().
15039beb93cSSam Leffler  */
15139beb93cSSam Leffler int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
15239beb93cSSam Leffler {
15339beb93cSSam Leffler 	struct x509_certificate *cert;
15439beb93cSSam Leffler 
15539beb93cSSam Leffler 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
15639beb93cSSam Leffler 		    buf, len);
15739beb93cSSam Leffler 
15839beb93cSSam Leffler 	*pk = crypto_public_key_from_cert(buf, len);
15939beb93cSSam Leffler 	if (*pk)
16039beb93cSSam Leffler 		return 0;
16139beb93cSSam Leffler 
16239beb93cSSam Leffler 	cert = x509_certificate_parse(buf, len);
16339beb93cSSam Leffler 	if (cert == NULL) {
16439beb93cSSam Leffler 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
16539beb93cSSam Leffler 			   "certificate");
16639beb93cSSam Leffler 		return -1;
16739beb93cSSam Leffler 	}
16839beb93cSSam Leffler 
16939beb93cSSam Leffler 	/* TODO
17039beb93cSSam Leffler 	 * verify key usage (must allow encryption)
17139beb93cSSam Leffler 	 *
17239beb93cSSam Leffler 	 * All certificate profiles, key and cryptographic formats are
17339beb93cSSam Leffler 	 * defined by the IETF PKIX working group [PKIX]. When a key
17439beb93cSSam Leffler 	 * usage extension is present, the digitalSignature bit must be
17539beb93cSSam Leffler 	 * set for the key to be eligible for signing, as described
17639beb93cSSam Leffler 	 * above, and the keyEncipherment bit must be present to allow
17739beb93cSSam Leffler 	 * encryption, as described above. The keyAgreement bit must be
17839beb93cSSam Leffler 	 * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
17939beb93cSSam Leffler 	 */
18039beb93cSSam Leffler 
18139beb93cSSam Leffler 	*pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
18239beb93cSSam Leffler 	x509_certificate_free(cert);
18339beb93cSSam Leffler 
18439beb93cSSam Leffler 	if (*pk == NULL) {
18539beb93cSSam Leffler 		wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
18639beb93cSSam Leffler 			   "server public key");
18739beb93cSSam Leffler 		return -1;
18839beb93cSSam Leffler 	}
18939beb93cSSam Leffler 
19039beb93cSSam Leffler 	return 0;
19139beb93cSSam Leffler }
19239beb93cSSam Leffler 
19339beb93cSSam Leffler 
19439beb93cSSam Leffler int tls_verify_hash_init(struct tls_verify_hash *verify)
19539beb93cSSam Leffler {
19639beb93cSSam Leffler 	tls_verify_hash_free(verify);
19739beb93cSSam Leffler 	verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
19839beb93cSSam Leffler 	verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
19939beb93cSSam Leffler 	verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
20039beb93cSSam Leffler 	verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
20139beb93cSSam Leffler 	verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
20239beb93cSSam Leffler 	verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
20339beb93cSSam Leffler 	if (verify->md5_client == NULL || verify->md5_server == NULL ||
20439beb93cSSam Leffler 	    verify->md5_cert == NULL || verify->sha1_client == NULL ||
20539beb93cSSam Leffler 	    verify->sha1_server == NULL || verify->sha1_cert == NULL) {
20639beb93cSSam Leffler 		tls_verify_hash_free(verify);
20739beb93cSSam Leffler 		return -1;
20839beb93cSSam Leffler 	}
209*f05cddf9SRui Paulo #ifdef CONFIG_TLSV12
210*f05cddf9SRui Paulo 	verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
211*f05cddf9SRui Paulo 						 0);
212*f05cddf9SRui Paulo 	verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
213*f05cddf9SRui Paulo 						 0);
214*f05cddf9SRui Paulo 	verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
215*f05cddf9SRui Paulo 					       0);
216*f05cddf9SRui Paulo 	if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
217*f05cddf9SRui Paulo 	    verify->sha256_cert == NULL) {
218*f05cddf9SRui Paulo 		tls_verify_hash_free(verify);
219*f05cddf9SRui Paulo 		return -1;
220*f05cddf9SRui Paulo 	}
221*f05cddf9SRui Paulo #endif /* CONFIG_TLSV12 */
22239beb93cSSam Leffler 	return 0;
22339beb93cSSam Leffler }
22439beb93cSSam Leffler 
22539beb93cSSam Leffler 
22639beb93cSSam Leffler void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
22739beb93cSSam Leffler 			 size_t len)
22839beb93cSSam Leffler {
22939beb93cSSam Leffler 	if (verify->md5_client && verify->sha1_client) {
23039beb93cSSam Leffler 		crypto_hash_update(verify->md5_client, buf, len);
23139beb93cSSam Leffler 		crypto_hash_update(verify->sha1_client, buf, len);
23239beb93cSSam Leffler 	}
23339beb93cSSam Leffler 	if (verify->md5_server && verify->sha1_server) {
23439beb93cSSam Leffler 		crypto_hash_update(verify->md5_server, buf, len);
23539beb93cSSam Leffler 		crypto_hash_update(verify->sha1_server, buf, len);
23639beb93cSSam Leffler 	}
23739beb93cSSam Leffler 	if (verify->md5_cert && verify->sha1_cert) {
23839beb93cSSam Leffler 		crypto_hash_update(verify->md5_cert, buf, len);
23939beb93cSSam Leffler 		crypto_hash_update(verify->sha1_cert, buf, len);
24039beb93cSSam Leffler 	}
241*f05cddf9SRui Paulo #ifdef CONFIG_TLSV12
242*f05cddf9SRui Paulo 	if (verify->sha256_client)
243*f05cddf9SRui Paulo 		crypto_hash_update(verify->sha256_client, buf, len);
244*f05cddf9SRui Paulo 	if (verify->sha256_server)
245*f05cddf9SRui Paulo 		crypto_hash_update(verify->sha256_server, buf, len);
246*f05cddf9SRui Paulo 	if (verify->sha256_cert)
247*f05cddf9SRui Paulo 		crypto_hash_update(verify->sha256_cert, buf, len);
248*f05cddf9SRui Paulo #endif /* CONFIG_TLSV12 */
24939beb93cSSam Leffler }
25039beb93cSSam Leffler 
25139beb93cSSam Leffler 
25239beb93cSSam Leffler void tls_verify_hash_free(struct tls_verify_hash *verify)
25339beb93cSSam Leffler {
25439beb93cSSam Leffler 	crypto_hash_finish(verify->md5_client, NULL, NULL);
25539beb93cSSam Leffler 	crypto_hash_finish(verify->md5_server, NULL, NULL);
25639beb93cSSam Leffler 	crypto_hash_finish(verify->md5_cert, NULL, NULL);
25739beb93cSSam Leffler 	crypto_hash_finish(verify->sha1_client, NULL, NULL);
25839beb93cSSam Leffler 	crypto_hash_finish(verify->sha1_server, NULL, NULL);
25939beb93cSSam Leffler 	crypto_hash_finish(verify->sha1_cert, NULL, NULL);
26039beb93cSSam Leffler 	verify->md5_client = NULL;
26139beb93cSSam Leffler 	verify->md5_server = NULL;
26239beb93cSSam Leffler 	verify->md5_cert = NULL;
26339beb93cSSam Leffler 	verify->sha1_client = NULL;
26439beb93cSSam Leffler 	verify->sha1_server = NULL;
26539beb93cSSam Leffler 	verify->sha1_cert = NULL;
266*f05cddf9SRui Paulo #ifdef CONFIG_TLSV12
267*f05cddf9SRui Paulo 	crypto_hash_finish(verify->sha256_client, NULL, NULL);
268*f05cddf9SRui Paulo 	crypto_hash_finish(verify->sha256_server, NULL, NULL);
269*f05cddf9SRui Paulo 	crypto_hash_finish(verify->sha256_cert, NULL, NULL);
270*f05cddf9SRui Paulo 	verify->sha256_client = NULL;
271*f05cddf9SRui Paulo 	verify->sha256_server = NULL;
272*f05cddf9SRui Paulo 	verify->sha256_cert = NULL;
273*f05cddf9SRui Paulo #endif /* CONFIG_TLSV12 */
274*f05cddf9SRui Paulo }
275*f05cddf9SRui Paulo 
276*f05cddf9SRui Paulo 
277*f05cddf9SRui Paulo int tls_version_ok(u16 ver)
278*f05cddf9SRui Paulo {
279*f05cddf9SRui Paulo 	if (ver == TLS_VERSION_1)
280*f05cddf9SRui Paulo 		return 1;
281*f05cddf9SRui Paulo #ifdef CONFIG_TLSV11
282*f05cddf9SRui Paulo 	if (ver == TLS_VERSION_1_1)
283*f05cddf9SRui Paulo 		return 1;
284*f05cddf9SRui Paulo #endif /* CONFIG_TLSV11 */
285*f05cddf9SRui Paulo #ifdef CONFIG_TLSV12
286*f05cddf9SRui Paulo 	if (ver == TLS_VERSION_1_2)
287*f05cddf9SRui Paulo 		return 1;
288*f05cddf9SRui Paulo #endif /* CONFIG_TLSV12 */
289*f05cddf9SRui Paulo 
290*f05cddf9SRui Paulo 	return 0;
291*f05cddf9SRui Paulo }
292*f05cddf9SRui Paulo 
293*f05cddf9SRui Paulo 
294*f05cddf9SRui Paulo const char * tls_version_str(u16 ver)
295*f05cddf9SRui Paulo {
296*f05cddf9SRui Paulo 	switch (ver) {
297*f05cddf9SRui Paulo 	case TLS_VERSION_1:
298*f05cddf9SRui Paulo 		return "1.0";
299*f05cddf9SRui Paulo 	case TLS_VERSION_1_1:
300*f05cddf9SRui Paulo 		return "1.1";
301*f05cddf9SRui Paulo 	case TLS_VERSION_1_2:
302*f05cddf9SRui Paulo 		return "1.2";
303*f05cddf9SRui Paulo 	}
304*f05cddf9SRui Paulo 
305*f05cddf9SRui Paulo 	return "?";
306*f05cddf9SRui Paulo }
307*f05cddf9SRui Paulo 
308*f05cddf9SRui Paulo 
309*f05cddf9SRui Paulo int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label,
310*f05cddf9SRui Paulo 	    const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
311*f05cddf9SRui Paulo {
312*f05cddf9SRui Paulo #ifdef CONFIG_TLSV12
313*f05cddf9SRui Paulo 	if (ver >= TLS_VERSION_1_2) {
314*f05cddf9SRui Paulo 		tls_prf_sha256(secret, secret_len, label, seed, seed_len,
315*f05cddf9SRui Paulo 			       out, outlen);
316*f05cddf9SRui Paulo 		return 0;
317*f05cddf9SRui Paulo 	}
318*f05cddf9SRui Paulo #endif /* CONFIG_TLSV12 */
319*f05cddf9SRui Paulo 
320*f05cddf9SRui Paulo 	return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
321*f05cddf9SRui Paulo 				outlen);
32239beb93cSSam Leffler }
323