Remove old API
This commit is contained in:
		
							parent
							
								
									9daa2f129e
								
							
						
					
					
						commit
						501e5bcf08
					
				| @ -1,22 +0,0 @@ | ||||
| // Copyright (c) 2020 | ||||
| // Author: Hugo Pointcheval | ||||
| 
 | ||||
| class KeyException implements Exception { | ||||
|   String message; | ||||
|   KeyException(this.message); | ||||
| } | ||||
| 
 | ||||
| class EncryptionException implements Exception { | ||||
|   String message; | ||||
|   EncryptionException(this.message); | ||||
| } | ||||
| 
 | ||||
| class DecryptionException implements Exception { | ||||
|   String message; | ||||
|   DecryptionException(this.message); | ||||
| } | ||||
| 
 | ||||
| class NotImplementedException implements Exception { | ||||
|   String message; | ||||
|   NotImplementedException(this.message); | ||||
| } | ||||
| @ -1,88 +0,0 @@ | ||||
| // Copyright (c) 2020 | ||||
| // Author: Hugo Pointcheval | ||||
| import 'dart:async'; | ||||
| import 'dart:typed_data'; | ||||
| 
 | ||||
| import 'package:flutter/services.dart'; | ||||
| import 'package:native_crypto/exceptions.dart'; | ||||
| 
 | ||||
| /// [Sources] | ||||
| /// Plugin class. | ||||
| /// Contains raw functions and specific platform calls. | ||||
| ///  | ||||
| /// Use [symmetrical_crypto] for an **AES Layer API**. | ||||
| class NativeCrypto { | ||||
|   /// [Private] | ||||
|   /// Contains the channel for platform specific code. | ||||
|   static const MethodChannel _channel = | ||||
|       const MethodChannel('native.crypto.helper'); | ||||
| 
 | ||||
|   /// PBKDF2. | ||||
|   /// | ||||
|   /// [keyLength] is in Bytes.  | ||||
|   /// It returns an `Uint8List`. | ||||
|   Future<Uint8List> pbkdf2(String password, String salt, {int keyLength: 32, int iteration: 10000, String algorithm: 'sha256'}) async { | ||||
|     Uint8List key; | ||||
|     try { | ||||
|       key = await _channel.invokeMethod('pbkdf2', <String, dynamic>{ | ||||
|       'password': password, | ||||
|       'salt': salt, | ||||
|       'keyLength': keyLength, | ||||
|       'iteration': iteration, | ||||
|       'algorithm': algorithm, | ||||
|     }); | ||||
|     } on PlatformException catch (e) { | ||||
|       throw e; | ||||
|     } | ||||
|     return key; | ||||
|   } | ||||
|    | ||||
|   /// Generates AES key. | ||||
|   /// | ||||
|   /// [size] is in bits, 128, 192 or 256.  | ||||
|   /// It returns an `Uint8List`. | ||||
|   Future<Uint8List> symKeygen(int size) async { | ||||
|     Uint8List aesKey; | ||||
|     try { | ||||
|       aesKey = await _channel.invokeMethod('symKeygen', <String, dynamic>{ | ||||
|       'size': size, | ||||
|     }); | ||||
|     } on PlatformException catch (e) { | ||||
|       throw e; | ||||
|     } | ||||
|     return aesKey; | ||||
|   } | ||||
| 
 | ||||
|   /// Encrypts passed data with a given AES key. | ||||
|   /// | ||||
|   /// Generates a random **IV**. Returns a list | ||||
|   /// of `Uint8List` with encrypted cipher as first | ||||
|   /// and IV as second member. | ||||
|   Future<List<Uint8List>> symEncrypt( | ||||
|       Uint8List payloadbytes, Uint8List aesKey) async { | ||||
|     final List<Uint8List> encryptedPayload = | ||||
|         await _channel.invokeListMethod('symEncrypt', <String, dynamic>{ | ||||
|       'payload': payloadbytes, | ||||
|       'aesKey': aesKey, | ||||
|     }); | ||||
|     return encryptedPayload; | ||||
|   } | ||||
| 
 | ||||
|   /// Decrypts a passed payload with a given AES key. | ||||
|   /// | ||||
|   /// The payload must be a list of `Uint8List` | ||||
|   /// with encrypted cipher as first and IV as second member. | ||||
|   Future<Uint8List> symDecrypt( | ||||
|       List<Uint8List> payloadbytes, Uint8List aesKey) async { | ||||
|     Uint8List decryptedPayload; | ||||
|     try { | ||||
|       decryptedPayload = await _channel.invokeMethod('symDecrypt', <String, dynamic>{ | ||||
|       'payload': payloadbytes, | ||||
|       'aesKey': aesKey, | ||||
|     }); | ||||
|     } on PlatformException catch (e) { | ||||
|       throw DecryptionException(e.message); | ||||
|     } | ||||
|     return decryptedPayload; | ||||
|   } | ||||
| } | ||||
| @ -1,203 +0,0 @@ | ||||
| // Copyright (c) 2020 | ||||
| // Author: Hugo Pointcheval | ||||
| import 'dart:async'; | ||||
| import 'dart:developer'; | ||||
| import 'dart:typed_data'; | ||||
| 
 | ||||
| import 'package:flutter/services.dart'; | ||||
| 
 | ||||
| import 'src/native_crypto.dart'; | ||||
| import 'exceptions.dart'; | ||||
| 
 | ||||
| const String TAG_ERROR = 'error.native_crypto.symmetric_crypto'; | ||||
| const String TAG_DEBUG = 'debug.native_crypto.symmetric_crypto'; | ||||
| 
 | ||||
| /// Defines all available key sizes. | ||||
| enum KeySize { bits128, bits192, bits256 } | ||||
| 
 | ||||
| /// Defines all available digest. | ||||
| enum Digest { sha1, sha256, sha512 } | ||||
| 
 | ||||
| /// Defines all available ciphers. | ||||
| enum Cipher { AES } | ||||
| 
 | ||||
| /// Key Helper | ||||
| /// | ||||
| /// You can generate Secret keys of different sizes. | ||||
| class KeyGenerator { | ||||
|   /// Generate a secret key. | ||||
|   /// | ||||
|   /// You can specify a `keySize`. Default is **256 bits**. | ||||
|   /// It returns an `Uint8List`. | ||||
|   Future<Uint8List> secretKey({KeySize keySize = KeySize.bits256}) async { | ||||
|     Map<KeySize, int> availableSizes = { | ||||
|       KeySize.bits128: 128, | ||||
|       KeySize.bits192: 192, | ||||
|       KeySize.bits256: 256 | ||||
|     }; | ||||
|     int size = availableSizes[keySize]; | ||||
| 
 | ||||
|     Uint8List key; | ||||
|     try { | ||||
|       key = await NativeCrypto().symKeygen(size); | ||||
|       log("KEY LENGTH: ${key.length}", name: TAG_DEBUG); | ||||
|     } on PlatformException catch (e) { | ||||
|       log(e.message, name: TAG_ERROR); | ||||
|       throw e; | ||||
|     } | ||||
|     return key; | ||||
|   } | ||||
| 
 | ||||
|   /// PBKDF2. | ||||
|   /// | ||||
|   /// `keyLength` is in Bytes. | ||||
|   /// It returns an `Uint8List`. | ||||
|   Future<Uint8List> pbkdf2(String password, String salt, | ||||
|       {int keyLength: 32, | ||||
|       int iteration: 10000, | ||||
|       Digest digest: Digest.sha256}) async { | ||||
|     Uint8List key; | ||||
| 
 | ||||
|     Map<Digest, String> availableDigests = { | ||||
|       Digest.sha1: 'sha1', | ||||
|       Digest.sha256: 'sha256', | ||||
|       Digest.sha512: 'sha512', | ||||
|     }; | ||||
| 
 | ||||
|     String algo = availableDigests[digest]; | ||||
| 
 | ||||
|     try { | ||||
|       key = await NativeCrypto().pbkdf2(password, salt, | ||||
|           keyLength: keyLength, iteration: iteration, algorithm: algo); | ||||
|       log("PBKDF2 KEY LENGTH: ${key.length} | DIGEST: $algo", name: TAG_DEBUG); | ||||
|     } on PlatformException catch (e) { | ||||
|       log(e.message, name: TAG_ERROR); | ||||
|       throw e; | ||||
|     } | ||||
|     return key; | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| /// AES Helper | ||||
| /// | ||||
| /// You can encrypt and decrypt data. | ||||
| class AES { | ||||
|   Uint8List _key; | ||||
| 
 | ||||
|   bool _isInitialized = false; | ||||
| 
 | ||||
|   KeySize _keySize; | ||||
| 
 | ||||
|   /// You can pass a key in constructor. | ||||
|   AES({Uint8List key}) { | ||||
|     this._key = key; | ||||
|     try { | ||||
|       this._isInitialized = _testKey(); | ||||
|     } on KeyException catch (e) { | ||||
|       this._isInitialized = false; | ||||
|       throw e; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /// This key is used for encryption and decryption. | ||||
|   Uint8List get key => this._key; | ||||
| 
 | ||||
|   /// Check if the AES object is intialized with a valid key before perform any operation. | ||||
|   bool get isInitialized => this._isInitialized; | ||||
| 
 | ||||
|   /// Defines the size of the generated or passed key. | ||||
|   KeySize get keySize => this._keySize; | ||||
| 
 | ||||
|   /// [Private] | ||||
|   /// Tests if the key is valid. | ||||
|   /// | ||||
|   /// The key must be 128, 192 or 256 bits long. | ||||
|   bool _testKey() { | ||||
|     if (this.key != null) { | ||||
|       switch (this.key.length) { | ||||
|         case 16: | ||||
|           this._keySize = KeySize.bits128; | ||||
|           break; | ||||
|         case 24: | ||||
|           this._keySize = KeySize.bits192; | ||||
|           break; | ||||
|         case 32: | ||||
|           this._keySize = KeySize.bits256; | ||||
|           break; | ||||
|         default: | ||||
|           var error = 'Invalid key length: ${this.key.length} Bytes'; | ||||
|           log(error, name: TAG_ERROR); | ||||
|           throw KeyException(error); | ||||
|       } | ||||
|       return true; | ||||
|     } else { | ||||
|       return false; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /// Generate an AES key. | ||||
|   /// | ||||
|   /// You have to specify a `keySize`. | ||||
|   /// Return `null` if the key is already set. | ||||
|   init(KeySize keySize) async { | ||||
|     if (this.key != null) return null; | ||||
| 
 | ||||
|     this._keySize = keySize; | ||||
| 
 | ||||
|     try { | ||||
|       this._key = await KeyGenerator().secretKey(keySize: keySize); | ||||
|     } on PlatformException catch (e) { | ||||
|       log(e.message, name: TAG_ERROR); | ||||
|     } | ||||
| 
 | ||||
|     try { | ||||
|       this._isInitialized = _testKey(); | ||||
|     } on KeyException catch (e) { | ||||
|       this._isInitialized = false; | ||||
|       throw e; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   /// Encrypts data. | ||||
|   /// | ||||
|   /// Takes `Uint8List` data as parameter. | ||||
|   /// And returns an `Uint8List` **list**. | ||||
|   /// | ||||
|   /// You can pass a different key. | ||||
|   /// | ||||
|   /// The first member of this list is the `cipher data`, | ||||
|   /// and the second member is the `IV`. | ||||
|   Future<List<Uint8List>> encrypt(Uint8List data, {Uint8List key}) async { | ||||
|     if (!this._isInitialized && key == null) | ||||
|       throw EncryptionException( | ||||
|           'Instance not initialized. You can pass a key directly in encrypt method.'); | ||||
| 
 | ||||
|     List<Uint8List> encryptedPayload = | ||||
|         await NativeCrypto().symEncrypt(data, key ?? this.key); | ||||
|     return encryptedPayload; | ||||
|   } | ||||
| 
 | ||||
|   /// Decrypts data. | ||||
|   /// | ||||
|   /// Takes `Uint8List` **list** as parameter. | ||||
|   /// And returns plain text data as `Uint8List`. | ||||
|   /// | ||||
|   /// You can pass a different key. | ||||
|   Future<Uint8List> decrypt(List<Uint8List> encryptedPayload, | ||||
|       {Uint8List key}) async { | ||||
|     if (!this._isInitialized && key == null) | ||||
|       throw DecryptionException( | ||||
|           'Instance not initialized. You can pass a key directly in decrypt method.'); | ||||
| 
 | ||||
|     Uint8List decryptedPayload; | ||||
|     try { | ||||
|       decryptedPayload = | ||||
|           await NativeCrypto().symDecrypt(encryptedPayload, key ?? this.key); | ||||
|     } on DecryptionException catch (e) { | ||||
|       log(e.message, name: TAG_ERROR); | ||||
|       throw e; | ||||
|     } | ||||
| 
 | ||||
|     return decryptedPayload; | ||||
|   } | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user