diff --git a/WireGuard/Shared/Model/Configuration.swift b/WireGuard/Shared/Model/Configuration.swift index 41ff7bc..d2680cb 100644 --- a/WireGuard/Shared/Model/Configuration.swift +++ b/WireGuard/Shared/Model/Configuration.swift @@ -7,6 +7,9 @@ import Foundation final class TunnelConfiguration: Codable { var interface: InterfaceConfiguration let peers: [PeerConfiguration] + + static let keyLength: Int = 32 + init(interface: InterfaceConfiguration, peers: [PeerConfiguration]) { self.interface = interface self.peers = peers @@ -32,7 +35,7 @@ struct InterfaceConfiguration: Codable { self.name = name self.privateKey = privateKey if (name.isEmpty) { fatalError("Empty name") } - if (privateKey.count != 32) { fatalError("Invalid private key") } + if (privateKey.count != TunnelConfiguration.keyLength) { fatalError("Invalid private key") } } } @@ -42,7 +45,7 @@ struct PeerConfiguration: Codable { var preSharedKey: Data? { didSet(value) { if let value = value { - if (value.count != 32) { fatalError("Invalid preshared key") } + if (value.count != TunnelConfiguration.keyLength) { fatalError("Invalid preshared key") } } } } @@ -52,6 +55,6 @@ struct PeerConfiguration: Codable { init(publicKey: Data) { self.publicKey = publicKey - if (publicKey.count != 32) { fatalError("Invalid public key") } + if (publicKey.count != TunnelConfiguration.keyLength) { fatalError("Invalid public key") } } } diff --git a/WireGuard/WireGuard/ConfigFile/WgQuickConfigFileParser.swift b/WireGuard/WireGuard/ConfigFile/WgQuickConfigFileParser.swift index af3baf0..4cba816 100644 --- a/WireGuard/WireGuard/ConfigFile/WgQuickConfigFileParser.swift +++ b/WireGuard/WireGuard/ConfigFile/WgQuickConfigFileParser.swift @@ -27,7 +27,7 @@ class WgQuickConfigFileParser { func collate(interfaceAttributes attributes: [String: String]) -> InterfaceConfiguration? { // required wg fields guard let privateKeyString = attributes["privatekey"] else { return nil } - guard let privateKey = Data(base64Encoded: privateKeyString), privateKey.count == 32 else { return nil } + guard let privateKey = Data(base64Encoded: privateKeyString), privateKey.count == TunnelConfiguration.keyLength else { return nil } var interface = InterfaceConfiguration(name: name, privateKey: privateKey) // other wg fields if let listenPortString = attributes["listenport"] { @@ -63,11 +63,11 @@ class WgQuickConfigFileParser { func collate(peerAttributes attributes: [String: String]) -> PeerConfiguration? { // required wg fields guard let publicKeyString = attributes["publickey"] else { return nil } - guard let publicKey = Data(base64Encoded: publicKeyString), publicKey.count == 32 else { return nil } + guard let publicKey = Data(base64Encoded: publicKeyString), publicKey.count == TunnelConfiguration.keyLength else { return nil } var peer = PeerConfiguration(publicKey: publicKey) // wg fields if let preSharedKeyString = attributes["presharedkey"] { - guard let preSharedKey = Data(base64Encoded: preSharedKeyString), preSharedKey.count == 32 else { return nil } + guard let preSharedKey = Data(base64Encoded: preSharedKeyString), preSharedKey.count == TunnelConfiguration.keyLength else { return nil } peer.preSharedKey = preSharedKey } if let allowedIPsString = attributes["allowedips"] { diff --git a/WireGuard/WireGuard/Crypto/Curve25519.swift b/WireGuard/WireGuard/Crypto/Curve25519.swift index 84c35d3..43d9b00 100644 --- a/WireGuard/WireGuard/Crypto/Curve25519.swift +++ b/WireGuard/WireGuard/Crypto/Curve25519.swift @@ -4,24 +4,27 @@ import UIKit struct Curve25519 { + + static let keyLength: Int = 32 + static func generatePrivateKey() -> Data { - var privateKey = Data(repeating: 0, count: 32) + var privateKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) privateKey.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) in curve25519_generate_private_key(bytes) } - assert(privateKey.count == 32) + assert(privateKey.count == TunnelConfiguration.keyLength) return privateKey } static func generatePublicKey(fromPrivateKey privateKey: Data) -> Data { - assert(privateKey.count == 32) - var publicKey = Data(repeating: 0, count: 32) + assert(privateKey.count == TunnelConfiguration.keyLength) + var publicKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) privateKey.withUnsafeBytes { (privateKeyBytes: UnsafePointer) in publicKey.withUnsafeMutableBytes { (bytes: UnsafeMutablePointer) in curve25519_derive_public_key(bytes, privateKeyBytes) } } - assert(publicKey.count == 32) + assert(publicKey.count == TunnelConfiguration.keyLength) return publicKey } } diff --git a/WireGuard/WireGuard/UI/TunnelViewModel.swift b/WireGuard/WireGuard/UI/TunnelViewModel.swift index de14ad5..92a1a64 100644 --- a/WireGuard/WireGuard/UI/TunnelViewModel.swift +++ b/WireGuard/WireGuard/UI/TunnelViewModel.swift @@ -65,7 +65,7 @@ class TunnelViewModel { if (field == .privateKey) { if (stringValue.count == TunnelViewModel.keyLengthInBase64), let privateKey = Data(base64Encoded: stringValue), - privateKey.count == 32 { + privateKey.count == TunnelConfiguration.keyLength { let publicKey = Curve25519.generatePublicKey(fromPrivateKey: privateKey) scratchpad[.publicKey] = publicKey.base64EncodedString() } else { @@ -109,7 +109,7 @@ class TunnelViewModel { fieldsWithError.insert(.privateKey) return .error("Interface's private key is required") } - guard let privateKey = Data(base64Encoded: privateKeyString), privateKey.count == 32 else { + guard let privateKey = Data(base64Encoded: privateKeyString), privateKey.count == TunnelConfiguration.keyLength else { fieldsWithError.insert(.privateKey) return .error("Interface's private key must be a 32-byte key in base64 encoding") } @@ -247,14 +247,14 @@ class TunnelViewModel { fieldsWithError.insert(.publicKey) return .error("Peer's public key is required") } - guard let publicKey = Data(base64Encoded: publicKeyString), publicKey.count == 32 else { + guard let publicKey = Data(base64Encoded: publicKeyString), publicKey.count == TunnelConfiguration.keyLength else { fieldsWithError.insert(.publicKey) return .error("Peer's public key must be a 32-byte key in base64 encoding") } var config = PeerConfiguration(publicKey: publicKey) var errorMessages: [String] = [] if let preSharedKeyString = scratchpad[.preSharedKey] { - if let preSharedKey = Data(base64Encoded: preSharedKeyString), preSharedKey.count == 32 { + if let preSharedKey = Data(base64Encoded: preSharedKeyString), preSharedKey.count == TunnelConfiguration.keyLength { config.preSharedKey = preSharedKey } else { fieldsWithError.insert(.preSharedKey)