private async ValueTask <IConnection?> InternalConnectAsync(ICap cap, string serviceType, CancellationToken cancellationToken) { using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); linkedTokenSource.CancelAfter(TimeSpan.FromSeconds(20)); var baseConnectionOptions = new BaseConnectionOptions() { MaxSendByteCount = 4 * 1024 * 1024, MaxReceiveByteCount = 4 * 1024 * 1024, BytesPool = _bytesPool, }; var baseConnection = new BaseConnection(cap, _baseConnectionDispatcher, baseConnectionOptions); var omniSecureConnectionOptions = new OmniSecureConnectionOptions() { Type = OmniSecureConnectionType.Connected, BufferPool = _bytesPool, }; var omniSecureConnection = new OmniSecureConnection(baseConnection, omniSecureConnectionOptions); await omniSecureConnection.HandshakeAsync(linkedTokenSource.Token); var helloMessage = new ConnectionHelloMessage(serviceType); await omniSecureConnection.EnqueueAsync((bufferWriter) => helloMessage.Export(bufferWriter, _bytesPool), linkedTokenSource.Token); return(omniSecureConnection); }
private async ValueTask <(IConnection?, string?)> InternalAcceptAsync(ICap cap, CancellationToken cancellationToken) { using var linkedTokenSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); linkedTokenSource.CancelAfter(TimeSpan.FromSeconds(20)); var baseConnectionOptions = new BaseConnectionOptions() { MaxSendByteCount = 4 * 1024 * 1024, MaxReceiveByteCount = 4 * 1024 * 1024, BytesPool = _bytesPool, }; var baseConnection = new BaseConnection(cap, _baseConnectionDispatcher, baseConnectionOptions); var omniSecureConnectionOptions = new OmniSecureConnectionOptions() { Type = OmniSecureConnectionType.Accepted, BufferPool = _bytesPool, }; var omniSecureConnection = new OmniSecureConnection(baseConnection, omniSecureConnectionOptions); await omniSecureConnection.HandshakeAsync(linkedTokenSource.Token); ConnectionHelloMessage?helloMessage = null; await omniSecureConnection.DequeueAsync((sequence) => helloMessage = ConnectionHelloMessage.Import(sequence, _bytesPool), linkedTokenSource.Token); return(omniSecureConnection, helloMessage?.ServiceType); }
public SecureConnection(IConnection connection, OmniSecureConnectionOptions options) { _connection = connection ?? throw new ArgumentNullException(nameof(connection)); if (options == null) { throw new ArgumentNullException(nameof(options)); } if (!EnumHelper.IsValid(options.Type)) { throw new ArgumentException(nameof(options.Type)); } _type = options.Type; _passwords = options.Passwords ?? Array.Empty <string>(); _bytesPool = options.BufferPool ?? BytesPool.Shared; }
public async Task RandomSendAndReceiveTest(OmniDigitalSignature?clientDigitalSignature, OmniDigitalSignature?serverDigitalSignature) { var random = new Random(); var(clientSocket, serverSocket) = SocketHelper.GetSocketPair(); await using var batchActionDispatcher = new BatchActionDispatcher(TimeSpan.FromMilliseconds(10)); var bridgeConnectionOptions = new BridgeConnectionOptions(1024 * 1024 * 256); await using var clientBridgeConnection = new BridgeConnection(new SocketCap(clientSocket), null, null, batchActionDispatcher, BytesPool.Shared, bridgeConnectionOptions); await using var serverBridgeConnection = new BridgeConnection(new SocketCap(serverSocket), null, null, batchActionDispatcher, BytesPool.Shared, bridgeConnectionOptions); var clientSecureConnectionOptions = new OmniSecureConnectionOptions(OmniSecureConnectionType.Connected, clientDigitalSignature, 1024 * 1024 * 256); await using var clientSecureConnection = OmniSecureConnection.CreateV1(clientBridgeConnection, BytesPool.Shared, clientSecureConnectionOptions); var serverSecureConnectionOptions = new OmniSecureConnectionOptions(OmniSecureConnectionType.Accepted, serverDigitalSignature, 1024 * 1024 * 256); await using var serverSecureConnection = OmniSecureConnection.CreateV1(serverBridgeConnection, BytesPool.Shared, serverSecureConnectionOptions); // ハンドシェイクを行う var valueTask1 = clientSecureConnection.HandshakeAsync(); var valueTask2 = serverSecureConnection.HandshakeAsync(); await Task.WhenAll(valueTask1.AsTask(), valueTask2.AsTask()); if (clientDigitalSignature != null) { Assert.Equal(serverSecureConnection.Signature, clientDigitalSignature.GetOmniSignature()); } if (serverDigitalSignature != null) { Assert.Equal(clientSecureConnection.Signature, serverDigitalSignature.GetOmniSignature()); } await TestHelper.RandomSendAndReceive(random, clientSecureConnection, serverSecureConnection); await TestHelper.RandomSendAndReceive(random, serverSecureConnection, clientSecureConnection); }