-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathEncryptedStorage.swift
More file actions
88 lines (73 loc) · 2.89 KB
/
Copy pathEncryptedStorage.swift
File metadata and controls
88 lines (73 loc) · 2.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
import Foundation
@objcMembers public class EncryptedStorage: NSObject {
public static let isEncrypted = true
public func setItem(key: String, value: String, promise: Promise) {
guard let dataFromValue = value.data(using: .utf8) else {
promise.reject("An error occured while saving value", errorCode: 0)
return
}
let storeQuery = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecValueData: dataFromValue
] as CFDictionary
SecItemDelete(storeQuery)
let status = SecItemAdd(storeQuery, nil)
if status == noErr {
promise.resolve(value)
} else {
promise.reject("An error occured while saving value", errorCode: Int(status))
}
}
public func getItem(key: String, promise: Promise) {
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecReturnData: kCFBooleanTrue as Any,
kSecMatchLimit: kSecMatchLimitOne,
kSecUseAuthenticationUI: kSecUseAuthenticationUIFail
] as CFDictionary
var dataRef: CFTypeRef?
let status = SecItemCopyMatching(query, &dataRef)
if status == errSecInteractionNotAllowed {
// Device locked or item requires auth — don't delete, resolve as absent
promise.resolve(NSNull())
} else if status == errSecSuccess {
guard let data = dataRef as? Data, let value = String(data: data, encoding: .utf8) else {
promise.reject("An error occured while retrieving value", errorCode: Int(status))
return
}
promise.resolve(value)
} else if status == errSecItemNotFound {
promise.resolve(NSNull())
} else {
promise.reject("An error occured while retrieving value", errorCode: Int(status))
}
}
public func removeItem(key: String, promise: Promise) {
let query = [
kSecClass: kSecClassGenericPassword,
kSecAttrAccount: key,
kSecReturnData: kCFBooleanTrue as Any
] as CFDictionary
let status = SecItemDelete(query)
if status == noErr || status == errSecItemNotFound {
promise.resolve(key)
} else {
promise.reject("An error occured while removing value", errorCode: Int(status))
}
}
public func clear(promise: Promise) {
let secureItems: [CFString] = [
kSecClassGenericPassword,
kSecClassInternetPassword,
kSecClassCertificate,
kSecClassKey,
kSecClassIdentity
]
for item in secureItems {
SecItemDelete([kSecClass: item] as CFDictionary)
}
promise.resolve(nil)
}
}