1 /* 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 21 struct 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 29 void pasn_data_deinit(struct pasn_data *pasn) 30 { 31 bin_clear_free(pasn, sizeof(struct pasn_data)); 32 } 33 34 35 void 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 53 void 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 62 void 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 71 void pasn_set_akmp(struct pasn_data *pasn, int akmp) 72 { 73 if (!pasn) 74 return; 75 pasn->akmp = akmp; 76 } 77 78 79 void pasn_set_cipher(struct pasn_data *pasn, int cipher) 80 { 81 if (!pasn) 82 return; 83 pasn->cipher = cipher; 84 } 85 86 87 void 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 95 void 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 103 void 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 111 int 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 124 void pasn_set_password(struct pasn_data *pasn, const char *password) 125 { 126 if (!pasn) 127 return; 128 pasn->password = password; 129 } 130 131 132 void 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 140 void 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 148 void 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 156 void 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 164 void 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 173 int 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 195 int pasn_get_akmp(struct pasn_data *pasn) 196 { 197 if (!pasn) 198 return 0; 199 return pasn->akmp; 200 } 201 202 203 int pasn_get_cipher(struct pasn_data *pasn) 204 { 205 if (!pasn) 206 return 0; 207 return pasn->cipher; 208 } 209 210 211 size_t pasn_get_pmk_len(struct pasn_data *pasn) 212 { 213 if (!pasn) 214 return 0; 215 return pasn->pmk_len; 216 } 217 218 219 u8 * pasn_get_pmk(struct pasn_data *pasn) 220 { 221 if (!pasn) 222 return NULL; 223 return pasn->pmk; 224 } 225 226 227 struct wpa_ptk * pasn_get_ptk(struct pasn_data *pasn) 228 { 229 if (!pasn) 230 return NULL; 231 return &pasn->ptk; 232 } 233