From cef3957875230874e5c45442b01ca295d373ac41 Mon Sep 17 00:00:00 2001 From: Roopesh Chander Date: Tue, 9 Apr 2019 11:11:28 +0530 Subject: Swift 5 migration: Handle changes in Data's pointer interface Signed-off-by: Roopesh Chander --- WireGuard/Shared/Model/Data+KeyEncoding.swift | 38 +++++++++++++++++++++---- WireGuard/WireGuard/Crypto/Curve25519.swift | 6 ++-- WireGuard/WireGuard/Tunnel/TunnelsManager.swift | 2 +- WireGuard/WireGuard/ZipArchive/ZipArchive.swift | 2 +- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/WireGuard/Shared/Model/Data+KeyEncoding.swift b/WireGuard/Shared/Model/Data+KeyEncoding.swift index a1abdd7..5c7aee9 100644 --- a/WireGuard/Shared/Model/Data+KeyEncoding.swift +++ b/WireGuard/Shared/Model/Data+KeyEncoding.swift @@ -13,8 +13,8 @@ extension Data { return nil } var out = Data(repeating: 0, count: Int(WG_KEY_LEN_HEX)) - out.withUnsafeMutableBytes { outBytes in - self.withUnsafeBytes { inBytes in + out.withUnsafeMutableInt8Bytes { outBytes in + self.withUnsafeUInt8Bytes { inBytes in key_to_hex(outBytes, inBytes) } } @@ -25,7 +25,7 @@ extension Data { init?(hexKey hexString: String) { self.init(repeating: 0, count: Int(WG_KEY_LEN)) - if !self.withUnsafeMutableBytes { key_from_hex($0, hexString) } { + if !self.withUnsafeMutableUInt8Bytes { key_from_hex($0, hexString) } { return nil } } @@ -35,8 +35,8 @@ extension Data { return nil } var out = Data(repeating: 0, count: Int(WG_KEY_LEN_BASE64)) - out.withUnsafeMutableBytes { outBytes in - self.withUnsafeBytes { inBytes in + out.withUnsafeMutableInt8Bytes { outBytes in + self.withUnsafeUInt8Bytes { inBytes in key_to_base64(outBytes, inBytes) } } @@ -47,8 +47,34 @@ extension Data { init?(base64Key base64String: String) { self.init(repeating: 0, count: Int(WG_KEY_LEN)) - if !self.withUnsafeMutableBytes { key_from_base64($0, base64String) } { + if !self.withUnsafeMutableUInt8Bytes { key_from_base64($0, base64String) } { return nil } } } + +extension Data { + func withUnsafeUInt8Bytes(_ body: (UnsafePointer) -> R) -> R { + assert(!isEmpty) + return self.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> R in + let bytes = ptr.bindMemory(to: UInt8.self) + return body(bytes.baseAddress!) // might crash if self.count == 0 + } + } + + mutating func withUnsafeMutableUInt8Bytes(_ body: (UnsafeMutablePointer) -> R) -> R { + assert(!isEmpty) + return self.withUnsafeMutableBytes { (ptr: UnsafeMutableRawBufferPointer) -> R in + let bytes = ptr.bindMemory(to: UInt8.self) + return body(bytes.baseAddress!) // might crash if self.count == 0 + } + } + + mutating func withUnsafeMutableInt8Bytes(_ body: (UnsafeMutablePointer) -> R) -> R { + assert(!isEmpty) + return self.withUnsafeMutableBytes { (ptr: UnsafeMutableRawBufferPointer) -> R in + let bytes = ptr.bindMemory(to: Int8.self) + return body(bytes.baseAddress!) // might crash if self.count == 0 + } + } +} diff --git a/WireGuard/WireGuard/Crypto/Curve25519.swift b/WireGuard/WireGuard/Crypto/Curve25519.swift index d498a64..602cd2d 100644 --- a/WireGuard/WireGuard/Crypto/Curve25519.swift +++ b/WireGuard/WireGuard/Crypto/Curve25519.swift @@ -9,7 +9,7 @@ struct Curve25519 { static func generatePrivateKey() -> Data { var privateKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) - privateKey.withUnsafeMutableBytes { bytes in + privateKey.withUnsafeMutableUInt8Bytes { bytes in curve25519_generate_private_key(bytes) } assert(privateKey.count == TunnelConfiguration.keyLength) @@ -19,8 +19,8 @@ struct Curve25519 { static func generatePublicKey(fromPrivateKey privateKey: Data) -> Data { assert(privateKey.count == TunnelConfiguration.keyLength) var publicKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) - privateKey.withUnsafeBytes { privateKeyBytes in - publicKey.withUnsafeMutableBytes { bytes in + privateKey.withUnsafeUInt8Bytes { privateKeyBytes in + publicKey.withUnsafeMutableUInt8Bytes { bytes in curve25519_derive_public_key(bytes, privateKeyBytes) } } diff --git a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift index b0bf0cb..ce8008c 100644 --- a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift +++ b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift @@ -486,7 +486,7 @@ class TunnelContainer: NSObject { completionHandler(tunnelConfiguration) return } - guard nil != (try? session.sendProviderMessage(Data(bytes: [ 0 ]), responseHandler: { + guard nil != (try? session.sendProviderMessage(Data([ UInt8(0) ]), responseHandler: { guard self.status != .inactive, let data = $0, let base = self.tunnelConfiguration, let settings = String(data: data, encoding: .utf8) else { completionHandler(self.tunnelConfiguration) return diff --git a/WireGuard/WireGuard/ZipArchive/ZipArchive.swift b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift index 2cca880..85623da 100644 --- a/WireGuard/WireGuard/ZipArchive/ZipArchive.swift +++ b/WireGuard/WireGuard/ZipArchive/ZipArchive.swift @@ -31,7 +31,7 @@ class ZipArchive { let fileName = input.fileName let contents = input.contents zipOpenNewFileInZip(zipFile, fileName.cString(using: .utf8), nil, nil, 0, nil, 0, nil, Z_DEFLATED, Z_DEFAULT_COMPRESSION) - contents.withUnsafeBytes { (ptr: UnsafePointer) -> Void in + contents.withUnsafeUInt8Bytes { ptr -> Void in zipWriteInFileInZip(zipFile, UnsafeRawPointer(ptr), UInt32(contents.count)) } zipCloseFileInZip(zipFile) -- cgit v1.2.3-59-g8ed1b