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);
                    }
                }
        }
Beispiel #3
0
        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);
                    }
                }
        }
Beispiel #4
0
        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());
            }
        }
Beispiel #5
0
        private async Task <T> SendAsync <T>(string action, KmsRequest request)
            where T : KmsResponse, new()
        {
            var jsonText = JsonObject.FromObject(request).ToString(pretty: false);

            var httpRequest = new HttpRequestMessage(HttpMethod.Post, Endpoint)
            {
                Headers =
                {
                    { "x-amz-target", "TrentService." + action }
                },

                Content = new StringContent(jsonText, Encoding.UTF8, "application/x-amz-json-1.1")
            };

            var responseText = await SendAsync(httpRequest).ConfigureAwait(false);

            return(JsonObject.Parse(responseText).As <T>());
        }
        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);
                }
            }
        }