diff --git a/packages/simplexmq/example/simplexmq_example.dart b/packages/simplexmq/example/simplexmq_example.dart index 8b13789179..ef6b175bc5 100644 --- a/packages/simplexmq/example/simplexmq_example.dart +++ b/packages/simplexmq/example/simplexmq_example.dart @@ -1 +1,39 @@ +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); +} diff --git a/packages/simplexmq/lib/src/transport.dart b/packages/simplexmq/lib/src/transport.dart index baa030a43b..3e9f0213e1 100644 --- a/packages/simplexmq/lib/src/transport.dart +++ b/packages/simplexmq/lib/src/transport.dart @@ -8,6 +8,7 @@ import 'rsa_keys.dart'; abstract class Transport { Future read(int n); Future write(Uint8List data); + Future close(); } Stream blockStream(Transport t, int blockSize) async* { @@ -68,6 +69,10 @@ class SMPTransportClient { return _clientHandshake(conn, keyHash, blockSize); } + Future close() { + return _conn.close(); + } + static Future _clientHandshake( Transport conn, Uint8List? keyHash, int? blkSize) async { final srv = await _getHeaderAndPublicKey_1_2(conn, keyHash); @@ -108,8 +113,11 @@ class SMPTransportClient { return ServerHeader(blockSize, keySize); } - Future _sendEncryptedKeys_4(RSAPublicKey serverKey) => - _conn.write(encryptOAEP(serverKey, _clientHeader())); + Future _sendEncryptedKeys_4(RSAPublicKey serverKey) async { + final header = encryptOAEP(serverKey, _clientHeader()); + // print(header); + await _conn.write(header); + } Uint8List _clientHeader() => concatN([ encodeInt32(blockSize), diff --git a/packages/simplexmq_io/example/simplexmq_io_example.dart b/packages/simplexmq_io/example/simplexmq_io_example.dart index acd05a7458..1a47c71f9c 100644 --- a/packages/simplexmq_io/example/simplexmq_io_example.dart +++ b/packages/simplexmq_io/example/simplexmq_io_example.dart @@ -1,6 +1,12 @@ -// import 'package:simplexmq_io/simplexmq_io.dart'; +import 'dart:io'; -// void main() { -// var awesome = Awesome(); -// print('awesome: ${awesome.isAwesome}'); -// } +void main() { + ServerSocket.bind('localhost', 8080) + .then((server) => server.listen((Socket socket) { + print('New client connection'); + socket.listen((List data) { + String result = String.fromCharCodes(data); + print(result); + }); + })); +} diff --git a/packages/simplexmq_io/lib/src/socket.dart b/packages/simplexmq_io/lib/src/socket.dart index 148f505088..1622454cd3 100644 --- a/packages/simplexmq_io/lib/src/socket.dart +++ b/packages/simplexmq_io/lib/src/socket.dart @@ -23,7 +23,7 @@ class SocketTransport implements Transport { SocketTransport._(this._socket, this._timeout, this._bufferSize); static Future connect(String host, int port, - {Duration timeout = const Duration(seconds: 1), + {Duration timeout = const Duration(seconds: 4), int bufferSize = 16384}) async { final socket = await Socket.connect(host, port, timeout: timeout); final t = SocketTransport._(socket, timeout, bufferSize); @@ -35,7 +35,7 @@ class SocketTransport implements Transport { } @override - Future read(int n) async { + Future read(int n) { if (_readers.isEmpty && _buffer.length >= n) { final data = _buffer.sublist(0, n); _buffer = _buffer.sublist(n); @@ -72,8 +72,9 @@ class SocketTransport implements Transport { } /// Close the client transport - void close() { - _subscription.cancel(); + @override + Future close() async { + await _subscription.cancel(); _socket.destroy(); while (_readers.isNotEmpty) { final r = _readers.removeFirst(); diff --git a/packages/simplexmq_io/test/simplexmq_io_test.dart b/packages/simplexmq_io/test/simplexmq_io_test.dart index d7cc9c239b..dc2a5e1e9f 100644 --- a/packages/simplexmq_io/test/simplexmq_io_test.dart +++ b/packages/simplexmq_io/test/simplexmq_io_test.dart @@ -12,7 +12,7 @@ void main() { group('transport', () { Future startServer( void Function(Socket client) handleConnection) async { - var server = await ServerSocket.bind(InternetAddress.anyIPv4, 0); + var server = await ServerSocket.bind(localhost, 5223); server.listen(handleConnection); return server; } @@ -21,17 +21,18 @@ void main() { var completer = Completer(); var server = await startServer((Socket client) { + print('client connected'); client.listen( (Uint8List data) async { completer.complete(data); }, ); }); - var transport = await SocketTransport.connect(localhost, server.port); + var transport = await SocketTransport.connect(localhost, 5223); await transport.write(Uint8List.fromList([1, 2, 3])); expect(await completer.future, [1, 2, 3]); - transport.close(); + await transport.close(); await server.close(); }); @@ -41,7 +42,7 @@ void main() { }); var transport = await SocketTransport.connect(localhost, server.port); expect(await transport.read(3), [1, 2, 3]); - transport.close(); + await transport.close(); await server.close(); }); }); diff --git a/packages/simplexmq_io/test/transport_test.dart b/packages/simplexmq_io/test/transport_test.dart index de38353193..d5bb789d45 100644 --- a/packages/simplexmq_io/test/transport_test.dart +++ b/packages/simplexmq_io/test/transport_test.dart @@ -1,15 +1,17 @@ +// import 'dart:io'; import 'package:simplexmq/simplexmq.dart'; import 'package:simplexmq_io/simplexmq_io.dart'; import 'package:test/test.dart'; void main() { group('SMP transport', () { - test('establish connection (expects SMP server on localhost:5423)', + test('establish connection (expects SMP server on localhost:5223)', () async { - final conn = await SocketTransport.connect('localhost', 5423); + // await Socket.connect('localhost', 5223); + final conn = await SocketTransport.connect('localhost', 5223); final smp = await SMPTransportClient.connect(conn); print('connected'); print(smp); - }, skip: 'socket does not connect'); + }, skip: 'requires server; pc OAEP impl is not compatible as it uses SHA1'); }); }