shill: add support for connecting to WPA-PSK networks

BUG=chromium-os:20897
TEST=unittests, some autotests (see below)

the following autotests now pass, at least in the wifi_vm_config:
- network_WiFiManager.000_SSID_Length_Limit
- network_WiFiSecMat.010CheckWPA_TKIP
- network_WiFiSecMat.011CheckWPA_AES
- network_WiFiSecMat.012CheckWPA_Multi
- network_WiFiSecMat.018CheckWPA_CounterMeasures

Change-Id: Ie7499fd87f661ceef3ef0aae348a08bd43c305f4
Reviewed-on: http://gerrit.chromium.org/gerrit/8586
Tested-by: mukesh agrawal <quiche@google.com>
Reviewed-by: Paul Stewart <pstew@chromium.org>
diff --git a/wifi_endpoint.h b/wifi_endpoint.h
index 17bf60b..c7b161c 100644
--- a/wifi_endpoint.h
+++ b/wifi_endpoint.h
@@ -6,11 +6,13 @@
 #define SHILL_WIFI_ENDPOINT_
 
 #include <map>
+#include <set>
 #include <string>
 #include <vector>
 
 #include <base/memory/ref_counted.h>
 #include <dbus-c++/dbus.h>
+#include <gtest/gtest_prod.h>  // for FRIEND_TEST
 
 #include "shill/endpoint.h"
 #include "shill/shill_event.h"
@@ -33,24 +35,34 @@
   const std::string &bssid_hex() const;
   int16_t signal_strength() const;
   const std::string &network_mode() const;
+  const std::string &security_mode() const;
 
  private:
-  static const uint32_t kSupplicantNetworkModeInfrastructureInt;
-  static const uint32_t kSupplicantNetworkModeAdHocInt;
-  static const uint32_t kSupplicantNetworkModeAccessPointInt;
+  friend class WiFiEndpointTest;
+  // these test cases need access to the KeyManagement enum
+  FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAP);
+  FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsPSK);
+  FRIEND_TEST(WiFiEndpointTest, ParseKeyManagementMethodsEAPAndPSK);
 
-  static const char kSupplicantPropertySSID[];
-  static const char kSupplicantPropertyBSSID[];
-  static const char kSupplicantPropertySignal[];
-  static const char kSupplicantPropertyMode[];
-  static const char kSupplicantNetworkModeInfrastructure[];
-  static const char kSupplicantNetworkModeAdHoc[];
-  static const char kSupplicantNetworkModeAccessPoint[];
+  enum KeyManagement {
+    kKeyManagement802_1x,
+    kKeyManagementPSK
+  };
 
   // Maps mode strings from supplicant into flimflam's nomenclature, as defined
   // in chromeos/dbus/service_constants.h
   static const char *ParseMode(const std::string &mode_string);
+  // Parses an Endpoint's properties to identify approprirate flimflam
+  // security property value, as defined in chromeos/dbus/service_constants.h
+  static const char *ParseSecurity(
+      const std::map<std::string, ::DBus::Variant> &properties);
+  // Parses and Endpoint's properties' "RSN" or "WPA" sub-dictionary, to
+  // identify supported key management methods (802.1x or PSK).
+  static void ParseKeyManagementMethods(
+      const std::map<std::string, ::DBus::Variant> &security_method_properties,
+      std::set<KeyManagement> *key_management_methods);
 
+  // TODO(quiche): make const?
   std::vector<uint8_t> ssid_;
   std::vector<uint8_t> bssid_;
   std::string ssid_string_;
@@ -58,7 +70,10 @@
   std::string bssid_string_;
   std::string bssid_hex_;
   int16_t signal_strength_;
+  // network_mode_ and security_mode_ are represented as flimflam names
+  // (not necessarily the same as wpa_supplicant names)
   std::string network_mode_;
+  std::string security_mode_;
 
   DISALLOW_COPY_AND_ASSIGN(WiFiEndpoint);
 };