blob: e2c668136300659d860dad107ef6aa3d1d082bd8 [file] [log] [blame]
Sunil Ravi99c035e2024-07-12 01:42:03 +00001/*
2 * PASN common processing
3 *
4 * Copyright (C) 2024, Qualcomm Innovation Center, Inc.
5 *
6 * This software may be distributed under the terms of the BSD license.
7 * See README for more details.
8 */
9
10#include "utils/includes.h"
11
12#include "utils/common.h"
13#include "common/wpa_common.h"
14#include "common/sae.h"
15#include "crypto/sha384.h"
16#include "crypto/crypto.h"
17#include "common/ieee802_11_defs.h"
18#include "pasn_common.h"
19
20
21struct pasn_data * pasn_data_init(void)
22{
23 struct pasn_data *pasn = os_zalloc(sizeof(struct pasn_data));
24
25 return pasn;
26}
27
28
29void pasn_data_deinit(struct pasn_data *pasn)
30{
31 bin_clear_free(pasn, sizeof(struct pasn_data));
32}
33
34
35void pasn_register_callbacks(struct pasn_data *pasn, void *cb_ctx,
36 int (*send_mgmt)(void *ctx, const u8 *data,
37 size_t data_len, int noack,
38 unsigned int freq,
39 unsigned int wait),
40 int (*validate_custom_pmkid)(void *ctx,
41 const u8 *addr,
42 const u8 *pmkid))
43{
44 if (!pasn)
45 return;
46
47 pasn->cb_ctx = cb_ctx;
48 pasn->send_mgmt = send_mgmt;
49 pasn->validate_custom_pmkid = validate_custom_pmkid;
50}
51
52
53void pasn_enable_kdk_derivation(struct pasn_data *pasn)
54{
55 if (!pasn)
56 return;
57 pasn->derive_kdk = true;
58 pasn->kdk_len = WPA_KDK_MAX_LEN;
59}
60
61
62void pasn_disable_kdk_derivation(struct pasn_data *pasn)
63{
64 if (!pasn)
65 return;
66 pasn->derive_kdk = false;
67 pasn->kdk_len = 0;
68}
69
70
71void pasn_set_akmp(struct pasn_data *pasn, int akmp)
72{
73 if (!pasn)
74 return;
75 pasn->akmp = akmp;
76}
77
78
79void pasn_set_cipher(struct pasn_data *pasn, int cipher)
80{
81 if (!pasn)
82 return;
83 pasn->cipher = cipher;
84}
85
86
87void pasn_set_own_addr(struct pasn_data *pasn, const u8 *addr)
88{
89 if (!pasn || !addr)
90 return;
91 os_memcpy(pasn->own_addr, addr, ETH_ALEN);
92}
93
94
95void pasn_set_peer_addr(struct pasn_data *pasn, const u8 *addr)
96{
97 if (!pasn || !addr)
98 return;
99 os_memcpy(pasn->peer_addr, addr, ETH_ALEN);
100}
101
102
103void pasn_set_bssid(struct pasn_data *pasn, const u8 *addr)
104{
105 if (!pasn || !addr)
106 return;
107 os_memcpy(pasn->bssid, addr, ETH_ALEN);
108}
109
110
111int pasn_set_pt(struct pasn_data *pasn, struct sae_pt *pt)
112{
113 if (!pasn)
114 return -1;
115#ifdef CONFIG_SAE
116 pasn->pt = pt;
117 return 0;
118#else /* CONFIG_SAE */
119 return -1;
120#endif /* CONFIG_SAE */
121}
122
123
124void pasn_set_password(struct pasn_data *pasn, const char *password)
125{
126 if (!pasn)
127 return;
128 pasn->password = password;
129}
130
131
132void pasn_set_wpa_key_mgmt(struct pasn_data *pasn, int key_mgmt)
133{
134 if (!pasn)
135 return;
136 pasn->wpa_key_mgmt = key_mgmt;
137}
138
139
140void pasn_set_rsn_pairwise(struct pasn_data *pasn, int rsn_pairwise)
141{
142 if (!pasn)
143 return;
144 pasn->rsn_pairwise = rsn_pairwise;
145}
146
147
148void pasn_set_rsnxe_caps(struct pasn_data *pasn, u16 rsnxe_capab)
149{
150 if (!pasn)
151 return;
152 pasn->rsnxe_capab = rsnxe_capab;
153}
154
155
156void pasn_set_rsnxe_ie(struct pasn_data *pasn, const u8 *rsnxe_ie)
157{
158 if (!pasn || !rsnxe_ie)
159 return;
160 pasn->rsnxe_ie = rsnxe_ie;
161}
162
163
164void pasn_set_custom_pmkid(struct pasn_data *pasn, const u8 *pmkid)
165{
166 if (!pasn || !pmkid)
167 return;
168 os_memcpy(pasn->custom_pmkid, pmkid, PMKID_LEN);
169 pasn->custom_pmkid_valid = true;
170}
171
172
173int pasn_set_extra_ies(struct pasn_data *pasn, const u8 *extra_ies,
174 size_t extra_ies_len)
175{
176 if (!pasn || !extra_ies_len || !extra_ies)
177 return -1;
178
179 if (pasn->extra_ies) {
180 os_free((u8 *) pasn->extra_ies);
181 pasn->extra_ies_len = extra_ies_len;
182 }
183
184 pasn->extra_ies = os_memdup(extra_ies, extra_ies_len);
185 if (!pasn->extra_ies) {
186 wpa_printf(MSG_ERROR,
187 "PASN: Extra IEs memory allocation failed");
188 return -1;
189 }
190 pasn->extra_ies_len = extra_ies_len;
191 return 0;
192}
193
194
195int pasn_get_akmp(struct pasn_data *pasn)
196{
197 if (!pasn)
198 return 0;
199 return pasn->akmp;
200}
201
202
203int pasn_get_cipher(struct pasn_data *pasn)
204{
205 if (!pasn)
206 return 0;
207 return pasn->cipher;
208}
209
210
211size_t pasn_get_pmk_len(struct pasn_data *pasn)
212{
213 if (!pasn)
214 return 0;
215 return pasn->pmk_len;
216}
217
218
219u8 * pasn_get_pmk(struct pasn_data *pasn)
220{
221 if (!pasn)
222 return NULL;
223 return pasn->pmk;
224}
225
226
227struct wpa_ptk * pasn_get_ptk(struct pasn_data *pasn)
228{
229 if (!pasn)
230 return NULL;
231 return &pasn->ptk;
232}