mobile_nebula/ios/NebulaNetworkExtension/Keychain.swift

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

68 lines
2 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] = [
2025-02-13 22:33:07 +00:00
kSecClass as String: kSecClassGenericPassword as String,
kSecAttrAccount as String: key,
kSecValueData as String: data,
2020-07-27 20:43:58 +00:00
kSecAttrAccessGroup as String: groupName,
]
2025-02-13 22:33:07 +00:00
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
2025-02-13 22:33:07 +00:00
_ = 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] = [
2025-02-13 22:33:07 +00:00
kSecClass as String: kSecClassGenericPassword,
kSecAttrAccount as String: key,
kSecReturnData as String: kCFBooleanTrue!,
kSecMatchLimit as String: kSecMatchLimitOne,
2020-07-27 20:43:58 +00:00
kSecAttrAccessGroup as String: groupName,
]
2025-02-13 22:33:07 +00:00
var dataTypeRef: AnyObject?
2020-07-27 20:43:58 +00:00
let status: OSStatus = SecItemCopyMatching(query as CFDictionary, &dataTypeRef)
if status == noErr {
return dataTypeRef as! Data?
} else {
return nil
}
}
2025-02-13 22:33:07 +00:00
2020-07-27 20:43:58 +00:00
class func delete(key: String) -> Bool {
2025-02-13 22:33:07 +00:00
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
}
}
extension Data {
init<T>(from value: T) {
var value = value
var data = Data()
2025-02-13 22:33:07 +00:00
withUnsafePointer(to: &value) { (ptr: UnsafePointer<T>) in
2020-07-27 20:43:58 +00:00
data = Data(buffer: UnsafeBufferPointer(start: ptr, count: 1))
2025-02-13 22:33:07 +00:00
}
2020-07-27 20:43:58 +00:00
self.init(data)
}
2025-02-13 22:33:07 +00:00
func to<T>(type _: T.Type) -> T {
return withUnsafeBytes { $0.load(as: T.self) }
2020-07-27 20:43:58 +00:00
}
}