diff --git a/lib/exceptions.dart b/lib/exceptions.dart deleted file mode 100644 index b14d965..0000000 --- a/lib/exceptions.dart +++ /dev/null @@ -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); -} diff --git a/lib/src/native_crypto.dart b/lib/src/native_crypto.dart deleted file mode 100644 index e78dce1..0000000 --- a/lib/src/native_crypto.dart +++ /dev/null @@ -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 pbkdf2(String password, String salt, {int keyLength: 32, int iteration: 10000, String algorithm: 'sha256'}) async { - Uint8List key; - try { - key = await _channel.invokeMethod('pbkdf2', { - '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 symKeygen(int size) async { - Uint8List aesKey; - try { - aesKey = await _channel.invokeMethod('symKeygen', { - '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> symEncrypt( - Uint8List payloadbytes, Uint8List aesKey) async { - final List encryptedPayload = - await _channel.invokeListMethod('symEncrypt', { - '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 symDecrypt( - List payloadbytes, Uint8List aesKey) async { - Uint8List decryptedPayload; - try { - decryptedPayload = await _channel.invokeMethod('symDecrypt', { - 'payload': payloadbytes, - 'aesKey': aesKey, - }); - } on PlatformException catch (e) { - throw DecryptionException(e.message); - } - return decryptedPayload; - } -} \ No newline at end of file diff --git a/lib/symmetric_crypto.dart b/lib/symmetric_crypto.dart deleted file mode 100644 index 21af73a..0000000 --- a/lib/symmetric_crypto.dart +++ /dev/null @@ -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 secretKey({KeySize keySize = KeySize.bits256}) async { - Map 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 pbkdf2(String password, String salt, - {int keyLength: 32, - int iteration: 10000, - Digest digest: Digest.sha256}) async { - Uint8List key; - - Map 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> 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 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 decrypt(List 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; - } -}