transport test

This commit is contained in:
Evgeny Poberezkin
2021-10-18 07:28:49 +01:00
parent 78565914db
commit 61e452356b
6 changed files with 74 additions and 18 deletions

View File

@@ -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);
}

View File

@@ -8,6 +8,7 @@ import 'rsa_keys.dart';
abstract class Transport {
Future<Uint8List> read(int n);
Future<void> write(Uint8List data);
Future<void> close();
}
Stream<Uint8List> blockStream(Transport t, int blockSize) async* {
@@ -68,6 +69,10 @@ class SMPTransportClient {
return _clientHandshake(conn, keyHash, blockSize);
}
Future<void> close() {
return _conn.close();
}
static Future<SMPTransportClient> _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<void> _sendEncryptedKeys_4(RSAPublicKey serverKey) =>
_conn.write(encryptOAEP(serverKey, _clientHeader()));
Future<void> _sendEncryptedKeys_4(RSAPublicKey serverKey) async {
final header = encryptOAEP(serverKey, _clientHeader());
// print(header);
await _conn.write(header);
}
Uint8List _clientHeader() => concatN([
encodeInt32(blockSize),

View File

@@ -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<int> data) {
String result = String.fromCharCodes(data);
print(result);
});
}));
}

View File

@@ -23,7 +23,7 @@ class SocketTransport implements Transport {
SocketTransport._(this._socket, this._timeout, this._bufferSize);
static Future<SocketTransport> 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<Uint8List> read(int n) async {
Future<Uint8List> 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<void> close() async {
await _subscription.cancel();
_socket.destroy();
while (_readers.isNotEmpty) {
final r = _readers.removeFirst();

View File

@@ -12,7 +12,7 @@ void main() {
group('transport', () {
Future<ServerSocket> 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<Uint8List>();
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();
});
});

View File

@@ -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');
});
}