1 /* 2 * Simultaneous authentication of equals 3 * Copyright (c) 2012-2013, Jouni Malinen <j@w1.fi> 4 * 5 * This software may be distributed under the terms of the BSD license. 6 * See README for more details. 7 */ 8 9 #ifndef SAE_H 10 #define SAE_H 11 12 #define SAE_KCK_LEN 32 13 #define SAE_PMK_LEN 32 14 #define SAE_PMK_LEN_MAX 64 15 #define SAE_PMKID_LEN 16 16 #define SAE_MAX_PRIME_LEN 512 17 #define SAE_MAX_ECC_PRIME_LEN 66 18 #define SAE_MAX_HASH_LEN 64 19 #define SAE_COMMIT_MAX_LEN (2 + 3 * SAE_MAX_PRIME_LEN + 255) 20 #ifdef CONFIG_SAE_PK 21 #define SAE_CONFIRM_MAX_LEN ((2 + SAE_MAX_HASH_LEN) + 1500) 22 #else /* CONFIG_SAE_PK */ 23 #define SAE_CONFIRM_MAX_LEN (2 + SAE_MAX_HASH_LEN) 24 #endif /* CONFIG_SAE_PK */ 25 #define SAE_PK_M_LEN 16 26 27 /* Special value returned by sae_parse_commit() */ 28 #define SAE_SILENTLY_DISCARD 65535 29 30 struct sae_pk { 31 struct wpabuf *m; 32 struct crypto_ec_key *key; 33 int group; 34 struct wpabuf *pubkey; /* DER encoded subjectPublicKey */ 35 #ifdef CONFIG_TESTING_OPTIONS 36 struct crypto_ec_key *sign_key_override; 37 #endif /* CONFIG_TESTING_OPTIONS */ 38 }; 39 40 41 struct sae_temporary_data { 42 u8 kck[SAE_MAX_HASH_LEN]; 43 size_t kck_len; 44 struct crypto_bignum *own_commit_scalar; 45 struct crypto_bignum *own_commit_element_ffc; 46 struct crypto_ec_point *own_commit_element_ecc; 47 struct crypto_bignum *peer_commit_element_ffc; 48 struct crypto_ec_point *peer_commit_element_ecc; 49 struct crypto_ec_point *pwe_ecc; 50 struct crypto_bignum *pwe_ffc; 51 struct crypto_bignum *sae_rand; 52 struct crypto_ec *ec; 53 int prime_len; 54 int order_len; 55 const struct dh_group *dh; 56 const struct crypto_bignum *prime; 57 const struct crypto_bignum *order; 58 struct crypto_bignum *prime_buf; 59 struct crypto_bignum *order_buf; 60 struct wpabuf *anti_clogging_token; 61 char *pw_id; 62 char *parsed_pw_id; 63 int vlan_id; 64 u8 bssid[ETH_ALEN]; 65 struct wpabuf *own_rejected_groups; 66 struct wpabuf *peer_rejected_groups; 67 unsigned int own_addr_higher:1; 68 unsigned int try_other_password:1; 69 70 #ifdef CONFIG_SAE_PK 71 u8 kek[SAE_MAX_HASH_LEN]; 72 size_t kek_len; 73 const struct sae_pk *ap_pk; 74 u8 own_addr[ETH_ALEN]; 75 u8 peer_addr[ETH_ALEN]; 76 u8 fingerprint[SAE_MAX_HASH_LEN]; 77 size_t fingerprint_bytes; 78 size_t fingerprint_bits; 79 size_t lambda; 80 unsigned int sec; 81 u8 ssid[32]; 82 size_t ssid_len; 83 #ifdef CONFIG_TESTING_OPTIONS 84 bool omit_pk_elem; 85 #endif /* CONFIG_TESTING_OPTIONS */ 86 #endif /* CONFIG_SAE_PK */ 87 88 struct os_reltime disabled_until; 89 90 const void *used_pw; 91 }; 92 93 struct sae_pt { 94 struct sae_pt *next; 95 int group; 96 struct crypto_ec *ec; 97 struct crypto_ec_point *ecc_pt; 98 99 const struct dh_group *dh; 100 struct crypto_bignum *ffc_pt; 101 #ifdef CONFIG_SAE_PK 102 u8 ssid[32]; 103 size_t ssid_len; 104 #endif /* CONFIG_SAE_PK */ 105 }; 106 107 enum sae_state { 108 SAE_NOTHING, SAE_COMMITTED, SAE_CONFIRMED, SAE_ACCEPTED 109 }; 110 111 struct sae_data { 112 enum sae_state state; 113 u16 send_confirm; 114 u8 pmk[SAE_PMK_LEN_MAX]; 115 size_t pmk_len; 116 int akmp; /* WPA_KEY_MGMT_* used in key derivation */ 117 u32 own_akm_suite_selector; 118 u32 peer_akm_suite_selector; 119 u8 pmkid[SAE_PMKID_LEN]; 120 struct crypto_bignum *peer_commit_scalar; 121 struct crypto_bignum *peer_commit_scalar_accepted; 122 int group; 123 unsigned int sync; /* protocol instance variable: Sync */ 124 u16 rc; /* protocol instance variable: Rc (received send-confirm) */ 125 unsigned int h2e:1; 126 unsigned int pk:1; 127 unsigned int no_pw_id:1; 128 struct sae_temporary_data *tmp; 129 }; 130 131 int sae_set_group(struct sae_data *sae, int group); 132 void sae_clear_temp_data(struct sae_data *sae); 133 void sae_clear_data(struct sae_data *sae); 134 135 int sae_prepare_commit(const u8 *addr1, const u8 *addr2, 136 const u8 *password, size_t password_len, 137 struct sae_data *sae); 138 int sae_prepare_commit_pt(struct sae_data *sae, const struct sae_pt *pt, 139 const u8 *addr1, const u8 *addr2, 140 int *rejected_groups, const struct sae_pk *pk); 141 int sae_process_commit(struct sae_data *sae); 142 int sae_write_commit(struct sae_data *sae, struct wpabuf *buf, 143 const struct wpabuf *token, const char *identifier); 144 u16 sae_parse_commit(struct sae_data *sae, const u8 *data, size_t len, 145 const u8 **token, size_t *token_len, int *allowed_groups, 146 int h2e, int *ie_offset); 147 int sae_write_confirm(struct sae_data *sae, struct wpabuf *buf); 148 int sae_check_confirm(struct sae_data *sae, const u8 *data, size_t len, 149 int *ie_offset); 150 u16 sae_group_allowed(struct sae_data *sae, int *allowed_groups, u16 group); 151 const char * sae_state_txt(enum sae_state state); 152 size_t sae_ecc_prime_len_2_hash_len(size_t prime_len); 153 size_t sae_ffc_prime_len_2_hash_len(size_t prime_len); 154 struct sae_pt * sae_derive_pt(const int *groups, 155 const u8 *ssid, size_t ssid_len, 156 const u8 *password, size_t password_len, 157 const char *identifier); 158 struct crypto_ec_point * 159 sae_derive_pwe_from_pt_ecc(const struct sae_pt *pt, 160 const u8 *addr1, const u8 *addr2); 161 struct crypto_bignum * 162 sae_derive_pwe_from_pt_ffc(const struct sae_pt *pt, 163 const u8 *addr1, const u8 *addr2); 164 void sae_deinit_pt(struct sae_pt *pt); 165 166 /* sae_pk.c */ 167 #ifdef CONFIG_SAE_PK 168 bool sae_pk_valid_password(const char *pw); 169 #else /* CONFIG_SAE_PK */ sae_pk_valid_password(const char * pw)170 static inline bool sae_pk_valid_password(const char *pw) 171 { 172 return false; 173 } 174 #endif /* CONFIG_SAE_PK */ 175 char * sae_pk_base32_encode(const u8 *src, size_t len_bits); 176 u8 * sae_pk_base32_decode(const char *src, size_t len, size_t *out_len); 177 int sae_pk_set_password(struct sae_data *sae, const char *password); 178 void sae_deinit_pk(struct sae_pk *pk); 179 struct sae_pk * sae_parse_pk(const char *val); 180 int sae_write_confirm_pk(struct sae_data *sae, struct wpabuf *buf); 181 int sae_check_confirm_pk(struct sae_data *sae, const u8 *ies, size_t ies_len); 182 int sae_hash(size_t hash_len, const u8 *data, size_t len, u8 *hash); 183 u32 sae_pk_get_be19(const u8 *buf); 184 void sae_pk_buf_shift_left_19(u8 *buf, size_t len); 185 186 #endif /* SAE_H */ 187