DPP: Protocol testing framework
Add a generic mechanism for configuring the DPP implementation to behave in particular different (mostly incorrect) ways for protocol testing purposes. The new dpp_test parameter can be set to a non-zero integer to indicate a specific behavior. This is only available in CONFIG_TESTING_OPTIONS=y builds. This commit include cases for an extra attribute being added after the Wrapped Data attribute and Initiator/Responder capabilities having an unexpected zero capability. Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
parent
7ed5337d8c
commit
60239f60a6
4 changed files with 164 additions and 9 deletions
|
@ -29,6 +29,7 @@
|
||||||
#include "common/version.h"
|
#include "common/version.h"
|
||||||
#include "common/ieee802_11_defs.h"
|
#include "common/ieee802_11_defs.h"
|
||||||
#include "common/ctrl_iface_common.h"
|
#include "common/ctrl_iface_common.h"
|
||||||
|
#include "common/dpp.h"
|
||||||
#include "crypto/tls.h"
|
#include "crypto/tls.h"
|
||||||
#include "drivers/driver.h"
|
#include "drivers/driver.h"
|
||||||
#include "eapol_auth/eapol_auth_sm.h"
|
#include "eapol_auth/eapol_auth_sm.h"
|
||||||
|
@ -1301,6 +1302,8 @@ static int hostapd_ctrl_iface_set(struct hostapd_data *hapd, char *cmd)
|
||||||
} else if (os_strcasecmp(cmd,
|
} else if (os_strcasecmp(cmd,
|
||||||
"dpp_ignore_netaccesskey_mismatch") == 0) {
|
"dpp_ignore_netaccesskey_mismatch") == 0) {
|
||||||
hapd->dpp_ignore_netaccesskey_mismatch = atoi(value);
|
hapd->dpp_ignore_netaccesskey_mismatch = atoi(value);
|
||||||
|
} else if (os_strcasecmp(cmd, "dpp_test") == 0) {
|
||||||
|
dpp_test = atoi(value);
|
||||||
#endif /* CONFIG_DPP */
|
#endif /* CONFIG_DPP */
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
#ifdef CONFIG_MBO
|
#ifdef CONFIG_MBO
|
||||||
|
@ -3508,6 +3511,13 @@ static void hostapd_ctrl_iface_flush(struct hapd_interfaces *interfaces)
|
||||||
wps_testing_dummy_cred = 0;
|
wps_testing_dummy_cred = 0;
|
||||||
wps_corrupt_pkhash = 0;
|
wps_corrupt_pkhash = 0;
|
||||||
#endif /* CONFIG_WPS_TESTING */
|
#endif /* CONFIG_WPS_TESTING */
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
#ifdef CONFIG_DPP
|
||||||
|
dpp_test = DPP_TEST_DISABLED;
|
||||||
|
#endif /* CONFIG_DPP */
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
139
src/common/dpp.c
139
src/common/dpp.c
|
@ -25,6 +25,10 @@
|
||||||
#include "dpp.h"
|
#include "dpp.h"
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
enum dpp_test_behavior dpp_test = DPP_TEST_DISABLED;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
#if OPENSSL_VERSION_NUMBER < 0x10100000L
|
||||||
/* Compatibility wrappers for older versions. */
|
/* Compatibility wrappers for older versions. */
|
||||||
|
|
||||||
|
@ -1396,6 +1400,10 @@ struct dpp_authentication * dpp_auth_init(void *msg_ctx,
|
||||||
/* Build DPP Authentication Request frame attributes */
|
/* Build DPP Authentication Request frame attributes */
|
||||||
attr_len = 2 * (4 + SHA256_MAC_LEN) + 4 + wpabuf_len(pi) +
|
attr_len = 2 * (4 + SHA256_MAC_LEN) + 4 + wpabuf_len(pi) +
|
||||||
4 + sizeof(wrapped_data);
|
4 + sizeof(wrapped_data);
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_REQ)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_REQ, attr_len);
|
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_REQ, attr_len);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -1440,6 +1448,12 @@ struct dpp_authentication * dpp_auth_init(void *msg_ctx,
|
||||||
auth->i_capab = configurator ? DPP_CAPAB_CONFIGURATOR :
|
auth->i_capab = configurator ? DPP_CAPAB_CONFIGURATOR :
|
||||||
DPP_CAPAB_ENROLLEE;
|
DPP_CAPAB_ENROLLEE;
|
||||||
*pos++ = auth->i_capab;
|
*pos++ = auth->i_capab;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_ZERO_I_CAPAB) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - zero I-capabilities");
|
||||||
|
pos[-1] = 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
attr_end = wpabuf_put(msg, 0);
|
attr_end = wpabuf_put(msg, 0);
|
||||||
|
|
||||||
|
@ -1466,6 +1480,14 @@ struct dpp_authentication * dpp_auth_init(void *msg_ctx,
|
||||||
wpabuf_put_le16(msg, siv_len);
|
wpabuf_put_le16(msg, siv_len);
|
||||||
wpabuf_put_data(msg, wrapped_data, siv_len);
|
wpabuf_put_data(msg, wrapped_data, siv_len);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_REQ) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Authentication Request frame attributes", msg);
|
"DPP: Authentication Request frame attributes", msg);
|
||||||
|
|
||||||
|
@ -1485,6 +1507,7 @@ struct wpabuf * dpp_build_conf_req(struct dpp_authentication *auth,
|
||||||
size_t json_len, clear_len;
|
size_t json_len, clear_len;
|
||||||
struct wpabuf *clear = NULL, *msg = NULL;
|
struct wpabuf *clear = NULL, *msg = NULL;
|
||||||
u8 *wrapped;
|
u8 *wrapped;
|
||||||
|
size_t attr_len;
|
||||||
|
|
||||||
wpa_printf(MSG_DEBUG, "DPP: Build configuration request");
|
wpa_printf(MSG_DEBUG, "DPP: Build configuration request");
|
||||||
|
|
||||||
|
@ -1500,7 +1523,12 @@ struct wpabuf * dpp_build_conf_req(struct dpp_authentication *auth,
|
||||||
/* { E-nonce, configAttrib }ke */
|
/* { E-nonce, configAttrib }ke */
|
||||||
clear_len = 4 + nonce_len + 4 + json_len;
|
clear_len = 4 + nonce_len + 4 + json_len;
|
||||||
clear = wpabuf_alloc(clear_len);
|
clear = wpabuf_alloc(clear_len);
|
||||||
msg = wpabuf_alloc(4 + clear_len + AES_BLOCK_SIZE);
|
attr_len = 4 + clear_len + AES_BLOCK_SIZE;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_CONF_REQ)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
msg = wpabuf_alloc(attr_len);
|
||||||
if (!clear || !msg)
|
if (!clear || !msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -1527,6 +1555,14 @@ struct wpabuf * dpp_build_conf_req(struct dpp_authentication *auth,
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
||||||
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_CONF_REQ) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Configuration Request frame attributes", msg);
|
"DPP: Configuration Request frame attributes", msg);
|
||||||
wpabuf_free(clear);
|
wpabuf_free(clear);
|
||||||
|
@ -1940,6 +1976,10 @@ static int dpp_auth_build_resp(struct dpp_authentication *auth)
|
||||||
/* Build DPP Authentication Response frame attributes */
|
/* Build DPP Authentication Response frame attributes */
|
||||||
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) +
|
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) +
|
||||||
4 + wpabuf_len(pr) + 4 + sizeof(wrapped_data);
|
4 + wpabuf_len(pr) + 4 + sizeof(wrapped_data);
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_RESP)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP, attr_len);
|
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP, attr_len);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2000,6 +2040,12 @@ static int dpp_auth_build_resp(struct dpp_authentication *auth)
|
||||||
auth->r_capab = auth->configurator ? DPP_CAPAB_CONFIGURATOR :
|
auth->r_capab = auth->configurator ? DPP_CAPAB_CONFIGURATOR :
|
||||||
DPP_CAPAB_ENROLLEE;
|
DPP_CAPAB_ENROLLEE;
|
||||||
*pos++ = auth->r_capab;
|
*pos++ = auth->r_capab;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_ZERO_R_CAPAB) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - zero R-capabilities");
|
||||||
|
pos[-1] = 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
/* {R-auth}ke */
|
/* {R-auth}ke */
|
||||||
WPA_PUT_LE16(pos, DPP_ATTR_WRAPPED_DATA);
|
WPA_PUT_LE16(pos, DPP_ATTR_WRAPPED_DATA);
|
||||||
pos += 2;
|
pos += 2;
|
||||||
|
@ -2031,6 +2077,14 @@ static int dpp_auth_build_resp(struct dpp_authentication *auth)
|
||||||
wpabuf_put_le16(msg, siv_len);
|
wpabuf_put_le16(msg, siv_len);
|
||||||
wpabuf_put_data(msg, wrapped_data, siv_len);
|
wpabuf_put_data(msg, wrapped_data, siv_len);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_RESP) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Authentication Response frame attributes", msg);
|
"DPP: Authentication Response frame attributes", msg);
|
||||||
|
|
||||||
|
@ -2059,6 +2113,10 @@ static int dpp_auth_build_resp_status(struct dpp_authentication *auth,
|
||||||
|
|
||||||
/* Build DPP Authentication Response frame attributes */
|
/* Build DPP Authentication Response frame attributes */
|
||||||
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) + 4 + sizeof(wrapped_data);
|
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) + 4 + sizeof(wrapped_data);
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_RESP)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP, attr_len);
|
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_RESP, attr_len);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2106,6 +2164,12 @@ static int dpp_auth_build_resp_status(struct dpp_authentication *auth,
|
||||||
auth->r_capab = auth->configurator ? DPP_CAPAB_CONFIGURATOR :
|
auth->r_capab = auth->configurator ? DPP_CAPAB_CONFIGURATOR :
|
||||||
DPP_CAPAB_ENROLLEE;
|
DPP_CAPAB_ENROLLEE;
|
||||||
*pos++ = auth->r_capab;
|
*pos++ = auth->r_capab;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_ZERO_R_CAPAB) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - zero R-capabilities");
|
||||||
|
pos[-1] = 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
/* OUI, OUI type, Crypto Suite, DPP frame type */
|
/* OUI, OUI type, Crypto Suite, DPP frame type */
|
||||||
addr[0] = wpabuf_head_u8(msg) + 2;
|
addr[0] = wpabuf_head_u8(msg) + 2;
|
||||||
|
@ -2130,6 +2194,14 @@ static int dpp_auth_build_resp_status(struct dpp_authentication *auth,
|
||||||
wpabuf_put_le16(msg, siv_len);
|
wpabuf_put_le16(msg, siv_len);
|
||||||
wpabuf_put_data(msg, wrapped_data, siv_len);
|
wpabuf_put_data(msg, wrapped_data, siv_len);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_RESP) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Authentication Response frame attributes", msg);
|
"DPP: Authentication Response frame attributes", msg);
|
||||||
|
|
||||||
|
@ -2378,6 +2450,10 @@ static struct wpabuf * dpp_auth_build_conf(struct dpp_authentication *auth)
|
||||||
/* Build DPP Authentication Confirmation frame attributes */
|
/* Build DPP Authentication Confirmation frame attributes */
|
||||||
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) +
|
attr_len = 4 + 1 + 2 * (4 + SHA256_MAC_LEN) +
|
||||||
4 + i_auth_len + AES_BLOCK_SIZE;
|
4 + i_auth_len + AES_BLOCK_SIZE;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_CONF)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_CONF, attr_len);
|
msg = dpp_alloc_msg(DPP_PA_AUTHENTICATION_CONF, attr_len);
|
||||||
if (!msg)
|
if (!msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
@ -2428,6 +2504,14 @@ static struct wpabuf * dpp_auth_build_conf(struct dpp_authentication *auth)
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: {I-auth}ke",
|
wpa_hexdump(MSG_DEBUG, "DPP: {I-auth}ke",
|
||||||
wrapped_i_auth, i_auth_len + AES_BLOCK_SIZE);
|
wrapped_i_auth, i_auth_len + AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_AUTH_CONF) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Authentication Confirmation frame attributes",
|
"DPP: Authentication Confirmation frame attributes",
|
||||||
msg);
|
msg);
|
||||||
|
@ -3319,7 +3403,7 @@ dpp_build_conf_resp(struct dpp_authentication *auth, const u8 *e_nonce,
|
||||||
u16 e_nonce_len, int ap)
|
u16 e_nonce_len, int ap)
|
||||||
{
|
{
|
||||||
struct wpabuf *conf;
|
struct wpabuf *conf;
|
||||||
size_t clear_len;
|
size_t clear_len, attr_len;
|
||||||
struct wpabuf *clear = NULL, *msg = NULL;
|
struct wpabuf *clear = NULL, *msg = NULL;
|
||||||
u8 *wrapped;
|
u8 *wrapped;
|
||||||
const u8 *addr[1];
|
const u8 *addr[1];
|
||||||
|
@ -3338,7 +3422,12 @@ dpp_build_conf_resp(struct dpp_authentication *auth, const u8 *e_nonce,
|
||||||
if (conf)
|
if (conf)
|
||||||
clear_len += 4 + wpabuf_len(conf);
|
clear_len += 4 + wpabuf_len(conf);
|
||||||
clear = wpabuf_alloc(clear_len);
|
clear = wpabuf_alloc(clear_len);
|
||||||
msg = wpabuf_alloc(4 + 1 + 4 + clear_len + AES_BLOCK_SIZE);
|
attr_len = 4 + 1 + 4 + clear_len + AES_BLOCK_SIZE;
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_CONF_RESP)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
msg = wpabuf_alloc(attr_len);
|
||||||
if (!clear || !msg)
|
if (!clear || !msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -3378,6 +3467,14 @@ dpp_build_conf_resp(struct dpp_authentication *auth, const u8 *e_nonce,
|
||||||
wpabuf_free(clear);
|
wpabuf_free(clear);
|
||||||
clear = NULL;
|
clear = NULL;
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_CONF_RESP) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_hexdump_buf(MSG_DEBUG,
|
wpa_hexdump_buf(MSG_DEBUG,
|
||||||
"DPP: Configuration Response attributes", msg);
|
"DPP: Configuration Response attributes", msg);
|
||||||
return msg;
|
return msg;
|
||||||
|
@ -5406,7 +5503,7 @@ struct wpabuf * dpp_pkex_rx_exchange_resp(struct dpp_pkex *pkex,
|
||||||
u16 attr_status_len, attr_id_len, attr_key_len;
|
u16 attr_status_len, attr_id_len, attr_key_len;
|
||||||
const EC_GROUP *group;
|
const EC_GROUP *group;
|
||||||
BN_CTX *bnctx = NULL;
|
BN_CTX *bnctx = NULL;
|
||||||
size_t clear_len;
|
size_t clear_len, attr_len;
|
||||||
struct wpabuf *clear = NULL;
|
struct wpabuf *clear = NULL;
|
||||||
u8 *wrapped;
|
u8 *wrapped;
|
||||||
struct wpabuf *msg = NULL, *A_pub = NULL, *X_pub = NULL, *Y_pub = NULL;
|
struct wpabuf *msg = NULL, *A_pub = NULL, *X_pub = NULL, *Y_pub = NULL;
|
||||||
|
@ -5559,8 +5656,12 @@ struct wpabuf * dpp_pkex_rx_exchange_resp(struct dpp_pkex *pkex,
|
||||||
/* {A, u, [bootstrapping info]}z */
|
/* {A, u, [bootstrapping info]}z */
|
||||||
clear_len = 4 + 2 * curve->prime_len + 4 + curve->hash_len;
|
clear_len = 4 + 2 * curve->prime_len + 4 + curve->hash_len;
|
||||||
clear = wpabuf_alloc(clear_len);
|
clear = wpabuf_alloc(clear_len);
|
||||||
msg = dpp_alloc_msg(DPP_PA_PKEX_COMMIT_REVEAL_REQ,
|
attr_len = 4 + clear_len + AES_BLOCK_SIZE;
|
||||||
4 + clear_len + AES_BLOCK_SIZE);
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_REQ)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
msg = dpp_alloc_msg(DPP_PA_PKEX_COMMIT_REVEAL_REQ, attr_len);
|
||||||
if (!clear || !msg)
|
if (!clear || !msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -5594,6 +5695,14 @@ struct wpabuf * dpp_pkex_rx_exchange_resp(struct dpp_pkex *pkex,
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
||||||
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_REQ) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
out:
|
out:
|
||||||
wpabuf_free(clear);
|
wpabuf_free(clear);
|
||||||
wpabuf_free(A_pub);
|
wpabuf_free(A_pub);
|
||||||
|
@ -5635,7 +5744,7 @@ struct wpabuf * dpp_pkex_rx_commit_reveal_req(struct dpp_pkex *pkex,
|
||||||
struct wpabuf *msg = NULL, *A_pub = NULL, *X_pub = NULL, *Y_pub = NULL;
|
struct wpabuf *msg = NULL, *A_pub = NULL, *X_pub = NULL, *Y_pub = NULL;
|
||||||
struct wpabuf *B_pub = NULL;
|
struct wpabuf *B_pub = NULL;
|
||||||
u8 u[DPP_MAX_HASH_LEN], v[DPP_MAX_HASH_LEN];
|
u8 u[DPP_MAX_HASH_LEN], v[DPP_MAX_HASH_LEN];
|
||||||
size_t clear_len;
|
size_t clear_len, attr_len;
|
||||||
struct wpabuf *clear = NULL;
|
struct wpabuf *clear = NULL;
|
||||||
u8 *wrapped;
|
u8 *wrapped;
|
||||||
int res;
|
int res;
|
||||||
|
@ -5803,8 +5912,12 @@ struct wpabuf * dpp_pkex_rx_commit_reveal_req(struct dpp_pkex *pkex,
|
||||||
/* {B, v [bootstrapping info]}z */
|
/* {B, v [bootstrapping info]}z */
|
||||||
clear_len = 4 + 2 * curve->prime_len + 4 + curve->hash_len;
|
clear_len = 4 + 2 * curve->prime_len + 4 + curve->hash_len;
|
||||||
clear = wpabuf_alloc(clear_len);
|
clear = wpabuf_alloc(clear_len);
|
||||||
msg = dpp_alloc_msg(DPP_PA_PKEX_COMMIT_REVEAL_RESP,
|
attr_len = 4 + clear_len + AES_BLOCK_SIZE;
|
||||||
4 + clear_len + AES_BLOCK_SIZE);
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_RESP)
|
||||||
|
attr_len += 4;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
msg = dpp_alloc_msg(DPP_PA_PKEX_COMMIT_REVEAL_RESP, attr_len);
|
||||||
if (!clear || !msg)
|
if (!clear || !msg)
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
@ -5837,6 +5950,14 @@ struct wpabuf * dpp_pkex_rx_commit_reveal_req(struct dpp_pkex *pkex,
|
||||||
goto fail;
|
goto fail;
|
||||||
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
wpa_hexdump(MSG_DEBUG, "DPP: AES-SIV ciphertext",
|
||||||
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
wrapped, wpabuf_len(clear) + AES_BLOCK_SIZE);
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
if (dpp_test == DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_RESP) {
|
||||||
|
wpa_printf(MSG_INFO, "DPP: TESTING - attr after Wrapped Data");
|
||||||
|
wpabuf_put_le16(msg, DPP_ATTR_TESTING);
|
||||||
|
wpabuf_put_le16(msg, 0);
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
out:
|
out:
|
||||||
EVP_PKEY_CTX_free(ctx);
|
EVP_PKEY_CTX_free(ctx);
|
||||||
os_free(unwrapped);
|
os_free(unwrapped);
|
||||||
|
|
|
@ -52,6 +52,7 @@ enum dpp_attribute_id {
|
||||||
DPP_ATTR_ENROLLEE_NONCE = 0x1014,
|
DPP_ATTR_ENROLLEE_NONCE = 0x1014,
|
||||||
DPP_ATTR_CODE_IDENTIFIER = 0x1015,
|
DPP_ATTR_CODE_IDENTIFIER = 0x1015,
|
||||||
DPP_ATTR_TRANSACTION_ID = 0x1016,
|
DPP_ATTR_TRANSACTION_ID = 0x1016,
|
||||||
|
DPP_ATTR_TESTING = 0x10ff, /* not defined in the DPP tech spec */
|
||||||
};
|
};
|
||||||
|
|
||||||
enum dpp_status_error {
|
enum dpp_status_error {
|
||||||
|
@ -203,6 +204,23 @@ struct dpp_introduction {
|
||||||
size_t pmk_len;
|
size_t pmk_len;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef CONFIG_TESTING_OPTIONS
|
||||||
|
enum dpp_test_behavior {
|
||||||
|
DPP_TEST_DISABLED = 0,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_AUTH_REQ = 1,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_AUTH_RESP = 2,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_AUTH_CONF = 3,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_REQ = 4,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_PKEX_CR_RESP = 5,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_CONF_REQ = 6,
|
||||||
|
DPP_TEST_AFTER_WRAPPED_DATA_CONF_RESP = 7,
|
||||||
|
DPP_TEST_ZERO_I_CAPAB = 8,
|
||||||
|
DPP_TEST_ZERO_R_CAPAB = 9,
|
||||||
|
};
|
||||||
|
|
||||||
|
extern enum dpp_test_behavior dpp_test;
|
||||||
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
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_bootstrap_key_hash(struct dpp_bootstrap_info *bi);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "common/ieee802_11_defs.h"
|
#include "common/ieee802_11_defs.h"
|
||||||
#include "common/ieee802_11_common.h"
|
#include "common/ieee802_11_common.h"
|
||||||
#include "common/wpa_ctrl.h"
|
#include "common/wpa_ctrl.h"
|
||||||
|
#include "common/dpp.h"
|
||||||
#include "crypto/tls.h"
|
#include "crypto/tls.h"
|
||||||
#include "ap/hostapd.h"
|
#include "ap/hostapd.h"
|
||||||
#include "eap_peer/eap.h"
|
#include "eap_peer/eap.h"
|
||||||
|
@ -655,6 +656,8 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
|
||||||
} else if (os_strcasecmp(cmd,
|
} else if (os_strcasecmp(cmd,
|
||||||
"dpp_ignore_netaccesskey_mismatch") == 0) {
|
"dpp_ignore_netaccesskey_mismatch") == 0) {
|
||||||
wpa_s->dpp_ignore_netaccesskey_mismatch = atoi(value);
|
wpa_s->dpp_ignore_netaccesskey_mismatch = atoi(value);
|
||||||
|
} else if (os_strcasecmp(cmd, "dpp_test") == 0) {
|
||||||
|
dpp_test = atoi(value);
|
||||||
#endif /* CONFIG_DPP */
|
#endif /* CONFIG_DPP */
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
#ifndef CONFIG_NO_CONFIG_BLOBS
|
#ifndef CONFIG_NO_CONFIG_BLOBS
|
||||||
|
@ -7778,6 +7781,9 @@ static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
|
||||||
wpa_s->get_pref_freq_list_override = NULL;
|
wpa_s->get_pref_freq_list_override = NULL;
|
||||||
wpabuf_free(wpa_s->sae_commit_override);
|
wpabuf_free(wpa_s->sae_commit_override);
|
||||||
wpa_s->sae_commit_override = NULL;
|
wpa_s->sae_commit_override = NULL;
|
||||||
|
#ifdef CONFIG_DPP
|
||||||
|
dpp_test = DPP_TEST_DISABLED;
|
||||||
|
#endif /* CONFIG_DPP */
|
||||||
#endif /* CONFIG_TESTING_OPTIONS */
|
#endif /* CONFIG_TESTING_OPTIONS */
|
||||||
|
|
||||||
wpa_s->disconnected = 0;
|
wpa_s->disconnected = 0;
|
||||||
|
|
Loading…
Reference in a new issue