mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2025-01-31 09:14:03 -05:00
DPP2: Use the new privacy protection key to protect E-id on Enrollee
Use ppKey instead of C-sign-key to encrypted E-id to E'-id into Reconfig Announcement frame on the Enrollee side. Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
37df40845a
commit
99d7bf2348
@ -723,7 +723,9 @@ int dpp_reconfig_auth_conf_rx(struct dpp_authentication *auth, const u8 *hdr,
|
|||||||
const u8 *attr_start, size_t attr_len);
|
const u8 *attr_start, size_t attr_len);
|
||||||
|
|
||||||
struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
||||||
size_t csign_key_len);
|
size_t csign_key_len,
|
||||||
|
const u8 *pp_key,
|
||||||
|
size_t pp_key_len);
|
||||||
int dpp_update_reconfig_id(struct dpp_reconfig_id *id);
|
int dpp_update_reconfig_id(struct dpp_reconfig_id *id);
|
||||||
void dpp_free_reconfig_id(struct dpp_reconfig_id *id);
|
void dpp_free_reconfig_id(struct dpp_reconfig_id *id);
|
||||||
|
|
||||||
|
@ -3004,10 +3004,12 @@ fail:
|
|||||||
|
|
||||||
|
|
||||||
struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
||||||
size_t csign_key_len)
|
size_t csign_key_len,
|
||||||
|
const u8 *pp_key,
|
||||||
|
size_t pp_key_len)
|
||||||
{
|
{
|
||||||
const unsigned char *p;
|
const unsigned char *p;
|
||||||
EVP_PKEY *csign = NULL;
|
EVP_PKEY *csign = NULL, *ppkey = NULL;
|
||||||
struct dpp_reconfig_id *id = NULL;
|
struct dpp_reconfig_id *id = NULL;
|
||||||
BN_CTX *ctx = NULL;
|
BN_CTX *ctx = NULL;
|
||||||
BIGNUM *bn = NULL, *q = NULL;
|
BIGNUM *bn = NULL, *q = NULL;
|
||||||
@ -3020,6 +3022,13 @@ struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
|||||||
if (!csign)
|
if (!csign)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (!pp_key)
|
||||||
|
goto fail;
|
||||||
|
p = pp_key;
|
||||||
|
ppkey = d2i_PUBKEY(NULL, &p, pp_key_len);
|
||||||
|
if (!ppkey)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
eckey = EVP_PKEY_get0_EC_KEY(csign);
|
eckey = EVP_PKEY_get0_EC_KEY(csign);
|
||||||
if (!eckey)
|
if (!eckey)
|
||||||
goto fail;
|
goto fail;
|
||||||
@ -3047,9 +3056,12 @@ struct dpp_reconfig_id * dpp_gen_reconfig_id(const u8 *csign_key,
|
|||||||
e_id = NULL;
|
e_id = NULL;
|
||||||
id->csign = csign;
|
id->csign = csign;
|
||||||
csign = NULL;
|
csign = NULL;
|
||||||
|
id->pp_key = ppkey;
|
||||||
|
ppkey = NULL;
|
||||||
fail:
|
fail:
|
||||||
EC_POINT_free(e_id);
|
EC_POINT_free(e_id);
|
||||||
EVP_PKEY_free(csign);
|
EVP_PKEY_free(csign);
|
||||||
|
EVP_PKEY_free(ppkey);
|
||||||
BN_clear_free(bn);
|
BN_clear_free(bn);
|
||||||
BN_CTX_free(ctx);
|
BN_CTX_free(ctx);
|
||||||
return id;
|
return id;
|
||||||
@ -3093,13 +3105,13 @@ int dpp_update_reconfig_id(struct dpp_reconfig_id *id)
|
|||||||
BIGNUM *bn = NULL, *q = NULL;
|
BIGNUM *bn = NULL, *q = NULL;
|
||||||
EC_POINT *e_prime_id = NULL, *a_nonce = NULL;
|
EC_POINT *e_prime_id = NULL, *a_nonce = NULL;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
const EC_KEY *csign;
|
const EC_KEY *pp;
|
||||||
const EC_POINT *csign_point;
|
const EC_POINT *pp_point;
|
||||||
|
|
||||||
csign = EVP_PKEY_get0_EC_KEY(id->csign);
|
pp = EVP_PKEY_get0_EC_KEY(id->pp_key);
|
||||||
if (!csign)
|
if (!pp)
|
||||||
goto fail;
|
goto fail;
|
||||||
csign_point = EC_KEY_get0_public_key(csign);
|
pp_point = EC_KEY_get0_public_key(pp);
|
||||||
e_prime_id = EC_POINT_new(id->group);
|
e_prime_id = EC_POINT_new(id->group);
|
||||||
a_nonce = EC_POINT_new(id->group);
|
a_nonce = EC_POINT_new(id->group);
|
||||||
ctx = BN_CTX_new();
|
ctx = BN_CTX_new();
|
||||||
@ -3107,12 +3119,12 @@ int dpp_update_reconfig_id(struct dpp_reconfig_id *id)
|
|||||||
q = BN_new();
|
q = BN_new();
|
||||||
/* Generate random 0 <= a-nonce < q
|
/* Generate random 0 <= a-nonce < q
|
||||||
* A-NONCE = a-nonce * G
|
* A-NONCE = a-nonce * G
|
||||||
* E'-id = E-id + a-nonce * S_C */
|
* E'-id = E-id + a-nonce * P_pk */
|
||||||
if (!csign_point || !e_prime_id || !a_nonce || !ctx || !bn || !q ||
|
if (!pp_point || !e_prime_id || !a_nonce || !ctx || !bn || !q ||
|
||||||
!EC_GROUP_get_order(id->group, q, ctx) ||
|
!EC_GROUP_get_order(id->group, q, ctx) ||
|
||||||
!BN_rand_range(bn, q) || /* bn = a-nonce */
|
!BN_rand_range(bn, q) || /* bn = a-nonce */
|
||||||
!EC_POINT_mul(id->group, a_nonce, bn, NULL, NULL, ctx) ||
|
!EC_POINT_mul(id->group, a_nonce, bn, NULL, NULL, ctx) ||
|
||||||
!EC_POINT_mul(id->group, e_prime_id, NULL, csign_point, bn, ctx) ||
|
!EC_POINT_mul(id->group, e_prime_id, NULL, pp_point, bn, ctx) ||
|
||||||
!EC_POINT_add(id->group, e_prime_id, id->e_id, e_prime_id, ctx))
|
!EC_POINT_add(id->group, e_prime_id, id->e_id, e_prime_id, ctx))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@ -3145,6 +3157,7 @@ void dpp_free_reconfig_id(struct dpp_reconfig_id *id)
|
|||||||
EVP_PKEY_free(id->csign);
|
EVP_PKEY_free(id->csign);
|
||||||
EVP_PKEY_free(id->a_nonce);
|
EVP_PKEY_free(id->a_nonce);
|
||||||
EVP_PKEY_free(id->e_prime_id);
|
EVP_PKEY_free(id->e_prime_id);
|
||||||
|
EVP_PKEY_free(id->pp_key);
|
||||||
os_free(id);
|
os_free(id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,6 +146,7 @@ struct dpp_reconfig_id {
|
|||||||
EVP_PKEY *csign;
|
EVP_PKEY *csign;
|
||||||
EVP_PKEY *a_nonce; /* A-NONCE */
|
EVP_PKEY *a_nonce; /* A-NONCE */
|
||||||
EVP_PKEY *e_prime_id; /* E'-id */
|
EVP_PKEY *e_prime_id; /* E'-id */
|
||||||
|
EVP_PKEY *pp_key;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* dpp_tcp.c */
|
/* dpp_tcp.c */
|
||||||
|
@ -3730,7 +3730,9 @@ int wpas_dpp_reconfig(struct wpa_supplicant *wpa_s, const char *cmd)
|
|||||||
|
|
||||||
dpp_free_reconfig_id(wpa_s->dpp_reconfig_id);
|
dpp_free_reconfig_id(wpa_s->dpp_reconfig_id);
|
||||||
wpa_s->dpp_reconfig_id = dpp_gen_reconfig_id(ssid->dpp_csign,
|
wpa_s->dpp_reconfig_id = dpp_gen_reconfig_id(ssid->dpp_csign,
|
||||||
ssid->dpp_csign_len);
|
ssid->dpp_csign_len,
|
||||||
|
ssid->dpp_pp_key,
|
||||||
|
ssid->dpp_pp_key_len);
|
||||||
if (!wpa_s->dpp_reconfig_id) {
|
if (!wpa_s->dpp_reconfig_id) {
|
||||||
wpa_printf(MSG_DEBUG,
|
wpa_printf(MSG_DEBUG,
|
||||||
"DPP: Failed to generate E-id for reconfiguration");
|
"DPP: Failed to generate E-id for reconfiguration");
|
||||||
|
Loading…
Reference in New Issue
Block a user