]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
DPP: Allow 3rd party information to be added into config request obj
authorJouni Malinen <quic_jouni@quicinc.com>
Sat, 16 Jul 2022 09:31:28 +0000 (12:31 +0300)
committerJouni Malinen <j@w1.fi>
Sat, 16 Jul 2022 14:22:23 +0000 (17:22 +0300)
This allows the DPP Configuration Request Object from an Enrollee to be
extended with 3rd party information. The new dpp_extra_conf_req_name and
dpp_extra_conf_req_value configuration parameters specify the name of
the added JSON node and its contents. For example:
dpp_extra_conf_req_name=org.example
dpp_extra_conf_req_value={"a":1,"b":"test"}

Signed-off-by: Jouni Malinen <quic_jouni@quicinc.com>
12 files changed:
hostapd/config_file.c
hostapd/hostapd.conf
src/ap/ap_config.c
src/ap/ap_config.h
src/ap/dpp_hostapd.c
src/common/dpp.c
src/common/dpp.h
src/common/dpp_tcp.c
wpa_supplicant/config.c
wpa_supplicant/config.h
wpa_supplicant/config_file.c
wpa_supplicant/dpp_supplicant.c

index 5d915a090fe82d297ef42b9664717b64b99a22b7..8dc267ef2f199f864cd32eae2cb3a8b3ceeb6caa 100644 (file)
@@ -4456,6 +4456,12 @@ static int hostapd_config_fill(struct hostapd_config *conf,
        } else if (os_strcmp(buf, "dpp_mud_url") == 0) {
                os_free(bss->dpp_mud_url);
                bss->dpp_mud_url = os_strdup(pos);
+       } else if (os_strcmp(buf, "dpp_extra_conf_req_name") == 0) {
+               os_free(bss->dpp_extra_conf_req_name);
+               bss->dpp_extra_conf_req_name = os_strdup(pos);
+       } else if (os_strcmp(buf, "dpp_extra_conf_req_value") == 0) {
+               os_free(bss->dpp_extra_conf_req_value);
+               bss->dpp_extra_conf_req_value = os_strdup(pos);
        } else if (os_strcmp(buf, "dpp_connector") == 0) {
                os_free(bss->dpp_connector);
                bss->dpp_connector = os_strdup(pos);
index 1c4ca71a9352992b77a2d416aa309428700f1de1..ea67aa100124f9da8aa7b60c11157f58a4227f99 100644 (file)
@@ -2514,6 +2514,12 @@ own_ip_addr=127.0.0.1
 # MUD URL for Enrollee's DPP Configuration Request (optional)
 #dpp_mud_url=https://example.com/mud
 
+# JSON node name of additional data for Enrollee's DPP Configuration Request
+#dpp_extra_conf_req_name=org.example
+
+# JSON node data of additional data for Enrollee's DPP Configuration Request
+#dpp_extra_conf_req_value="abc":123
+
 #dpp_connector
 #dpp_netaccesskey
 #dpp_netaccesskey_expiry
index 1c229c6c78ae3385ccf91964715d8926d0301fcf..63af3d04726b8f3bae28dec09cd1ab1d5f7a3338 100644 (file)
@@ -947,6 +947,8 @@ void hostapd_config_free_bss(struct hostapd_bss_config *conf)
 #ifdef CONFIG_DPP
        os_free(conf->dpp_name);
        os_free(conf->dpp_mud_url);
+       os_free(conf->dpp_extra_conf_req_name);
+       os_free(conf->dpp_extra_conf_req_value);
        os_free(conf->dpp_connector);
        wpabuf_free(conf->dpp_netaccesskey);
        wpabuf_free(conf->dpp_csign);
index 9fb38571737aa2855000ff29e446896b31337108..c5701cc0003abf992b7e4e50775ce131ac70f970 100644 (file)
@@ -755,6 +755,8 @@ struct hostapd_bss_config {
 #ifdef CONFIG_DPP
        char *dpp_name;
        char *dpp_mud_url;
+       char *dpp_extra_conf_req_name;
+       char *dpp_extra_conf_req_value;
        char *dpp_connector;
        struct wpabuf *dpp_netaccesskey;
        unsigned int dpp_netaccesskey_expiry;
index e99e658cad50e2275c973a5e7a41d1a914a8406c..47174a71b0c0d61882e4c8bf7ab7902eba615483 100644 (file)
@@ -343,6 +343,9 @@ static int hostapd_dpp_pkex_done(void *ctx, void *conn,
 
        return dpp_tcp_auth(hapd->iface->interfaces->dpp, conn, auth,
                            hapd->conf->dpp_name, DPP_NETROLE_AP,
+                           hapd->conf->dpp_mud_url,
+                           hapd->conf->dpp_extra_conf_req_name,
+                           hapd->conf->dpp_extra_conf_req_value,
                            hostapd_dpp_process_conf_obj, NULL);
 }
 #endif /* CONFIG_DPP2 */
@@ -928,7 +931,10 @@ int hostapd_dpp_auth_init(struct hostapd_data *hapd, const char *cmd)
        if (tcp)
                return dpp_tcp_init(hapd->iface->interfaces->dpp, auth,
                                    &ipaddr, tcp_port, hapd->conf->dpp_name,
-                                   DPP_NETROLE_AP, hapd->msg_ctx, hapd,
+                                   DPP_NETROLE_AP, hapd->conf->dpp_mud_url,
+                                   hapd->conf->dpp_extra_conf_req_name,
+                                   hapd->conf->dpp_extra_conf_req_value,
+                                   hapd->msg_ctx, hapd,
                                    hostapd_dpp_process_conf_obj, NULL);
 #endif /* CONFIG_DPP2 */
 
@@ -1287,7 +1293,9 @@ static void hostapd_dpp_start_gas_client(struct hostapd_data *hapd)
 
        buf = dpp_build_conf_req_helper(auth, hapd->conf->dpp_name,
                                        DPP_NETROLE_AP,
-                                       hapd->conf->dpp_mud_url, NULL);
+                                       hapd->conf->dpp_mud_url, NULL,
+                                       hapd->conf->dpp_extra_conf_req_name,
+                                       hapd->conf->dpp_extra_conf_req_value);
        if (!buf) {
                wpa_printf(MSG_DEBUG,
                           "DPP: No configuration request data available");
index 6c1b5be0e649edce3ef37a5f39bbc4360236b7c7..4ef736c0e5bcab736d5e62b5eeccd85109fd6214 100644 (file)
@@ -969,7 +969,9 @@ struct wpabuf * dpp_build_conf_req(struct dpp_authentication *auth,
 struct wpabuf * dpp_build_conf_req_helper(struct dpp_authentication *auth,
                                          const char *name,
                                          enum dpp_netrole netrole,
-                                         const char *mud_url, int *opclasses)
+                                         const char *mud_url, int *opclasses,
+                                         const char *extra_name,
+                                         const char *extra_value)
 {
        size_t len, name_len;
        const char *tech = "infra";
@@ -992,6 +994,8 @@ struct wpabuf * dpp_build_conf_req_helper(struct dpp_authentication *auth,
        len = 100 + name_len * 6 + 1 + int_array_len(opclasses) * 4;
        if (mud_url && mud_url[0])
                len += 10 + os_strlen(mud_url);
+       if (extra_name && extra_value && extra_name[0] && extra_value[0])
+               len += 10 + os_strlen(extra_name) + os_strlen(extra_value);
 #ifdef CONFIG_DPP2
        if (auth->csr) {
                size_t csr_len;
@@ -1031,6 +1035,10 @@ struct wpabuf * dpp_build_conf_req_helper(struct dpp_authentication *auth,
                json_value_sep(json);
                json_add_string(json, "pkcs10", csr);
        }
+       if (extra_name && extra_value && extra_name[0] && extra_value[0]) {
+               json_value_sep(json);
+               wpabuf_printf(json, "\"%s\":%s", extra_name, extra_value);
+       }
        json_end_object(json);
 
        buf = dpp_build_conf_req(auth, wpabuf_head(json));
index 8202ef818da6036c4827d685b4c6dc1f970623c5..af03413139f8f9ad78b63c544624f6ac0f68e162 100644 (file)
@@ -586,7 +586,9 @@ struct wpabuf * dpp_build_conf_req(struct dpp_authentication *auth,
 struct wpabuf * dpp_build_conf_req_helper(struct dpp_authentication *auth,
                                          const char *name,
                                          enum dpp_netrole netrole,
-                                         const char *mud_url, int *opclasses);
+                                         const char *mud_url, int *opclasses,
+                                         const char *extra_name,
+                                         const char *extra_value);
 int dpp_auth_conf_rx(struct dpp_authentication *auth, const u8 *hdr,
                     const u8 *attr_start, size_t attr_len);
 int dpp_notify_new_qr_code(struct dpp_authentication *auth,
@@ -744,15 +746,20 @@ int dpp_tcp_pkex_init(struct dpp_global *dpp, struct dpp_pkex *pkex,
                                       struct dpp_bootstrap_info *bi));
 int dpp_tcp_init(struct dpp_global *dpp, struct dpp_authentication *auth,
                 const struct hostapd_ip_addr *addr, int port,
-                const char *name, enum dpp_netrole netrole, void *msg_ctx,
-                void *cb_ctx,
+                const char *name, enum dpp_netrole netrole,
+                const char *mud_url,
+                const char *extra_conf_req_name,
+                const char *extra_conf_req_value,
+                void *msg_ctx, void *cb_ctx,
                 int (*process_conf_obj)(void *ctx,
                                         struct dpp_authentication *auth),
                 bool (*tcp_msg_sent)(void *ctx,
                                      struct dpp_authentication *auth));
 int dpp_tcp_auth(struct dpp_global *dpp, void *_conn,
                 struct dpp_authentication *auth, const char *name,
-                enum dpp_netrole netrole,
+                enum dpp_netrole netrole, const char *mud_url,
+                const char *extra_conf_req_name,
+                const char *extra_conf_req_value,
                 int (*process_conf_obj)(void *ctx,
                                         struct dpp_authentication *auth),
                 bool (*tcp_msg_sent)(void *ctx,
index d7c23284105e781c30e1aebc1d5d04180b4f576a..cbe8d2ca50863933f59ab6ba6e40151236cb62bf 100644 (file)
@@ -48,6 +48,9 @@ struct dpp_connection {
        unsigned int gas_comeback_in_progress:1;
        u8 gas_dialog_token;
        char *name;
+       char *mud_url;
+       char *extra_conf_req_name;
+       char *extra_conf_req_value;
        enum dpp_netrole netrole;
 };
 
@@ -118,6 +121,9 @@ static void dpp_connection_free(struct dpp_connection *conn)
        dpp_auth_deinit(conn->auth);
        dpp_pkex_free(conn->pkex);
        os_free(conn->name);
+       os_free(conn->mud_url);
+       os_free(conn->extra_conf_req_name);
+       os_free(conn->extra_conf_req_value);
        os_free(conn);
 }
 
@@ -332,8 +338,10 @@ static void dpp_controller_start_gas_client(struct dpp_connection *conn)
        const char *dpp_name;
 
        dpp_name = conn->name ? conn->name : "Test";
-       buf = dpp_build_conf_req_helper(auth, dpp_name, conn->netrole, NULL,
-                                       NULL);
+       buf = dpp_build_conf_req_helper(auth, dpp_name, conn->netrole,
+                                       conn->mud_url, NULL,
+                                       conn->extra_conf_req_name,
+                                       conn->extra_conf_req_value);
        if (!buf) {
                wpa_printf(MSG_DEBUG,
                           "DPP: No configuration request data available");
@@ -1943,7 +1951,10 @@ static int dpp_tcp_auth_start(struct dpp_connection *conn,
 
 int dpp_tcp_init(struct dpp_global *dpp, struct dpp_authentication *auth,
                 const struct hostapd_ip_addr *addr, int port, const char *name,
-                enum dpp_netrole netrole, void *msg_ctx, void *cb_ctx,
+                enum dpp_netrole netrole, const char *mud_url,
+                const char *extra_conf_req_name,
+                const char *extra_conf_req_value,
+                void *msg_ctx, void *cb_ctx,
                 int (*process_conf_obj)(void *ctx,
                                         struct dpp_authentication *auth),
                 bool (*tcp_msg_sent)(void *ctx,
@@ -1973,6 +1984,12 @@ int dpp_tcp_init(struct dpp_global *dpp, struct dpp_authentication *auth,
        conn->process_conf_obj = process_conf_obj;
        conn->tcp_msg_sent = tcp_msg_sent;
        conn->name = os_strdup(name ? name : "Test");
+       if (mud_url)
+               conn->mud_url = os_strdup(mud_url);
+       if (extra_conf_req_name)
+               conn->extra_conf_req_name = os_strdup(extra_conf_req_name);
+       if (extra_conf_req_value)
+               conn->extra_conf_req_value = os_strdup(extra_conf_req_value);
        conn->netrole = netrole;
        conn->global = dpp;
        conn->auth = auth;
@@ -2019,7 +2036,9 @@ fail:
 
 int dpp_tcp_auth(struct dpp_global *dpp, void *_conn,
                 struct dpp_authentication *auth, const char *name,
-                enum dpp_netrole netrole,
+                enum dpp_netrole netrole, const char *mud_url,
+                const char *extra_conf_req_name,
+                const char *extra_conf_req_value,
                 int (*process_conf_obj)(void *ctx,
                                         struct dpp_authentication *auth),
                 bool (*tcp_msg_sent)(void *ctx,
@@ -2033,6 +2052,13 @@ int dpp_tcp_auth(struct dpp_global *dpp, void *_conn,
        conn->tcp_msg_sent = tcp_msg_sent;
        os_free(conn->name);
        conn->name = os_strdup(name ? name : "Test");
+       os_free(conn->mud_url);
+       conn->mud_url = mud_url ? os_strdup(mud_url) : NULL;
+       os_free(conn->extra_conf_req_name);
+       conn->extra_conf_req_name = extra_conf_req_name ?
+               os_strdup(extra_conf_req_name) : NULL;
+       conn->extra_conf_req_value = extra_conf_req_value ?
+               os_strdup(extra_conf_req_value) : NULL;
        conn->netrole = netrole;
        conn->auth = auth;
 
index 92525d7c6de310c43174a6778b2c906a559a0c9e..364bdc905d8b5063e92bb7238d86e8414508dcff 100644 (file)
@@ -2970,6 +2970,8 @@ void wpa_config_free(struct wpa_config *config)
 #endif /* CONFIG_MBO */
        os_free(config->dpp_name);
        os_free(config->dpp_mud_url);
+       os_free(config->dpp_extra_conf_req_name);
+       os_free(config->dpp_extra_conf_req_value);
 
        os_free(config);
 }
@@ -5301,6 +5303,8 @@ static const struct global_parse_data global_fields[] = {
        { INT_RANGE(dpp_config_processing, 0, 2), 0 },
        { STR(dpp_name), 0 },
        { STR(dpp_mud_url), 0 },
+       { STR(dpp_extra_conf_req_name), 0 },
+       { STR(dpp_extra_conf_req_value), 0 },
 #endif /* CONFIG_DPP */
        { INT_RANGE(coloc_intf_reporting, 0, 1), 0 },
 #ifdef CONFIG_WNM
index ba9f2ed8b952fc11f11203f0be2d08d6e65cabc5..d16913692cb312c90aa56538e8b3faaecb24966b 100644 (file)
@@ -1617,6 +1617,18 @@ struct wpa_config {
         */
        char *dpp_mud_url;
 
+       /**
+        * dpp_extra_conf_req_name - JSON node name of additional data for
+        * Enrollee's DPP Configuration Request
+        */
+       char *dpp_extra_conf_req_name;
+
+       /**
+        * dpp_extra_conf_req_value - JSON node data of additional data for
+        * Enrollee's DPP Configuration Request
+        */
+       char *dpp_extra_conf_req_value;
+
        /**
         * coloc_intf_reporting - Colocated interference reporting
         *
index c0763253fe56bdb9eef93b30170dfa609241de8a..a779868f3fc0d89b939cb5883bf9b934c4c220b4 100644 (file)
@@ -1543,6 +1543,16 @@ static void wpa_config_write_global(FILE *f, struct wpa_config *config)
        if (config->dpp_config_processing)
                fprintf(f, "dpp_config_processing=%d\n",
                        config->dpp_config_processing);
+       if (config->dpp_name)
+               fprintf(f, "dpp_name=%s\n", config->dpp_name);
+       if (config->dpp_mud_url)
+               fprintf(f, "dpp_mud_url=%s\n", config->dpp_mud_url);
+       if (config->dpp_extra_conf_req_name)
+               fprintf(f, "dpp_extra_conf_req_name=%s\n",
+                       config->dpp_extra_conf_req_name);
+       if (config->dpp_extra_conf_req_value)
+               fprintf(f, "dpp_extra_conf_req_value=%s\n",
+                       config->dpp_extra_conf_req_value);
        if (config->coloc_intf_reporting)
                fprintf(f, "coloc_intf_reporting=%d\n",
                        config->coloc_intf_reporting);
index a248ca2dda4d30d7323d370dbed5a0d43d5f8055..1ed2be03b025297d58ffd255ae960d52d4e4c03e 100644 (file)
@@ -904,6 +904,9 @@ int wpas_dpp_auth_init(struct wpa_supplicant *wpa_s, const char *cmd)
        if (tcp)
                return dpp_tcp_init(wpa_s->dpp, auth, &ipaddr, tcp_port,
                                    wpa_s->conf->dpp_name, DPP_NETROLE_STA,
+                                   wpa_s->conf->dpp_mud_url,
+                                   wpa_s->conf->dpp_extra_conf_req_name,
+                                   wpa_s->conf->dpp_extra_conf_req_value,
                                    wpa_s, wpa_s, wpas_dpp_process_conf_obj,
                                    wpas_dpp_tcp_msg_sent);
 #endif /* CONFIG_DPP2 */
@@ -1842,7 +1845,9 @@ static void wpas_dpp_start_gas_client(struct wpa_supplicant *wpa_s)
        buf = dpp_build_conf_req_helper(auth, wpa_s->conf->dpp_name,
                                        wpa_s->dpp_netrole,
                                        wpa_s->conf->dpp_mud_url,
-                                       supp_op_classes);
+                                       supp_op_classes,
+                                       wpa_s->conf->dpp_extra_conf_req_name,
+                                       wpa_s->conf->dpp_extra_conf_req_value);
        os_free(supp_op_classes);
        if (!buf) {
                wpa_printf(MSG_DEBUG,
@@ -2764,7 +2769,11 @@ static int wpas_dpp_pkex_done(void *ctx, void *conn,
        }
 
        return dpp_tcp_auth(wpa_s->dpp, conn, auth, wpa_s->conf->dpp_name,
-                           DPP_NETROLE_STA, wpas_dpp_process_conf_obj,
+                           DPP_NETROLE_STA,
+                           wpa_s->conf->dpp_mud_url,
+                           wpa_s->conf->dpp_extra_conf_req_name,
+                           wpa_s->conf->dpp_extra_conf_req_value,
+                           wpas_dpp_process_conf_obj,
                            wpas_dpp_tcp_msg_sent);
 }
 #endif /* CONFIG_DPP2 */