Ejemplo n.º 1
0
        private void SendClientKeyExchange()
        {
            var preMasterSecret = TLS12.GetPreMasterSecret();

            _session.MasterSecret = TLS12.GetMasterSecret(preMasterSecret, _session.ClientRandom, _session.ServerRandom);
            var clientKeyExchange = new ClientKeyExchange
            {
                SessionId       = _session.Id,
                PreMasterSecret = preMasterSecret
            };
            var serverRsa = Rsa.CreateFromPublicPEM(_session.RSAPublicPem);
            var request   = new SecurityLayerMessage
            {
                Type = SecurityMessageType.ClientKeyExchange,
                Data = serverRsa.Encrypt(_serializer.Serialize <ClientKeyExchange>(clientKeyExchange))
            };
            var requestBytes = _serializer.Serialize <SecurityLayerMessage>(request);

            Send(requestBytes);

            var responseBytes  = Receive();
            var message        = _serializer.Deserialize <SecurityLayerMessage>(responseBytes);
            var serverFinished = _serializer.Deserialize <ServerFinished>(message.Data);

            _session.Id = serverFinished.SessionId;
            var keys = TLS12.GetKeys(_session.MasterSecret, _session.ClientRandom, _session.ServerRandom);

            _session.ClientWriteMACKey = TLS12.GetClientWriteMACKey(keys);
            _session.ServerWriteMACKey = TLS12.GetServerWriteMACKey(keys);
            _session.ClientWriteKey    = TLS12.GetClientWriteKey(keys);
            _session.ServerWriteKey    = TLS12.GetServerWriteKey(keys);
            _session.IsAuthenticated   = true;
        }