diff --git a/test/g1_test.dart b/test/g1_test.dart index 679b9e763050ce98205dd24bbe3bdb630c5bb0d5..cec3a7533db1a26762b48eb1e28c127fa0d81a75 100644 --- a/test/g1_test.dart +++ b/test/g1_test.dart @@ -1,7 +1,8 @@ import 'dart:convert'; -import 'dart:typed_data'; +import 'dart:math'; import 'package:durt/durt.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:ginkgo/data/models/payment_state.dart'; import 'package:ginkgo/g1/g1_helper.dart'; @@ -13,7 +14,6 @@ void main() { final Uint8List seedRestored = seedFromString(sSeed); expect(seed, equals(seedRestored)); - final CesiumWallet wallet = generateCesiumWallet(seed); final CesiumWallet walletRestored = generateCesiumWallet(seedRestored); expect(wallet.pubkey, equals(walletRestored.pubkey)); @@ -92,4 +92,54 @@ void main() { expect(e, isArgumentError); } }); + test('encrypt/decrypt of keys', () { + final Random random = Random(); + for (int i = 0; i < 50; i++) { + final String pass = _generateRandomPatternPassword(random); + final String wrongPass = _generateRandomPatternPassword(random); + + final Uint8List seed = generateUintSeed(); + final CesiumWallet wallet = generateCesiumWallet(seed); + + final Map<String, String> sample = <String, String>{ + 'pubKey': wallet.pubkey, + 'seed': seedToString(wallet.seed) + }; + + final Map<String, String> encSample = + encryptJsonForExport(jsonEncode(sample), pass); + final String encJson = encSample['key']!; + expect(encJson.isNotEmpty, equals(true)); + + final Map<String, dynamic> decrypted = + decryptJsonForImport(encJson, pass); + expect(decrypted['pubKey'], equals(sample['pubKey'])); + expect(decrypted['seed'], equals(sample['seed'])); + + try { + // test wrong pass + decryptJsonForImport(encJson, wrongPass); + } on ArgumentError catch (e) { + expect(e, isArgumentError); + } catch (e) { + if (kDebugMode) { + print( + 'encjson: $encJson and wrongPass: $wrongPass correct pass: $pass'); + } + // rethrow; + } + } + }); +} + +String _generateRandomPatternPassword(Random random) { + final int length = random.nextInt(8) + 2; // Password length between 2 and 9. + final Set<int> digits = <int>{1, 2, 3, 4, 5, 6, 7, 8, 9}; + final List<int> passwordDigits = <int>[]; + for (int i = 0; i < length; i++) { + final int selectedDigit = digits.elementAt(random.nextInt(digits.length)); + passwordDigits.add(selectedDigit); + digits.remove(selectedDigit); + } + return passwordDigits.join(); }