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; }