Add native examples

This commit is contained in:
Hugo Pointcheval 2021-12-28 18:20:06 +01:00
parent 41b59b2b93
commit 8cd192c6b0
3 changed files with 129 additions and 113 deletions

View File

@ -1,74 +1,84 @@
// Author: Hugo Pointcheval
// Email: git@pcl.ovh
// -----
// File: main.dart
// Created Date: 27/12/2021 22:43:20
// Last Modified: 28/12/2021 18:18:44
// -----
// Copyright (c) 2021
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:native_crypto_platform_interface/native_crypto_platform_interface.dart'; import 'package:native_crypto_platform_interface/native_crypto_platform_interface.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
class MyApp extends StatefulWidget { void run() async {
NativeCryptoPlatform _nativeCryptoPlatform = NativeCryptoPlatform.instance;
debugPrint("Benchmark");
int size = 25;
int iterations = 25;
int totalEnc = 0;
int totalDec = 0;
debugPrint("Size: $size MB");
Uint8List? secretKey = await _nativeCryptoPlatform.generateSecretKey(128);
debugPrint("Generate random data...");
var before = DateTime.now();
Uint8List data = Uint8List(size * 1024 * 1024);
var after = DateTime.now();
debugPrint("Generate random data: ${after.difference(before).inMilliseconds} ms");
for (var _ in List.generate(iterations, (index) => index)) {
debugPrint("Encrypt data...");
before = DateTime.now();
Uint8List? encrypted = await _nativeCryptoPlatform.encrypt(data, secretKey!, "aes");
after = DateTime.now();
debugPrint("Encrypt data: ${after.difference(before).inMilliseconds} ms");
totalEnc += after.difference(before).inMilliseconds;
debugPrint("Decrypt data...");
before = DateTime.now();
data = (await _nativeCryptoPlatform.decrypt(encrypted!, secretKey, "aes"))!;
after = DateTime.now();
debugPrint("Decrypt data: ${after.difference(before).inMilliseconds} ms");
totalDec += after.difference(before).inMilliseconds;
}
debugPrint("Average Encrypt: ${totalEnc/iterations} ms for $size MB");
debugPrint("Average Decrypt: ${totalDec/iterations} ms for $size MB");
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key); const MyApp({Key? key}) : super(key: key);
@override @override
State<MyApp> createState() => _MyAppState(); Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
} }
class _MyAppState extends State<MyApp> { class MyHomePage extends StatelessWidget {
String _platformVersion = 'Unknown'; const MyHomePage({Key? key}) : super(key: key);
@override
void initState() {
super.initState();
initPlatformState();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
NativeCryptoPlatform _nativeCryptoPlatform = NativeCryptoPlatform.instance;
String platformVersion;
// Platform messages may fail, so we use a try/catch PlatformException.
// We also handle the message potentially returning null.
Uint8List? sk = await _nativeCryptoPlatform.generateSecretKey(256);
print(sk ?? 'null');
Uint8List? ciphertext = await _nativeCryptoPlatform.encrypt(
Uint8List.fromList("abc".codeUnits), sk!, "aes");
print(ciphertext ?? 'null');
Uint8List? plaintext =
await _nativeCryptoPlatform.decrypt(ciphertext!, sk, "aes");
print(plaintext ?? 'null');
try {
platformVersion = 'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( run();
home: Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Plugin example app'), title: const Text('Plugin example app'),
), ),
body: Center( body: const Center(
child: Text('Running on: $_platformVersion\n'), child: Text("Check the console"),
),
), ),
); );
} }

View File

@ -108,7 +108,7 @@ packages:
path: "../../native_crypto_platform_interface" path: "../../native_crypto_platform_interface"
relative: true relative: true
source: path source: path
version: "0.0.7" version: "0.1.0"
path: path:
dependency: transitive dependency: transitive
description: description:

View File

@ -1,78 +1,84 @@
// Author: Hugo Pointcheval
// Email: git@pcl.ovh
// -----
// File: main.dart
// Created Date: 27/12/2021 22:43:20
// Last Modified: 28/12/2021 18:19:37
// -----
// Copyright (c) 2021
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'dart:async';
import 'package:flutter/services.dart';
import 'package:native_crypto_platform_interface/native_crypto_platform_interface.dart'; import 'package:native_crypto_platform_interface/native_crypto_platform_interface.dart';
void main() { void main() {
runApp(const MyApp()); runApp(const MyApp());
} }
class MyApp extends StatefulWidget { void run() async {
NativeCryptoPlatform _nativeCryptoPlatform = NativeCryptoPlatform.instance;
debugPrint("Benchmark");
int size = 25;
int iterations = 25;
int totalEnc = 0;
int totalDec = 0;
debugPrint("Size: $size MB");
Uint8List? secretKey = await _nativeCryptoPlatform.generateSecretKey(128);
debugPrint("Generate random data...");
var before = DateTime.now();
Uint8List data = Uint8List(size * 1024 * 1024);
var after = DateTime.now();
debugPrint("Generate random data: ${after.difference(before).inMilliseconds} ms");
for (var _ in List.generate(iterations, (index) => index)) {
debugPrint("Encrypt data...");
before = DateTime.now();
Uint8List? encrypted = await _nativeCryptoPlatform.encrypt(data, secretKey!, "aes");
after = DateTime.now();
debugPrint("Encrypt data: ${after.difference(before).inMilliseconds} ms");
totalEnc += after.difference(before).inMilliseconds;
debugPrint("Decrypt data...");
before = DateTime.now();
data = (await _nativeCryptoPlatform.decrypt(encrypted!, secretKey, "aes"))!;
after = DateTime.now();
debugPrint("Decrypt data: ${after.difference(before).inMilliseconds} ms");
totalDec += after.difference(before).inMilliseconds;
}
debugPrint("Average Encrypt: ${totalEnc/iterations} ms for $size MB");
debugPrint("Average Decrypt: ${totalDec/iterations} ms for $size MB");
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key); const MyApp({Key? key}) : super(key: key);
@override @override
State<MyApp> createState() => _MyAppState(); Widget build(BuildContext context) {
return const MaterialApp(
home: MyHomePage(),
);
}
} }
class _MyAppState extends State<MyApp> { class MyHomePage extends StatelessWidget {
String _platformVersion = 'Unknown'; const MyHomePage({Key? key}) : super(key: key);
@override
void initState() {
super.initState();
initPlatformState();
}
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
NativeCryptoPlatform _nativeCryptoPlatform = NativeCryptoPlatform.instance;
String platformVersion;
// Platform messages may fail, so we use a try/catch PlatformException.
// We also handle the message potentially returning null.
Uint8List? sk = await _nativeCryptoPlatform.generateSecretKey(256);
print(sk ?? 'null');
Uint8List? ciphertext = await _nativeCryptoPlatform.encrypt(Uint8List.fromList("abc".codeUnits), sk!, "aes");
print(ciphertext ?? 'null');
Uint8List? plaintext = await _nativeCryptoPlatform.decrypt(ciphertext!, sk, "aes");
print(plaintext ?? 'null');
Uint8List? kp = await _nativeCryptoPlatform.generateKeyPair();
print(kp!.sublist(0, 31));
print(kp.sublist(32).length);
Uint8List? sharedSecret = await _nativeCryptoPlatform.generateSharedSecretKey(Uint8List.fromList("salt".codeUnits), 32, kp.sublist(0, 31), kp.sublist(32), "sha256");
try {
platformVersion = 'Unknown platform version';
} on PlatformException {
platformVersion = 'Failed to get platform version.';
}
// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;
setState(() {
_platformVersion = platformVersion;
});
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MaterialApp( run();
home: Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: const Text('Plugin example app'), title: const Text('Plugin example app'),
), ),
body: Center( body: const Center(
child: Text('Running on: $_platformVersion\n'), child: Text("Check the console"),
),
), ),
); );
} }