]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
DPP: Allow PKEX x/X and y/Y keypairs to be overridden
authorJouni Malinen <jouni@qca.qualcomm.com>
Thu, 23 Nov 2017 23:41:50 +0000 (01:41 +0200)
committerJouni Malinen <j@w1.fi>
Thu, 23 Nov 2017 23:41:50 +0000 (01:41 +0200)
This is for testing purposes to allow a test vector with specific values
to be generated.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
src/common/dpp.c
src/common/dpp.h
wpa_supplicant/ctrl_iface.c

index 5325ece88bde0bbef51bf1a0344d1a54f9adc0ce..fe4b154b10bde53088aad1c49eb9c0ce603fcae4 100644 (file)
@@ -32,6 +32,8 @@
 enum dpp_test_behavior dpp_test = DPP_TEST_DISABLED;
 u8 dpp_pkex_own_mac_override[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
 u8 dpp_pkex_peer_mac_override[ETH_ALEN] = { 0, 0, 0, 0, 0, 0 };
+u8 dpp_pkex_ephemeral_key_override[600];
+size_t dpp_pkex_ephemeral_key_override_len = 0;
 
 static int dpp_test_gen_invalid_key(struct wpabuf *msg,
                                    const struct dpp_curve_params *curve);
@@ -6104,7 +6106,21 @@ static struct wpabuf * dpp_pkex_build_exchange_req(struct dpp_pkex *pkex)
                goto fail;
 
        /* Generate a random ephemeral keypair x/X */
+#ifdef CONFIG_TESTING_OPTIONS
+       if (dpp_pkex_ephemeral_key_override_len) {
+               const struct dpp_curve_params *tmp_curve;
+
+               wpa_printf(MSG_INFO,
+                          "DPP: TESTING - override ephemeral key x/X");
+               pkex->x = dpp_set_keypair(&tmp_curve,
+                                         dpp_pkex_ephemeral_key_override,
+                                         dpp_pkex_ephemeral_key_override_len);
+       } else {
+               pkex->x = dpp_gen_keypair(curve);
+       }
+#else /* CONFIG_TESTING_OPTIONS */
        pkex->x = dpp_gen_keypair(curve);
+#endif /* CONFIG_TESTING_OPTIONS */
        if (!pkex->x)
                goto fail;
 
@@ -6552,7 +6568,21 @@ struct dpp_pkex * dpp_pkex_rx_exchange_req(void *msg_ctx,
                goto fail;
 
        /* Generate a random ephemeral keypair y/Y */
+#ifdef CONFIG_TESTING_OPTIONS
+       if (dpp_pkex_ephemeral_key_override_len) {
+               const struct dpp_curve_params *tmp_curve;
+
+               wpa_printf(MSG_INFO,
+                          "DPP: TESTING - override ephemeral key y/Y");
+               pkex->y = dpp_set_keypair(&tmp_curve,
+                                         dpp_pkex_ephemeral_key_override,
+                                         dpp_pkex_ephemeral_key_override_len);
+       } else {
+               pkex->y = dpp_gen_keypair(curve);
+       }
+#else /* CONFIG_TESTING_OPTIONS */
        pkex->y = dpp_gen_keypair(curve);
+#endif /* CONFIG_TESTING_OPTIONS */
        if (!pkex->y)
                goto fail;
 
index 85a18ebe48252953942a00303cf01e202ff00ce1..59afabb763c03db1004bca5036927045842524f5 100644 (file)
@@ -326,6 +326,8 @@ enum dpp_test_behavior {
 extern enum dpp_test_behavior dpp_test;
 extern u8 dpp_pkex_own_mac_override[ETH_ALEN];
 extern u8 dpp_pkex_peer_mac_override[ETH_ALEN];
+extern u8 dpp_pkex_ephemeral_key_override[600];
+extern size_t dpp_pkex_ephemeral_key_override_len;
 #endif /* CONFIG_TESTING_OPTIONS */
 
 void dpp_bootstrap_info_free(struct dpp_bootstrap_info *info);
index ec52dd7471db6e072db31e0dda6b42641cb6a253..de9d6256932026054a35ef441695e5ff0c9178aa 100644 (file)
@@ -621,6 +621,17 @@ static int wpa_supplicant_ctrl_iface_set(struct wpa_supplicant *wpa_s,
        } else if (os_strcasecmp(cmd, "dpp_pkex_peer_mac_override") == 0) {
                if (hwaddr_aton(value, dpp_pkex_peer_mac_override))
                        ret = -1;
+       } else if (os_strcasecmp(cmd, "dpp_pkex_ephemeral_key_override") == 0) {
+               size_t hex_len = os_strlen(value);
+
+               if (hex_len >
+                   2 * sizeof(dpp_pkex_ephemeral_key_override))
+                       ret = -1;
+               else if (hexstr2bin(value, dpp_pkex_ephemeral_key_override,
+                                   hex_len / 2))
+                       ret = -1;
+               else
+                       dpp_pkex_ephemeral_key_override_len = hex_len / 2;
 #endif /* CONFIG_DPP */
 #ifdef CONFIG_TESTING_OPTIONS
        } else if (os_strcasecmp(cmd, "ext_mgmt_frame_handling") == 0) {
@@ -7769,6 +7780,7 @@ static void wpa_supplicant_ctrl_iface_flush(struct wpa_supplicant *wpa_s)
        wpa_s->dpp_resp_retry_time = 0;
        os_memset(dpp_pkex_own_mac_override, 0, ETH_ALEN);
        os_memset(dpp_pkex_peer_mac_override, 0, ETH_ALEN);
+       dpp_pkex_ephemeral_key_override_len = 0;
 #endif /* CONFIG_DPP */
 
 #ifdef CONFIG_TDLS