]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
EAP-pwd: Move EC group initialization to earlier step
authorDan Harkins <dharkins@lounge.org>
Fri, 25 May 2018 18:40:04 +0000 (21:40 +0300)
committerJouni Malinen <j@w1.fi>
Mon, 28 May 2018 14:15:07 +0000 (17:15 +0300)
This is needed for adding support for salted passwords.

Signed-off-by: Dan Harkins <dharkins@lounge.org>
src/eap_common/eap_pwd_common.c
src/eap_common/eap_pwd_common.h
src/eap_peer/eap_pwd.c
src/eap_server/eap_server_pwd.c

index 5e986822db771e0668cedea6f7a2b5a4ffba2a4b..f3716873e650af9da9bef49b003659a672bc03d3 100644 (file)
@@ -81,6 +81,27 @@ static int eap_pwd_kdf(const u8 *key, size_t keylen, const u8 *label,
 }
 
 
+EAP_PWD_group * get_eap_pwd_group(u16 num)
+{
+       EAP_PWD_group *grp;
+
+       grp = os_zalloc(sizeof(EAP_PWD_group));
+       if (!grp)
+               return NULL;
+       grp->group = crypto_ec_init(num);
+       if (!grp->group) {
+               wpa_printf(MSG_INFO, "EAP-pwd: unable to create EC group");
+               os_free(grp);
+               return NULL;
+       }
+
+       grp->group_num = num;
+       wpa_printf(MSG_INFO, "EAP-pwd: provisioned group %d", num);
+
+       return grp;
+}
+
+
 /*
  * compute a "random" secret point on an elliptic curve based
  * on the password and identities.
@@ -97,12 +118,8 @@ int compute_password_element(EAP_PWD_group *grp, u16 num,
        size_t primebytelen, primebitlen;
        struct crypto_bignum *x_candidate = NULL, *rnd = NULL, *cofactor = NULL;
 
-       grp->pwe = NULL;
-       grp->group = crypto_ec_init(num);
-       if (!grp->group) {
-               wpa_printf(MSG_INFO, "EAP-pwd: unable to create EC group");
-               goto fail;
-       }
+       if (grp->pwe)
+               return -1;
 
        cofactor = crypto_bignum_init();
        grp->pwe = crypto_ec_point_init(grp->group);
@@ -234,11 +251,8 @@ int compute_password_element(EAP_PWD_group *grp, u16 num,
                break;
        }
        wpa_printf(MSG_DEBUG, "EAP-pwd: found a PWE in %d tries", ctr);
-       grp->group_num = num;
        if (0) {
  fail:
-               crypto_ec_deinit(grp->group);
-               grp->group = NULL;
                crypto_ec_point_deinit(grp->pwe, 1);
                grp->pwe = NULL;
                ret = 1;
index 7ac7b6aec12d84f6c0cd53718d700de922b677a1..03e18d4d170f51139ed42a0fc16345812ec68087 100644 (file)
@@ -50,6 +50,7 @@ struct eap_pwd_id {
 } STRUCT_PACKED;
 
 /* common routines */
+EAP_PWD_group * get_eap_pwd_group(u16 num);
 int compute_password_element(EAP_PWD_group *grp, u16 num,
                             const u8 *password, size_t password_len,
                             const u8 *id_server, size_t id_server_len,
index d62defe2836e10e308dc321afb60ba7349f419bd..ae0f9a47c4643613cf207f5aa1bac40b34faf47b 100644 (file)
@@ -265,7 +265,7 @@ eap_pwd_perform_id_exchange(struct eap_sm *sm, struct eap_pwd_data *data,
        wpa_hexdump_ascii(MSG_INFO, "EAP-PWD (peer): server sent id of",
                          data->id_server, data->id_server_len);
 
-       data->grp = os_zalloc(sizeof(EAP_PWD_group));
+       data->grp = get_eap_pwd_group(data->group_num);
        if (data->grp == NULL) {
                wpa_printf(MSG_INFO, "EAP-PWD: failed to allocate memory for "
                           "group");
index 835ea09aefe1f113bec5f7f71aea33d7d3852714..12a549ed108de6ff28520ccc7e0c42c30bf4c282 100644 (file)
@@ -562,7 +562,7 @@ static void eap_pwd_process_id_resp(struct eap_sm *sm,
        wpa_hexdump_ascii(MSG_DEBUG, "EAP-PWD (server): peer sent id of",
                          data->id_peer, data->id_peer_len);
 
-       data->grp = os_zalloc(sizeof(EAP_PWD_group));
+       data->grp = get_eap_pwd_group(data->group_num);
        if (data->grp == NULL) {
                wpa_printf(MSG_INFO, "EAP-PWD: failed to allocate memory for "
                           "group");