v2 #12
							
								
								
									
										113
									
								
								packages/native_crypto_ios/ios/Classes/NativeCrypto.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								packages/native_crypto_ios/ios/Classes/NativeCrypto.swift
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,113 @@ | |||||||
|  | // | ||||||
|  | //  NativeCrypto.swift | ||||||
|  | //  native_crypto_ios | ||||||
|  | // | ||||||
|  | //  Created by Hugo Pointcheval on 04/04/2023. | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | import Foundation | ||||||
|  | import CryptoKit | ||||||
|  | 
 | ||||||
|  | public class NativeCrypto: NSObject, NativeCryptoAPI { | ||||||
|  |     func hash(data: FlutterStandardTypedData, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         var md = HashAlgorithmParser.getMessageDigest(algorithm: algorithm) | ||||||
|  |         md.update(data: data.data) | ||||||
|  | 
 | ||||||
|  |         let bytes = Data(md.finalize()) | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: bytes) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func hmac(data: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         let symmetricKey : SymmetricKey = SymmetricKey.init(data: key.data) | ||||||
|  |          | ||||||
|  |         switch algorithm { | ||||||
|  |         case .sha256: return FlutterStandardTypedData(bytes: Data(HMAC<SHA256>(key: symmetricKey).finalize())) | ||||||
|  |         case .sha384: return FlutterStandardTypedData(bytes: Data(HMAC<SHA384>(key: symmetricKey).finalize())) | ||||||
|  |         case .sha512: return FlutterStandardTypedData(bytes: Data(HMAC<SHA512>(key: symmetricKey).finalize())) | ||||||
|  |         @unknown default: fatalError("Unknown algorithm") | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func generateSecureRandom(length: Int64) throws -> FlutterStandardTypedData? { | ||||||
|  |         let lengthInt = Int(truncatingIfNeeded: length) | ||||||
|  |         let symmetricKey = SymmetricKey.init(size: SymmetricKeySize(bitCount: lengthInt / 8)) | ||||||
|  |         let bytes = symmetricKey.withUnsafeBytes | ||||||
|  |         { | ||||||
|  |             return Data(Array($0)) | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: bytes) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func pbkdf2(password: FlutterStandardTypedData, salt: FlutterStandardTypedData, length: Int64, iterations: Int64, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         let lengthInt = Int(truncatingIfNeeded: length) | ||||||
|  |         let iterationsInt = Int(truncatingIfNeeded: iterations) | ||||||
|  |         let pbkdf2 = Pbkdf2(length: lengthInt, iterations: iterationsInt, hashAlgorithm: algorithm) | ||||||
|  |         pbkdf2.initialize(password: password.data, salt: salt.data) | ||||||
|  |         let data = try? pbkdf2.derive() | ||||||
|  |          | ||||||
|  |         if (data == nil) { | ||||||
|  |             return nil | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: data!) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func encrypt(plainText: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let bytes = try? aes.encrypt(data: plainText.data, key: key.data, predefinedIV: nil) | ||||||
|  |          | ||||||
|  |         if (bytes == nil) { | ||||||
|  |             return nil | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: bytes!) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func encryptWithIV(plainText: FlutterStandardTypedData, iv: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let bytes = try? aes.encrypt(data: plainText.data, key: key.data, predefinedIV: iv.data) | ||||||
|  |          | ||||||
|  |         if (bytes == nil) { | ||||||
|  |             return nil | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: bytes!) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func decrypt(cipherText: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let bytes = try? aes.decrypt(data: cipherText.data, key: key.data) | ||||||
|  |          | ||||||
|  |         if (bytes == nil) { | ||||||
|  |             return nil | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return FlutterStandardTypedData(bytes: bytes!) | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func encryptFile(plainTextPath: String, cipherTextPath: String, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let params = FileParameters(input: plainTextPath, output: cipherTextPath) | ||||||
|  |         let success = try? aes.encryptFile(fileParameters: params, key: key.data, predefinedIV: nil) | ||||||
|  |          | ||||||
|  |         return success | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func encryptFileWithIV(plainTextPath: String, cipherTextPath: String, iv: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let params = FileParameters(input: plainTextPath, output: cipherTextPath) | ||||||
|  |         let success = try? aes.encryptFile(fileParameters: params, key: key.data, predefinedIV: iv.data) | ||||||
|  |          | ||||||
|  |         return success | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     func decryptFile(cipherTextPath: String, plainTextPath: String, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? { | ||||||
|  |         let aes = AESCipher() | ||||||
|  |         let params = FileParameters(input: cipherTextPath, output: plainTextPath) | ||||||
|  |         let success = try? aes.decryptFile(fileParameters: params, key: key.data) | ||||||
|  |          | ||||||
|  |         return success | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -1,188 +0,0 @@ | |||||||
| // Copyright 2019-2023 Hugo Pointcheval
 |  | ||||||
| // 
 |  | ||||||
| // Use of this source code is governed by an MIT-style
 |  | ||||||
| // license that can be found in the LICENSE file or at
 |  | ||||||
| // https://opensource.org/licenses/MIT.
 |  | ||||||
| // --
 |  | ||||||
| // Autogenerated from Pigeon (v9.0.0), do not edit directly.
 |  | ||||||
| // See also: https://pub.dev/packages/pigeon
 |  | ||||||
| 
 |  | ||||||
| #import <Foundation/Foundation.h> |  | ||||||
| 
 |  | ||||||
| @protocol FlutterBinaryMessenger; |  | ||||||
| @protocol FlutterMessageCodec; |  | ||||||
| @class FlutterError; |  | ||||||
| @class FlutterStandardTypedData; |  | ||||||
| 
 |  | ||||||
| NS_ASSUME_NONNULL_BEGIN |  | ||||||
| 
 |  | ||||||
| @class HashRequest; |  | ||||||
| @class HashResponse; |  | ||||||
| @class HmacRequest; |  | ||||||
| @class HmacResponse; |  | ||||||
| @class GenerateSecureRandomRequest; |  | ||||||
| @class GenerateSecureRandomResponse; |  | ||||||
| @class Pbkdf2Request; |  | ||||||
| @class Pbkdf2Response; |  | ||||||
| @class EncryptRequest; |  | ||||||
| @class EncryptResponse; |  | ||||||
| @class DecryptRequest; |  | ||||||
| @class DecryptResponse; |  | ||||||
| @class EncryptFileRequest; |  | ||||||
| @class EncryptFileResponse; |  | ||||||
| @class DecryptFileRequest; |  | ||||||
| @class DecryptFileResponse; |  | ||||||
| @class EncryptWithIVRequest; |  | ||||||
| 
 |  | ||||||
| @interface HashRequest : NSObject |  | ||||||
| + (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * data; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HashResponse : NSObject |  | ||||||
| + (instancetype)makeWithHash:(nullable FlutterStandardTypedData *)hash; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * hash; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HmacRequest : NSObject |  | ||||||
| + (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * data; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HmacResponse : NSObject |  | ||||||
| + (instancetype)makeWithHmac:(nullable FlutterStandardTypedData *)hmac; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * hmac; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface GenerateSecureRandomRequest : NSObject |  | ||||||
| + (instancetype)makeWithLength:(nullable NSNumber *)length; |  | ||||||
| @property(nonatomic, strong, nullable) NSNumber * length; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface GenerateSecureRandomResponse : NSObject |  | ||||||
| + (instancetype)makeWithRandom:(nullable FlutterStandardTypedData *)random; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * random; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface Pbkdf2Request : NSObject |  | ||||||
| + (instancetype)makeWithPassword:(nullable FlutterStandardTypedData *)password |  | ||||||
|     salt:(nullable FlutterStandardTypedData *)salt |  | ||||||
|     length:(nullable NSNumber *)length |  | ||||||
|     iterations:(nullable NSNumber *)iterations |  | ||||||
|     hashAlgorithm:(nullable NSString *)hashAlgorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * password; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * salt; |  | ||||||
| @property(nonatomic, strong, nullable) NSNumber * length; |  | ||||||
| @property(nonatomic, strong, nullable) NSNumber * iterations; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * hashAlgorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface Pbkdf2Response : NSObject |  | ||||||
| + (instancetype)makeWithKey:(nullable FlutterStandardTypedData *)key; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptRequest : NSObject |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * plainText; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptResponse : NSObject |  | ||||||
| + (instancetype)makeWithCipherText:(nullable FlutterStandardTypedData *)cipherText; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * cipherText; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptRequest : NSObject |  | ||||||
| + (instancetype)makeWithCipherText:(nullable FlutterStandardTypedData *)cipherText |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * cipherText; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptResponse : NSObject |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * plainText; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptFileRequest : NSObject |  | ||||||
| + (instancetype)makeWithPlainTextPath:(nullable NSString *)plainTextPath |  | ||||||
|     cipherTextPath:(nullable NSString *)cipherTextPath |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * plainTextPath; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * cipherTextPath; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptFileResponse : NSObject |  | ||||||
| + (instancetype)makeWithSuccess:(nullable NSNumber *)success; |  | ||||||
| @property(nonatomic, strong, nullable) NSNumber * success; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptFileRequest : NSObject |  | ||||||
| + (instancetype)makeWithCipherTextPath:(nullable NSString *)cipherTextPath |  | ||||||
|     plainTextPath:(nullable NSString *)plainTextPath |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * cipherTextPath; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * plainTextPath; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptFileResponse : NSObject |  | ||||||
| + (instancetype)makeWithSuccess:(nullable NSNumber *)success; |  | ||||||
| @property(nonatomic, strong, nullable) NSNumber * success; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptWithIVRequest : NSObject |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText |  | ||||||
|     iv:(nullable FlutterStandardTypedData *)iv |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * plainText; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * iv; |  | ||||||
| @property(nonatomic, strong, nullable) FlutterStandardTypedData * key; |  | ||||||
| @property(nonatomic, copy, nullable) NSString * algorithm; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| /// The codec used by NativeCryptoAPI.
 |  | ||||||
| NSObject<FlutterMessageCodec> *NativeCryptoAPIGetCodec(void); |  | ||||||
| 
 |  | ||||||
| @protocol NativeCryptoAPI |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable HashResponse *)hashRequest:(HashRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable HmacResponse *)hmacRequest:(HmacRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable GenerateSecureRandomResponse *)generateSecureRandomRequest:(GenerateSecureRandomRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable Pbkdf2Response *)pbkdf2Request:(Pbkdf2Request *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable EncryptResponse *)encryptRequest:(EncryptRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable DecryptResponse *)decryptRequest:(DecryptRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable EncryptFileResponse *)encryptFileRequest:(EncryptFileRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable DecryptFileResponse *)decryptFileRequest:(DecryptFileRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| /// @return `nil` only when `error != nil`.
 |  | ||||||
| - (nullable EncryptResponse *)encryptWithIVRequest:(EncryptWithIVRequest *)request error:(FlutterError *_Nullable *_Nonnull)error; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| extern void NativeCryptoAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<NativeCryptoAPI> *_Nullable api); |  | ||||||
| 
 |  | ||||||
| NS_ASSUME_NONNULL_END |  | ||||||
| @ -3,144 +3,9 @@ import UIKit | |||||||
| 
 | 
 | ||||||
| @available(iOS 13.0, *) | @available(iOS 13.0, *) | ||||||
| public class SwiftNativeCryptoIosPlugin: NSObject, FlutterPlugin { | public class SwiftNativeCryptoIosPlugin: NSObject, FlutterPlugin { | ||||||
|     static let name: String = "plugins.hugop.cl/native_crypto" |  | ||||||
|      |  | ||||||
|     public static func register(with registrar: FlutterPluginRegistrar) { |     public static func register(with registrar: FlutterPluginRegistrar) { | ||||||
|         let channel = FlutterMethodChannel(name: name, binaryMessenger: registrar.messenger()) |         let messenger : FlutterBinaryMessenger = registrar.messenger() | ||||||
|         let instance = SwiftNativeCryptoIosPlugin() |         let api : NativeCryptoAPI & NSObjectProtocol = NativeCrypto.init() | ||||||
|         registrar.addMethodCallDelegate(instance, channel: channel) |         NativeCryptoAPISetup.setUp(binaryMessenger: messenger, api: api); | ||||||
|     } |  | ||||||
|      |  | ||||||
|     public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { |  | ||||||
|         switch call.method { |  | ||||||
|         case "digest": _call(task: handleDigest(call: call), result: result) |  | ||||||
|         case "generateSecretKey": _call(task: handleGenerateSecretKey(call: call), result: result) |  | ||||||
|         case "pbkdf2": _call(task: handlePbkdf2(call: call), result: result) |  | ||||||
|         case "encryptAsList": _call(task: handleEncryptAsList(call: call), result: result) |  | ||||||
|         case "decryptAsList": _call(task: handleDecryptAsList(call: call), result: result) |  | ||||||
|         case "encrypt": _call(task: handleCrypt(call: call, forEncryption: true), result: result) |  | ||||||
|         case "decrypt": _call(task: handleCrypt(call: call, forEncryption: false), result: result) |  | ||||||
|         default: result(FlutterMethodNotImplemented) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|      |  | ||||||
|     private func _call<T>(task: Task<T>, result: @escaping FlutterResult) { |  | ||||||
|         task.call() |  | ||||||
|         task.finalize(callback: {(task: Task<T>) in |  | ||||||
|             if (task.isSuccessful()) { |  | ||||||
|                 result(task.getResult()!) |  | ||||||
|             } else { |  | ||||||
|                 let exception: Error = task.getException() |  | ||||||
|                 let message = exception.localizedDescription |  | ||||||
|                 result(FlutterError(code: "native_crypto", message: message, details: nil)) |  | ||||||
|             } |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handleDigest(call: FlutterMethodCall) -> Task<FlutterStandardTypedData> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let data : Data = (args["data"] as! FlutterStandardTypedData).data |  | ||||||
|             let algorithm : String = args["algorithm"] as! String |  | ||||||
|              |  | ||||||
|             return FlutterStandardTypedData.init(bytes: try HashAlgorithm.digest(data: data, algorithm: algorithm)) |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handleGenerateSecretKey(call: FlutterMethodCall) -> Task<FlutterStandardTypedData> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let bitsCount : NSNumber = args["bitsCount"] as! NSNumber |  | ||||||
|              |  | ||||||
|             return FlutterStandardTypedData.init(bytes: SecretKey(fromSecureRandom: bitsCount.intValue).bytes) |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handlePbkdf2(call: FlutterMethodCall) -> Task<FlutterStandardTypedData> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let password : String = args["password"] as! String |  | ||||||
|             let salt : String = args["salt"] as! String |  | ||||||
|             let keyBytesCount : NSNumber = args["keyBytesCount"] as! NSNumber |  | ||||||
|             let iterations : NSNumber = args["iterations"] as! NSNumber |  | ||||||
|             let algorithm : String = args["algorithm"] as! String |  | ||||||
|              |  | ||||||
|             let pbkdf2 : Pbkdf2 = Pbkdf2(keyBytesCount: keyBytesCount.intValue, iterations: iterations.intValue) |  | ||||||
|             pbkdf2.hash = HashAlgorithm.init(rawValue: algorithm) ?? pbkdf2.hash |  | ||||||
|             pbkdf2.initialize(password: password, salt: salt) |  | ||||||
|              |  | ||||||
|             return FlutterStandardTypedData.init(bytes: try pbkdf2.derive().bytes) |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handleEncryptAsList(call: FlutterMethodCall) -> Task<Array<Data>> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let data : Data = (args["data"] as! FlutterStandardTypedData).data |  | ||||||
|             let key : Data = (args["key"] as! FlutterStandardTypedData).data |  | ||||||
|             let algorithm : String = args["algorithm"] as! String |  | ||||||
|              |  | ||||||
|             let cipherAlgorithm : CipherAlgorithm? = CipherAlgorithm.init(rawValue: algorithm) |  | ||||||
|             var cipher : Cipher |  | ||||||
|             if (cipherAlgorithm != nil) { |  | ||||||
|                 cipher = cipherAlgorithm!.getCipher |  | ||||||
|             } else { |  | ||||||
|                 throw NativeCryptoError.cipherError |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             return try cipher.encryptAsList(data: data, key: key) |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handleDecryptAsList(call: FlutterMethodCall) -> Task<FlutterStandardTypedData> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let data = args["data"] as! NSArray |  | ||||||
|             let key : Data = (args["key"] as! FlutterStandardTypedData).data |  | ||||||
|             let algorithm : String = args["algorithm"] as! String |  | ||||||
|              |  | ||||||
|             let iv = (data[0] as! FlutterStandardTypedData).data |  | ||||||
|             let encrypted = (data[1] as! FlutterStandardTypedData).data |  | ||||||
|              |  | ||||||
|             let cipherAlgorithm : CipherAlgorithm? = CipherAlgorithm.init(rawValue: algorithm) |  | ||||||
|             var cipher : Cipher |  | ||||||
|             if (cipherAlgorithm != nil) { |  | ||||||
|                 cipher = cipherAlgorithm!.getCipher |  | ||||||
|             } else { |  | ||||||
|                 throw NativeCryptoError.cipherError |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             return FlutterStandardTypedData.init(bytes: try cipher.decryptAsList(data: [iv, encrypted], key: key)) |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     private func handleCrypt(call: FlutterMethodCall, forEncryption: Bool) -> Task<FlutterStandardTypedData> { |  | ||||||
|         return Task(task: { |  | ||||||
|             let args : NSDictionary = call.arguments as! NSDictionary |  | ||||||
|              |  | ||||||
|             let data : Data = (args["data"] as! FlutterStandardTypedData).data |  | ||||||
|             let key : Data = (args["key"] as! FlutterStandardTypedData).data |  | ||||||
|             let algorithm : String = args["algorithm"] as! String |  | ||||||
|              |  | ||||||
|             let cipherAlgorithm : CipherAlgorithm? = CipherAlgorithm.init(rawValue: algorithm) |  | ||||||
|             var cipher : Cipher |  | ||||||
|             if (cipherAlgorithm != nil) { |  | ||||||
|                 cipher = cipherAlgorithm!.getCipher |  | ||||||
|             } else { |  | ||||||
|                 throw NativeCryptoError.cipherError |  | ||||||
|             } |  | ||||||
|              |  | ||||||
|             if (forEncryption) { |  | ||||||
|                 return FlutterStandardTypedData.init(bytes: try cipher.encrypt(data: data, key: key)) |  | ||||||
|             } else { |  | ||||||
|                 return FlutterStandardTypedData.init(bytes: try cipher.decrypt(data: data, key: key)) |  | ||||||
|             } |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
|      |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -9,17 +9,33 @@ import Foundation | |||||||
| import CryptoKit | import CryptoKit | ||||||
| 
 | 
 | ||||||
| class AESCipher : Cipher { | class AESCipher : Cipher { | ||||||
|     var algorithm: CipherAlgorithm = CipherAlgorithm.aes |  | ||||||
|      |  | ||||||
|     /// Encrypts plaintext with key using AES GCM |     /// Encrypts plaintext with key using AES GCM | ||||||
|     @available(iOS 13.0, *) |     @available(iOS 13.0, *) | ||||||
|     func encrypt(data: Data, key: Data) throws -> Data { |     func encrypt(data: Data, key: Data, predefinedIV: Data?) throws -> Data { | ||||||
|         let symmetricKey : SymmetricKey = SymmetricKey.init(data: key) |         let symmetricKey : SymmetricKey = SymmetricKey.init(data: key) | ||||||
|         let encrypted : AES.GCM.SealedBox? = try? AES.GCM.seal(data, using: symmetricKey) |  | ||||||
|          |          | ||||||
|         let encryptedData : Data? = encrypted?.combined |         // Encryption | ||||||
|  |         var encrypted : AES.GCM.SealedBox | ||||||
|  |         do { | ||||||
|  |             // If predefinedIV is not null use it | ||||||
|  |             if (predefinedIV != nil) { | ||||||
|  |                 let nonce = try AES.GCM.Nonce(data: predefinedIV!) | ||||||
|  |                 encrypted = try AES.GCM.seal(data, using: symmetricKey, nonce: nonce) | ||||||
|  |             } else { | ||||||
|  |                 encrypted = try AES.GCM.seal(data, using: symmetricKey) | ||||||
|  |             } | ||||||
|  |         } catch CryptoKitError.incorrectKeySize { | ||||||
|  |             throw NativeCryptoError.invalidKeySize() | ||||||
|  |         } catch CryptoKitError.invalidParameter, CryptoKitError.incorrectParameterSize { | ||||||
|  |             throw NativeCryptoError.invalidParameter() | ||||||
|  |         } catch { | ||||||
|  |             throw NativeCryptoError.unknownError(reason: "An error occured during encryption.") | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         // NONCE[12] || CIPHERTEXT[n] || TAG[16] | ||||||
|  |         let encryptedData : Data? = encrypted.combined | ||||||
|         if (encryptedData == nil) { |         if (encryptedData == nil) { | ||||||
|             throw NativeCryptoError.encryptionError |             throw NativeCryptoError.unknownError(reason: "An error occured during ciphertext combination.") | ||||||
|         } |         } | ||||||
|         return encryptedData! |         return encryptedData! | ||||||
|     } |     } | ||||||
| @ -28,30 +44,65 @@ class AESCipher : Cipher { | |||||||
|     @available(iOS 13.0, *) |     @available(iOS 13.0, *) | ||||||
|     func decrypt(data: Data, key: Data) throws -> Data { |     func decrypt(data: Data, key: Data) throws -> Data { | ||||||
|         let symmetricKey = SymmetricKey.init(data: key) |         let symmetricKey = SymmetricKey.init(data: key) | ||||||
|         let sealedBox = try? AES.GCM.SealedBox(combined: data) |          | ||||||
|         if (sealedBox == nil) { return Data.init() } |         // SealedBox initialization | ||||||
|         let decryptedData = try? AES.GCM.open(sealedBox!, using: symmetricKey) |         var encrypted : AES.GCM.SealedBox | ||||||
|         if (decryptedData == nil) { |         do { | ||||||
|             throw NativeCryptoError.decryptionError |             encrypted = try AES.GCM.SealedBox(combined: data) | ||||||
|         } |         } catch { | ||||||
|         return decryptedData! |             throw NativeCryptoError.unknownError(reason: "An error occured during sealedbox initialization.") | ||||||
|         } |         } | ||||||
|          |          | ||||||
|     func encryptAsList(data: Data, key: Data) throws -> [Data] { |         // Decryption | ||||||
|         let encryptedData = try encrypt(data: data, key: key) |         var decryptedData : Data | ||||||
|          |         do { | ||||||
|         let iv = encryptedData.prefix(12) |             decryptedData = try AES.GCM.open(encrypted, using: symmetricKey) | ||||||
|         let data = encryptedData.suffix(from: 12) |         } catch CryptoKitError.incorrectKeySize { | ||||||
|          |             throw NativeCryptoError.invalidKeySize() | ||||||
|         return [iv, data] |         } catch CryptoKitError.invalidParameter, CryptoKitError.incorrectParameterSize { | ||||||
|  |             throw NativeCryptoError.invalidParameter() | ||||||
|  |         } catch CryptoKitError.authenticationFailure { | ||||||
|  |             throw NativeCryptoError.authenticationError() | ||||||
|  |         } catch { | ||||||
|  |             throw NativeCryptoError.unknownError(reason: "An error occured during decryption.") | ||||||
|         } |         } | ||||||
|          |          | ||||||
|     func decryptAsList(data: [Data], key: Data) throws -> Data { |  | ||||||
|         var encryptedData = data.first! |  | ||||||
|         let data = data.last! |  | ||||||
|         encryptedData.append(data) |  | ||||||
|          |  | ||||||
|         let decryptedData = try decrypt(data: encryptedData, key: key) |  | ||||||
|         return decryptedData |         return decryptedData | ||||||
|     } |     } | ||||||
|  |      | ||||||
|  |     /// Encrypts plaintext file with key using AES GCM | ||||||
|  |     func encryptFile(fileParameters: FileParameters, key: Data, predefinedIV: Data?) throws -> Bool { | ||||||
|  |         let fileManager = FileManager.default | ||||||
|  |         let inputFile = URL(fileURLWithPath: fileParameters.inputPath) | ||||||
|  | 
 | ||||||
|  |         guard let data = fileManager.contents(atPath: inputFile.path) else { | ||||||
|  |             throw NativeCryptoError.ioError(reason: "Error while reading input file.") | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         let encryptedData = try encrypt(data: data, key: key, predefinedIV: predefinedIV) | ||||||
|  |          | ||||||
|  |         guard fileManager.createFile(atPath: fileParameters.outputPath, contents: encryptedData, attributes: nil) else { | ||||||
|  |             throw NativeCryptoError.ioError(reason: "Error while writing output file.") | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return true | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     /// Decrypts ciphertext file with key using AES GCM | ||||||
|  |     func decryptFile(fileParameters: FileParameters, key: Data) throws -> Bool { | ||||||
|  |         let fileManager = FileManager.default | ||||||
|  |         let inputFile = URL(fileURLWithPath: fileParameters.inputPath) | ||||||
|  | 
 | ||||||
|  |         guard let data = fileManager.contents(atPath: inputFile.path) else { | ||||||
|  |             throw NativeCryptoError.ioError(reason: "Error while reading input file.") | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         let decryptedData = try decrypt(data: data, key: key) | ||||||
|  |          | ||||||
|  |         guard fileManager.createFile(atPath: fileParameters.outputPath, contents: decryptedData, attributes: nil) else { | ||||||
|  |             throw NativeCryptoError.ioError(reason: "Error while writing output file.") | ||||||
|  |         } | ||||||
|  |          | ||||||
|  |         return true | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -9,45 +9,42 @@ import Foundation | |||||||
| import CommonCrypto | import CommonCrypto | ||||||
| 
 | 
 | ||||||
| class Pbkdf2 : KeyDerivation { | class Pbkdf2 : KeyDerivation { | ||||||
|     var algorithm: KdfAlgorithm = KdfAlgorithm.pbkdf2 |     var length: Int | ||||||
|      |  | ||||||
|     var keyBytesCount: Int |  | ||||||
|     var iterations: Int |     var iterations: Int | ||||||
|     var hash: HashAlgorithm = HashAlgorithm.HashSHA256 |     var hashAlgorithm: HashAlgorithm | ||||||
|      |      | ||||||
|     var password: String? = nil |     var password: Data? = nil | ||||||
|     var salt: String? = nil |     var salt: Data? = nil | ||||||
|      |      | ||||||
|     init(keyBytesCount: Int, iterations: Int) { |     init(length: Int, iterations: Int, hashAlgorithm: HashAlgorithm) { | ||||||
|         self.keyBytesCount = keyBytesCount |         self.length = length | ||||||
|         self.iterations = iterations |         self.iterations = iterations | ||||||
|  |         self.hashAlgorithm = hashAlgorithm | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func initialize(password: String, salt: String) { |     func initialize(password: Data, salt: Data) { | ||||||
|         self.password = password |         self.password = password | ||||||
|         self.salt = salt |         self.salt = salt | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     func derive() throws -> SecretKey { |     func derive() throws -> Data? { | ||||||
|         if (password == nil || salt == nil) { |         if (password == nil || salt == nil) { | ||||||
|             throw NativeCryptoError.pbkdf2Error |             throw NativeCryptoError.kdfError(reason: "Password and salt cannot be null.") | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         let passwordData = password!.data(using: .utf8)! |         var derivedKeyData = Data(repeating: 0, count: length) | ||||||
|         let saltData = salt!.data(using: .utf8)! |  | ||||||
|          |  | ||||||
|         var derivedKeyData = Data(repeating: 0, count: keyBytesCount) |  | ||||||
|         let localDerivedKeyData = derivedKeyData |         let localDerivedKeyData = derivedKeyData | ||||||
|  |         let identifier = HashAlgorithmParser.getPbkdf2Identifier(algorithm: hashAlgorithm) | ||||||
|          |          | ||||||
|         let status = derivedKeyData.withUnsafeMutableBytes { (derivedKeyBytes: UnsafeMutableRawBufferPointer) in |         let status = derivedKeyData.withUnsafeMutableBytes { (derivedKeyBytes: UnsafeMutableRawBufferPointer) in | ||||||
|             saltData.withUnsafeBytes { (saltBytes: UnsafeRawBufferPointer) in |             salt!.withUnsafeBytes { (saltBytes: UnsafeRawBufferPointer) in | ||||||
|                 CCKeyDerivationPBKDF( |                 CCKeyDerivationPBKDF( | ||||||
|                     CCPBKDFAlgorithm(kCCPBKDF2), |                     CCPBKDFAlgorithm(kCCPBKDF2), | ||||||
|                     password, |                     (password! as NSData).bytes, | ||||||
|                     passwordData.count, |                     password!.count, | ||||||
|                     saltBytes.bindMemory(to: UInt8.self).baseAddress, |                     saltBytes.bindMemory(to: UInt8.self).baseAddress, | ||||||
|                     saltData.count, |                     salt!.count, | ||||||
|                     hash.pbkdf2identifier, |                     identifier, | ||||||
|                     UInt32(iterations), |                     UInt32(iterations), | ||||||
|                     derivedKeyBytes.bindMemory(to: UInt8.self).baseAddress, |                     derivedKeyBytes.bindMemory(to: UInt8.self).baseAddress, | ||||||
|                     localDerivedKeyData.count) |                     localDerivedKeyData.count) | ||||||
| @ -55,9 +52,9 @@ class Pbkdf2 : KeyDerivation { | |||||||
|         } |         } | ||||||
|          |          | ||||||
|         if (status != kCCSuccess) { |         if (status != kCCSuccess) { | ||||||
|             throw NativeCryptoError.pbkdf2Error |             throw NativeCryptoError.kdfError() | ||||||
|         } |         } | ||||||
|          |          | ||||||
|         return SecretKey(derivedKeyData) |         return derivedKeyData | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,25 +0,0 @@ | |||||||
| // |  | ||||||
| //  SecretKey.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation |  | ||||||
| import CryptoKit |  | ||||||
| 
 |  | ||||||
| class SecretKey : Key { |  | ||||||
|     var bytes: Data |  | ||||||
|      |  | ||||||
|     init(_ bytes: Data) { |  | ||||||
|         self.bytes = bytes |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     init(fromSecureRandom bitsCount: Int) { |  | ||||||
|         let symmetricKey = SymmetricKey.init(size: SymmetricKeySize(bitCount: bitsCount)) |  | ||||||
|         bytes = symmetricKey.withUnsafeBytes |  | ||||||
|         { |  | ||||||
|             return Data(Array($0)) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -1,868 +0,0 @@ | |||||||
| // Copyright 2019-2023 Hugo Pointcheval |  | ||||||
| //  |  | ||||||
| // Use of this source code is governed by an MIT-style |  | ||||||
| // license that can be found in the LICENSE file or at |  | ||||||
| // https://opensource.org/licenses/MIT. |  | ||||||
| // -- |  | ||||||
| // Autogenerated from Pigeon (v9.0.0), do not edit directly. |  | ||||||
| // See also: https://pub.dev/packages/pigeon |  | ||||||
| 
 |  | ||||||
| #import "messages.g.h" |  | ||||||
| #import <Flutter/Flutter.h> |  | ||||||
| 
 |  | ||||||
| #if !__has_feature(objc_arc) |  | ||||||
| #error File requires ARC to be enabled. |  | ||||||
| #endif |  | ||||||
| 
 |  | ||||||
| static NSArray *wrapResult(id result, FlutterError *error) { |  | ||||||
|   if (error) { |  | ||||||
|     return @[ |  | ||||||
|       error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] |  | ||||||
|     ]; |  | ||||||
|   } |  | ||||||
|   return @[ result ?: [NSNull null] ]; |  | ||||||
| } |  | ||||||
| static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) { |  | ||||||
|   id result = array[key]; |  | ||||||
|   return (result == [NSNull null]) ? nil : result; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @interface HashRequest () |  | ||||||
| + (HashRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable HashRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HashResponse () |  | ||||||
| + (HashResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable HashResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HmacRequest () |  | ||||||
| + (HmacRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable HmacRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface HmacResponse () |  | ||||||
| + (HmacResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable HmacResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface GenerateSecureRandomRequest () |  | ||||||
| + (GenerateSecureRandomRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable GenerateSecureRandomRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface GenerateSecureRandomResponse () |  | ||||||
| + (GenerateSecureRandomResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable GenerateSecureRandomResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface Pbkdf2Request () |  | ||||||
| + (Pbkdf2Request *)fromList:(NSArray *)list; |  | ||||||
| + (nullable Pbkdf2Request *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface Pbkdf2Response () |  | ||||||
| + (Pbkdf2Response *)fromList:(NSArray *)list; |  | ||||||
| + (nullable Pbkdf2Response *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptRequest () |  | ||||||
| + (EncryptRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable EncryptRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptResponse () |  | ||||||
| + (EncryptResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable EncryptResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptRequest () |  | ||||||
| + (DecryptRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable DecryptRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptResponse () |  | ||||||
| + (DecryptResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable DecryptResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptFileRequest () |  | ||||||
| + (EncryptFileRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable EncryptFileRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptFileResponse () |  | ||||||
| + (EncryptFileResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable EncryptFileResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptFileRequest () |  | ||||||
| + (DecryptFileRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable DecryptFileRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface DecryptFileResponse () |  | ||||||
| + (DecryptFileResponse *)fromList:(NSArray *)list; |  | ||||||
| + (nullable DecryptFileResponse *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface EncryptWithIVRequest () |  | ||||||
| + (EncryptWithIVRequest *)fromList:(NSArray *)list; |  | ||||||
| + (nullable EncryptWithIVRequest *)nullableFromList:(NSArray *)list; |  | ||||||
| - (NSArray *)toList; |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation HashRequest |  | ||||||
| + (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   HashRequest* pigeonResult = [[HashRequest alloc] init]; |  | ||||||
|   pigeonResult.data = data; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (HashRequest *)fromList:(NSArray *)list { |  | ||||||
|   HashRequest *pigeonResult = [[HashRequest alloc] init]; |  | ||||||
|   pigeonResult.data = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable HashRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [HashRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.data ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation HashResponse |  | ||||||
| + (instancetype)makeWithHash:(nullable FlutterStandardTypedData *)hash { |  | ||||||
|   HashResponse* pigeonResult = [[HashResponse alloc] init]; |  | ||||||
|   pigeonResult.hash = hash; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (HashResponse *)fromList:(NSArray *)list { |  | ||||||
|   HashResponse *pigeonResult = [[HashResponse alloc] init]; |  | ||||||
|   pigeonResult.hash = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable HashResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [HashResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.hash ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation HmacRequest |  | ||||||
| + (instancetype)makeWithData:(nullable FlutterStandardTypedData *)data |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   HmacRequest* pigeonResult = [[HmacRequest alloc] init]; |  | ||||||
|   pigeonResult.data = data; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (HmacRequest *)fromList:(NSArray *)list { |  | ||||||
|   HmacRequest *pigeonResult = [[HmacRequest alloc] init]; |  | ||||||
|   pigeonResult.data = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable HmacRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [HmacRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.data ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation HmacResponse |  | ||||||
| + (instancetype)makeWithHmac:(nullable FlutterStandardTypedData *)hmac { |  | ||||||
|   HmacResponse* pigeonResult = [[HmacResponse alloc] init]; |  | ||||||
|   pigeonResult.hmac = hmac; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (HmacResponse *)fromList:(NSArray *)list { |  | ||||||
|   HmacResponse *pigeonResult = [[HmacResponse alloc] init]; |  | ||||||
|   pigeonResult.hmac = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable HmacResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [HmacResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.hmac ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation GenerateSecureRandomRequest |  | ||||||
| + (instancetype)makeWithLength:(nullable NSNumber *)length { |  | ||||||
|   GenerateSecureRandomRequest* pigeonResult = [[GenerateSecureRandomRequest alloc] init]; |  | ||||||
|   pigeonResult.length = length; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (GenerateSecureRandomRequest *)fromList:(NSArray *)list { |  | ||||||
|   GenerateSecureRandomRequest *pigeonResult = [[GenerateSecureRandomRequest alloc] init]; |  | ||||||
|   pigeonResult.length = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable GenerateSecureRandomRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [GenerateSecureRandomRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.length ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation GenerateSecureRandomResponse |  | ||||||
| + (instancetype)makeWithRandom:(nullable FlutterStandardTypedData *)random { |  | ||||||
|   GenerateSecureRandomResponse* pigeonResult = [[GenerateSecureRandomResponse alloc] init]; |  | ||||||
|   pigeonResult.random = random; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (GenerateSecureRandomResponse *)fromList:(NSArray *)list { |  | ||||||
|   GenerateSecureRandomResponse *pigeonResult = [[GenerateSecureRandomResponse alloc] init]; |  | ||||||
|   pigeonResult.random = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable GenerateSecureRandomResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [GenerateSecureRandomResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.random ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation Pbkdf2Request |  | ||||||
| + (instancetype)makeWithPassword:(nullable FlutterStandardTypedData *)password |  | ||||||
|     salt:(nullable FlutterStandardTypedData *)salt |  | ||||||
|     length:(nullable NSNumber *)length |  | ||||||
|     iterations:(nullable NSNumber *)iterations |  | ||||||
|     hashAlgorithm:(nullable NSString *)hashAlgorithm { |  | ||||||
|   Pbkdf2Request* pigeonResult = [[Pbkdf2Request alloc] init]; |  | ||||||
|   pigeonResult.password = password; |  | ||||||
|   pigeonResult.salt = salt; |  | ||||||
|   pigeonResult.length = length; |  | ||||||
|   pigeonResult.iterations = iterations; |  | ||||||
|   pigeonResult.hashAlgorithm = hashAlgorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (Pbkdf2Request *)fromList:(NSArray *)list { |  | ||||||
|   Pbkdf2Request *pigeonResult = [[Pbkdf2Request alloc] init]; |  | ||||||
|   pigeonResult.password = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.salt = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.length = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   pigeonResult.iterations = GetNullableObjectAtIndex(list, 3); |  | ||||||
|   pigeonResult.hashAlgorithm = GetNullableObjectAtIndex(list, 4); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable Pbkdf2Request *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [Pbkdf2Request fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.password ?: [NSNull null]), |  | ||||||
|     (self.salt ?: [NSNull null]), |  | ||||||
|     (self.length ?: [NSNull null]), |  | ||||||
|     (self.iterations ?: [NSNull null]), |  | ||||||
|     (self.hashAlgorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation Pbkdf2Response |  | ||||||
| + (instancetype)makeWithKey:(nullable FlutterStandardTypedData *)key { |  | ||||||
|   Pbkdf2Response* pigeonResult = [[Pbkdf2Response alloc] init]; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (Pbkdf2Response *)fromList:(NSArray *)list { |  | ||||||
|   Pbkdf2Response *pigeonResult = [[Pbkdf2Response alloc] init]; |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable Pbkdf2Response *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [Pbkdf2Response fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation EncryptRequest |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   EncryptRequest* pigeonResult = [[EncryptRequest alloc] init]; |  | ||||||
|   pigeonResult.plainText = plainText; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (EncryptRequest *)fromList:(NSArray *)list { |  | ||||||
|   EncryptRequest *pigeonResult = [[EncryptRequest alloc] init]; |  | ||||||
|   pigeonResult.plainText = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable EncryptRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [EncryptRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.plainText ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation EncryptResponse |  | ||||||
| + (instancetype)makeWithCipherText:(nullable FlutterStandardTypedData *)cipherText { |  | ||||||
|   EncryptResponse* pigeonResult = [[EncryptResponse alloc] init]; |  | ||||||
|   pigeonResult.cipherText = cipherText; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (EncryptResponse *)fromList:(NSArray *)list { |  | ||||||
|   EncryptResponse *pigeonResult = [[EncryptResponse alloc] init]; |  | ||||||
|   pigeonResult.cipherText = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable EncryptResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [EncryptResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.cipherText ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation DecryptRequest |  | ||||||
| + (instancetype)makeWithCipherText:(nullable FlutterStandardTypedData *)cipherText |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   DecryptRequest* pigeonResult = [[DecryptRequest alloc] init]; |  | ||||||
|   pigeonResult.cipherText = cipherText; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (DecryptRequest *)fromList:(NSArray *)list { |  | ||||||
|   DecryptRequest *pigeonResult = [[DecryptRequest alloc] init]; |  | ||||||
|   pigeonResult.cipherText = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable DecryptRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [DecryptRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.cipherText ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation DecryptResponse |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText { |  | ||||||
|   DecryptResponse* pigeonResult = [[DecryptResponse alloc] init]; |  | ||||||
|   pigeonResult.plainText = plainText; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (DecryptResponse *)fromList:(NSArray *)list { |  | ||||||
|   DecryptResponse *pigeonResult = [[DecryptResponse alloc] init]; |  | ||||||
|   pigeonResult.plainText = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable DecryptResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [DecryptResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.plainText ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation EncryptFileRequest |  | ||||||
| + (instancetype)makeWithPlainTextPath:(nullable NSString *)plainTextPath |  | ||||||
|     cipherTextPath:(nullable NSString *)cipherTextPath |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   EncryptFileRequest* pigeonResult = [[EncryptFileRequest alloc] init]; |  | ||||||
|   pigeonResult.plainTextPath = plainTextPath; |  | ||||||
|   pigeonResult.cipherTextPath = cipherTextPath; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (EncryptFileRequest *)fromList:(NSArray *)list { |  | ||||||
|   EncryptFileRequest *pigeonResult = [[EncryptFileRequest alloc] init]; |  | ||||||
|   pigeonResult.plainTextPath = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.cipherTextPath = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 3); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable EncryptFileRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [EncryptFileRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.plainTextPath ?: [NSNull null]), |  | ||||||
|     (self.cipherTextPath ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation EncryptFileResponse |  | ||||||
| + (instancetype)makeWithSuccess:(nullable NSNumber *)success { |  | ||||||
|   EncryptFileResponse* pigeonResult = [[EncryptFileResponse alloc] init]; |  | ||||||
|   pigeonResult.success = success; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (EncryptFileResponse *)fromList:(NSArray *)list { |  | ||||||
|   EncryptFileResponse *pigeonResult = [[EncryptFileResponse alloc] init]; |  | ||||||
|   pigeonResult.success = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable EncryptFileResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [EncryptFileResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.success ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation DecryptFileRequest |  | ||||||
| + (instancetype)makeWithCipherTextPath:(nullable NSString *)cipherTextPath |  | ||||||
|     plainTextPath:(nullable NSString *)plainTextPath |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   DecryptFileRequest* pigeonResult = [[DecryptFileRequest alloc] init]; |  | ||||||
|   pigeonResult.cipherTextPath = cipherTextPath; |  | ||||||
|   pigeonResult.plainTextPath = plainTextPath; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (DecryptFileRequest *)fromList:(NSArray *)list { |  | ||||||
|   DecryptFileRequest *pigeonResult = [[DecryptFileRequest alloc] init]; |  | ||||||
|   pigeonResult.cipherTextPath = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.plainTextPath = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 3); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable DecryptFileRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [DecryptFileRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.cipherTextPath ?: [NSNull null]), |  | ||||||
|     (self.plainTextPath ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation DecryptFileResponse |  | ||||||
| + (instancetype)makeWithSuccess:(nullable NSNumber *)success { |  | ||||||
|   DecryptFileResponse* pigeonResult = [[DecryptFileResponse alloc] init]; |  | ||||||
|   pigeonResult.success = success; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (DecryptFileResponse *)fromList:(NSArray *)list { |  | ||||||
|   DecryptFileResponse *pigeonResult = [[DecryptFileResponse alloc] init]; |  | ||||||
|   pigeonResult.success = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable DecryptFileResponse *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [DecryptFileResponse fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.success ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @implementation EncryptWithIVRequest |  | ||||||
| + (instancetype)makeWithPlainText:(nullable FlutterStandardTypedData *)plainText |  | ||||||
|     iv:(nullable FlutterStandardTypedData *)iv |  | ||||||
|     key:(nullable FlutterStandardTypedData *)key |  | ||||||
|     algorithm:(nullable NSString *)algorithm { |  | ||||||
|   EncryptWithIVRequest* pigeonResult = [[EncryptWithIVRequest alloc] init]; |  | ||||||
|   pigeonResult.plainText = plainText; |  | ||||||
|   pigeonResult.iv = iv; |  | ||||||
|   pigeonResult.key = key; |  | ||||||
|   pigeonResult.algorithm = algorithm; |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (EncryptWithIVRequest *)fromList:(NSArray *)list { |  | ||||||
|   EncryptWithIVRequest *pigeonResult = [[EncryptWithIVRequest alloc] init]; |  | ||||||
|   pigeonResult.plainText = GetNullableObjectAtIndex(list, 0); |  | ||||||
|   pigeonResult.iv = GetNullableObjectAtIndex(list, 1); |  | ||||||
|   pigeonResult.key = GetNullableObjectAtIndex(list, 2); |  | ||||||
|   pigeonResult.algorithm = GetNullableObjectAtIndex(list, 3); |  | ||||||
|   return pigeonResult; |  | ||||||
| } |  | ||||||
| + (nullable EncryptWithIVRequest *)nullableFromList:(NSArray *)list { |  | ||||||
|   return (list) ? [EncryptWithIVRequest fromList:list] : nil; |  | ||||||
| } |  | ||||||
| - (NSArray *)toList { |  | ||||||
|   return @[ |  | ||||||
|     (self.plainText ?: [NSNull null]), |  | ||||||
|     (self.iv ?: [NSNull null]), |  | ||||||
|     (self.key ?: [NSNull null]), |  | ||||||
|     (self.algorithm ?: [NSNull null]), |  | ||||||
|   ]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface NativeCryptoAPICodecReader : FlutterStandardReader |  | ||||||
| @end |  | ||||||
| @implementation NativeCryptoAPICodecReader |  | ||||||
| - (nullable id)readValueOfType:(UInt8)type { |  | ||||||
|   switch (type) { |  | ||||||
|     case 128:  |  | ||||||
|       return [DecryptFileRequest fromList:[self readValue]]; |  | ||||||
|     case 129:  |  | ||||||
|       return [DecryptFileResponse fromList:[self readValue]]; |  | ||||||
|     case 130:  |  | ||||||
|       return [DecryptRequest fromList:[self readValue]]; |  | ||||||
|     case 131:  |  | ||||||
|       return [DecryptResponse fromList:[self readValue]]; |  | ||||||
|     case 132:  |  | ||||||
|       return [EncryptFileRequest fromList:[self readValue]]; |  | ||||||
|     case 133:  |  | ||||||
|       return [EncryptFileResponse fromList:[self readValue]]; |  | ||||||
|     case 134:  |  | ||||||
|       return [EncryptRequest fromList:[self readValue]]; |  | ||||||
|     case 135:  |  | ||||||
|       return [EncryptResponse fromList:[self readValue]]; |  | ||||||
|     case 136:  |  | ||||||
|       return [EncryptWithIVRequest fromList:[self readValue]]; |  | ||||||
|     case 137:  |  | ||||||
|       return [GenerateSecureRandomRequest fromList:[self readValue]]; |  | ||||||
|     case 138:  |  | ||||||
|       return [GenerateSecureRandomResponse fromList:[self readValue]]; |  | ||||||
|     case 139:  |  | ||||||
|       return [HashRequest fromList:[self readValue]]; |  | ||||||
|     case 140:  |  | ||||||
|       return [HashResponse fromList:[self readValue]]; |  | ||||||
|     case 141:  |  | ||||||
|       return [HmacRequest fromList:[self readValue]]; |  | ||||||
|     case 142:  |  | ||||||
|       return [HmacResponse fromList:[self readValue]]; |  | ||||||
|     case 143:  |  | ||||||
|       return [Pbkdf2Request fromList:[self readValue]]; |  | ||||||
|     case 144:  |  | ||||||
|       return [Pbkdf2Response fromList:[self readValue]]; |  | ||||||
|     default: |  | ||||||
|       return [super readValueOfType:type]; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface NativeCryptoAPICodecWriter : FlutterStandardWriter |  | ||||||
| @end |  | ||||||
| @implementation NativeCryptoAPICodecWriter |  | ||||||
| - (void)writeValue:(id)value { |  | ||||||
|   if ([value isKindOfClass:[DecryptFileRequest class]]) { |  | ||||||
|     [self writeByte:128]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[DecryptFileResponse class]]) { |  | ||||||
|     [self writeByte:129]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[DecryptRequest class]]) { |  | ||||||
|     [self writeByte:130]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[DecryptResponse class]]) { |  | ||||||
|     [self writeByte:131]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[EncryptFileRequest class]]) { |  | ||||||
|     [self writeByte:132]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[EncryptFileResponse class]]) { |  | ||||||
|     [self writeByte:133]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[EncryptRequest class]]) { |  | ||||||
|     [self writeByte:134]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[EncryptResponse class]]) { |  | ||||||
|     [self writeByte:135]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[EncryptWithIVRequest class]]) { |  | ||||||
|     [self writeByte:136]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[GenerateSecureRandomRequest class]]) { |  | ||||||
|     [self writeByte:137]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[GenerateSecureRandomResponse class]]) { |  | ||||||
|     [self writeByte:138]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[HashRequest class]]) { |  | ||||||
|     [self writeByte:139]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[HashResponse class]]) { |  | ||||||
|     [self writeByte:140]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[HmacRequest class]]) { |  | ||||||
|     [self writeByte:141]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[HmacResponse class]]) { |  | ||||||
|     [self writeByte:142]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[Pbkdf2Request class]]) { |  | ||||||
|     [self writeByte:143]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else if ([value isKindOfClass:[Pbkdf2Response class]]) { |  | ||||||
|     [self writeByte:144]; |  | ||||||
|     [self writeValue:[value toList]]; |  | ||||||
|   } else { |  | ||||||
|     [super writeValue:value]; |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| @interface NativeCryptoAPICodecReaderWriter : FlutterStandardReaderWriter |  | ||||||
| @end |  | ||||||
| @implementation NativeCryptoAPICodecReaderWriter |  | ||||||
| - (FlutterStandardWriter *)writerWithData:(NSMutableData *)data { |  | ||||||
|   return [[NativeCryptoAPICodecWriter alloc] initWithData:data]; |  | ||||||
| } |  | ||||||
| - (FlutterStandardReader *)readerWithData:(NSData *)data { |  | ||||||
|   return [[NativeCryptoAPICodecReader alloc] initWithData:data]; |  | ||||||
| } |  | ||||||
| @end |  | ||||||
| 
 |  | ||||||
| NSObject<FlutterMessageCodec> *NativeCryptoAPIGetCodec() { |  | ||||||
|   static FlutterStandardMessageCodec *sSharedObject = nil; |  | ||||||
|   static dispatch_once_t sPred = 0; |  | ||||||
|   dispatch_once(&sPred, ^{ |  | ||||||
|     NativeCryptoAPICodecReaderWriter *readerWriter = [[NativeCryptoAPICodecReaderWriter alloc] init]; |  | ||||||
|     sSharedObject = [FlutterStandardMessageCodec codecWithReaderWriter:readerWriter]; |  | ||||||
|   }); |  | ||||||
|   return sSharedObject; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| void NativeCryptoAPISetup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<NativeCryptoAPI> *api) { |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.hash" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(hashRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(hashRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         HashRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         HashResponse *output = [api hashRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.hmac" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(hmacRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(hmacRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         HmacRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         HmacResponse *output = [api hmacRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.generateSecureRandom" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(generateSecureRandomRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(generateSecureRandomRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         GenerateSecureRandomRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         GenerateSecureRandomResponse *output = [api generateSecureRandomRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.pbkdf2" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(pbkdf2Request:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(pbkdf2Request:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         Pbkdf2Request *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         Pbkdf2Response *output = [api pbkdf2Request:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.encrypt" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(encryptRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(encryptRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         EncryptRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         EncryptResponse *output = [api encryptRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.decrypt" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(decryptRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(decryptRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         DecryptRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         DecryptResponse *output = [api decryptRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.encryptFile" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(encryptFileRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(encryptFileRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         EncryptFileRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         EncryptFileResponse *output = [api encryptFileRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.decryptFile" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(decryptFileRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(decryptFileRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         DecryptFileRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         DecryptFileResponse *output = [api decryptFileRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|   { |  | ||||||
|     FlutterBasicMessageChannel *channel = |  | ||||||
|       [[FlutterBasicMessageChannel alloc] |  | ||||||
|         initWithName:@"dev.flutter.pigeon.NativeCryptoAPI.encryptWithIV" |  | ||||||
|         binaryMessenger:binaryMessenger |  | ||||||
|         codec:NativeCryptoAPIGetCodec()]; |  | ||||||
|     if (api) { |  | ||||||
|       NSCAssert([api respondsToSelector:@selector(encryptWithIVRequest:error:)], @"NativeCryptoAPI api (%@) doesn't respond to @selector(encryptWithIVRequest:error:)", api); |  | ||||||
|       [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { |  | ||||||
|         NSArray *args = message; |  | ||||||
|         EncryptWithIVRequest *arg_request = GetNullableObjectAtIndex(args, 0); |  | ||||||
|         FlutterError *error; |  | ||||||
|         EncryptResponse *output = [api encryptWithIVRequest:arg_request error:&error]; |  | ||||||
|         callback(wrapResult(output, error)); |  | ||||||
|       }]; |  | ||||||
|     } else { |  | ||||||
|       [channel setMessageHandler:nil]; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
							
								
								
									
										243
									
								
								packages/native_crypto_ios/ios/Classes/messages.g.swift
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								packages/native_crypto_ios/ios/Classes/messages.g.swift
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,243 @@ | |||||||
|  | // Copyright 2019-2023 Hugo Pointcheval | ||||||
|  | //  | ||||||
|  | // Use of this source code is governed by an MIT-style | ||||||
|  | // license that can be found in the LICENSE file or at | ||||||
|  | // https://opensource.org/licenses/MIT. | ||||||
|  | // -- | ||||||
|  | // Autogenerated from Pigeon (v9.2.0), do not edit directly. | ||||||
|  | // See also: https://pub.dev/packages/pigeon | ||||||
|  | 
 | ||||||
|  | import Foundation | ||||||
|  | #if os(iOS) | ||||||
|  | import Flutter | ||||||
|  | #elseif os(macOS) | ||||||
|  | import FlutterMacOS | ||||||
|  | #else | ||||||
|  | #error("Unsupported platform.") | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | private func wrapResult(_ result: Any?) -> [Any?] { | ||||||
|  |   return [result] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | private func wrapError(_ error: Any) -> [Any?] { | ||||||
|  |   if let flutterError = error as? FlutterError { | ||||||
|  |     return [ | ||||||
|  |       flutterError.code, | ||||||
|  |       flutterError.message, | ||||||
|  |       flutterError.details | ||||||
|  |     ] | ||||||
|  |   } | ||||||
|  |   return [ | ||||||
|  |     "\(error)", | ||||||
|  |     "\(type(of: error))", | ||||||
|  |     "Stacktrace: \(Thread.callStackSymbols)" | ||||||
|  |   ] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | enum HashAlgorithm: Int { | ||||||
|  |   case sha256 = 0 | ||||||
|  |   case sha384 = 1 | ||||||
|  |   case sha512 = 2 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | enum CipherAlgorithm: Int { | ||||||
|  |   case aes = 0 | ||||||
|  | } | ||||||
|  | /// Generated protocol from Pigeon that represents a handler of messages from Flutter. | ||||||
|  | protocol NativeCryptoAPI { | ||||||
|  |   func hash(data: FlutterStandardTypedData, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func hmac(data: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func generateSecureRandom(length: Int64) throws -> FlutterStandardTypedData? | ||||||
|  |   func pbkdf2(password: FlutterStandardTypedData, salt: FlutterStandardTypedData, length: Int64, iterations: Int64, algorithm: HashAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func encrypt(plainText: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func encryptWithIV(plainText: FlutterStandardTypedData, iv: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func decrypt(cipherText: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> FlutterStandardTypedData? | ||||||
|  |   func encryptFile(plainTextPath: String, cipherTextPath: String, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? | ||||||
|  |   func encryptFileWithIV(plainTextPath: String, cipherTextPath: String, iv: FlutterStandardTypedData, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? | ||||||
|  |   func decryptFile(cipherTextPath: String, plainTextPath: String, key: FlutterStandardTypedData, algorithm: CipherAlgorithm) throws -> Bool? | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /// Generated setup class from Pigeon to handle messages through the `binaryMessenger`. | ||||||
|  | class NativeCryptoAPISetup { | ||||||
|  |   /// The codec used by NativeCryptoAPI. | ||||||
|  |   /// Sets up an instance of `NativeCryptoAPI` to handle messages through the `binaryMessenger`. | ||||||
|  |   static func setUp(binaryMessenger: FlutterBinaryMessenger, api: NativeCryptoAPI?) { | ||||||
|  |     let hashChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.hash", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       hashChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let dataArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = HashAlgorithm(rawValue: args[1] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.hash(data: dataArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       hashChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let hmacChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.hmac", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       hmacChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let dataArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let keyArg = args[1] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = HashAlgorithm(rawValue: args[2] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.hmac(data: dataArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       hmacChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let generateSecureRandomChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.generateSecureRandom", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       generateSecureRandomChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let lengthArg = (args[0] is Int) ? Int64(args[0] as! Int) : args[0] as! Int64 | ||||||
|  |         do { | ||||||
|  |           let result = try api.generateSecureRandom(length: lengthArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       generateSecureRandomChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let pbkdf2Channel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.pbkdf2", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       pbkdf2Channel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let passwordArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let saltArg = args[1] as! FlutterStandardTypedData | ||||||
|  |         let lengthArg = (args[2] is Int) ? Int64(args[2] as! Int) : args[2] as! Int64 | ||||||
|  |         let iterationsArg = (args[3] is Int) ? Int64(args[3] as! Int) : args[3] as! Int64 | ||||||
|  |         let algorithmArg = HashAlgorithm(rawValue: args[4] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.pbkdf2(password: passwordArg, salt: saltArg, length: lengthArg, iterations: iterationsArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       pbkdf2Channel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let encryptChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.encrypt", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       encryptChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let plainTextArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let keyArg = args[1] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[2] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.encrypt(plainText: plainTextArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       encryptChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let encryptWithIVChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.encryptWithIV", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       encryptWithIVChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let plainTextArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let ivArg = args[1] as! FlutterStandardTypedData | ||||||
|  |         let keyArg = args[2] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[3] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.encryptWithIV(plainText: plainTextArg, iv: ivArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       encryptWithIVChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let decryptChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.decrypt", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       decryptChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let cipherTextArg = args[0] as! FlutterStandardTypedData | ||||||
|  |         let keyArg = args[1] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[2] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.decrypt(cipherText: cipherTextArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       decryptChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let encryptFileChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.encryptFile", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       encryptFileChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let plainTextPathArg = args[0] as! String | ||||||
|  |         let cipherTextPathArg = args[1] as! String | ||||||
|  |         let keyArg = args[2] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[3] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.encryptFile(plainTextPath: plainTextPathArg, cipherTextPath: cipherTextPathArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       encryptFileChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let encryptFileWithIVChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.encryptFileWithIV", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       encryptFileWithIVChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let plainTextPathArg = args[0] as! String | ||||||
|  |         let cipherTextPathArg = args[1] as! String | ||||||
|  |         let ivArg = args[2] as! FlutterStandardTypedData | ||||||
|  |         let keyArg = args[3] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[4] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.encryptFileWithIV(plainTextPath: plainTextPathArg, cipherTextPath: cipherTextPathArg, iv: ivArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       encryptFileWithIVChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |     let decryptFileChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.NativeCryptoAPI.decryptFile", binaryMessenger: binaryMessenger) | ||||||
|  |     if let api = api { | ||||||
|  |       decryptFileChannel.setMessageHandler { message, reply in | ||||||
|  |         let args = message as! [Any] | ||||||
|  |         let cipherTextPathArg = args[0] as! String | ||||||
|  |         let plainTextPathArg = args[1] as! String | ||||||
|  |         let keyArg = args[2] as! FlutterStandardTypedData | ||||||
|  |         let algorithmArg = CipherAlgorithm(rawValue: args[3] as! Int)! | ||||||
|  |         do { | ||||||
|  |           let result = try api.decryptFile(cipherTextPath: cipherTextPathArg, plainTextPath: plainTextPathArg, key: keyArg, algorithm: algorithmArg) | ||||||
|  |           reply(wrapResult(result)) | ||||||
|  |         } catch { | ||||||
|  |           reply(wrapError(error)) | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } else { | ||||||
|  |       decryptFileChannel.setMessageHandler(nil) | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
| @ -8,9 +8,8 @@ | |||||||
| import Foundation | import Foundation | ||||||
| 
 | 
 | ||||||
| protocol Cipher { | protocol Cipher { | ||||||
|     var algorithm: CipherAlgorithm { get } |     func encrypt(data: Data, key: Data, predefinedIV: Data?) throws -> Data | ||||||
|     func encrypt(data: Data, key: Data) throws -> Data |  | ||||||
|     func decrypt(data: Data, key: Data) throws -> Data |     func decrypt(data: Data, key: Data) throws -> Data | ||||||
|     func encryptAsList(data: Data, key: Data) throws -> [Data] |     func encryptFile(fileParameters: FileParameters, key: Data, predefinedIV: Data?) throws -> Bool | ||||||
|     func decryptAsList(data: [Data], key: Data) throws-> Data |     func decryptFile(fileParameters: FileParameters, key: Data) throws -> Bool | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,12 +0,0 @@ | |||||||
| // |  | ||||||
| //  Key.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation |  | ||||||
| 
 |  | ||||||
| protocol Key { |  | ||||||
|     var bytes: Data { get set } |  | ||||||
| } |  | ||||||
| @ -8,6 +8,5 @@ | |||||||
| import Foundation | import Foundation | ||||||
| 
 | 
 | ||||||
| protocol KeyDerivation { | protocol KeyDerivation { | ||||||
|     var algorithm : KdfAlgorithm { get } |     func derive() throws -> Data? | ||||||
|     func derive() throws -> SecretKey |  | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,18 +0,0 @@ | |||||||
| // |  | ||||||
| //  CipherAlgorithm.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation |  | ||||||
| 
 |  | ||||||
| enum CipherAlgorithm : String { |  | ||||||
|     case aes = "aes" |  | ||||||
|      |  | ||||||
|     var getCipher: Cipher { |  | ||||||
|         switch self { |  | ||||||
|         case .aes: return AESCipher() |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -6,3 +6,15 @@ | |||||||
| // | // | ||||||
| 
 | 
 | ||||||
| import Foundation | import Foundation | ||||||
|  | 
 | ||||||
|  | class FileParameters { | ||||||
|  |     var inputPath: String | ||||||
|  |     var outputPath: String | ||||||
|  | 
 | ||||||
|  |     init(input: String, output: String) { | ||||||
|  |         self.inputPath = input | ||||||
|  |         self.outputPath = output | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |      | ||||||
|  | } | ||||||
|  | |||||||
| @ -1,45 +0,0 @@ | |||||||
| // |  | ||||||
| //  HashAlgorithm.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation |  | ||||||
| import CommonCrypto |  | ||||||
| import CryptoKit |  | ||||||
| 
 |  | ||||||
| enum HashAlgorithm: String { |  | ||||||
|     case HashSHA256 = "sha256" |  | ||||||
|     case HashSHA384 = "sha384" |  | ||||||
|     case HashSHA512 = "sha512" |  | ||||||
|      |  | ||||||
|     var pbkdf2identifier: UInt32 { |  | ||||||
|         switch self { |  | ||||||
|         case .HashSHA256: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA256) |  | ||||||
|         case .HashSHA384: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA384) |  | ||||||
|         case .HashSHA512: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA512) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     @available(iOS 13.0, *) |  | ||||||
|     func digest(data: Data) -> Data { |  | ||||||
|         switch self { |  | ||||||
|         case .HashSHA256: |  | ||||||
|             return Data(SHA256.hash(data: data)) |  | ||||||
|         case .HashSHA384: |  | ||||||
|             return Data(SHA384.hash(data: data)) |  | ||||||
|         case .HashSHA512: |  | ||||||
|             return Data(SHA512.hash(data: data)) |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
|      |  | ||||||
|     @available(iOS 13.0, *) |  | ||||||
|     static func digest(data: Data, algorithm: String) throws -> Data { |  | ||||||
|         let algo = HashAlgorithm.init(rawValue: algorithm) |  | ||||||
|         if (algo == nil) { |  | ||||||
|             throw NativeCryptoError.messageDigestError |  | ||||||
|         } |  | ||||||
|         return algo!.digest(data: data) |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | // | ||||||
|  | //  HashAlgorithmParser.swift | ||||||
|  | //  native_crypto_ios | ||||||
|  | // | ||||||
|  | //  Created by Hugo Pointcheval on 04/04/2023. | ||||||
|  | // | ||||||
|  | 
 | ||||||
|  | import Foundation | ||||||
|  | import CommonCrypto | ||||||
|  | import CryptoKit | ||||||
|  | 
 | ||||||
|  | public class HashAlgorithmParser { | ||||||
|  |     static func getMessageDigest(algorithm: HashAlgorithm) -> any HashFunction { | ||||||
|  |         switch algorithm { | ||||||
|  |         case .sha256: return SHA256.init() | ||||||
|  |         case .sha384: return SHA384.init() | ||||||
|  |         case .sha512: return SHA512.init() | ||||||
|  |         @unknown default: fatalError("Unknown algorithm") | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     static func getPbkdf2Identifier(algorithm: HashAlgorithm) -> UInt32 { | ||||||
|  |         switch algorithm { | ||||||
|  |         case .sha256: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA256) | ||||||
|  |         case .sha384: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA384) | ||||||
|  |         case .sha512: return CCPBKDFAlgorithm(kCCPRFHmacAlgSHA512) | ||||||
|  |         @unknown default: fatalError("Unknown algorithm") | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -1,12 +0,0 @@ | |||||||
| // |  | ||||||
| //  KdfAlgorithm.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation |  | ||||||
| 
 |  | ||||||
| enum KdfAlgorithm { |  | ||||||
|     case pbkdf2 |  | ||||||
| } |  | ||||||
| @ -7,12 +7,51 @@ | |||||||
| 
 | 
 | ||||||
| import Foundation | import Foundation | ||||||
| 
 | 
 | ||||||
| enum NativeCryptoError : Error { | enum NativeCryptoError : LocalizedError { | ||||||
| case decryptionError |     /// When an operation is not supported | ||||||
| case encryptionError |     case notSupported(reason: String? = nil) | ||||||
| case messageDigestError |     /// When the key is invalid | ||||||
| case pbkdf2Error |     case invalidKey(reason: String? = nil) | ||||||
| case cipherError |     /// When the key length is invalid | ||||||
| case resultError |     case invalidKeySize(reason: String? = nil) | ||||||
| case exceptionError |     /// When operation parameter is invalid | ||||||
|  |     case invalidParameter(reason: String? = nil) | ||||||
|  |     /// When an authentication process fails | ||||||
|  |     case authenticationError(reason: String? = nil) | ||||||
|  |     /// When a input/output process (like file manipulation) fails | ||||||
|  |     case ioError(reason: String? = nil) | ||||||
|  |     /// When cipher initialization fails | ||||||
|  |     case cipherError(reason: String? = nil) | ||||||
|  |     /// When a digest process fails | ||||||
|  |     case digestError(reason: String? = nil) | ||||||
|  |     /// When a key derivation process fails | ||||||
|  |     case kdfError(reason: String? = nil) | ||||||
|  |     /// When any other expection is thrown | ||||||
|  |     case unknownError(reason: String? = nil) | ||||||
|  | 
 | ||||||
|  |     var errorDescription: String? { | ||||||
|  |         switch self { | ||||||
|  |         case .notSupported(reason: let reason): | ||||||
|  |             return reason ?? "This operation is not supported." | ||||||
|  |         case .invalidKey(reason: let reason): | ||||||
|  |             return reason ?? "Invalid key." | ||||||
|  |         case .invalidKeySize(reason: let reason): | ||||||
|  |             return reason ?? "Invalid key size." | ||||||
|  |         case .invalidParameter(reason: let reason): | ||||||
|  |             return reason ?? "Invalid parameter." | ||||||
|  |         case .authenticationError(reason: let reason): | ||||||
|  |             return reason ?? "Authentication fails." | ||||||
|  |         case .ioError(reason: let reason): | ||||||
|  |             return reason ?? "IO operation fails." | ||||||
|  |         case .cipherError(reason: let reason): | ||||||
|  |             return reason ?? "Cipher initialization fails." | ||||||
|  |         case .digestError(reason: let reason): | ||||||
|  |             return reason ?? "Digest fails." | ||||||
|  |         case .kdfError(reason: let reason): | ||||||
|  |             return reason ?? "Key derivation fails." | ||||||
|  |         case .unknownError(reason: let reason): | ||||||
|  |             return reason ?? "An unknown error occurred during the operation." | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
| } | } | ||||||
|  | |||||||
| @ -1,10 +1,3 @@ | |||||||
| // |  | ||||||
| //  Task.swift |  | ||||||
| //  native_crypto_ios |  | ||||||
| // |  | ||||||
| //  Created by Hugo Pointcheval on 25/05/2022. |  | ||||||
| // |  | ||||||
| 
 |  | ||||||
| import Foundation | import Foundation | ||||||
| 
 | 
 | ||||||
| class Task<T> { | class Task<T> { | ||||||
| @ -30,7 +23,7 @@ class Task<T> { | |||||||
|         if (exception != nil) { |         if (exception != nil) { | ||||||
|             return exception! |             return exception! | ||||||
|         } else { |         } else { | ||||||
|             return NativeCryptoError.exceptionError |             return NativeCryptoError.unknownError() | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|      |      | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user