RsaKey: Add a method to generate the key in another isolate

This way we won't be blocking the main thread.
This commit is contained in:
Vishesh Handa
2020-05-03 15:39:39 +02:00
parent 941a4c589a
commit cfcb1d33ed
4 changed files with 34 additions and 0 deletions

View File

@ -1,8 +1,11 @@
import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:math'; import 'dart:math';
import 'dart:typed_data'; import 'dart:typed_data';
import 'package:gitjournal/error_reporting.dart';
import 'package:gitjournal/ssh/binary_length_value.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/key_generators/rsa_key_generator.dart';
import 'package:steel_crypt/PointyCastleN/pointycastle.dart'; import 'package:steel_crypt/PointyCastleN/pointycastle.dart';
import 'package:steel_crypt/PointyCastleN/random/fortuna_random.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:meta/meta.dart';
import 'package:ssh_key/ssh_key.dart' as ssh_key; import 'package:ssh_key/ssh_key.dart' as ssh_key;
import 'package:isolate/isolate_runner.dart';
class RsaKeyPair { class RsaKeyPair {
RSAPublicKey publicKey; RSAPublicKey publicKey;
@ -83,6 +87,19 @@ class RsaKeyPair {
var encrypter = RsaCrypt(); var encrypter = RsaCrypt();
return encrypter.encodeKeyToString(privateKey); return encrypter.encodeKeyToString(privateKey);
} }
static Future<RsaKeyPair> 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() { SecureRandom _getSecureRandom() {
@ -108,3 +125,7 @@ AsymmetricKeyPair<PublicKey, PrivateKey> _getRsaKeyPair(
keyGenerator.init(params); keyGenerator.init(params);
return keyGenerator.generateKeyPair(); return keyGenerator.generateKeyPair();
} }
FutureOr<RsaKeyPair> _gen(void _) async {
return RsaKeyPair.generate();
}

View File

@ -378,6 +378,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.3.3" version: "0.3.3"
isolate:
dependency: "direct main"
description:
name: isolate
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.3"
js: js:
dependency: transitive dependency: transitive
description: description:

View File

@ -48,6 +48,7 @@ dependencies:
cached_network_image: ^2.1.0+1 cached_network_image: ^2.1.0+1
ssh_key: ssh_key:
git: https://github.com/GitJournal/ssh_key.git git: https://github.com/GitJournal/ssh_key.git
isolate: ^2.0.3
dev_dependencies: dev_dependencies:
flutter_launcher_icons: "^0.7.2" flutter_launcher_icons: "^0.7.2"

View File

@ -8,6 +8,11 @@ void main() {
expect(pair.isValid(), true); expect(pair.isValid(), true);
}); });
test('Should async generate and verify keys', () async {
var pair = await RsaKeyPair.generateAsync();
expect(pair.isValid(), true);
});
var publicKeySingleLine = 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='; '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 ---- var publicKeySsh2 = '''---- BEGIN SSH2 PUBLIC KEY ----