Lines Matching defs:pkex
6895 static struct wpabuf * dpp_pkex_build_exchange_req(struct dpp_pkex *pkex)
6906 const struct dpp_curve_params *curve = pkex->own_bi->curve;
6914 Qi = dpp_pkex_derive_Qi(curve, pkex->own_mac, pkex->code,
6915 pkex->identifier, bnctx, &group);
6926 pkex->x = dpp_set_keypair(&tmp_curve,
6930 pkex->x = dpp_gen_keypair(curve);
6933 pkex->x = dpp_gen_keypair(curve);
6935 if (!pkex->x)
6939 X_ec = EVP_PKEY_get1_EC_KEY(pkex->x);
6957 if (pkex->identifier)
6958 attr_len += 4 + os_strlen(pkex->identifier);
6981 if (pkex->identifier) {
6983 wpabuf_put_le16(msg, os_strlen(pkex->identifier));
6984 wpabuf_put_str(msg, pkex->identifier);
7009 dpp_bn2bin_pad(Mx, pkex->Mx, curve->prime_len) < 0 ||
7032 static void dpp_pkex_fail(struct dpp_pkex *pkex, const char *txt)
7034 wpa_msg(pkex->msg_ctx, MSG_INFO, DPP_EVENT_FAIL "%s", txt);
7043 struct dpp_pkex *pkex;
7053 pkex = os_zalloc(sizeof(*pkex));
7054 if (!pkex)
7056 pkex->msg_ctx = msg_ctx;
7057 pkex->initiator = 1;
7058 pkex->own_bi = bi;
7059 os_memcpy(pkex->own_mac, own_mac, ETH_ALEN);
7061 pkex->identifier = os_strdup(identifier);
7062 if (!pkex->identifier)
7065 pkex->code = os_strdup(code);
7066 if (!pkex->code)
7068 pkex->exchange_req = dpp_pkex_build_exchange_req(pkex);
7069 if (!pkex->exchange_req)
7071 return pkex;
7073 dpp_pkex_free(pkex);
7079 dpp_pkex_build_exchange_resp(struct dpp_pkex *pkex,
7085 const struct dpp_curve_params *curve = pkex->own_bi->curve;
7089 if (pkex->identifier)
7090 attr_len += 4 + os_strlen(pkex->identifier);
7116 if (pkex->identifier) {
7118 wpabuf_put_le16(msg, os_strlen(pkex->identifier));
7119 wpabuf_put_str(msg, pkex->identifier);
7147 dpp_bn2bin_pad(Nx, pkex->Nx, curve->prime_len) < 0 ||
7264 struct dpp_pkex *pkex = NULL;
7313 pkex = os_zalloc(sizeof(*pkex));
7314 if (!pkex)
7316 pkex->own_bi = bi;
7317 pkex->failed = 1;
7318 pkex->exchange_resp = dpp_pkex_build_exchange_resp(
7319 pkex, DPP_STATUS_BAD_GROUP, NULL, NULL);
7320 if (!pkex->exchange_resp)
7322 return pkex;
7365 pkex = os_zalloc(sizeof(*pkex));
7366 if (!pkex)
7368 pkex->t = bi->pkex_t;
7369 pkex->msg_ctx = msg_ctx;
7370 pkex->own_bi = bi;
7371 os_memcpy(pkex->own_mac, own_mac, ETH_ALEN);
7372 os_memcpy(pkex->peer_mac, peer_mac, ETH_ALEN);
7374 pkex->identifier = os_strdup(identifier);
7375 if (!pkex->identifier)
7378 pkex->code = os_strdup(code);
7379 if (!pkex->code)
7382 os_memcpy(pkex->Mx, attr_key, attr_key_len / 2);
7389 pkex->x = EVP_PKEY_new();
7390 if (!pkex->x ||
7391 EVP_PKEY_set1_EC_KEY(pkex->x, X_ec) != 1)
7406 pkex->y = dpp_set_keypair(&tmp_curve,
7410 pkex->y = dpp_gen_keypair(curve);
7413 pkex->y = dpp_gen_keypair(curve);
7415 if (!pkex->y)
7419 Y_ec = EVP_PKEY_get1_EC_KEY(pkex->y);
7435 pkex->exchange_resp = dpp_pkex_build_exchange_resp(pkex, DPP_STATUS_OK,
7437 if (!pkex->exchange_resp)
7441 if (dpp_ecdh(pkex->y, pkex->x, Kx, &Kx_len) < 0)
7449 res = dpp_pkex_derive_z(pkex->peer_mac, pkex->own_mac,
7450 pkex->Mx, curve->prime_len,
7451 pkex->Nx, curve->prime_len, pkex->code,
7452 Kx, Kx_len, pkex->z, curve->hash_len);
7457 pkex->exchange_done = 1;
7473 return pkex;
7476 dpp_pkex_free(pkex);
7477 pkex = NULL;
7483 dpp_pkex_build_commit_reveal_req(struct dpp_pkex *pkex,
7486 const struct dpp_curve_params *curve = pkex->own_bi->curve;
7569 if (aes_siv_encrypt(pkex->z, curve->hash_len,
7595 struct wpabuf * dpp_pkex_rx_exchange_resp(struct dpp_pkex *pkex,
7604 const struct dpp_curve_params *curve = pkex->own_bi->curve;
7615 if (pkex->failed || pkex->t >= PKEX_COUNTER_T_LIMIT || !pkex->initiator)
7622 pkex->failed = 1;
7633 os_memcpy(pkex->peer_mac, peer_mac, ETH_ALEN);
7638 dpp_pkex_fail(pkex, "No DPP Status attribute");
7648 wpa_msg(pkex->msg_ctx, MSG_INFO, DPP_EVENT_FAIL
7656 dpp_pkex_fail(pkex, "PKEX failed (peer indicated failure)");
7664 pkex->identifier)) {
7665 dpp_pkex_fail(pkex, "PKEX code identifier mismatch");
7673 dpp_pkex_fail(pkex, "Missing Encrypted Key attribute");
7681 Qr = dpp_pkex_derive_Qr(curve, pkex->peer_mac, pkex->code,
7682 pkex->identifier, bnctx, &group);
7699 dpp_pkex_fail(pkex, "Invalid Encrypted Key value");
7700 pkex->t++;
7706 pkex->exchange_done = 1;
7714 pkex->y = EVP_PKEY_new();
7715 if (!pkex->y ||
7716 EVP_PKEY_set1_EC_KEY(pkex->y, Y_ec) != 1)
7718 if (dpp_ecdh(pkex->own_bi->pubkey, pkex->y, Jx, &Jx_len) < 0)
7725 A_pub = dpp_get_pubkey_point(pkex->own_bi->pubkey, 0);
7726 Y_pub = dpp_get_pubkey_point(pkex->y, 0);
7727 X_pub = dpp_get_pubkey_point(pkex->x, 0);
7730 addr[0] = pkex->own_mac;
7743 if (dpp_ecdh(pkex->x, pkex->y, Kx, &Kx_len) < 0)
7751 res = dpp_pkex_derive_z(pkex->own_mac, pkex->peer_mac,
7752 pkex->Mx, curve->prime_len,
7754 pkex->code, Kx, Kx_len,
7755 pkex->z, curve->hash_len);
7760 msg = dpp_pkex_build_commit_reveal_req(pkex, A_pub, u);
7784 dpp_pkex_build_commit_reveal_resp(struct dpp_pkex *pkex,
7787 const struct dpp_curve_params *curve = pkex->own_bi->curve;
7870 if (aes_siv_encrypt(pkex->z, curve->hash_len,
7896 struct wpabuf * dpp_pkex_rx_commit_reveal_req(struct dpp_pkex *pkex,
7900 const struct dpp_curve_params *curve = pkex->own_bi->curve;
7919 pkex->failed = 1;
7924 if (!pkex->exchange_done || pkex->failed ||
7925 pkex->t >= PKEX_COUNTER_T_LIMIT || pkex->initiator)
7931 dpp_pkex_fail(pkex,
7951 if (aes_siv_decrypt(pkex->z, curve->hash_len,
7954 dpp_pkex_fail(pkex,
7956 pkex->failed = 1;
7957 pkex->t++;
7964 dpp_pkex_fail(pkex, "Invalid attribute in unwrapped data");
7971 dpp_pkex_fail(pkex, "No valid peer bootstrapping key found");
7974 pkex->peer_bootstrap_key = dpp_set_pubkey_point(pkex->x, b_key,
7976 if (!pkex->peer_bootstrap_key) {
7977 dpp_pkex_fail(pkex, "Peer bootstrapping key is invalid");
7981 pkex->peer_bootstrap_key);
7984 if (dpp_ecdh(pkex->y, pkex->peer_bootstrap_key, Jx, &Jx_len) < 0)
7991 A_pub = dpp_get_pubkey_point(pkex->peer_bootstrap_key, 0);
7992 Y_pub = dpp_get_pubkey_point(pkex->y, 0);
7993 X_pub = dpp_get_pubkey_point(pkex->x, 0);
7996 addr[0] = pkex->peer_mac;
8011 dpp_pkex_fail(pkex, "No valid u (I-Auth tag) found");
8015 pkex->t++;
8021 if (dpp_ecdh(pkex->own_bi->pubkey, pkex->x, Lx, &Lx_len) < 0)
8028 B_pub = dpp_get_pubkey_point(pkex->own_bi->pubkey, 0);
8031 addr[0] = pkex->own_mac;
8043 msg = dpp_pkex_build_commit_reveal_resp(pkex, B_pub, v);
8061 int dpp_pkex_rx_commit_reveal_resp(struct dpp_pkex *pkex, const u8 *hdr,
8064 const struct dpp_curve_params *curve = pkex->own_bi->curve;
8082 pkex->failed = 1;
8087 if (!pkex->exchange_done || pkex->failed ||
8088 pkex->t >= PKEX_COUNTER_T_LIMIT || !pkex->initiator)
8094 dpp_pkex_fail(pkex,
8114 if (aes_siv_decrypt(pkex->z, curve->hash_len,
8117 dpp_pkex_fail(pkex,
8119 pkex->t++;
8126 dpp_pkex_fail(pkex, "Invalid attribute in unwrapped data");
8133 dpp_pkex_fail(pkex, "No valid peer bootstrapping key found");
8136 pkex->peer_bootstrap_key = dpp_set_pubkey_point(pkex->x, b_key,
8138 if (!pkex->peer_bootstrap_key) {
8139 dpp_pkex_fail(pkex, "Peer bootstrapping key is invalid");
8143 pkex->peer_bootstrap_key);
8146 if (dpp_ecdh(pkex->x, pkex->peer_bootstrap_key, Lx, &Lx_len) < 0)
8153 B_pub = dpp_get_pubkey_point(pkex->peer_bootstrap_key, 0);
8154 X_pub = dpp_get_pubkey_point(pkex->x, 0);
8155 Y_pub = dpp_get_pubkey_point(pkex->y, 0);
8158 addr[0] = pkex->peer_mac;
8173 dpp_pkex_fail(pkex, "No valid v (R-Auth tag) found");
8177 pkex->t++;
8194 void dpp_pkex_free(struct dpp_pkex *pkex)
8196 if (!pkex)
8199 os_free(pkex->identifier);
8200 os_free(pkex->code);
8201 EVP_PKEY_free(pkex->x);
8202 EVP_PKEY_free(pkex->y);
8203 EVP_PKEY_free(pkex->peer_bootstrap_key);
8204 wpabuf_free(pkex->exchange_req);
8205 wpabuf_free(pkex->exchange_resp);
8206 os_free(pkex);
8420 else if (os_strstr(cmd, "type=pkex"))
8518 dpp_pkex_finish(struct dpp_global *dpp, struct dpp_pkex *pkex, const u8 *peer,
8531 bi->curve = pkex->own_bi->curve;
8532 bi->pubkey = pkex->peer_bootstrap_key;
8533 pkex->peer_bootstrap_key = NULL;
8538 dpp_pkex_free(pkex);