mirror of
https://github.com/vanhoefm/fragattacks.git
synced 2024-11-25 00:38:24 -05:00
DPP2: Add a helper function for building Presence Announcement frame
Signed-off-by: Jouni Malinen <jouni@codeaurora.org>
This commit is contained in:
parent
7cba35b0ed
commit
1f0226770c
@ -1056,6 +1056,32 @@ static const struct dpp_curve_params * dpp_get_curve_nid(int nid)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int dpp_bi_pubkey_hash(struct dpp_bootstrap_info *bi,
|
||||||
|
const u8 *data, size_t data_len)
|
||||||
|
{
|
||||||
|
const u8 *addr[2];
|
||||||
|
size_t len[2];
|
||||||
|
|
||||||
|
addr[0] = data;
|
||||||
|
len[0] = data_len;
|
||||||
|
if (sha256_vector(1, addr, len, bi->pubkey_hash) < 0)
|
||||||
|
return -1;
|
||||||
|
wpa_hexdump(MSG_DEBUG, "DPP: Public key hash",
|
||||||
|
bi->pubkey_hash, SHA256_MAC_LEN);
|
||||||
|
|
||||||
|
addr[0] = (const u8 *) "chirp";
|
||||||
|
len[0] = 5;
|
||||||
|
addr[1] = data;
|
||||||
|
len[1] = data_len;
|
||||||
|
if (sha256_vector(2, addr, len, bi->pubkey_hash_chirp) < 0)
|
||||||
|
return -1;
|
||||||
|
wpa_hexdump(MSG_DEBUG, "DPP: Public key hash (chirp)",
|
||||||
|
bi->pubkey_hash_chirp, SHA256_MAC_LEN);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dpp_parse_uri_pk(struct dpp_bootstrap_info *bi, const char *info)
|
static int dpp_parse_uri_pk(struct dpp_bootstrap_info *bi, const char *info)
|
||||||
{
|
{
|
||||||
const char *end;
|
const char *end;
|
||||||
@ -1094,14 +1120,11 @@ static int dpp_parse_uri_pk(struct dpp_bootstrap_info *bi, const char *info)
|
|||||||
wpa_hexdump(MSG_DEBUG, "DPP: Base64 decoded URI public-key",
|
wpa_hexdump(MSG_DEBUG, "DPP: Base64 decoded URI public-key",
|
||||||
data, data_len);
|
data, data_len);
|
||||||
|
|
||||||
if (sha256_vector(1, (const u8 **) &data, &data_len,
|
if (dpp_bi_pubkey_hash(bi, data, data_len) < 0) {
|
||||||
bi->pubkey_hash) < 0) {
|
|
||||||
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
||||||
os_free(data);
|
os_free(data);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: Public key hash",
|
|
||||||
bi->pubkey_hash, SHA256_MAC_LEN);
|
|
||||||
|
|
||||||
/* DER encoded ASN.1 SubjectPublicKeyInfo
|
/* DER encoded ASN.1 SubjectPublicKeyInfo
|
||||||
*
|
*
|
||||||
@ -1519,27 +1542,19 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int dpp_bootstrap_key_hash(struct dpp_bootstrap_info *bi)
|
static int dpp_bootstrap_key_hash(struct dpp_bootstrap_info *bi)
|
||||||
{
|
{
|
||||||
struct wpabuf *der;
|
struct wpabuf *der;
|
||||||
int res;
|
int res;
|
||||||
const u8 *addr[1];
|
|
||||||
size_t len[1];
|
|
||||||
|
|
||||||
der = dpp_bootstrap_key_der(bi->pubkey);
|
der = dpp_bootstrap_key_der(bi->pubkey);
|
||||||
if (!der)
|
if (!der)
|
||||||
return -1;
|
return -1;
|
||||||
wpa_hexdump_buf(MSG_DEBUG, "DPP: Compressed public key (DER)",
|
wpa_hexdump_buf(MSG_DEBUG, "DPP: Compressed public key (DER)",
|
||||||
der);
|
der);
|
||||||
|
res = dpp_bi_pubkey_hash(bi, wpabuf_head(der), wpabuf_len(der));
|
||||||
addr[0] = wpabuf_head(der);
|
|
||||||
len[0] = wpabuf_len(der);
|
|
||||||
res = sha256_vector(1, addr, len, bi->pubkey_hash);
|
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
||||||
else
|
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: Public key hash", bi->pubkey_hash,
|
|
||||||
SHA256_MAC_LEN);
|
|
||||||
wpabuf_free(der);
|
wpabuf_free(der);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@ -1552,8 +1567,6 @@ static int dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve,
|
|||||||
char *pos, *end;
|
char *pos, *end;
|
||||||
size_t len;
|
size_t len;
|
||||||
struct wpabuf *der = NULL;
|
struct wpabuf *der = NULL;
|
||||||
const u8 *addr[1];
|
|
||||||
int res;
|
|
||||||
|
|
||||||
if (!curve) {
|
if (!curve) {
|
||||||
bi->curve = &dpp_curves[0];
|
bi->curve = &dpp_curves[0];
|
||||||
@ -1579,15 +1592,10 @@ static int dpp_keygen(struct dpp_bootstrap_info *bi, const char *curve,
|
|||||||
wpa_hexdump_buf(MSG_DEBUG, "DPP: Compressed public key (DER)",
|
wpa_hexdump_buf(MSG_DEBUG, "DPP: Compressed public key (DER)",
|
||||||
der);
|
der);
|
||||||
|
|
||||||
addr[0] = wpabuf_head(der);
|
if (dpp_bi_pubkey_hash(bi, wpabuf_head(der), wpabuf_len(der)) < 0) {
|
||||||
len = wpabuf_len(der);
|
|
||||||
res = sha256_vector(1, addr, &len, bi->pubkey_hash);
|
|
||||||
if (res < 0) {
|
|
||||||
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
wpa_printf(MSG_DEBUG, "DPP: Failed to hash public key");
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: Public key hash", bi->pubkey_hash,
|
|
||||||
SHA256_MAC_LEN);
|
|
||||||
|
|
||||||
base64 = base64_encode(wpabuf_head(der), wpabuf_len(der), &len);
|
base64 = base64_encode(wpabuf_head(der), wpabuf_len(der), &len);
|
||||||
wpabuf_free(der);
|
wpabuf_free(der);
|
||||||
@ -12211,4 +12219,22 @@ void dpp_controller_stop(struct dpp_global *dpp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct wpabuf * dpp_build_presence_announcement(struct dpp_bootstrap_info *bi)
|
||||||
|
{
|
||||||
|
struct wpabuf *msg;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "DPP: Build Presence Announcement frame");
|
||||||
|
|
||||||
|
msg = dpp_alloc_msg(DPP_PA_PRESENCE_ANNOUNCEMENT, 4 + SHA256_MAC_LEN);
|
||||||
|
if (!msg)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Responder Bootstrapping Key Hash */
|
||||||
|
dpp_build_attr_r_bootstrap_key_hash(msg, bi->pubkey_hash_chirp);
|
||||||
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
|
"DPP: Presence Announcement frame attributes", msg);
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_DPP2 */
|
#endif /* CONFIG_DPP2 */
|
||||||
|
@ -134,6 +134,7 @@ struct dpp_bootstrap_info {
|
|||||||
int own;
|
int own;
|
||||||
EVP_PKEY *pubkey;
|
EVP_PKEY *pubkey;
|
||||||
u8 pubkey_hash[SHA256_MAC_LEN];
|
u8 pubkey_hash[SHA256_MAC_LEN];
|
||||||
|
u8 pubkey_hash_chirp[SHA256_MAC_LEN];
|
||||||
const struct dpp_curve_params *curve;
|
const struct dpp_curve_params *curve;
|
||||||
unsigned int pkex_t; /* number of failures before dpp_pkex
|
unsigned int pkex_t; /* number of failures before dpp_pkex
|
||||||
* instantiation */
|
* instantiation */
|
||||||
@ -436,7 +437,6 @@ extern size_t dpp_nonce_override_len;
|
|||||||
|
|
||||||
void dpp_bootstrap_info_free(struct dpp_bootstrap_info *info);
|
void dpp_bootstrap_info_free(struct dpp_bootstrap_info *info);
|
||||||
const char * dpp_bootstrap_type_txt(enum dpp_bootstrap_type type);
|
const char * dpp_bootstrap_type_txt(enum dpp_bootstrap_type type);
|
||||||
int dpp_bootstrap_key_hash(struct dpp_bootstrap_info *bi);
|
|
||||||
int dpp_parse_uri_chan_list(struct dpp_bootstrap_info *bi,
|
int dpp_parse_uri_chan_list(struct dpp_bootstrap_info *bi,
|
||||||
const char *chan_list);
|
const char *chan_list);
|
||||||
int dpp_parse_uri_mac(struct dpp_bootstrap_info *bi, const char *mac);
|
int dpp_parse_uri_mac(struct dpp_bootstrap_info *bi, const char *mac);
|
||||||
@ -596,6 +596,7 @@ int dpp_controller_start(struct dpp_global *dpp,
|
|||||||
void dpp_controller_stop(struct dpp_global *dpp);
|
void dpp_controller_stop(struct dpp_global *dpp);
|
||||||
int dpp_tcp_init(struct dpp_global *dpp, struct dpp_authentication *auth,
|
int dpp_tcp_init(struct dpp_global *dpp, struct dpp_authentication *auth,
|
||||||
const struct hostapd_ip_addr *addr, int port);
|
const struct hostapd_ip_addr *addr, int port);
|
||||||
|
struct wpabuf * dpp_build_presence_announcement(struct dpp_bootstrap_info *bi);
|
||||||
|
|
||||||
struct dpp_global_config {
|
struct dpp_global_config {
|
||||||
void *msg_ctx;
|
void *msg_ctx;
|
||||||
|
Loading…
Reference in New Issue
Block a user