27RCSID(
"$Id: e1fc391684bf921ad22728321cabb5dc5469f1ca $")
31#include <freeradius-devel/tls/base.h>
32#include <freeradius-devel/eap/tls.h>
34#include <openssl/evp.h>
35#include <openssl/aes.h>
40void T_PRF(
unsigned char const *
secret,
unsigned int secret_len,
41 char const *prf_label,
42 unsigned char const *seed,
unsigned int seed_len,
43 unsigned char *
out,
unsigned int out_len)
45 size_t prf_size = strlen(prf_label);
50 if (prf_size > 128) prf_size = 128;
63#define MIN(a,b) (((a)>(b)) ? (b) : (a))
67 while (pos < out_len) {
86 unsigned long errCode;
88 fprintf(stderr,
"An error occurred\n");
89 while((errCode = ERR_get_error()))
91 char *err = ERR_error_string(errCode, NULL);
92 fprintf(stderr,
"%s\n", err);
99 uint8_t const *aad,
size_t aad_len,
114 if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
118 if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL))
122 if (1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
handleErrors();
127 if (1 != EVP_EncryptUpdate(ctx, NULL, &
len, aad, (
int)aad_len))
133 if (1 != EVP_EncryptUpdate(ctx, ciphertext, &
len, plaintext, (
int)plaintext_len))
135 ciphertext_len =
len;
141 ciphertext_len +=
len;
144 if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
148 EVP_CIPHER_CTX_free(ctx);
150 return ciphertext_len;
154 uint8_t const *aad,
size_t aad_len,
166 if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
170 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL))
174 if (!EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv))
handleErrors();
179 if (!EVP_DecryptUpdate(ctx, NULL, &
len, aad, (
int)aad_len))
185 if (!EVP_DecryptUpdate(ctx, plaintext, &
len, ciphertext, (
int)ciphertext_len))
192 memcpy(&tmp, &tag,
sizeof(tmp));
195 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tmp))
handleErrors();
201 ret = EVP_DecryptFinal_ex(ctx, plaintext +
len, &
len);
204 EVP_CIPHER_CTX_free(ctx);
206 if (ret == 0)
return -1;
209 return plaintext_len +
len;
214 EVP_MD
const *evp_md,
216 uint8_t const *seed,
size_t seed_len)
218 EVP_MD_CTX *ctx_a, *ctx_out;
224 ctx_a = EVP_MD_CTX_new();
225 ctx_out = EVP_MD_CTX_new();
227 MEM(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL,
secret, (
int)secret_len));
229 EVP_DigestSignInit(ctx_a, NULL, evp_md, NULL, pkey);
230 EVP_DigestSignInit(ctx_out, NULL, evp_md, NULL, pkey);
232 size = EVP_MD_size(evp_md);
235 EVP_DigestSignUpdate(ctx_a, seed, seed_len);
240 EVP_DigestSignFinal(ctx_a, a, &(
size_t){
sizeof(a) });
244 EVP_DigestSignUpdate(ctx_out, a, size);
245 EVP_DigestSignUpdate(ctx_out, seed, seed_len);
248 if (out_len < size) {
249 EVP_DigestSignFinal(ctx_out, a, &(
size_t){
sizeof(a) });
250 memcpy(
out, a, out_len);
255 EVP_DigestSignFinal(ctx_out,
out, &(
size_t){ EVP_MAX_MD_SIZE });
256 EVP_MD_CTX_reset(ctx_out);
258 EVP_DigestSignInit(ctx_out, NULL, evp_md, NULL, pkey);
263 EVP_MD_CTX_reset(ctx_a);
264 EVP_DigestSignInit(ctx_a, NULL, evp_md, NULL, pkey);
265 EVP_DigestSignUpdate(ctx_a, a, size);
266 EVP_DigestSignFinal(ctx_a, a, &(
size_t){ EVP_MAX_MD_SIZE });
271 EVP_MD_CTX_free(ctx_a);
272 EVP_MD_CTX_free(ctx_out);
273#ifdef __STDC_LIB_EXT1__
274 memset_s(a, 0,
sizeof(a),
sizeof(a));
276 memset(a, 0,
sizeof(a));
283 uint8_t const *seed,
size_t seed_len)
286 unsigned int len = (secret_len + 1) / 2;
293 for (i = 0; i < out_len; i++)
out[i] ^= scratch[i];
297 uint8_t const *seed,
size_t seed_len)
308 size_t len, master_key_len;
309 uint8_t seed[128 + (2 * SSL3_RANDOM_SIZE)];
310 uint8_t master_key[SSL_MAX_MASTER_KEY_LENGTH];
312 len = strlen(prf_label);
316 memcpy(p, prf_label,
len);
318 (void) SSL_get_server_random(s, p, SSL3_RANDOM_SIZE);
319 p += SSL3_RANDOM_SIZE;
320 (void) SSL_get_client_random(s, p, SSL3_RANDOM_SIZE);
321 p += SSL3_RANDOM_SIZE;
323 master_key_len = SSL_SESSION_get_master_key(SSL_get_session(s), master_key,
sizeof(master_key));
324 if (version == TLS1_2_VERSION) {
static int const char char buffer[256]
#define USES_APPLE_DEPRECATED_API
#define NEVER_RETURNS
Should be placed before the function return type.
static void eap_crypto_rfc5246_prf(uint8_t *out, size_t out_len, uint8_t const *secret, size_t secret_len, uint8_t const *seed, size_t seed_len)
int eap_fast_decrypt(uint8_t const *ciphertext, size_t ciphertext_len, uint8_t const *aad, size_t aad_len, uint8_t const *tag, uint8_t const *key, uint8_t const *iv, uint8_t *plaintext)
static NEVER_RETURNS void handleErrors(void)
int eap_fast_encrypt(uint8_t const *plaintext, size_t plaintext_len, uint8_t const *aad, size_t aad_len, uint8_t const *key, uint8_t *iv, unsigned char *ciphertext, uint8_t *tag)
void eap_fast_tls_gen_challenge(SSL *s, int version, uint8_t *buffer, uint8_t *scratch, size_t size, char const *prf_label)
static void crypto_rfc4346_p_hash(uint8_t *out, size_t out_len, EVP_MD const *evp_md, uint8_t const *secret, size_t secret_len, uint8_t const *seed, size_t seed_len)
USES_APPLE_DEPRECATED_API void T_PRF(unsigned char const *secret, unsigned int secret_len, char const *prf_label, unsigned char const *seed, unsigned int seed_len, unsigned char *out, unsigned int out_len)
static void eap_crypto_rfc4346_prf(uint8_t *out, size_t out_len, uint8_t *scratch, uint8_t const *secret, size_t secret_len, uint8_t const *seed, size_t seed_len)
Crypto function declarations.
int fr_hmac_sha1(uint8_t digest[static SHA1_DIGEST_LENGTH], uint8_t const *in, size_t inlen, uint8_t const *key, size_t key_len)
Calculate HMAC using internal SHA1 implementation.
#define SHA1_DIGEST_LENGTH
static fr_sbuff_err_t char ** out
static fr_sbuff_err_t char size_t * len