25 RCSID(
"$Id: 684e9d178e020282f1caf6907143369ef3a96dec $")
29 #include <openssl/hmac.h>
32 #if OPENSSL_VERSION_NUMBER < 0x10001000L
36 static void P_hash(EVP_MD
const *evp_md,
37 unsigned char const *
secret,
unsigned int secret_len,
38 unsigned char const *seed,
unsigned int seed_len,
39 unsigned char *out,
unsigned int out_len)
41 HMAC_CTX ctx_a, ctx_out;
42 unsigned char a[HMAC_MAX_MD_CBLOCK];
45 HMAC_CTX_init(&ctx_a);
46 HMAC_CTX_init(&ctx_out);
47 HMAC_Init_ex(&ctx_a, secret, secret_len, evp_md, NULL);
48 HMAC_Init_ex(&ctx_out, secret, secret_len, evp_md, NULL);
50 size = HMAC_size(&ctx_out);
53 HMAC_Update(&ctx_a, seed, seed_len);
54 HMAC_Final(&ctx_a, a, NULL);
58 HMAC_Update(&ctx_out, a, size);
59 HMAC_Update(&ctx_out, seed, seed_len);
63 HMAC_Final(&ctx_out, a, NULL);
64 memcpy(out, a, out_len);
69 HMAC_Final(&ctx_out, out, NULL);
70 HMAC_Init_ex(&ctx_out, NULL, 0, NULL, NULL);
75 HMAC_Init_ex(&ctx_a, NULL, 0, NULL, NULL);
76 HMAC_Update(&ctx_a, a, size);
77 HMAC_Final(&ctx_a, a, NULL);
80 HMAC_CTX_cleanup(&ctx_a);
81 HMAC_CTX_cleanup(&ctx_out);
82 memset(a, 0,
sizeof(a));
85 static void PRF(
unsigned char const *
secret,
unsigned int secret_len,
86 unsigned char const *seed,
unsigned int seed_len,
87 unsigned char *out,
unsigned char *buf,
unsigned int out_len)
90 unsigned int len = (secret_len + 1) / 2;
91 uint8_t
const *s1 =
secret;
92 uint8_t
const *s2 = secret + (secret_len - len);
94 P_hash(EVP_md5(), s1, len, seed, seed_len, out, out_len);
95 P_hash(EVP_sha1(), s2, len, seed, seed_len, buf, out_len);
97 for (i=0; i < out_len; i++) {
103 #define EAPTLS_MPPE_KEY_LEN 32
114 prf_size = strlen(prf_label);
116 #if OPENSSL_VERSION_NUMBER >= 0x10001000L
117 if (SSL_export_keying_material(s, out,
sizeof(out), prf_label, prf_size, NULL, 0, 0) != 1) {
118 ERROR(
"Failed generating keying material");
123 uint8_t seed[64 + (2 * SSL3_RANDOM_SIZE)];
128 memcpy(p, prf_label, prf_size);
131 memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE);
132 p += SSL3_RANDOM_SIZE;
133 prf_size += SSL3_RANDOM_SIZE;
135 memcpy(p, s->s3->server_random, SSL3_RANDOM_SIZE);
136 prf_size += SSL3_RANDOM_SIZE;
138 PRF(s->session->master_key, s->session->master_key_length,
139 seed, prf_size, out, buf,
sizeof(out));
153 #define FR_TLS_PRF_CHALLENGE "ttls challenge"
163 #if OPENSSL_VERSION_NUMBER >= 0x10001000L
168 uint8_t out[32], buf[32];
174 memcpy(p, s->s3->client_random, SSL3_RANDOM_SIZE);
175 p += SSL3_RANDOM_SIZE;
176 memcpy(p, s->s3->server_random, SSL3_RANDOM_SIZE);
178 PRF(s->session->master_key, s->session->master_key_length,
179 seed,
sizeof(seed), out, buf,
sizeof(out));
180 memcpy(buffer, out, size);
196 p = talloc_array(vp, uint8_t, 1 + 2 * SSL3_RANDOM_SIZE);
197 p[0] = header & 0xff;
199 #ifdef HAVE_SSL_GET_CLIENT_RANDOM
200 SSL_get_client_random(s, p + 1, SSL3_RANDOM_SIZE);
201 SSL_get_server_random(s, p + 1 + SSL3_RANDOM_SIZE, SSL3_RANDOM_SIZE);
203 memcpy(p + 1, s->s3->client_random, SSL3_RANDOM_SIZE);
204 memcpy(p + 1 + SSL3_RANDOM_SIZE,
205 s->s3->server_random, SSL3_RANDOM_SIZE);
VALUE_PAIR * fr_pair_afrom_num(TALLOC_CTX *ctx, unsigned int vendor, unsigned int attr)
Create a new valuepair.
static USES_APPLE_DEPRECATED_API void P_hash(EVP_MD const *evp_md, unsigned char const *secret, unsigned int secret_len, unsigned char const *seed, unsigned int seed_len, unsigned char *out, unsigned int out_len)
VALUE_PAIR * vps
Result of decoding the packet into VALUE_PAIRs.
void eap_tls_gen_eap_key(RADIUS_PACKET *packet, SSL *s, uint32_t header)
#define EAPTLS_MPPE_KEY_LEN
static void PRF(unsigned char const *secret, unsigned int secret_len, unsigned char const *seed, unsigned int seed_len, unsigned char *out, unsigned char *buf, unsigned int out_len)
void fr_pair_add(VALUE_PAIR **head, VALUE_PAIR *vp)
Add a VP to the end of the list.
Stores an attribute, a value and various bits of other data.
void eap_ttls_gen_challenge(SSL *s, uint8_t *buffer, size_t size)
void eap_tls_gen_mppe_keys(REQUEST *request, SSL *s, char const *prf_label)
Generate keys according to RFC 2716 and add to the reply.
void fr_pair_value_memsteal(VALUE_PAIR *vp, uint8_t const *src)
Reparent an allocated octet buffer to a VALUE_PAIR.
#define FR_TLS_PRF_CHALLENGE
static char const * secret
void eap_add_reply(REQUEST *request, char const *name, uint8_t const *value, int len)
#define USES_APPLE_DEPRECATED_API