/
SSEncryption.swift
74 lines (63 loc) · 2.25 KB
/
SSEncryption.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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
//
// SSEncryption.swift
// SendNoteApp
//
// Created by Kamal Punia on 24/11/22.
//
import Foundation
import CryptoSwift
final class SSEncryption: NSObject {
// MARK: - Variables
static let shared = SSEncryption()
// MARK: - Initializer
private override init() {
super.init()
}
// MARK: - Internal functions
func deviceEncrypt(string: String) -> String? {
if let generatedKey = DeviceKey().retrieveKey(),
let keyData = Data(base64Encoded: generatedKey) {
if let encryptedString = encrypt(inputString: string, key: keyData) {
return encryptedString
}
}
return nil
}
func deviceDecrypt(string: String) -> String? {
if let generatedKey = DeviceKey().retrieveKey(),
let keyData = Data(base64Encoded: generatedKey),
let deCryptedString = decrypt(base64EncodedString: string, key: keyData) {
return deCryptedString
}
return nil
}
private func encrypt(inputString :String , key : Data)->String?{
let dataBytes = Data(inputString.utf8)
let iv = AES.randomIV(AES.blockSize)
let gcm = GCM(iv: iv, mode: .combined)
if let aes = try? AES(key: key.bytes, blockMode: gcm, padding: .pkcs7){
/* Encrypt Data */
if let encryptedBytes = try? aes.encrypt(dataBytes.bytes){
let encryptedData = Data(encryptedBytes)
return (iv + encryptedData).toBase64()
}
}
return nil
}
private func decrypt(base64EncodedString: String , key: Data)->String?{
if base64EncodedString.isEmptyWithTrimmedSpace {
return nil
}
let data = Array(base64: base64EncodedString)
let iv = Array(data.prefix(16))
let cyphertext = Array(data.suffix(from: 16))
let gcm = GCM(iv: iv, mode: .combined)
if let aes = try? AES(key: key.bytes, blockMode: gcm, padding: .pkcs7){
if let decryptedBytes = try? aes.decrypt(cyphertext){
let decryptedData = Data(decryptedBytes)
return String(data: decryptedData, encoding: .utf8)
}
}
return nil
}
}