SMP transport handshake works

This commit is contained in:
Evgeny Poberezkin 2021-10-21 20:16:11 +01:00
parent 61e452356b
commit e8fe5632f4
6 changed files with 19 additions and 55 deletions

View File

@ -1,39 +0,0 @@
import 'dart:typed_data';
import 'package:simplexmq/src/buffer.dart';
import 'package:simplexmq/src/crypto.dart';
import 'package:simplexmq/src/rsa_keys.dart';
// import 'package:simplexmq/src/transport.dart';
// import 'dart:io';
// import 'package:rsa_pkcs/rsa_pkcs.dart' show RSAPKCSParser;
// import 'package:pointycastle/asymmetric/api.dart';
// import 'package:ssh_key/ssh_key.dart';
void main() async {
// final socket = await Socket.connect('localhost', 8080);
// socket.add([65, 66, 67]);
// await socket.flush();
final keyStr =
// 'MIIBoDANBgkqhkiG9w0BAQEFAAOCAY0AMIIBiAKCAQEAtfalLDtEveHNlKq782D9kIRYbICBckd+v83HeAs7MI/u39fBRmk8kHZ8k/OzN5o+aBWDoBAm7m+24fnolR2QwQG4WSSLPLr3uXQDm7hHWHCu5TqNryf70QlJAbdljnwWauLxWwJ9bfCtjnBPBxL1Aypd/stIZJA4qKpuOtIMBh9n8RzuyRFEKGTrDguTOVTFK2R3/DF10G1LmU2cKC/QTCt/fVJsjihfivTanrNri8ue0Hs3pK+sL7L5zlN7srnU2CZHZtuoXldx1LRIn3Y1Rj33ASpfM7gDkndWjqdK6t5FQdxe3R+j5txqg8EMTb9PF4PfhdvEi9f7238AovMeowKBgAtXNGoxBEvCfVQbM9RCYS90nPIEfgV3D7jK9HrrvCewYnU55fhTsNZFYQNj/iq3m9t6VTG/helpM6bK4rLvW5YAY+1dVltHErPODy3Tz+3Fg7aP7EZ1XrPjHfCd87zTr5/ima4GZIxutbDfNd1WecIIK9gVrstSjG/fIuQ3Ay6X';
'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvV/IhWtgS1CENNl38Jo9mJqeJ63agN8zo2PAIHNxuorlFUpaXOkLtHcASn3PiXwjNgFuO2FtiP1QRIz7Cg8bACHtdsA20moUCnfExOgwhHsePCFxxcWTfPTeYqb83OJXKJdc3t0ihPD9Zo2o75BY6ahSiNY4NLQHEnuqCK+P/ItUDa7QqqzHcinlRPVgO7HbE/5YsGafd7McHVmd8dv0nild0y29SILXvGKOvHIkUBthb32VaCI+75b9A1eNvLdUlF0kSmWzQTLjSYwWVSvfP0zAetZ1vlksFaohYrSZUtZ0PlTkti1rdyCMdvLpsS2A6g3vjuobm0oUKiRgikNYywIDAQAB';
// final pair = RSAPKCSParser().parsePEM('''
// final key = publicKeyDecode('''
// -----BEGIN PUBLIC KEY-----
// MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzknLODTvx9LrwnWrgoe5zSF7olPnp20O/0PLw/WtvV9paLzkeyhf07RqBzYUEyGccpOMEwY98SsJk/8GJnVPUclAHj2rqxAkwYTKHbsMjbZ18VuL0vC5JTBwnvqMUa+fj3oi7QxHMWLY9w1iYLauYM/aYWBc/Fg5LZoawG0Yf3nuZ3rGWic88tf5y8BIVgSEeRovF/NQKX8LsFgaxXdpTMfMwu7xVh0jaFUU98T6ke+GADszmuqeUXFs9IRZoRUieTSafM8XQ+Xr7g513TYTpXuj9GQ04nmE+BEZ5O2MBNjYFle91SsvCyPwYxv0aFbFZ05/vZKZIdbhgpFxh03p3wIDAQAB
// -----END PUBLIC KEY-----
// ''') as RSAPublicKey;
// final key = RSAPublicKey((pair.public?.modulus) as BigInt,
// BigInt.from((pair.public?.publicExponent) as int));
final key = decodeRsaPubKey(decode64(encodeAscii(keyStr))!);
print(key);
final Uint8List header = encodeAscii('hello');
// concatN([
// encodeInt32(4096),
// encodeInt16(0),
// SessionKey.create().serialize(),
// SessionKey.create().serialize()
// ]);
final enc = decodeAscii(encode64(encryptOAEP(key, header)));
print(enc);
}

View File

@ -36,7 +36,6 @@ Uint8List pseudoRandomBytes(int len) {
return _randomBytes(len, sessionSeed);
}
// len should be divisible by 4
Uint8List _randomBytes(int len, Random seedSource) {
final bytes = Uint8List(len);
for (int i = 0; i < len; i++) {
@ -81,13 +80,13 @@ AsymmetricKeyPair<RSAPublicKey, RSAPrivateKey> generateRSAkeyPair(
}
Uint8List encryptOAEP(RSAPublicKey key, Uint8List data) {
final oaep = OAEPEncoding(RSAEngine())
final oaep = OAEPEncoding.withSHA256(RSAEngine())
..init(true, PublicKeyParameter<RSAPublicKey>(key));
return oaep.process(data);
}
Uint8List decryptOAEP(RSAPrivateKey key, Uint8List data) {
final oaep = OAEPEncoding(RSAEngine())
final oaep = OAEPEncoding.withSHA256(RSAEngine())
..init(false, PrivateKeyParameter<RSAPrivateKey>(key));
return oaep.process(data);
}

View File

@ -115,7 +115,6 @@ class SMPTransportClient {
Future<void> _sendEncryptedKeys_4(RSAPublicKey serverKey) async {
final header = encryptOAEP(serverKey, _clientHeader());
// print(header);
await _conn.write(header);
}

View File

@ -8,7 +8,12 @@ environment:
dependencies:
asn1lib: ^1.0.2
pointycastle: ^3.3.4
pointycastle:
git:
url: git@github.com:simplex-chat/pc-dart.git
ref: nullsafety
# pointycastle: ^3.3.4
dev_dependencies:
lints: ^1.0.0

View File

@ -12,7 +12,7 @@ void main() {
group('transport', () {
Future<ServerSocket> startServer(
void Function(Socket client) handleConnection) async {
var server = await ServerSocket.bind(localhost, 5223);
var server = await ServerSocket.bind(localhost, 8080);
server.listen(handleConnection);
return server;
}
@ -21,14 +21,13 @@ void main() {
var completer = Completer<Uint8List>();
var server = await startServer((Socket client) {
print('client connected');
client.listen(
(Uint8List data) async {
completer.complete(data);
},
);
});
var transport = await SocketTransport.connect(localhost, 5223);
var transport = await SocketTransport.connect(localhost, 8080);
await transport.write(Uint8List.fromList([1, 2, 3]));
expect(await completer.future, [1, 2, 3]);

View File

@ -5,13 +5,14 @@ import 'package:test/test.dart';
void main() {
group('SMP transport', () {
test('establish connection (expects SMP server on localhost:5223)',
() async {
// await Socket.connect('localhost', 5223);
final conn = await SocketTransport.connect('localhost', 5223);
final smp = await SMPTransportClient.connect(conn);
print('connected');
print(smp);
}, skip: 'requires server; pc OAEP impl is not compatible as it uses SHA1');
test(
'establish connection (expects SMP server on localhost:5223)',
() async {
final conn = await SocketTransport.connect('localhost', 5223);
final smp = await SMPTransportClient.connect(conn);
expect(smp is SMPTransportClient, true);
},
skip: 'requires SMP server on port 5223',
);
});
}