transport test
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -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');
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user