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);
49 if (prf_size > 128) prf_size = 128;
62#define MIN(a,b) (((a)>(b)) ? (b) : (a))
66 while (pos < out_len) {
98 uint8_t const *aad,
size_t aad_len,
113 if (1 != EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
117 if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL))
121 if (1 != EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv))
handleErrors();
126 if (1 != EVP_EncryptUpdate(ctx, NULL, &len, aad, aad_len))
132 if (1 != EVP_EncryptUpdate(ctx, ciphertext, &len, plaintext, plaintext_len))
134 ciphertext_len = len;
139 if (1 != EVP_EncryptFinal_ex(ctx, ciphertext + len, &len))
handleErrors();
140 ciphertext_len += len;
143 if (1 != EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag))
147 EVP_CIPHER_CTX_free(ctx);
149 return ciphertext_len;
153 uint8_t const *aad,
size_t aad_len,
165 if (!EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), NULL, NULL, NULL))
169 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL))
173 if (!EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv))
handleErrors();
178 if (!EVP_DecryptUpdate(ctx, NULL, &len, aad, aad_len))
184 if (!EVP_DecryptUpdate(ctx, plaintext, &len, ciphertext, ciphertext_len))
191 memcpy(&tmp, &tag,
sizeof(tmp));
194 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tmp))
handleErrors();
200 ret = EVP_DecryptFinal_ex(ctx, plaintext + len, &len);
203 EVP_CIPHER_CTX_free(ctx);
205 if (ret == 0)
return -1;
208 return plaintext_len + len;
213 EVP_MD
const *evp_md,
215 uint8_t const *seed,
size_t seed_len)
217 EVP_MD_CTX *ctx_a, *ctx_out;
223 ctx_a = EVP_MD_CTX_new();
224 ctx_out = EVP_MD_CTX_new();
226 MEM(pkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, NULL,
secret, secret_len));
228 EVP_DigestSignInit(ctx_a, NULL, evp_md, NULL, pkey);
229 EVP_DigestSignInit(ctx_out, NULL, evp_md, NULL, pkey);
231 size = EVP_MD_size(evp_md);
234 EVP_DigestSignUpdate(ctx_a, seed, seed_len);
239 EVP_DigestSignFinal(ctx_a, a, &(
size_t){
sizeof(a) });
243 EVP_DigestSignUpdate(ctx_out, a, size);
244 EVP_DigestSignUpdate(ctx_out, seed, seed_len);
247 if (out_len < size) {
248 EVP_DigestSignFinal(ctx_out, a, &(
size_t){
sizeof(a) });
249 memcpy(
out, a, out_len);
254 EVP_DigestSignFinal(ctx_out,
out, &(
size_t){ EVP_MAX_MD_SIZE });
255 EVP_MD_CTX_reset(ctx_out);
257 EVP_DigestSignInit(ctx_out, NULL, evp_md, NULL, pkey);
262 EVP_MD_CTX_reset(ctx_a);
263 EVP_DigestSignInit(ctx_a, NULL, evp_md, NULL, pkey);
264 EVP_DigestSignUpdate(ctx_a, a, size);
265 EVP_DigestSignFinal(ctx_a, a, &(
size_t){ EVP_MAX_MD_SIZE });
270 EVP_MD_CTX_free(ctx_a);
271 EVP_MD_CTX_free(ctx_out);
272#ifdef __STDC_LIB_EXT1__
273 memset_s(a, 0,
sizeof(a),
sizeof(a));
275 memset(a, 0,
sizeof(a));
282 uint8_t const *seed,
size_t seed_len)
285 unsigned int len = (secret_len + 1) / 2;
292 for (i = 0; i < out_len; i++)
out[i] ^= scratch[i];
302 size_t len, master_key_len;
303 uint8_t seed[128 + (2 * SSL3_RANDOM_SIZE)];
304 uint8_t master_key[SSL_MAX_MASTER_KEY_LENGTH];
306 len = strlen(prf_label);
307 if (len > 128) len = 128;
310 memcpy(p, prf_label, len);
312 (void) SSL_get_server_random(s, p, SSL3_RANDOM_SIZE);
313 p += SSL3_RANDOM_SIZE;
314 (void) SSL_get_client_random(s, p, SSL3_RANDOM_SIZE);
315 p += SSL3_RANDOM_SIZE;
317 master_key_len = SSL_SESSION_get_master_key(SSL_get_session(s), master_key,
sizeof(master_key));
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)
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)
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)
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.