mobile_nebula/ios/NebulaNetworkExtension/Keychain.swift

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

71 lines
1.8 KiB
Swift
Raw Normal View History

2020-07-27 20:43:58 +00:00
import Foundation
let groupName = "group.net.defined.mobileNebula"
class KeyChain {
class func save(key: String, data: Data, managed: Bool) -> Bool {
var query: [String: Any] = [
2020-07-27 20:43:58 +00:00
kSecClass as String: kSecClassGenericPassword as String,
kSecAttrAccount as String: key,
kSecValueData as String: data,
kSecAttrAccessGroup as String: groupName,
]
if managed {
query[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock
2020-07-27 20:43:58 +00:00
}
// Attempt to delete an existing key to allow for an overwrite
_ = self.delete(key: key)
return SecItemAdd(query as CFDictionary, nil) == 0
}
2020-07-27 20:43:58 +00:00
class func load(key: String) -> Data? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne,
kSecAttrAccessGroup as String: groupName,
]
2020-07-27 20:43:58 +00:00
var dataTypeRef: AnyObject? = nil
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
2020-07-27 20:43:58 +00:00
if status == noErr {
return dataTypeRef as! Data?
} else {
return nil
}
}
2020-07-27 20:43:58 +00:00
class func delete(key: String) -> Bool {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword as String,
kSecAttrAccount as String: key,
kSecAttrAccessGroup as String: groupName,
]
2020-07-27 20:43:58 +00:00
return SecItemDelete(query as CFDictionary) == 0
}
2020-07-27 20:43:58 +00:00
}
extension Data {
init<T>(from value: T) {
var value = value
var data = Data()
withUnsafePointer(
to: &value,
{ (ptr: UnsafePointer<T>) -> Void in
data = Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
})
self.init(data)
}
func to<T>(type: T.Type) -> T {
return self.withUnsafeBytes { $0.load(as: T.self) }
}
}