To do:
- hostap: try other roaming modes
  NOTE: current mode (manual roaming) does not really roam at all..
  Firmware did not notice the current AP disappearing..
- add support for WPA with ap_scan=0 (update selected cipher etc. based on
  AssocInfo; make sure these match with configuration)
- optional security separation (build time option): run EAPOL state machines
  as non-root (need to add something like socketpair between privileged root
  process and non-root handler; send EAPOL packets between processes
  and send keying data from non-root -> privileged)
  EAPOL-Key processing (WPA & WEP keys) could be in privileged part
  at least in the beginning; some parts might end up being moved to
  non-root part eventually
- consider closing smart card / PCSC connection when EAP-SIM/EAP-AKA
  authentication has been completed (cache scard data based on serial#(?)
  and try to optimize next connection if the same card is present for next
  auth)
- EAP-AKA: AT_CHECKCODE
- EAP-SIM/AKA: AT_RESULT_IND
- on disconnect event, could try to associate with another AP if one is
  present in scan results; would need to update scan results periodically..
- if driver/hw is not WPA2 capable, must remove WPA_PROTO_RSN flag from
  ssid->proto fields to avoid detecting downgrade attacks when the driver
  is not reporting RSN IE, but msg 3/4 has one
- Cisco AP and non-zero keyidx for unicast -> map to broadcast
  (actually, this already works with driver_ndis; so maybe just change
  driver_*.c to do the mapping for drivers that cannot handle non-zero keyidx
  for unicast); worked also with Host AP driver and madwifi
- IEEE 802.1X and key update with driver_ndis?? wpa_supplicant did not seem
  to see unencrypted EAPOL-Key frames at all..
- EAP-PAX with PAX_SEC
- EAP (RFC 3748)
  * OTP Extended Responses (Sect. 5.5)
- test what happens if authenticator sends EAP-Success before real EAP
  authentication ("canned" Success); this should be ignored based on
  RFC 3748 Sect. 4.2
- test compilation with gcc -W options (more warnings?)
  (Done once; number of unused function arguments still present)
- add proper support for using dot11RSNAConfigSATimeout
- ctrl_iface: get/set/remove blob
- use doc/docbook/*.sgml and docbook2{txt,html,pdf} to replace README and
  web pages including the same information.. i.e., have this information only
  in one page; how to build a PDF file with all the SGML included?
- test wait-for-interface and daemonize combinations with number of driver
  interfaces
  * 'test' worked with WPA-PSK
- EAP-POTP/RSA SecurID profile (draft-nystrom-eap-potp-03.txt)
- document wpa_gui build and consider adding it to 'make install'
- test madwifi with pairwise=TKIP group=WEP104
- possibility to link in WPA Authenticator state machine to wpa_supplicant
  (new STAKey handshake, WPA2 IBSS)
- consider merging hostapd and wpa_supplicant PMKSA cache implementations
- add support for configuring password for MSCHAPv2 as NtPasswordHash in
  the same way as was added to hostapd (hash:<hex value>)
- test_driver: configure directory and create AP-<mac> and STA-<mac> files
  there to allow scanning multiple APs (e.g., for testing pre-auth and PMKSA
  caching testing) and to exchange STA-STA EAPOL frames
- consider adding generic buffer functionality that could be used in number
  of places
  * allocate buffer (with default max size), allow reserving head room to
    make it possible to add a header without having to reallocate buffer
  * reallocate buffer (add head and/or tail room)
  * ref count and free when count=0 ?
  * add data (to tail): re-alloc more tailroom if needed and copy new data
  * error flag so that caller can do multiple add()s and only in the end
    check whether something has failed; this should make error handling
    simpler
- consider redesigning pending EAP requests (identity/password/otp from
  ctrl_iface) by moving the retrying of the previous request into EAP
  state machine so that EAPOL state machine is not needed for this
- rfc4284.txt (network selection for eap)
- www pages about configuring wpa_supplicant:
  * global options (ap_scan, ctrl_interfaces) based on OS/driver
  * network block
  * key_mgmt selection
  * WPA parameters
  * EAP options (one page for each method)
  * "configuration wizard" (step 1: select OS, step 2: select driver, ...) to
    generate example configuration
- error path in rsn_preauth_init: should probably deinit l2_packet handlers
  if something fails; does something else need deinit?
- consider moving SIM card functionality (IMSI fetching) away from eap.c;
  this should likely happen before EAP is initialized for authentication;
  now IMSI is read only after receiving EAP-Identity/Request, but since it is
  really needed for all cases, reading IMSI and generating Identity string
  could very well be done before EAP has been started
- test all allowed EAP Phase 2 methods (i.e., anything else than PEAP, TTLS,
  FAST): SIM AKA PAX PSK LEAP; if these work, include in eap_testing.txt; if
  not, either fix or make eap_allowed_phase2_type reject
- try to work around race in receiving association event and first EAPOL
  message
- helper function to do memcmp(addr, "\x00\x00\x00\x00\x00\x00", ETH_ALEN)
- add wpa_secure_memzero() macro and secure implementation (volatile u8*) to
  clear memory; this would be used to clear temporary buffers containing
  private data (e.g., keys); the macro can be defined to NOP in order to save
  space (i.e., no code should depend on the macro doing something)
- make sure that TLS session cache is not shared between EAP types or if it
  is, that the cache entries are bound to only one EAP type; e.g., cache entry
  created with EAP-TLS must not be allowed to do fast re-auth with EAP-TTLS
- consider moving eap_tls_build_ack() call into eap_tls_process_helper()
  (it seems to be called always if helper returns 1)
  * could need to modify eap_{ttls,peap,fast}_decrypt to do same
- add support for fetching full user cert chain from Windows certificate
  stores even when there are intermediate CA certs that are not in the
  configured ca_cert store (e.g., ROOT) (they could be, e.g., in CA store)


0.6.x branch:
- clean up common.[ch]
- change TLS/crypto library interface to use a structure of function
  pointers and helper inline functions (like driver_ops) instead of
  requiring every TLS wrapper to implement all functions
- move from CVS to git (0.3.x, 0.4.x, 0.5.x releases will continue
  to be updated only on CVS)
- move files into subdirectories and combine wpa_supplicant and hostapd
  into a repository that matches in directory structure with the release
  tarballs
  (subdirs: eap_common, eap_peer, eap_server, driver, driver_ap, ...)
- make it clearer that EAP server/peer can be used as a separate library
  for other programs
- add support for encrypted configuration fields (e.g., password, psk,
  passphrase, pin)
- wpa_gui: add support for setting and showing priority, id_str, auth_alg
  (open/shared for static WEP)
