From cfcb1d33ede799cc5ba4b928a74910ffc2407b3c Mon Sep 17 00:00:00 2001 From: Vishesh Handa Date: Sun, 3 May 2020 15:39:39 +0200 Subject: [PATCH] RsaKey: Add a method to generate the key in another isolate This way we won't be blocking the main thread. --- lib/ssh/rsa_key_pair.dart | 21 +++++++++++++++++++++ pubspec.lock | 7 +++++++ pubspec.yaml | 1 + test/rsa_key_pair_test.dart | 5 +++++ 4 files changed, 34 insertions(+) diff --git a/lib/ssh/rsa_key_pair.dart b/lib/ssh/rsa_key_pair.dart index 7363886e..52611184 100644 --- a/lib/ssh/rsa_key_pair.dart +++ b/lib/ssh/rsa_key_pair.dart @@ -1,8 +1,11 @@ +import 'dart:async'; import 'dart:convert'; import 'dart:math'; import 'dart:typed_data'; +import 'package:gitjournal/error_reporting.dart'; import 'package:gitjournal/ssh/binary_length_value.dart'; +import 'package:gitjournal/utils/logger.dart'; import 'package:steel_crypt/PointyCastleN/key_generators/rsa_key_generator.dart'; import 'package:steel_crypt/PointyCastleN/pointycastle.dart'; import 'package:steel_crypt/PointyCastleN/random/fortuna_random.dart'; @@ -10,6 +13,7 @@ import 'package:steel_crypt/steel_crypt.dart'; import 'package:meta/meta.dart'; import 'package:ssh_key/ssh_key.dart' as ssh_key; +import 'package:isolate/isolate_runner.dart'; class RsaKeyPair { RSAPublicKey publicKey; @@ -83,6 +87,19 @@ class RsaKeyPair { var encrypter = RsaCrypt(); return encrypter.encodeKeyToString(privateKey); } + + static Future generateAsync() async { + IsolateRunner iso = await IsolateRunner.spawn(); + try { + return await iso.run(_gen, null); + } catch (e) { + Log.e(e); + logException(e, StackTrace.current); + return null; + } finally { + iso.close(); + } + } } SecureRandom _getSecureRandom() { @@ -108,3 +125,7 @@ AsymmetricKeyPair _getRsaKeyPair( keyGenerator.init(params); return keyGenerator.generateKeyPair(); } + +FutureOr _gen(void _) async { + return RsaKeyPair.generate(); +} diff --git a/pubspec.lock b/pubspec.lock index 68d8b78a..571b55f4 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -378,6 +378,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "0.3.3" + isolate: + dependency: "direct main" + description: + name: isolate + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" js: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index db9095e7..5a4af0e0 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -48,6 +48,7 @@ dependencies: cached_network_image: ^2.1.0+1 ssh_key: git: https://github.com/GitJournal/ssh_key.git + isolate: ^2.0.3 dev_dependencies: flutter_launcher_icons: "^0.7.2" diff --git a/test/rsa_key_pair_test.dart b/test/rsa_key_pair_test.dart index fbd232fc..15125de1 100644 --- a/test/rsa_key_pair_test.dart +++ b/test/rsa_key_pair_test.dart @@ -8,6 +8,11 @@ void main() { expect(pair.isValid(), true); }); + test('Should async generate and verify keys', () async { + var pair = await RsaKeyPair.generateAsync(); + expect(pair.isValid(), true); + }); + var publicKeySingleLine = 'ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAgEAiL0jjDdFqK/kYThqKt7THrjABTPWvXmB3URIpGKCP/jZlSuCUP3Oc+IxuFeXSIMvVIYeW2PZAjXQGTn60XzPHr+M0NoGcPAvzZf2u57aX3YKaL93cZSBHR97H+XhcYdrm7ATwfjMDgfgj7+VTvW4nI46Z+qjxmYifc8uVELolg1TDHWY789ggcdvy92oGjB0VUgMEywrOP+LS0DgG4dmkoUBWGP9dvYcPZDUF4q0XY9ZHhvyPWEZ3o2vETTrEJr9QHYwgjmFfJn2VFNnD/4qeDDHOmSlDgEOfQcZIm+XUOn9eVsv//dAPSY/yMJXf8d0ZSm+VS29QShMjA4R+7yh5WhsIhouBRno2PpEVVb37Xwe3V6U3o9UnQ3ADtL75DbrZ5beNWcmKzlJ7jVX5QzHSBAnePbBx/fyeP/f144xPtJWB3jW/kXjtPyWjpzGndaPQ0WgXkbf8fvIuB3NJTTcZ7PeIKnLaMIzT5XNCR+xobvdC8J9d6k84/q/laJKF3G8KbRGPNwnoVg1cwWFez+dzqo2ypcTtv/20yAmz86EvuohZoWrtoWvkZLCoyxdqO93ymEjgHAn2bsIWyOODtXovxAJqPgk3dxM1f9PAEQwc1bG+Z/Gc1Fd8DncgxyhKSQzLsfWroTnIn8wsnmhPJtaZWNuT5BJa8GhnzX09g6nhbk='; var publicKeySsh2 = '''---- BEGIN SSH2 PUBLIC KEY ----