Skip to content

Commit

Permalink
Implement all network keys from wpa_supplicant
Browse files Browse the repository at this point in the history
  • Loading branch information
ConnorRigby committed May 9, 2019
1 parent b3ffddd commit c46f764
Show file tree
Hide file tree
Showing 3 changed files with 808 additions and 50 deletions.
45 changes: 43 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -185,13 +185,19 @@ WiFi configuration looks like this:

The `:ipv4` key is the same as in Wired Ethernet and only DHCP is currently supported.

The `:wifi` key has the following fields:
The `:wifi` key has the following common fields:

* `:key_mgmt` - WiFi security mode (`:wpa_psk` for WPA2, `:none` for no password)
* `:mode` - Only `:client` mode is supported
* `:mode` -
* `:client` (default) - Normal operation. Associate with an AP
* `:adhoc` - peer to peer mode
* `:host` - access point mode
* `:psk` - A WPA2 passphrase or the raw PSK. If a passphrase is passed in, it will be converted to a PSK and disgarded.
* `:ssid` - The SSID for the network

See the [official docs](https://w1.fi/cgit/hostap/plain/wpa_supplicant/wpa_supplicant.conf) for
the complete list of options.

Here's an example:

```elixir
Expand All @@ -207,6 +213,41 @@ iex> VintageNet.configure("wlan0", %{
})
```

Example of WEP:

```elixir
iex> VintageNet.configure("wlan0", %{
type: VintageNet.Technology.WiFi,
wifi: %{
ssid: "my_network_ssid",
wep_key0: "42FEEDDEAFBABEDEAFBEEFAA55",
key_mgmt: :none,
wep_tx_keyidx: 0
},
ipv4: %{method: :dhcp}
})
```

Example of WPA-EAP:

```elixir
iex> VintageNet.configure("wlan0", %{
type: VintageNet.Technology.WiFi,
wifi: %{
ipv4: %{method: :dhcp},
ssid: "testing",
key_mgmt: :wpa_eap,
scan_ssid: 1,
pairwise: "CCMP TKIP",
group: "CCMP TKIP",
eap: "PEAP",
identity: "user1",
password: "supersecret",
phase1: "peapver=auto",
phase2: "MSCHAPV2"
},
ipv4: %{method: :dhcp}
})
### LTE

```elixir
Expand Down
192 changes: 164 additions & 28 deletions lib/vintage_net/technology/wifi.ex
Original file line number Diff line number Diff line change
Expand Up @@ -104,46 +104,94 @@ defmodule VintageNet.Technology.WiFi do
|> IO.iodata_to_binary()
end

defp key_mgmt_to_string(key) when key in [:none, :wep], do: "NONE"
defp key_mgmt_to_string(:none), do: "NONE"
defp key_mgmt_to_string(:wpa_psk), do: "WPA-PSK"
defp key_mgmt_to_string(:wpa_eap), do: "WPA-EAP"
defp key_mgmt_to_string(:IEEE8021X), do: "IEEE8021X"
# This is to allow passing multi mgmts
defp key_mgmt_to_string(string) when is_binary(string), do: string

defp mode_to_string(:client), do: "0"
defp mode_to_string(:adhoc), do: "1"
defp mode_to_string(:host), do: "2"
# In case the user supplies data as the integer type
defp mode_to_string(mode) when is_integer(mode), do: mode

defp into_wifi_network_config(%{networks: networks}) do
Enum.map(networks, &into_wifi_network_config/1)
end

defp into_wifi_network_config(%{key_mgmt: :wep} = wifi) do
network_config([
into_config_string(wifi, :ssid),
"key_mgmt=NONE",
"wep_tx_keyidx=0",
"wep_key0=#{wifi.psk}"
])
end

defp into_wifi_network_config(%{key_mgmt: :wpa_eap} = wifi) do
defp into_wifi_network_config(wifi) do
network_config([
# Common settings
into_config_string(wifi, :ssid),
into_config_string(wifi, :bssid),
into_config_string(wifi, :key_mgmt),
into_config_string(wifi, :scan_ssid),
into_config_string(wifi, :priority),
into_config_string(wifi, :bssid_whitelist),
into_config_string(wifi, :bssid_blacklist),
into_config_string(wifi, :wps_disabled),
into_config_string(wifi, :mode),
into_config_string(wifi, :ap_scan),

# WPA-PSK settings
into_config_string(wifi, :psk),
into_config_string(wifi, :wpa_ptk_rekey),

# MACSEC settings
into_config_string(wifi, :macsec_policy),
into_config_string(wifi, :macsec_integ_only),
into_config_string(wifi, :macsec_replay_protect),
into_config_string(wifi, :macsec_replay_window),
into_config_string(wifi, :macsec_port),
into_config_string(wifi, :mka_cak),
into_config_string(wifi, :mka_ckn),
into_config_string(wifi, :mka_priority),

# EAP settings
into_config_string(wifi, :identity),
into_config_string(wifi, :anonymous_identity),
into_config_string(wifi, :password),
into_config_string(wifi, :pairwise),
into_config_string(wifi, :group),
into_config_string(wifi, :group_mgmt),
into_config_string(wifi, :eap),
into_config_string(wifi, :identity),
into_config_string(wifi, :password),
into_config_string(wifi, :eapol_flags),
into_config_string(wifi, :phase1),
into_config_string(wifi, :phase2)
])
end

defp into_wifi_network_config(wifi) do
network_config([
into_config_string(wifi, :ssid),
into_config_string(wifi, :psk),
into_config_string(wifi, :key_mgmt),
into_config_string(wifi, :scan_ssid),
into_config_string(wifi, :priority)
into_config_string(wifi, :phase2),
into_config_string(wifi, :fragment_size),
into_config_string(wifi, :ocsp),
into_config_string(wifi, :openssl_ciphers),
into_config_string(wifi, :erp),

# TODO:
# These parts are files.
# They should probably be added to the `files` part
# of raw_config
into_config_string(wifi, :ca_cert),
into_config_string(wifi, :ca_cert2),
into_config_string(wifi, :dh_file),
into_config_string(wifi, :dh_file2),
into_config_string(wifi, :client_cert),
into_config_string(wifi, :client_cert2),
into_config_string(wifi, :private_key),
into_config_string(wifi, :private_key2),
into_config_string(wifi, :private_key_passwd),
into_config_string(wifi, :private_key2_passwd),
into_config_string(wifi, :pac_file),

# WEP Settings
into_config_string(wifi, :auth_alg),
into_config_string(wifi, :wep_key0),
into_config_string(wifi, :wep_key1),
into_config_string(wifi, :wep_key2),
into_config_string(wifi, :wep_key3),
into_config_string(wifi, :wep_tx_keyidx),

# SIM Settings
into_config_string(wifi, :pin),
into_config_string(wifi, :pcsc)
])
end

Expand All @@ -158,15 +206,27 @@ defmodule VintageNet.Technology.WiFi do
"ssid=#{inspect(ssid)}"
end

defp wifi_opt_to_config_string(_wifi, :bssid, bssid) do
"bssid=#{bssid}"
end

defp wifi_opt_to_config_string(wifi, :psk, psk) do
{:ok, real_psk} = WPA2.to_psk(wifi.ssid, psk)
"psk=#{real_psk}"
end

defp wifi_opt_to_config_string(_wifi, :wpa_ptk_rekey, wpa_ptk_rekey) do
"wpa_ptk_rekey=#{wpa_ptk_rekey}"
end

defp wifi_opt_to_config_string(_wifi, :key_mgmt, key_mgmt) do
"key_mgmt=#{key_mgmt_to_string(key_mgmt)}"
end

defp wifi_opt_to_config_string(_wifi, :mode, mode) do
"mode=#{mode_to_string(mode)}"
end

defp wifi_opt_to_config_string(_wifi, :scan_ssid, value) do
"scan_ssid=#{value}"
end
Expand All @@ -176,19 +236,23 @@ defmodule VintageNet.Technology.WiFi do
end

defp wifi_opt_to_config_string(_wifi, :identity, value) do
"identity=#{value}"
"identity=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :anonymous_identity, value) do
"anonymous_identity=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :password, value) do
"password=#{value}"
"password=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :phase1, value) do
"phase1=#{value}"
"phase1=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :phase2, value) do
"phase2=#{value}"
"phase2=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :pairwise, value) do
Expand All @@ -203,6 +267,78 @@ defmodule VintageNet.Technology.WiFi do
"eap=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :eapol_flags, value) do
"eapol_flags=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :ca_cert, value) do
"ca_cert=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :ca_cert2, value) do
"ca_cert2=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :client_cert, value) do
"client_cert=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :client_cert2, value) do
"client_cert2=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :private_key, value) do
"private_key=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :private_key2, value) do
"private_key2=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :private_key_passwd, value) do
"private_key_passwd=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :private_key2_passwd, value) do
"private_key2_passwd=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :pin, value) do
"pin=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :wep_tx_keyidx, value) do
"wep_tx_keyidx=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :wep_key0, value) do
"wep_key0=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :wep_key1, value) do
"wep_key1=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :wep_key2, value) do
"wep_key2=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :wep_key3, value) do
"wep_key3=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :pcsc, value) do
"pcsc=#{inspect(value)}"
end

defp wifi_opt_to_config_string(_wifi, :bssid_blacklist, value) do
"bssid_blacklist=#{value}"
end

defp wifi_opt_to_config_string(_wifi, :bssid_whitelist, value) do
"bssid_whitelist=#{value}"
end

# TODO: Remove duplication with ethernet!!
defp dhcp_options(hostname) do
"""
Expand Down
Loading

0 comments on commit c46f764

Please sign in to comment.