diff options
author | Eric Kuck <eric@bluelinelabs.com> | 2018-12-20 22:52:45 -0600 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2018-12-21 16:42:16 +0100 |
commit | 8553723e04c4d63b99e669df2e43fc4a914b7f9d (patch) | |
tree | e3b7b25777e47455a787fa590cf00d1c25cbdc5d /WireGuard/Shared/Model/PeerConfiguration.swift | |
parent | NE: simplify logic (diff) | |
download | wireguard-apple-8553723e04c4d63b99e669df2e43fc4a914b7f9d.tar.xz wireguard-apple-8553723e04c4d63b99e669df2e43fc4a914b7f9d.zip |
Updated NETunnelProvider save format
Signed-off-by: Eric Kuck <eric@bluelinelabs.com>
Diffstat (limited to 'WireGuard/Shared/Model/PeerConfiguration.swift')
-rw-r--r-- | WireGuard/Shared/Model/PeerConfiguration.swift | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/WireGuard/Shared/Model/PeerConfiguration.swift b/WireGuard/Shared/Model/PeerConfiguration.swift new file mode 100644 index 0000000..0fad842 --- /dev/null +++ b/WireGuard/Shared/Model/PeerConfiguration.swift @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +import Foundation + +struct PeerConfiguration { + var publicKey: Data + var preSharedKey: Data? { + didSet(value) { + if let value = value { + if value.count != TunnelConfiguration.keyLength { + fatalError("Invalid preshared key") + } + } + } + } + var allowedIPs = [IPAddressRange]() + var endpoint: Endpoint? + var persistentKeepAlive: UInt16? + + init(publicKey: Data) { + self.publicKey = publicKey + if publicKey.count != TunnelConfiguration.keyLength { + fatalError("Invalid public key") + } + } +} + +extension PeerConfiguration: Codable { + enum CodingKeys: String, CodingKey { + case publicKey = "PublicKey" + case preSharedKey = "PreSharedKey" + case allowedIPs = "AllowedIPs" + case endpoint = "Endpoint" + case persistentKeepAlive = "PersistentKeepAlive" + } + + init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + publicKey = try Data(base64Encoded: values.decode(String.self, forKey: .publicKey))! + if let base64PreSharedKey = try? values.decode(Data.self, forKey: .preSharedKey) { + preSharedKey = Data(base64Encoded: base64PreSharedKey) + } else { + preSharedKey = nil + } + allowedIPs = try values.decode([IPAddressRange].self, forKey: .allowedIPs) + endpoint = try? values.decode(Endpoint.self, forKey: .endpoint) + persistentKeepAlive = try? values.decode(UInt16.self, forKey: .persistentKeepAlive) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(publicKey.base64EncodedString(), forKey: .publicKey) + if let preSharedKey = preSharedKey { + try container.encode(preSharedKey.base64EncodedString(), forKey: .preSharedKey) + } + + try container.encode(allowedIPs, forKey: .allowedIPs) + if let endpoint = endpoint { + try container.encode(endpoint, forKey: .endpoint) + } + if let persistentKeepAlive = persistentKeepAlive { + try container.encode(persistentKeepAlive, forKey: .persistentKeepAlive) + } + } +} |