-
Notifications
You must be signed in to change notification settings - Fork 0
/
RSAProvider.swift
58 lines (44 loc) · 1.65 KB
/
RSAProvider.swift
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
import Security
struct RSAProvider {
private var publicKeyString: String {
"""
-----BEGIN PUBLIC KEY-----
y
o
u
r
k
e
y
-----END PUBLIC KEY-----
"""
}
func encrypt(data: Data) -> Data? {
guard let secKey = secKey() else { return nil }
let buffer = data.bytes
var keySize = SecKeyGetBlockSize(secKey)
var keyBuffer = [UInt8](repeating: 0, count: keySize)
guard SecKeyEncrypt(secKey, SecPadding.PKCS1, buffer, buffer.count, &keyBuffer, &keySize) == errSecSuccess else { return nil }
return Data(bytes: keyBuffer, count: keySize)
}
private func secKey() -> SecKey? {
let keyString = publicKeyString.components(separatedBy: "\n").filter { line in
return !line.hasPrefix("-----BEGIN") && !line.hasPrefix("-----END")
}
let key = keyString.joined(separator: "")
guard let publicKeyData = Data(base64Encoded: key) else { return nil }
let publicKeyDict: CFDictionary = [
kSecClass: kSecClassKey,
kSecAttrKeyType: kSecAttrKeyTypeRSA,
kSecAttrKeyClass: kSecAttrKeyClassPublic,
kSecAttrKeySizeInBits: 2048,
kSecReturnPersistentRef : kCFBooleanTrue
] as CFDictionary
var error: Unmanaged<CFError>? = nil
guard let secKey = SecKeyCreateWithData(publicKeyData as CFData, publicKeyDict, &error) else {
print(error.debugDescription)
return nil
}
return secKey
}
}