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