aboutsummaryrefslogtreecommitdiffstats
path: root/WireGuard/Shared/Model/TunnelConfiguration.swift
diff options
context:
space:
mode:
authorEric Kuck <eric@bluelinelabs.com>2018-12-20 22:52:45 -0600
committerJason A. Donenfeld <Jason@zx2c4.com>2018-12-21 16:42:16 +0100
commit8553723e04c4d63b99e669df2e43fc4a914b7f9d (patch)
treee3b7b25777e47455a787fa590cf00d1c25cbdc5d /WireGuard/Shared/Model/TunnelConfiguration.swift
parentNE: simplify logic (diff)
downloadwireguard-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/TunnelConfiguration.swift')
-rw-r--r--WireGuard/Shared/Model/TunnelConfiguration.swift42
1 files changed, 42 insertions, 0 deletions
diff --git a/WireGuard/Shared/Model/TunnelConfiguration.swift b/WireGuard/Shared/Model/TunnelConfiguration.swift
new file mode 100644
index 0000000..87812cd
--- /dev/null
+++ b/WireGuard/Shared/Model/TunnelConfiguration.swift
@@ -0,0 +1,42 @@
+// SPDX-License-Identifier: MIT
+// Copyright © 2018 WireGuard LLC. All Rights Reserved.
+
+import Foundation
+
+final class TunnelConfiguration {
+ var interface: InterfaceConfiguration
+ let peers: [PeerConfiguration]
+
+ static let keyLength = 32
+
+ init(interface: InterfaceConfiguration, peers: [PeerConfiguration]) {
+ self.interface = interface
+ self.peers = peers
+
+ let peerPublicKeysArray = peers.map { $0.publicKey }
+ let peerPublicKeysSet = Set<Data>(peerPublicKeysArray)
+ if peerPublicKeysArray.count != peerPublicKeysSet.count {
+ fatalError("Two or more peers cannot have the same public key")
+ }
+ }
+}
+
+extension TunnelConfiguration: Codable {
+ enum CodingKeys: String, CodingKey {
+ case interface = "Interface"
+ case peers = "Peer"
+ }
+
+ convenience init(from decoder: Decoder) throws {
+ let values = try decoder.container(keyedBy: CodingKeys.self)
+ let interface = try values.decode(InterfaceConfiguration.self, forKey: .interface)
+ let peers = try values.decode([PeerConfiguration].self, forKey: .peers)
+ self.init(interface: interface, peers: peers)
+ }
+
+ func encode(to encoder: Encoder) throws {
+ var container = encoder.container(keyedBy: CodingKeys.self)
+ try container.encode(interface, forKey: .interface)
+ try container.encode(peers, forKey: .peers)
+ }
+}