private async Task SendKmsRequestAsync(KmsRequest request, CancellationToken cancellation) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ParseKmsEndPoint(request.Endpoint, out var host, out var port); #if NETSTANDARD1_5 await socket.ConnectAsync(host, port).ConfigureAwait(false); #else await Task.Factory.FromAsync(socket.BeginConnect(host, port, null, null), socket.EndConnect).ConfigureAwait(false); #endif using (var networkStream = new NetworkStream(socket, ownsSocket: true)) using (var sslStream = new SslStream(networkStream, leaveInnerStreamOpen: false)) { await sslStream.AuthenticateAsClientAsync(host).ConfigureAwait(false); var requestBytes = request.Message.ToArray(); await sslStream.WriteAsync(requestBytes, 0, requestBytes.Length).ConfigureAwait(false); var buffer = new byte[4096]; while (request.BytesNeeded > 0) { var count = await sslStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); var responseBytes = new byte[count]; Buffer.BlockCopy(buffer, 0, responseBytes, 0, count); request.Feed(responseBytes); } } }
private void SendKmsRequest(KmsRequest request, CancellationToken cancellation) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ParseKmsEndPoint(request.Endpoint, out var host, out var port); socket.Connect(host, port); using (var networkStream = new NetworkStream(socket, ownsSocket: true)) using (var sslStream = new SslStream(networkStream, leaveInnerStreamOpen: false)) { #if NETSTANDARD1_5 sslStream.AuthenticateAsClientAsync(host).ConfigureAwait(false).GetAwaiter().GetResult(); #else sslStream.AuthenticateAsClient(host); #endif var requestBytes = request.Message.ToArray(); sslStream.Write(requestBytes); var buffer = new byte[4096]; while (request.BytesNeeded > 0) { var count = sslStream.Read(buffer, 0, buffer.Length); var responseBytes = new byte[count]; Buffer.BlockCopy(buffer, 0, responseBytes, 0, count); request.Feed(responseBytes); } } }
private async Task SendKmsRequestAsync(KmsRequest request, CancellationToken cancellation) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); ParseKmsEndPoint(request.Endpoint, out var host, out var port); #if NETSTANDARD1_5 // the way we use this method doesn't work on Linux with .netstandard1.5, // to make it work on that platform, we need to resolve the host and use the IP address. // Since that platform is not supported on libmongocrypt level anyway, instead of fixing it, // we rely on throwing a PlatformNotSupported exception in the previous steps await socket.ConnectAsync(host, port).ConfigureAwait(false); #else await Task.Factory.FromAsync(socket.BeginConnect(host, port, null, null), socket.EndConnect).ConfigureAwait(false); #endif using (var networkStream = new NetworkStream(socket, ownsSocket: true)) using (var sslStream = new SslStream(networkStream, leaveInnerStreamOpen: false)) { await sslStream.AuthenticateAsClientAsync(host).ConfigureAwait(false); var requestBytes = request.Message.ToArray(); await sslStream.WriteAsync(requestBytes, 0, requestBytes.Length).ConfigureAwait(false); while (request.BytesNeeded > 0) { var buffer = new byte[request.BytesNeeded]; // BytesNeeded is the maximum number of bytes that libmongocrypt wants to receive. var count = await sslStream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false); var responseBytes = new byte[count]; Buffer.BlockCopy(buffer, 0, responseBytes, 0, count); request.Feed(responseBytes); } } }
void DoKmsRequest(KmsRequest request) { TcpClient tcpClient = new TcpClient(); Console.WriteLine("KMS: " + request.Endpoint); // change me to use the mock if (_kmsEndpoint != null) { tcpClient.Connect(_kmsEndpoint.DnsSafeHost, _kmsEndpoint.Port); } else { tcpClient.Connect(request.Endpoint, 443); } SslStream stream = new SslStream(tcpClient.GetStream(), false, new RemoteCertificateValidationCallback(ValidateServerCertificate)); stream.AuthenticateAsClient("localhost"); Binary bin = request.Message; stream.Write(bin.ToArray()); byte[] buffer = new byte[4096]; while (request.BytesNeeded > 0) { MemoryStream memBuffer = new MemoryStream(); int read = stream.Read(buffer, 0, buffer.Length); if (read > 0) { memBuffer.Write(buffer, 0, read); } request.Feed(memBuffer.ToArray()); } }
private void SendKmsRequest(KmsRequest request, CancellationToken cancellation) { var endpoint = CreateKmsEndPoint(request.Endpoint); var tlsStreamSettings = GetTlsStreamSettings(request.KmsProvider); var sslStreamFactory = new SslStreamFactory(tlsStreamSettings, _networkStreamFactory); using (var sslStream = sslStreamFactory.CreateStream(endpoint, cancellation)) { var requestBytes = request.Message.ToArray(); sslStream.Write(requestBytes, 0, requestBytes.Length); while (request.BytesNeeded > 0) { var buffer = new byte[request.BytesNeeded]; // BytesNeeded is the maximum number of bytes that libmongocrypt wants to receive. var count = sslStream.Read(buffer, 0, buffer.Length); var responseBytes = new byte[count]; Buffer.BlockCopy(buffer, 0, responseBytes, 0, count); request.Feed(responseBytes); } } }