wps_i.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. /*
  2. * Wi-Fi Protected Setup - internal definitions
  3. * Copyright (c) 2008, Jouni Malinen <j@w1.fi>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * Alternatively, this software may be distributed under the terms of BSD
  10. * license.
  11. *
  12. * See README and COPYING for more details.
  13. */
  14. #ifndef WPS_I_H
  15. #define WPS_I_H
  16. #include "wps.h"
  17. #include "wps_defs.h"
  18. /**
  19. * struct wps_data - WPS registration protocol data
  20. *
  21. * This data is stored at the EAP-WSC server/peer method and it is kept for a
  22. * single registration protocol run.
  23. */
  24. struct wps_data {
  25. int authenticator;
  26. struct wps_context *wps;
  27. struct wps_registrar *registrar;
  28. enum {
  29. /* Enrollee states */
  30. SEND_M1, RECV_M2, SEND_M3, RECV_M4, SEND_M5, RECV_M6, SEND_M7,
  31. RECV_M8, RECEIVED_M2D, WPS_MSG_DONE, RECV_ACK, WPS_FINISHED,
  32. SEND_WSC_NACK,
  33. /* Registrar states */
  34. RECV_M1, SEND_M2, RECV_M3, SEND_M4, RECV_M5, SEND_M6,
  35. RECV_M7, SEND_M8, RECV_DONE, SEND_M2D, RECV_M2D_ACK
  36. } state;
  37. u8 uuid_e[WPS_UUID_LEN];
  38. u8 uuid_r[WPS_UUID_LEN];
  39. u8 mac_addr_e[ETH_ALEN];
  40. u8 nonce_e[WPS_NONCE_LEN];
  41. u8 nonce_r[WPS_NONCE_LEN];
  42. u8 psk1[WPS_PSK_LEN];
  43. u8 psk2[WPS_PSK_LEN];
  44. u8 snonce[2 * WPS_SECRET_NONCE_LEN];
  45. u8 peer_hash1[WPS_HASH_LEN];
  46. u8 peer_hash2[WPS_HASH_LEN];
  47. struct wpabuf *dh_privkey;
  48. struct wpabuf *dh_pubkey_e;
  49. struct wpabuf *dh_pubkey_r;
  50. u8 authkey[WPS_AUTHKEY_LEN];
  51. u8 keywrapkey[WPS_KEYWRAPKEY_LEN];
  52. u8 emsk[WPS_EMSK_LEN];
  53. u8 mgmt_auth_key[WPS_MGMTAUTHKEY_LEN];
  54. u8 mgmt_auth_key_id[WPS_MGMT_KEY_ID_LEN];
  55. u8 mgmt_enc_key[WPS_MGMTENCKEY_LEN];
  56. u8 mgmt_enc_key_id[WPS_MGMT_KEY_ID_LEN];
  57. struct wpabuf *last_msg;
  58. u8 *dev_password;
  59. size_t dev_password_len;
  60. u16 dev_pw_id;
  61. int pbc;
  62. u8 request_type; /* Request Type attribute from (Re)AssocReq */
  63. u16 encr_type; /* available encryption types */
  64. u16 auth_type; /* available authentication types */
  65. u8 *new_psk;
  66. size_t new_psk_len;
  67. int wps_pin_revealed;
  68. struct wps_credential cred;
  69. struct wps_device_data peer_dev;
  70. };
  71. struct wps_parse_attr {
  72. /* fixed length fields */
  73. const u8 *version; /* 1 octet */
  74. const u8 *msg_type; /* 1 octet */
  75. const u8 *enrollee_nonce; /* WPS_NONCE_LEN (16) octets */
  76. const u8 *registrar_nonce; /* WPS_NONCE_LEN (16) octets */
  77. const u8 *uuid_r; /* WPS_UUID_LEN (16) octets */
  78. const u8 *uuid_e; /* WPS_UUID_LEN (16) octets */
  79. const u8 *auth_type_flags; /* 2 octets */
  80. const u8 *encr_type_flags; /* 2 octets */
  81. const u8 *conn_type_flags; /* 1 octet */
  82. const u8 *config_methods; /* 2 octets */
  83. const u8 *sel_reg_config_methods; /* 2 octets */
  84. const u8 *primary_dev_type; /* 8 octets */
  85. const u8 *rf_bands; /* 1 octet */
  86. const u8 *assoc_state; /* 2 octets */
  87. const u8 *config_error; /* 2 octets */
  88. const u8 *dev_password_id; /* 2 octets */
  89. const u8 *os_version; /* 4 octets */
  90. const u8 *wps_state; /* 1 octet */
  91. const u8 *authenticator; /* WPS_AUTHENTICATOR_LEN (8) octets */
  92. const u8 *r_hash1; /* WPS_HASH_LEN (32) octets */
  93. const u8 *r_hash2; /* WPS_HASH_LEN (32) octets */
  94. const u8 *e_hash1; /* WPS_HASH_LEN (32) octets */
  95. const u8 *e_hash2; /* WPS_HASH_LEN (32) octets */
  96. const u8 *r_snonce1; /* WPS_SECRET_NONCE_LEN (16) octets */
  97. const u8 *r_snonce2; /* WPS_SECRET_NONCE_LEN (16) octets */
  98. const u8 *e_snonce1; /* WPS_SECRET_NONCE_LEN (16) octets */
  99. const u8 *e_snonce2; /* WPS_SECRET_NONCE_LEN (16) octets */
  100. const u8 *key_wrap_auth; /* WPS_KWA_LEN (8) octets */
  101. const u8 *auth_type; /* 2 octets */
  102. const u8 *encr_type; /* 2 octets */
  103. const u8 *network_idx; /* 1 octet */
  104. const u8 *network_key_idx; /* 1 octet */
  105. const u8 *mac_addr; /* ETH_ALEN (6) octets */
  106. const u8 *key_prov_auto; /* 1 octet (Bool) */
  107. const u8 *dot1x_enabled; /* 1 octet (Bool) */
  108. const u8 *selected_registrar; /* 1 octet (Bool) */
  109. const u8 *request_type; /* 1 octet */
  110. const u8 *response_type; /* 1 octet */
  111. /* variable length fields */
  112. const u8 *manufacturer;
  113. size_t manufacturer_len;
  114. const u8 *model_name;
  115. size_t model_name_len;
  116. const u8 *model_number;
  117. size_t model_number_len;
  118. const u8 *serial_number;
  119. size_t serial_number_len;
  120. const u8 *dev_name;
  121. size_t dev_name_len;
  122. const u8 *public_key;
  123. size_t public_key_len;
  124. const u8 *encr_settings;
  125. size_t encr_settings_len;
  126. const u8 *ssid; /* <= 32 octets */
  127. size_t ssid_len;
  128. const u8 *network_key; /* <= 64 octets */
  129. size_t network_key_len;
  130. const u8 *eap_type; /* <= 8 octets */
  131. size_t eap_type_len;
  132. const u8 *eap_identity; /* <= 64 octets */
  133. size_t eap_identity_len;
  134. /* attributes that can occur multiple times */
  135. #define MAX_CRED_COUNT 10
  136. const u8 *cred[MAX_CRED_COUNT];
  137. size_t cred_len[MAX_CRED_COUNT];
  138. size_t num_cred;
  139. };
  140. /* wps_common.c */
  141. int wps_parse_msg(const struct wpabuf *msg, struct wps_parse_attr *attr);
  142. void wps_kdf(const u8 *key, const u8 *label_prefix, size_t label_prefix_len,
  143. const char *label, u8 *res, size_t res_len);
  144. int wps_build_public_key(struct wps_data *wps, struct wpabuf *msg);
  145. int wps_build_config_methods(struct wpabuf *msg, u16 methods);
  146. int wps_build_uuid_e(struct wpabuf *msg, const u8 *uuid);
  147. int wps_build_rf_bands(struct wpabuf *msg, u8 rf_bands);
  148. int wps_build_dev_password_id(struct wpabuf *msg, u16 id);
  149. int wps_build_config_error(struct wpabuf *msg, u16 err);
  150. int wps_derive_keys(struct wps_data *wps);
  151. int wps_derive_mgmt_keys(struct wps_data *wps);
  152. int wps_build_authenticator(struct wps_data *wps, struct wpabuf *msg);
  153. int wps_process_authenticator(struct wps_data *wps, const u8 *authenticator,
  154. const struct wpabuf *msg);
  155. void wps_derive_psk(struct wps_data *wps, const u8 *dev_passwd,
  156. size_t dev_passwd_len);
  157. struct wpabuf * wps_decrypt_encr_settings(struct wps_data *wps, const u8 *encr,
  158. size_t encr_len);
  159. int wps_process_key_wrap_auth(struct wps_data *wps, struct wpabuf *msg,
  160. const u8 *key_wrap_auth);
  161. int wps_build_key_wrap_auth(struct wps_data *wps, struct wpabuf *msg);
  162. int wps_build_encr_settings(struct wps_data *wps, struct wpabuf *msg,
  163. struct wpabuf *plain);
  164. int wps_build_version(struct wpabuf *msg);
  165. int wps_build_msg_type(struct wpabuf *msg, enum wps_msg_type msg_type);
  166. int wps_build_enrollee_nonce(struct wps_data *wps, struct wpabuf *msg);
  167. int wps_build_registrar_nonce(struct wps_data *wps, struct wpabuf *msg);
  168. int wps_build_auth_type_flags(struct wps_data *wps, struct wpabuf *msg);
  169. int wps_build_encr_type_flags(struct wps_data *wps, struct wpabuf *msg);
  170. int wps_build_conn_type_flags(struct wps_data *wps, struct wpabuf *msg);
  171. int wps_build_assoc_state(struct wps_data *wps, struct wpabuf *msg);
  172. int wps_process_cred(struct wps_parse_attr *attr,
  173. struct wps_credential *cred);
  174. int wps_process_ap_settings(struct wps_parse_attr *attr,
  175. struct wps_credential *cred);
  176. /* wps_enrollee.c */
  177. struct wpabuf * wps_enrollee_get_msg(struct wps_data *wps, u8 *op_code);
  178. enum wps_process_res wps_enrollee_process_msg(struct wps_data *wps, u8 op_code,
  179. const struct wpabuf *msg);
  180. /* wps_registrar.c */
  181. struct wpabuf * wps_registrar_get_msg(struct wps_data *wps, u8 *op_code);
  182. enum wps_process_res wps_registrar_process_msg(struct wps_data *wps,
  183. u8 op_code,
  184. const struct wpabuf *msg);
  185. #endif /* WPS_I_H */