From 7793e1fed4618aeac53b731ee10d0132cb7dce20 Mon Sep 17 00:00:00 2001 From: Herbert Poul Date: Wed, 15 Jul 2020 11:56:47 +0200 Subject: [PATCH] always use Argon2FfiFlutter from base package, add windows support, etc. --- .github/workflows/dart.yml | 12 ++++++++---- README.md | 18 ++++++++++++++++++ argon2_ffi_plugin.dll | Bin 0 -> 116224 bytes bin/_argon2.dart | 24 ------------------------ bin/kdbx.dart | 10 ++++++---- example/pubspec.lock | 9 ++++++++- test/internal/test_utils.dart | 19 ++----------------- test/kdbx4_test.dart | 3 ++- 8 files changed, 44 insertions(+), 51 deletions(-) create mode 100644 argon2_ffi_plugin.dll delete mode 100644 bin/_argon2.dart diff --git a/.github/workflows/dart.yml b/.github/workflows/dart.yml index aec8772..1cdc282 100644 --- a/.github/workflows/dart.yml +++ b/.github/workflows/dart.yml @@ -4,14 +4,18 @@ on: [push] jobs: build: + strategy: + matrix: + os: ['ubuntu-latest', 'windows-2019', 'macos-latest'] + dart_channel: ['stable'] - runs-on: ubuntu-latest - - container: - image: google/dart:2.8 + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v1 + - uses: cedx/setup-dart@v2 + with: + release-channel: ${{ matrix.dart_channel }} - name: Install dependencies run: pub get - name: Run tests diff --git a/README.md b/README.md index 744e78b..905ffd9 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,24 @@ TODO root directory contains shared libraris (libargon2*) which are built from https://github.com/authpass/argon2_ffi +* MacOS: + * argon2_ffi/ios/Classes + * `cmake . && cmake --build .` + * `cp libargon2_ffi.dylib kdbx.dart/` +* Linux: + * argon2_ffi/ios/Classes + * `cmake . && cmake --build .` + * `cp libargon2_ffi.so kdbx.dart/` +* Windows: + * Install Visual Studio Commnity Edition with C++ Development environment + * Start "Developer Command Prompt for VS 2019" + * argon2_ffi/ios/Classes: + ``` + cmake . + cmake --build . + cp Debug\argon2_ffi.dll C:\kdbx.dart\argon2_ffi_plugin.dll + ``` + # OLD INFO: # TODO diff --git a/argon2_ffi_plugin.dll b/argon2_ffi_plugin.dll new file mode 100644 index 0000000000000000000000000000000000000000..5f76e1bc6fbf11f3798676b6b5f6085b438b5645 GIT binary patch literal 116224 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 Function(Pointer str); -import 'dart:ffi'; -import 'dart:io'; - -import 'package:argon2_ffi_base/argon2_ffi_base.dart'; - -// TODO: This should be somehow combined with the test variant -// which also loads the requierd dylib/so files. - -class Argon2Test extends Argon2Base { - Argon2Test() { - final argon2lib = Platform.isMacOS - ? DynamicLibrary.open('libargon2_ffi.dylib') - : DynamicLibrary.open('./libargon2_ffi.so'); - argon2hash = argon2lib - .lookup>('hp_argon2_hash') - .asFunction(); - } - - @override - Argon2Hash argon2hash; -} diff --git a/bin/kdbx.dart b/bin/kdbx.dart index 3181c99..aa6a2e3 100644 --- a/bin/kdbx.dart +++ b/bin/kdbx.dart @@ -1,6 +1,8 @@ import 'dart:async'; +import 'dart:ffi'; import 'dart:io'; +import 'package:argon2_ffi_base/argon2_ffi_base.dart'; import 'package:args/args.dart'; import 'package:args/command_runner.dart'; import 'package:kdbx/kdbx.dart'; @@ -11,13 +13,13 @@ import 'package:logging/logging.dart'; import 'package:logging_appenders/logging_appenders.dart'; import 'package:prompts/prompts.dart' as prompts; -import '_argon2.dart'; - final _logger = Logger('kdbx'); void main(List arguments) { exitCode = 0; - + final path = Platform.script.resolve('../argon2_ffi_plugin.dll').toFilePath(); + print('loading $path'); + DynamicLibrary.open(path); final runner = KdbxCommandRunner('kdbx', 'Kdbx Utility'); runner.run(arguments).catchError((dynamic error, StackTrace stackTrace) { if (error is! UsageException) { @@ -92,7 +94,7 @@ abstract class KdbxFileCommand extends Command { final keyFileData = keyFile == null ? null : await File(keyFile).readAsBytes(); - final file = await KdbxFormat(Argon2Test()).read( + final file = await KdbxFormat(Argon2FfiFlutter()).read( bytes, Credentials.composite(ProtectedValue.fromString(password), keyFileData), ); diff --git a/example/pubspec.lock b/example/pubspec.lock index 188055a..31a1933 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -1,6 +1,13 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: + argon2_ffi_base: + dependency: transitive + description: + name: argon2_ffi_base + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.1" args: dependency: transitive description: @@ -231,6 +238,6 @@ packages: name: xml url: "https://pub.dartlang.org" source: hosted - version: "3.7.0" + version: "4.2.0" sdks: dart: ">=2.8.0 <3.0.0" diff --git a/test/internal/test_utils.dart b/test/internal/test_utils.dart index 0b221bd..3bcd93e 100644 --- a/test/internal/test_utils.dart +++ b/test/internal/test_utils.dart @@ -1,5 +1,4 @@ //typedef HashStuff = Pointer Function(Pointer str); -import 'dart:ffi'; import 'dart:io'; import 'dart:typed_data'; @@ -8,26 +7,12 @@ import 'package:kdbx/kdbx.dart'; // ignore_for_file: non_constant_identifier_names -class Argon2Test extends Argon2Base { - Argon2Test() { - final argon2lib = Platform.isMacOS - ? DynamicLibrary.open('libargon2_ffi.dylib') - : DynamicLibrary.open('./libargon2_ffi.so'); - argon2hash = argon2lib - .lookup>('hp_argon2_hash') - .asFunction(); - } - - @override - Argon2Hash argon2hash; -} - class TestUtil { static Future readKdbxFile( String filePath, { String password = 'asdf', }) async { - final kdbxFormat = KdbxFormat(Argon2Test()); + final kdbxFormat = KdbxFormat(Argon2FfiFlutter()); final data = await File(filePath).readAsBytes(); final file = await kdbxFormat.read( data, Credentials(ProtectedValue.fromString(password))); @@ -36,7 +21,7 @@ class TestUtil { static Future readKdbxFileBytes(Uint8List data, {String password = 'asdf'}) async { - final kdbxFormat = KdbxFormat(Argon2Test()); + final kdbxFormat = KdbxFormat(Argon2FfiFlutter()); final file = await kdbxFormat.read( data, Credentials(ProtectedValue.fromString(password))); return file; diff --git a/test/kdbx4_test.dart b/test/kdbx4_test.dart index 52f0a1e..472ef64 100644 --- a/test/kdbx4_test.dart +++ b/test/kdbx4_test.dart @@ -1,5 +1,6 @@ import 'dart:io'; +import 'package:argon2_ffi_base/argon2_ffi_base.dart'; import 'package:kdbx/kdbx.dart'; import 'package:kdbx/src/kdbx_header.dart'; import 'package:logging/logging.dart'; @@ -15,7 +16,7 @@ final _logger = Logger('kdbx4_test'); void main() { Logger.root.level = Level.ALL; PrintAppender().attachToLogger(Logger.root); - final kdbxFormat = KdbxFormat(Argon2Test()); + final kdbxFormat = KdbxFormat(Argon2FfiFlutter()); group('Reading', () { test('bubb', () async { final data = await File('test/keepassxcpasswords.kdbx').readAsBytes();