Add authentification
This commit is contained in:
parent
86ab3f8a2c
commit
c72d962a22
@ -15,6 +15,17 @@ extension FlutterStandardTypedData {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CryptoKit.Digest utils
|
||||||
|
@available(iOS 13.0, *)
|
||||||
|
extension Digest {
|
||||||
|
var bytes: [UInt8] { Array(makeIterator()) }
|
||||||
|
var data: Data { Data(bytes) }
|
||||||
|
|
||||||
|
var hexStr: String {
|
||||||
|
bytes.map { String(format: "%02X", $0) }.joined()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func crypt(operation: Int, algorithm: Int, options: Int, key: Data,
|
func crypt(operation: Int, algorithm: Int, options: Int, key: Data,
|
||||||
initializationVector: Data, dataIn: Data) -> Data? {
|
initializationVector: Data, dataIn: Data) -> Data? {
|
||||||
return key.withUnsafeBytes { keyUnsafeRawBufferPointer in
|
return key.withUnsafeBytes { keyUnsafeRawBufferPointer in
|
||||||
@ -110,7 +121,7 @@ public class SwiftNativeCryptoPlugin: NSObject, FlutterPlugin {
|
|||||||
let encryptedPayload = [encrypted, iv]
|
let encryptedPayload = [encrypted, iv]
|
||||||
|
|
||||||
let aesKey = (args["aesKey"] as! FlutterStandardTypedData).data
|
let aesKey = (args["aesKey"] as! FlutterStandardTypedData).data
|
||||||
let decryptedPayload = symDecrypt(payload: encryptedPayload, aesKey: aesKey)
|
let decryptedPayload = symDecrypt(payload: encryptedPayload, aesKey: aesKey)!
|
||||||
|
|
||||||
result(decryptedPayload)
|
result(decryptedPayload)
|
||||||
|
|
||||||
@ -119,6 +130,11 @@ public class SwiftNativeCryptoPlugin: NSObject, FlutterPlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func digest(input : Data) -> Data {
|
||||||
|
let hashed = SHA256.hash(data: input)
|
||||||
|
return hashed.data
|
||||||
|
}
|
||||||
|
|
||||||
func symKeygen() -> Data {
|
func symKeygen() -> Data {
|
||||||
let key = SymmetricKey(size: .bits256)
|
let key = SymmetricKey(size: .bits256)
|
||||||
let keyBytes = key.withUnsafeBytes {return Data(Array($0))}
|
let keyBytes = key.withUnsafeBytes {return Data(Array($0))}
|
||||||
@ -126,7 +142,9 @@ public class SwiftNativeCryptoPlugin: NSObject, FlutterPlugin {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func symEncrypt(payload : Data, aesKey : Data) -> [Data] {
|
func symEncrypt(payload : Data, aesKey : Data) -> [Data] {
|
||||||
var encrypted = payload.encryptAES256_CBC_PKCS7_IV(key: aesKey)!
|
let mac = digest(input: aesKey + payload)
|
||||||
|
let dataToEncrypt = mac + payload
|
||||||
|
var encrypted = dataToEncrypt.encryptAES256_CBC_PKCS7_IV(key: aesKey)!
|
||||||
|
|
||||||
// Create a range based on the length of data to return
|
// Create a range based on the length of data to return
|
||||||
let range = 0..<16
|
let range = 0..<16
|
||||||
@ -139,11 +157,24 @@ public class SwiftNativeCryptoPlugin: NSObject, FlutterPlugin {
|
|||||||
return [encrypted, iv]
|
return [encrypted, iv]
|
||||||
}
|
}
|
||||||
|
|
||||||
func symDecrypt(payload : [Data], aesKey : Data) -> Data {
|
func symDecrypt(payload : [Data], aesKey : Data) -> Data? {
|
||||||
let encrypted = payload[1] + payload[0]
|
let encrypted = payload[1] + payload[0]
|
||||||
let decrypted = encrypted.decryptAES256_CBC_PKCS7_IV(key: aesKey)!
|
var decrypted = encrypted.decryptAES256_CBC_PKCS7_IV(key: aesKey)!
|
||||||
|
|
||||||
|
// Create a range based on the length of data to return
|
||||||
|
let range = 0..<32
|
||||||
|
|
||||||
|
// Get a new copy of data
|
||||||
|
let mac = decrypted.subdata(in: range)
|
||||||
|
decrypted.removeSubrange(range)
|
||||||
|
|
||||||
|
let verificationMac = digest(input: aesKey + decrypted)
|
||||||
|
|
||||||
|
if (mac.base64EncodedData() == verificationMac.base64EncodedData()) {
|
||||||
return decrypted
|
return decrypted
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user