From f59279997063b3ce4751c5f3ef26f98a0c501378 Mon Sep 17 00:00:00 2001
From: Hugo Pointcheval
Date: Wed, 25 May 2022 21:33:51 +0200
Subject: [PATCH] docs: update readme
---
README.md | 110 ++++++++++++++++++-
resources/bench_nc_android_oneplus_A5010.csv | 14 +++
resources/bench_nc_ios_iphone13.csv | 14 +++
resources/bench_pc_android_oneplus_A5010.csv | 9 ++
resources/bench_pc_ios_iphone13.csv | 14 +++
resources/benchmark_pointycastle.png | Bin 123423 -> 0 bytes
resources/benchmarks.png | Bin 0 -> 115262 bytes
7 files changed, 159 insertions(+), 2 deletions(-)
create mode 100644 resources/bench_nc_android_oneplus_A5010.csv
create mode 100644 resources/bench_nc_ios_iphone13.csv
create mode 100644 resources/bench_pc_android_oneplus_A5010.csv
create mode 100644 resources/bench_pc_ios_iphone13.csv
delete mode 100644 resources/benchmark_pointycastle.png
create mode 100644 resources/benchmarks.png
diff --git a/README.md b/README.md
index e7423e8..e9b0b7c 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,109 @@
-# NativeCrypto
+
+
+
Fast and powerful cryptographic functions for Flutter.
+
-Fast and powerful cryptographic functions thanks to **javax.crypto** , **CommonCrypto** and **CryptoKit**.
\ No newline at end of file
+
+
+
+
+
+
+
+
+
+
+---
+
+[[Changelog]](./CHANGELOG.md) | [[License]](./LICENSE)
+
+---
+
+## About
+
+The goal of this plugin is to provide a fast and powerful cryptographic functions by calling native libraries. On Android, it uses [javax.cypto](https://developer.android.com/reference/javax/crypto/package-summary), and on iOS, it uses [CommonCrypto](https://opensource.apple.com/source/CommonCrypto/) and [CryptoKit](https://developer.apple.com/documentation/cryptokit/)
+
+I started this projet because I wanted to add cryptographic functions on a Flutter app. But I faced a problem with the well-known [Pointy Castle](https://pub.dev/packages/pointycastle) library: the performance was very poor. Here some benchmarks and comparison:
+
+
+
+For comparison, on a *iPhone 13*, you can encrypt/decrypt a message of **2MiB** in **~5.6s** with PointyCastle and in **~40ms** with NativeCrypto. And on an *OnePlus 5*, you can encrypt/decrypt a message of **50MiB** in **~6min30** with PointyCastle and in less than **~1s** with NativeCrypto.
+
+In short, NativeCrypto is incomparable with PointyCastle.
+
+## Usage
+
+First, check compatibility with your targets.
+
+| iOS | Android | MacOS | Linux | Windows | Web |
+| --- | ------- | ----- | ----- | ------- | --- |
+| ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
+
+#### Hash
+
+To digest a message, you can use the following function:
+
+```dart
+Uint8List hash = await HashAlgorithm.sha256.digest(message);
+```
+
+Note that you can find a `toBytes()` method in the example app, to convert a `String` to a `Uint8List`.
+
+> In NativeCrypto, you can use the following hash functions: SHA-256, SHA-384, SHA-512
+
+#### Keys
+
+You can build a `SecretKey` from a utf8, base64, base16 (hex) strings or raw bytes. You can also generate a SecretKey from secure random.
+
+```dart
+SecretKey secretKey = SecretKey(Uint8List.fromList([0x73, 0x65, 0x63, 0x72, 0x65, 0x74]));
+SecretKey secretKey = SecretKey.fromUtf8('secret');
+SecretKey secretKey = SecretKey.fromBase64('c2VjcmV0');
+SecretKey secretKey = SecretKey.fromBase16('63657274');
+SecretKey secretKey = await SecretKey.fromSecureRandom(256);
+```
+
+#### Key derivation
+
+You can derive a `SecretKey` using **PBKDF2**.
+
+First, you need to initialize a `Pbkdf2` object.
+
+```dart
+Pbkdf2 pbkdf2 = Pbkdf2(32, 1000, algorithm: HashAlgorithm.sha512);
+```
+
+Then, you can derive a `SecretKey` from a password and salt.
+
+```dart
+SecretKey secretKey = await pbkdf2.derive(password: password, salt: 'salt');
+```
+
+> In NativeCrypto, you can use the following key derivation function: PBKDF2
+
+#### Cipher
+
+And now, you can use the `SecretKey` to encrypt/decrypt a message.
+
+First, you need to initialize a `Cipher` object.
+
+```dart
+AES cipher = AES(secretKey, AESMode.gcm);
+```
+
+Then, you can encrypt/decrypt your message.
+
+```dart
+CipherText encrypted = await cipher.encrypt(message);
+Uint8List decrypted = await cipher.decrypt(encrypted);
+```
+
+After an encryption, you can use the `CipherText` object to access underlying data.
+
+```dart
+Uint8List iv = encrypted.iv;
+Uint8List data = encrypted.data;
+Uint8List tag = encrypted.tag;
+```
+
+Note that data and tag are costly to access, so you should only use them if you need to !
\ No newline at end of file
diff --git a/resources/bench_nc_android_oneplus_A5010.csv b/resources/bench_nc_android_oneplus_A5010.csv
new file mode 100644
index 0000000..5789c98
--- /dev/null
+++ b/resources/bench_nc_android_oneplus_A5010.csv
@@ -0,0 +1,14 @@
+Run;Size (B);Encryption Time (ms);Decryption Time (ms)
+1;2097152;48;64
+2;6291456;52;52
+3;10485760;105;83
+4;14680064;96;198
+5;18874368;116;143
+6;23068672;253;257
+7;27262976;164;213
+8;31457280;271;270
+9;35651584;339;356
+10;39845888;316;320
+11;44040192;370;412
+12;48234496;425;368
+13;52428800;430;402
\ No newline at end of file
diff --git a/resources/bench_nc_ios_iphone13.csv b/resources/bench_nc_ios_iphone13.csv
new file mode 100644
index 0000000..47ef2ec
--- /dev/null
+++ b/resources/bench_nc_ios_iphone13.csv
@@ -0,0 +1,14 @@
+Run;Size (B);Encryption Time (ms);Decryption Time (ms)
+1;2097152;20;16
+2;6291456;13;13
+3;10485760;16;22
+4;14680064;23;37
+5;18874368;21;48
+6;23068672;34;45
+7;27262976;38;72
+8;31457280;59;72
+9;35651584;70;74
+10;39845888;61;85
+11;44040192;80;92
+12;48234496;90;113
+13;52428800;79;111
\ No newline at end of file
diff --git a/resources/bench_pc_android_oneplus_A5010.csv b/resources/bench_pc_android_oneplus_A5010.csv
new file mode 100644
index 0000000..48346c9
--- /dev/null
+++ b/resources/bench_pc_android_oneplus_A5010.csv
@@ -0,0 +1,9 @@
+size;encryption time;encode time;decryption time;crypto time
+2000000;7764;7302;0
+4000000;14720;14580;0
+8000000;29421;29037;0
+16000000;58874;58304;0
+32000000;117964;116570;0
+64000000;235122;232923;0
+128000000;469697;466278;0
+256000000;0;0;0
\ No newline at end of file
diff --git a/resources/bench_pc_ios_iphone13.csv b/resources/bench_pc_ios_iphone13.csv
new file mode 100644
index 0000000..3f01464
--- /dev/null
+++ b/resources/bench_pc_ios_iphone13.csv
@@ -0,0 +1,14 @@
+Run;Size (B);Encryption Time (ms);Decryption Time (ms)
+1;2097152;2420;2289
+2;6291456;7118;7369
+3;10485760;12766;13051
+4;14680064;18594;19029
+5;18874368;27449;27927
+6;23068672;34093;33863
+7;27262976;39855;39981
+8;31457280;46359;46089
+9;35651584;52596;52375
+10;39845888;59151;58881
+11;44040192;65914;65590
+12;48234496;71908;72099
+13;52428800;79202;78571
\ No newline at end of file
diff --git a/resources/benchmark_pointycastle.png b/resources/benchmark_pointycastle.png
deleted file mode 100644
index 0f357353cae33376c1ee99e346f06bd57e1a07d9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 123423
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%0AEm!wrv$ZlK@zT#e)HU`0CSuGUrPE
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