Swift 5 migration: Handle changes in Data's pointer interface

This commit is contained in:
Roopesh Chander 2019-04-09 11:11:28 +05:30
parent 283462dc9b
commit 43024dfcbb
4 changed files with 37 additions and 11 deletions

View File

@ -13,8 +13,8 @@ extension Data {
return nil return nil
} }
var out = Data(repeating: 0, count: Int(WG_KEY_LEN_HEX)) var out = Data(repeating: 0, count: Int(WG_KEY_LEN_HEX))
out.withUnsafeMutableBytes { outBytes in out.withUnsafeMutableInt8Bytes { outBytes in
self.withUnsafeBytes { inBytes in self.withUnsafeUInt8Bytes { inBytes in
key_to_hex(outBytes, inBytes) key_to_hex(outBytes, inBytes)
} }
} }
@ -25,7 +25,7 @@ extension Data {
init?(hexKey hexString: String) { init?(hexKey hexString: String) {
self.init(repeating: 0, count: Int(WG_KEY_LEN)) 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 return nil
} }
} }
@ -35,8 +35,8 @@ extension Data {
return nil return nil
} }
var out = Data(repeating: 0, count: Int(WG_KEY_LEN_BASE64)) var out = Data(repeating: 0, count: Int(WG_KEY_LEN_BASE64))
out.withUnsafeMutableBytes { outBytes in out.withUnsafeMutableInt8Bytes { outBytes in
self.withUnsafeBytes { inBytes in self.withUnsafeUInt8Bytes { inBytes in
key_to_base64(outBytes, inBytes) key_to_base64(outBytes, inBytes)
} }
} }
@ -47,8 +47,34 @@ extension Data {
init?(base64Key base64String: String) { init?(base64Key base64String: String) {
self.init(repeating: 0, count: Int(WG_KEY_LEN)) 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 return nil
} }
} }
} }
extension Data {
func withUnsafeUInt8Bytes<R>(_ body: (UnsafePointer<UInt8>) -> 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<R>(_ body: (UnsafeMutablePointer<UInt8>) -> 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<R>(_ body: (UnsafeMutablePointer<Int8>) -> 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
}
}
}

View File

@ -9,7 +9,7 @@ struct Curve25519 {
static func generatePrivateKey() -> Data { static func generatePrivateKey() -> Data {
var privateKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) var privateKey = Data(repeating: 0, count: TunnelConfiguration.keyLength)
privateKey.withUnsafeMutableBytes { bytes in privateKey.withUnsafeMutableUInt8Bytes { bytes in
curve25519_generate_private_key(bytes) curve25519_generate_private_key(bytes)
} }
assert(privateKey.count == TunnelConfiguration.keyLength) assert(privateKey.count == TunnelConfiguration.keyLength)
@ -19,8 +19,8 @@ struct Curve25519 {
static func generatePublicKey(fromPrivateKey privateKey: Data) -> Data { static func generatePublicKey(fromPrivateKey privateKey: Data) -> Data {
assert(privateKey.count == TunnelConfiguration.keyLength) assert(privateKey.count == TunnelConfiguration.keyLength)
var publicKey = Data(repeating: 0, count: TunnelConfiguration.keyLength) var publicKey = Data(repeating: 0, count: TunnelConfiguration.keyLength)
privateKey.withUnsafeBytes { privateKeyBytes in privateKey.withUnsafeUInt8Bytes { privateKeyBytes in
publicKey.withUnsafeMutableBytes { bytes in publicKey.withUnsafeMutableUInt8Bytes { bytes in
curve25519_derive_public_key(bytes, privateKeyBytes) curve25519_derive_public_key(bytes, privateKeyBytes)
} }
} }

View File

@ -486,7 +486,7 @@ class TunnelContainer: NSObject {
completionHandler(tunnelConfiguration) completionHandler(tunnelConfiguration)
return 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 { guard self.status != .inactive, let data = $0, let base = self.tunnelConfiguration, let settings = String(data: data, encoding: .utf8) else {
completionHandler(self.tunnelConfiguration) completionHandler(self.tunnelConfiguration)
return return

View File

@ -31,7 +31,7 @@ class ZipArchive {
let fileName = input.fileName let fileName = input.fileName
let contents = input.contents let contents = input.contents
zipOpenNewFileInZip(zipFile, fileName.cString(using: .utf8), nil, nil, 0, nil, 0, nil, Z_DEFLATED, Z_DEFAULT_COMPRESSION) zipOpenNewFileInZip(zipFile, fileName.cString(using: .utf8), nil, nil, 0, nil, 0, nil, Z_DEFLATED, Z_DEFAULT_COMPRESSION)
contents.withUnsafeBytes { (ptr: UnsafePointer<UInt8>) -> Void in contents.withUnsafeUInt8Bytes { ptr -> Void in
zipWriteInFileInZip(zipFile, UnsafeRawPointer(ptr), UInt32(contents.count)) zipWriteInFileInZip(zipFile, UnsafeRawPointer(ptr), UInt32(contents.count))
} }
zipCloseFileInZip(zipFile) zipCloseFileInZip(zipFile)