xref: /dflybsd-src/contrib/wpa_supplicant/src/tls/tlsv1_common.c (revision 3ff40c12445a6f5918b9c6e9c7031bc0cb8786d1)
16d49e1aeSJan Lentfer /*
26d49e1aeSJan Lentfer  * TLSv1 common routines
3*3ff40c12SJohn Marino  * Copyright (c) 2006-2011, Jouni Malinen <j@w1.fi>
46d49e1aeSJan Lentfer  *
5*3ff40c12SJohn Marino  * This software may be distributed under the terms of the BSD license.
6*3ff40c12SJohn Marino  * See README for more details.
76d49e1aeSJan Lentfer  */
86d49e1aeSJan Lentfer 
96d49e1aeSJan Lentfer #include "includes.h"
106d49e1aeSJan Lentfer 
116d49e1aeSJan Lentfer #include "common.h"
12*3ff40c12SJohn Marino #include "crypto/sha1.h"
13*3ff40c12SJohn Marino #include "crypto/sha256.h"
146d49e1aeSJan Lentfer #include "x509v3.h"
156d49e1aeSJan Lentfer #include "tlsv1_common.h"
166d49e1aeSJan Lentfer 
176d49e1aeSJan Lentfer 
186d49e1aeSJan Lentfer /*
196d49e1aeSJan Lentfer  * TODO:
206d49e1aeSJan Lentfer  * RFC 2246 Section 9: Mandatory to implement TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA
216d49e1aeSJan Lentfer  * Add support for commonly used cipher suites; don't bother with exportable
226d49e1aeSJan Lentfer  * suites.
236d49e1aeSJan Lentfer  */
246d49e1aeSJan Lentfer 
256d49e1aeSJan Lentfer static const struct tls_cipher_suite tls_cipher_suites[] = {
266d49e1aeSJan Lentfer 	{ TLS_NULL_WITH_NULL_NULL, TLS_KEY_X_NULL, TLS_CIPHER_NULL,
276d49e1aeSJan Lentfer 	  TLS_HASH_NULL },
286d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_RC4_128_MD5, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
296d49e1aeSJan Lentfer 	  TLS_HASH_MD5 },
306d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_RC4_128_SHA, TLS_KEY_X_RSA, TLS_CIPHER_RC4_128,
316d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
326d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_DES_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_DES_CBC,
336d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
346d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_RSA,
356d49e1aeSJan Lentfer 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
366d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_RC4_128_MD5, TLS_KEY_X_DH_anon,
376d49e1aeSJan Lentfer 	  TLS_CIPHER_RC4_128, TLS_HASH_MD5 },
386d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_DES_CBC_SHA, TLS_KEY_X_DH_anon,
396d49e1aeSJan Lentfer 	  TLS_CIPHER_DES_CBC, TLS_HASH_SHA },
406d49e1aeSJan Lentfer  	{ TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, TLS_KEY_X_DH_anon,
416d49e1aeSJan Lentfer 	  TLS_CIPHER_3DES_EDE_CBC, TLS_HASH_SHA },
426d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_AES_128_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_128_CBC,
436d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
446d49e1aeSJan Lentfer 	{ TLS_DH_anon_WITH_AES_128_CBC_SHA, TLS_KEY_X_DH_anon,
456d49e1aeSJan Lentfer 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA },
466d49e1aeSJan Lentfer 	{ TLS_RSA_WITH_AES_256_CBC_SHA, TLS_KEY_X_RSA, TLS_CIPHER_AES_256_CBC,
476d49e1aeSJan Lentfer 	  TLS_HASH_SHA },
486d49e1aeSJan Lentfer 	{ TLS_DH_anon_WITH_AES_256_CBC_SHA, TLS_KEY_X_DH_anon,
49*3ff40c12SJohn Marino 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA },
50*3ff40c12SJohn Marino 	{ TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_KEY_X_RSA,
51*3ff40c12SJohn Marino 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
52*3ff40c12SJohn Marino 	{ TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_KEY_X_RSA,
53*3ff40c12SJohn Marino 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 },
54*3ff40c12SJohn Marino 	{ TLS_DH_anon_WITH_AES_128_CBC_SHA256, TLS_KEY_X_DH_anon,
55*3ff40c12SJohn Marino 	  TLS_CIPHER_AES_128_CBC, TLS_HASH_SHA256 },
56*3ff40c12SJohn Marino 	{ TLS_DH_anon_WITH_AES_256_CBC_SHA256, TLS_KEY_X_DH_anon,
57*3ff40c12SJohn Marino 	  TLS_CIPHER_AES_256_CBC, TLS_HASH_SHA256 }
586d49e1aeSJan Lentfer };
596d49e1aeSJan Lentfer 
60*3ff40c12SJohn Marino #define NUM_TLS_CIPHER_SUITES ARRAY_SIZE(tls_cipher_suites)
616d49e1aeSJan Lentfer 
626d49e1aeSJan Lentfer 
636d49e1aeSJan Lentfer static const struct tls_cipher_data tls_ciphers[] = {
646d49e1aeSJan Lentfer 	{ TLS_CIPHER_NULL,         TLS_CIPHER_STREAM,  0,  0,  0,
656d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_NULL },
666d49e1aeSJan Lentfer 	{ TLS_CIPHER_IDEA_CBC,     TLS_CIPHER_BLOCK,  16, 16,  8,
676d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_NULL },
686d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC2_CBC_40,   TLS_CIPHER_BLOCK,   5, 16,  0,
696d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC2 },
706d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC4_40,       TLS_CIPHER_STREAM,  5, 16,  0,
716d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC4 },
726d49e1aeSJan Lentfer 	{ TLS_CIPHER_RC4_128,      TLS_CIPHER_STREAM, 16, 16,  0,
736d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_RC4 },
746d49e1aeSJan Lentfer 	{ TLS_CIPHER_DES40_CBC,    TLS_CIPHER_BLOCK,   5,  8,  8,
756d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_DES },
766d49e1aeSJan Lentfer 	{ TLS_CIPHER_DES_CBC,      TLS_CIPHER_BLOCK,   8,  8,  8,
776d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_DES },
786d49e1aeSJan Lentfer 	{ TLS_CIPHER_3DES_EDE_CBC, TLS_CIPHER_BLOCK,  24, 24,  8,
796d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_3DES },
806d49e1aeSJan Lentfer 	{ TLS_CIPHER_AES_128_CBC,  TLS_CIPHER_BLOCK,  16, 16, 16,
816d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_AES },
826d49e1aeSJan Lentfer 	{ TLS_CIPHER_AES_256_CBC,  TLS_CIPHER_BLOCK,  32, 32, 16,
836d49e1aeSJan Lentfer 	  CRYPTO_CIPHER_ALG_AES }
846d49e1aeSJan Lentfer };
856d49e1aeSJan Lentfer 
86*3ff40c12SJohn Marino #define NUM_TLS_CIPHER_DATA ARRAY_SIZE(tls_ciphers)
876d49e1aeSJan Lentfer 
886d49e1aeSJan Lentfer 
896d49e1aeSJan Lentfer /**
906d49e1aeSJan Lentfer  * tls_get_cipher_suite - Get TLS cipher suite
916d49e1aeSJan Lentfer  * @suite: Cipher suite identifier
926d49e1aeSJan Lentfer  * Returns: Pointer to the cipher data or %NULL if not found
936d49e1aeSJan Lentfer  */
946d49e1aeSJan Lentfer const struct tls_cipher_suite * tls_get_cipher_suite(u16 suite)
956d49e1aeSJan Lentfer {
966d49e1aeSJan Lentfer 	size_t i;
976d49e1aeSJan Lentfer 	for (i = 0; i < NUM_TLS_CIPHER_SUITES; i++)
986d49e1aeSJan Lentfer 		if (tls_cipher_suites[i].suite == suite)
996d49e1aeSJan Lentfer 			return &tls_cipher_suites[i];
1006d49e1aeSJan Lentfer 	return NULL;
1016d49e1aeSJan Lentfer }
1026d49e1aeSJan Lentfer 
1036d49e1aeSJan Lentfer 
1046d49e1aeSJan Lentfer const struct tls_cipher_data * tls_get_cipher_data(tls_cipher cipher)
1056d49e1aeSJan Lentfer {
1066d49e1aeSJan Lentfer 	size_t i;
1076d49e1aeSJan Lentfer 	for (i = 0; i < NUM_TLS_CIPHER_DATA; i++)
1086d49e1aeSJan Lentfer 		if (tls_ciphers[i].cipher == cipher)
1096d49e1aeSJan Lentfer 			return &tls_ciphers[i];
1106d49e1aeSJan Lentfer 	return NULL;
1116d49e1aeSJan Lentfer }
1126d49e1aeSJan Lentfer 
1136d49e1aeSJan Lentfer 
1146d49e1aeSJan Lentfer int tls_server_key_exchange_allowed(tls_cipher cipher)
1156d49e1aeSJan Lentfer {
1166d49e1aeSJan Lentfer 	const struct tls_cipher_suite *suite;
1176d49e1aeSJan Lentfer 
1186d49e1aeSJan Lentfer 	/* RFC 2246, Section 7.4.3 */
1196d49e1aeSJan Lentfer 	suite = tls_get_cipher_suite(cipher);
1206d49e1aeSJan Lentfer 	if (suite == NULL)
1216d49e1aeSJan Lentfer 		return 0;
1226d49e1aeSJan Lentfer 
1236d49e1aeSJan Lentfer 	switch (suite->key_exchange) {
1246d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_DSS:
1256d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_DSS_EXPORT:
1266d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_RSA:
1276d49e1aeSJan Lentfer 	case TLS_KEY_X_DHE_RSA_EXPORT:
1286d49e1aeSJan Lentfer 	case TLS_KEY_X_DH_anon_EXPORT:
1296d49e1aeSJan Lentfer 	case TLS_KEY_X_DH_anon:
1306d49e1aeSJan Lentfer 		return 1;
1316d49e1aeSJan Lentfer 	case TLS_KEY_X_RSA_EXPORT:
1326d49e1aeSJan Lentfer 		return 1 /* FIX: public key len > 512 bits */;
1336d49e1aeSJan Lentfer 	default:
1346d49e1aeSJan Lentfer 		return 0;
1356d49e1aeSJan Lentfer 	}
1366d49e1aeSJan Lentfer }
1376d49e1aeSJan Lentfer 
1386d49e1aeSJan Lentfer 
1396d49e1aeSJan Lentfer /**
1406d49e1aeSJan Lentfer  * tls_parse_cert - Parse DER encoded X.509 certificate and get public key
1416d49e1aeSJan Lentfer  * @buf: ASN.1 DER encoded certificate
1426d49e1aeSJan Lentfer  * @len: Length of the buffer
1436d49e1aeSJan Lentfer  * @pk: Buffer for returning the allocated public key
1446d49e1aeSJan Lentfer  * Returns: 0 on success, -1 on failure
1456d49e1aeSJan Lentfer  *
1466d49e1aeSJan Lentfer  * This functions parses an ASN.1 DER encoded X.509 certificate and retrieves
1476d49e1aeSJan Lentfer  * the public key from it. The caller is responsible for freeing the public key
1486d49e1aeSJan Lentfer  * by calling crypto_public_key_free().
1496d49e1aeSJan Lentfer  */
1506d49e1aeSJan Lentfer int tls_parse_cert(const u8 *buf, size_t len, struct crypto_public_key **pk)
1516d49e1aeSJan Lentfer {
1526d49e1aeSJan Lentfer 	struct x509_certificate *cert;
1536d49e1aeSJan Lentfer 
1546d49e1aeSJan Lentfer 	wpa_hexdump(MSG_MSGDUMP, "TLSv1: Parse ASN.1 DER certificate",
1556d49e1aeSJan Lentfer 		    buf, len);
1566d49e1aeSJan Lentfer 
1576d49e1aeSJan Lentfer 	*pk = crypto_public_key_from_cert(buf, len);
1586d49e1aeSJan Lentfer 	if (*pk)
1596d49e1aeSJan Lentfer 		return 0;
1606d49e1aeSJan Lentfer 
1616d49e1aeSJan Lentfer 	cert = x509_certificate_parse(buf, len);
1626d49e1aeSJan Lentfer 	if (cert == NULL) {
1636d49e1aeSJan Lentfer 		wpa_printf(MSG_DEBUG, "TLSv1: Failed to parse X.509 "
1646d49e1aeSJan Lentfer 			   "certificate");
1656d49e1aeSJan Lentfer 		return -1;
1666d49e1aeSJan Lentfer 	}
1676d49e1aeSJan Lentfer 
1686d49e1aeSJan Lentfer 	/* TODO
1696d49e1aeSJan Lentfer 	 * verify key usage (must allow encryption)
1706d49e1aeSJan Lentfer 	 *
1716d49e1aeSJan Lentfer 	 * All certificate profiles, key and cryptographic formats are
1726d49e1aeSJan Lentfer 	 * defined by the IETF PKIX working group [PKIX]. When a key
1736d49e1aeSJan Lentfer 	 * usage extension is present, the digitalSignature bit must be
1746d49e1aeSJan Lentfer 	 * set for the key to be eligible for signing, as described
1756d49e1aeSJan Lentfer 	 * above, and the keyEncipherment bit must be present to allow
1766d49e1aeSJan Lentfer 	 * encryption, as described above. The keyAgreement bit must be
1776d49e1aeSJan Lentfer 	 * set on Diffie-Hellman certificates. (PKIX: RFC 3280)
1786d49e1aeSJan Lentfer 	 */
1796d49e1aeSJan Lentfer 
1806d49e1aeSJan Lentfer 	*pk = crypto_public_key_import(cert->public_key, cert->public_key_len);
1816d49e1aeSJan Lentfer 	x509_certificate_free(cert);
1826d49e1aeSJan Lentfer 
1836d49e1aeSJan Lentfer 	if (*pk == NULL) {
1846d49e1aeSJan Lentfer 		wpa_printf(MSG_ERROR, "TLSv1: Failed to import "
1856d49e1aeSJan Lentfer 			   "server public key");
1866d49e1aeSJan Lentfer 		return -1;
1876d49e1aeSJan Lentfer 	}
1886d49e1aeSJan Lentfer 
1896d49e1aeSJan Lentfer 	return 0;
1906d49e1aeSJan Lentfer }
1916d49e1aeSJan Lentfer 
1926d49e1aeSJan Lentfer 
1936d49e1aeSJan Lentfer int tls_verify_hash_init(struct tls_verify_hash *verify)
1946d49e1aeSJan Lentfer {
1956d49e1aeSJan Lentfer 	tls_verify_hash_free(verify);
1966d49e1aeSJan Lentfer 	verify->md5_client = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
1976d49e1aeSJan Lentfer 	verify->md5_server = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
1986d49e1aeSJan Lentfer 	verify->md5_cert = crypto_hash_init(CRYPTO_HASH_ALG_MD5, NULL, 0);
1996d49e1aeSJan Lentfer 	verify->sha1_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
2006d49e1aeSJan Lentfer 	verify->sha1_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
2016d49e1aeSJan Lentfer 	verify->sha1_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA1, NULL, 0);
2026d49e1aeSJan Lentfer 	if (verify->md5_client == NULL || verify->md5_server == NULL ||
2036d49e1aeSJan Lentfer 	    verify->md5_cert == NULL || verify->sha1_client == NULL ||
2046d49e1aeSJan Lentfer 	    verify->sha1_server == NULL || verify->sha1_cert == NULL) {
2056d49e1aeSJan Lentfer 		tls_verify_hash_free(verify);
2066d49e1aeSJan Lentfer 		return -1;
2076d49e1aeSJan Lentfer 	}
208*3ff40c12SJohn Marino #ifdef CONFIG_TLSV12
209*3ff40c12SJohn Marino 	verify->sha256_client = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
210*3ff40c12SJohn Marino 						 0);
211*3ff40c12SJohn Marino 	verify->sha256_server = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
212*3ff40c12SJohn Marino 						 0);
213*3ff40c12SJohn Marino 	verify->sha256_cert = crypto_hash_init(CRYPTO_HASH_ALG_SHA256, NULL,
214*3ff40c12SJohn Marino 					       0);
215*3ff40c12SJohn Marino 	if (verify->sha256_client == NULL || verify->sha256_server == NULL ||
216*3ff40c12SJohn Marino 	    verify->sha256_cert == NULL) {
217*3ff40c12SJohn Marino 		tls_verify_hash_free(verify);
218*3ff40c12SJohn Marino 		return -1;
219*3ff40c12SJohn Marino 	}
220*3ff40c12SJohn Marino #endif /* CONFIG_TLSV12 */
2216d49e1aeSJan Lentfer 	return 0;
2226d49e1aeSJan Lentfer }
2236d49e1aeSJan Lentfer 
2246d49e1aeSJan Lentfer 
2256d49e1aeSJan Lentfer void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
2266d49e1aeSJan Lentfer 			 size_t len)
2276d49e1aeSJan Lentfer {
2286d49e1aeSJan Lentfer 	if (verify->md5_client && verify->sha1_client) {
2296d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_client, buf, len);
2306d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_client, buf, len);
2316d49e1aeSJan Lentfer 	}
2326d49e1aeSJan Lentfer 	if (verify->md5_server && verify->sha1_server) {
2336d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_server, buf, len);
2346d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_server, buf, len);
2356d49e1aeSJan Lentfer 	}
2366d49e1aeSJan Lentfer 	if (verify->md5_cert && verify->sha1_cert) {
2376d49e1aeSJan Lentfer 		crypto_hash_update(verify->md5_cert, buf, len);
2386d49e1aeSJan Lentfer 		crypto_hash_update(verify->sha1_cert, buf, len);
2396d49e1aeSJan Lentfer 	}
240*3ff40c12SJohn Marino #ifdef CONFIG_TLSV12
241*3ff40c12SJohn Marino 	if (verify->sha256_client)
242*3ff40c12SJohn Marino 		crypto_hash_update(verify->sha256_client, buf, len);
243*3ff40c12SJohn Marino 	if (verify->sha256_server)
244*3ff40c12SJohn Marino 		crypto_hash_update(verify->sha256_server, buf, len);
245*3ff40c12SJohn Marino 	if (verify->sha256_cert)
246*3ff40c12SJohn Marino 		crypto_hash_update(verify->sha256_cert, buf, len);
247*3ff40c12SJohn Marino #endif /* CONFIG_TLSV12 */
2486d49e1aeSJan Lentfer }
2496d49e1aeSJan Lentfer 
2506d49e1aeSJan Lentfer 
2516d49e1aeSJan Lentfer void tls_verify_hash_free(struct tls_verify_hash *verify)
2526d49e1aeSJan Lentfer {
2536d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_client, NULL, NULL);
2546d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_server, NULL, NULL);
2556d49e1aeSJan Lentfer 	crypto_hash_finish(verify->md5_cert, NULL, NULL);
2566d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_client, NULL, NULL);
2576d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_server, NULL, NULL);
2586d49e1aeSJan Lentfer 	crypto_hash_finish(verify->sha1_cert, NULL, NULL);
2596d49e1aeSJan Lentfer 	verify->md5_client = NULL;
2606d49e1aeSJan Lentfer 	verify->md5_server = NULL;
2616d49e1aeSJan Lentfer 	verify->md5_cert = NULL;
2626d49e1aeSJan Lentfer 	verify->sha1_client = NULL;
2636d49e1aeSJan Lentfer 	verify->sha1_server = NULL;
2646d49e1aeSJan Lentfer 	verify->sha1_cert = NULL;
265*3ff40c12SJohn Marino #ifdef CONFIG_TLSV12
266*3ff40c12SJohn Marino 	crypto_hash_finish(verify->sha256_client, NULL, NULL);
267*3ff40c12SJohn Marino 	crypto_hash_finish(verify->sha256_server, NULL, NULL);
268*3ff40c12SJohn Marino 	crypto_hash_finish(verify->sha256_cert, NULL, NULL);
269*3ff40c12SJohn Marino 	verify->sha256_client = NULL;
270*3ff40c12SJohn Marino 	verify->sha256_server = NULL;
271*3ff40c12SJohn Marino 	verify->sha256_cert = NULL;
272*3ff40c12SJohn Marino #endif /* CONFIG_TLSV12 */
273*3ff40c12SJohn Marino }
274*3ff40c12SJohn Marino 
275*3ff40c12SJohn Marino 
276*3ff40c12SJohn Marino int tls_version_ok(u16 ver)
277*3ff40c12SJohn Marino {
278*3ff40c12SJohn Marino 	if (ver == TLS_VERSION_1)
279*3ff40c12SJohn Marino 		return 1;
280*3ff40c12SJohn Marino #ifdef CONFIG_TLSV11
281*3ff40c12SJohn Marino 	if (ver == TLS_VERSION_1_1)
282*3ff40c12SJohn Marino 		return 1;
283*3ff40c12SJohn Marino #endif /* CONFIG_TLSV11 */
284*3ff40c12SJohn Marino #ifdef CONFIG_TLSV12
285*3ff40c12SJohn Marino 	if (ver == TLS_VERSION_1_2)
286*3ff40c12SJohn Marino 		return 1;
287*3ff40c12SJohn Marino #endif /* CONFIG_TLSV12 */
288*3ff40c12SJohn Marino 
289*3ff40c12SJohn Marino 	return 0;
290*3ff40c12SJohn Marino }
291*3ff40c12SJohn Marino 
292*3ff40c12SJohn Marino 
293*3ff40c12SJohn Marino const char * tls_version_str(u16 ver)
294*3ff40c12SJohn Marino {
295*3ff40c12SJohn Marino 	switch (ver) {
296*3ff40c12SJohn Marino 	case TLS_VERSION_1:
297*3ff40c12SJohn Marino 		return "1.0";
298*3ff40c12SJohn Marino 	case TLS_VERSION_1_1:
299*3ff40c12SJohn Marino 		return "1.1";
300*3ff40c12SJohn Marino 	case TLS_VERSION_1_2:
301*3ff40c12SJohn Marino 		return "1.2";
302*3ff40c12SJohn Marino 	}
303*3ff40c12SJohn Marino 
304*3ff40c12SJohn Marino 	return "?";
305*3ff40c12SJohn Marino }
306*3ff40c12SJohn Marino 
307*3ff40c12SJohn Marino 
308*3ff40c12SJohn Marino int tls_prf(u16 ver, const u8 *secret, size_t secret_len, const char *label,
309*3ff40c12SJohn Marino 	    const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
310*3ff40c12SJohn Marino {
311*3ff40c12SJohn Marino #ifdef CONFIG_TLSV12
312*3ff40c12SJohn Marino 	if (ver >= TLS_VERSION_1_2) {
313*3ff40c12SJohn Marino 		tls_prf_sha256(secret, secret_len, label, seed, seed_len,
314*3ff40c12SJohn Marino 			       out, outlen);
315*3ff40c12SJohn Marino 		return 0;
316*3ff40c12SJohn Marino 	}
317*3ff40c12SJohn Marino #endif /* CONFIG_TLSV12 */
318*3ff40c12SJohn Marino 
319*3ff40c12SJohn Marino 	return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
320*3ff40c12SJohn Marino 				outlen);
3216d49e1aeSJan Lentfer }
322