Rename tls_prf() to tls_prf_sha1_md5()
Prepare for multiple TLS PRF functions by renaming the SHA1+MD5 based TLS PRF function to more specific name and add tls_prf() within the internal TLS implementation as a wrapper for this for now. Signed-hostap: Jouni Malinen <j@w1.fi>
This commit is contained in:
parent
ebe4e8f814
commit
cd52acec85
9 changed files with 30 additions and 18 deletions
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tls_prf - Pseudo-Random Function for TLS (TLS-PRF, RFC 2246)
|
* tls_prf_sha1_md5 - Pseudo-Random Function for TLS (TLS-PRF, RFC 2246)
|
||||||
* @secret: Key for PRF
|
* @secret: Key for PRF
|
||||||
* @secret_len: Length of the key in bytes
|
* @secret_len: Length of the key in bytes
|
||||||
* @label: A unique label for each purpose of the PRF
|
* @label: A unique label for each purpose of the PRF
|
||||||
|
@ -33,7 +33,7 @@
|
||||||
* This function is used to derive new, cryptographically separate keys from a
|
* This function is used to derive new, cryptographically separate keys from a
|
||||||
* given key in TLS. This PRF is defined in RFC 2246, Chapter 5.
|
* given key in TLS. This PRF is defined in RFC 2246, Chapter 5.
|
||||||
*/
|
*/
|
||||||
int tls_prf(const u8 *secret, size_t secret_len, const char *label,
|
int tls_prf_sha1_md5(const u8 *secret, size_t secret_len, const char *label,
|
||||||
const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
|
const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
|
||||||
{
|
{
|
||||||
size_t L_S1, L_S2, i;
|
size_t L_S1, L_S2, i;
|
||||||
|
|
|
@ -25,9 +25,9 @@ int sha1_prf(const u8 *key, size_t key_len, const char *label,
|
||||||
const u8 *data, size_t data_len, u8 *buf, size_t buf_len);
|
const u8 *data, size_t data_len, u8 *buf, size_t buf_len);
|
||||||
int sha1_t_prf(const u8 *key, size_t key_len, const char *label,
|
int sha1_t_prf(const u8 *key, size_t key_len, const char *label,
|
||||||
const u8 *seed, size_t seed_len, u8 *buf, size_t buf_len);
|
const u8 *seed, size_t seed_len, u8 *buf, size_t buf_len);
|
||||||
int __must_check tls_prf(const u8 *secret, size_t secret_len,
|
int __must_check tls_prf_sha1_md5(const u8 *secret, size_t secret_len,
|
||||||
const char *label, const u8 *seed, size_t seed_len,
|
const char *label, const u8 *seed,
|
||||||
u8 *out, size_t outlen);
|
size_t seed_len, u8 *out, size_t outlen);
|
||||||
int pbkdf2_sha1(const char *passphrase, const char *ssid, size_t ssid_len,
|
int pbkdf2_sha1(const char *passphrase, const char *ssid, size_t ssid_len,
|
||||||
int iterations, u8 *buf, size_t buflen);
|
int iterations, u8 *buf, size_t buflen);
|
||||||
#endif /* SHA1_H */
|
#endif /* SHA1_H */
|
||||||
|
|
|
@ -305,7 +305,7 @@ int __must_check tls_connection_get_keys(void *tls_ctx,
|
||||||
* not exported from the TLS library, tls_connection_prf() is required so that
|
* not exported from the TLS library, tls_connection_prf() is required so that
|
||||||
* further keying material can be derived from the master secret. If not
|
* further keying material can be derived from the master secret. If not
|
||||||
* implemented, the function will still need to be defined, but it can just
|
* implemented, the function will still need to be defined, but it can just
|
||||||
* return -1. Example implementation of this function is in tls_prf() function
|
* return -1. Example implementation of this function is in tls_prf_sha1_md5()
|
||||||
* when it is called with seed set to client_random|server_random (or
|
* when it is called with seed set to client_random|server_random (or
|
||||||
* server_random|client_random).
|
* server_random|client_random).
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -133,7 +133,7 @@ u8 * eap_fast_derive_key(void *ssl_ctx, struct tls_connection *conn,
|
||||||
|
|
||||||
wpa_hexdump_key(MSG_MSGDUMP, "EAP-FAST: master_secret for key "
|
wpa_hexdump_key(MSG_MSGDUMP, "EAP-FAST: master_secret for key "
|
||||||
"expansion", keys.master_key, keys.master_key_len);
|
"expansion", keys.master_key, keys.master_key_len);
|
||||||
if (tls_prf(keys.master_key, keys.master_key_len,
|
if (tls_prf_sha1_md5(keys.master_key, keys.master_key_len,
|
||||||
label, rnd, keys.client_random_len +
|
label, rnd, keys.client_random_len +
|
||||||
keys.server_random_len, out, block_size + len))
|
keys.server_random_len, out, block_size + len))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -294,7 +294,7 @@ u8 * eap_peer_tls_derive_key(struct eap_sm *sm, struct eap_ssl_data *data,
|
||||||
os_memcpy(rnd + keys.client_random_len, keys.server_random,
|
os_memcpy(rnd + keys.client_random_len, keys.server_random,
|
||||||
keys.server_random_len);
|
keys.server_random_len);
|
||||||
|
|
||||||
if (tls_prf(keys.master_key, keys.master_key_len,
|
if (tls_prf_sha1_md5(keys.master_key, keys.master_key_len,
|
||||||
label, rnd, keys.client_random_len +
|
label, rnd, keys.client_random_len +
|
||||||
keys.server_random_len, out, len))
|
keys.server_random_len, out, len))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -94,7 +94,7 @@ u8 * eap_server_tls_derive_key(struct eap_sm *sm, struct eap_ssl_data *data,
|
||||||
os_memcpy(rnd + keys.client_random_len, keys.server_random,
|
os_memcpy(rnd + keys.client_random_len, keys.server_random,
|
||||||
keys.server_random_len);
|
keys.server_random_len);
|
||||||
|
|
||||||
if (tls_prf(keys.master_key, keys.master_key_len,
|
if (tls_prf_sha1_md5(keys.master_key, keys.master_key_len,
|
||||||
label, rnd, keys.client_random_len +
|
label, rnd, keys.client_random_len +
|
||||||
keys.server_random_len, out, len))
|
keys.server_random_len, out, len))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "crypto/sha1.h"
|
||||||
#include "x509v3.h"
|
#include "x509v3.h"
|
||||||
#include "tlsv1_common.h"
|
#include "tlsv1_common.h"
|
||||||
|
|
||||||
|
@ -265,3 +266,11 @@ const char * tls_version_str(u16 ver)
|
||||||
|
|
||||||
return "?";
|
return "?";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int tls_prf(const u8 *secret, size_t secret_len, const char *label,
|
||||||
|
const u8 *seed, size_t seed_len, u8 *out, size_t outlen)
|
||||||
|
{
|
||||||
|
return tls_prf_sha1_md5(secret, secret_len, label, seed, seed_len, out,
|
||||||
|
outlen);
|
||||||
|
}
|
||||||
|
|
|
@ -220,5 +220,7 @@ void tls_verify_hash_add(struct tls_verify_hash *verify, const u8 *buf,
|
||||||
void tls_verify_hash_free(struct tls_verify_hash *verify);
|
void tls_verify_hash_free(struct tls_verify_hash *verify);
|
||||||
int tls_version_ok(u16 ver);
|
int tls_version_ok(u16 ver);
|
||||||
const char * tls_version_str(u16 ver);
|
const char * tls_version_str(u16 ver);
|
||||||
|
int tls_prf(const u8 *secret, size_t secret_len, const char *label,
|
||||||
|
const u8 *seed, size_t seed_len, u8 *out, size_t outlen);
|
||||||
|
|
||||||
#endif /* TLSV1_COMMON_H */
|
#endif /* TLSV1_COMMON_H */
|
||||||
|
|
|
@ -137,8 +137,9 @@ static int test_eap_fast(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("- PRF (TLS, SHA1/MD5) test case / key_block\n");
|
printf("- PRF (TLS, SHA1/MD5) test case / key_block\n");
|
||||||
if (tls_prf(master_secret, sizeof(master_secret), "key expansion",
|
if (tls_prf_sha1_md5(master_secret, sizeof(master_secret),
|
||||||
seed, sizeof(seed), buf, sizeof(key_block)) ||
|
"key expansion", seed, sizeof(seed),
|
||||||
|
buf, sizeof(key_block)) ||
|
||||||
memcmp(key_block, buf, sizeof(key_block)) != 0) {
|
memcmp(key_block, buf, sizeof(key_block)) != 0) {
|
||||||
printf("PRF test - FAILED!\n");
|
printf("PRF test - FAILED!\n");
|
||||||
errors++;
|
errors++;
|
||||||
|
|
Loading…
Reference in a new issue