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