private void HandleMessage(KeyExchangeDhInitMessage message) { var kexAlg = _keyExchangeAlgorithms[_exchangeContext.KeyExchange](); var hostKeyAlg = _publicKeyAlgorithms[_exchangeContext.PublicKey](_hostKey[_exchangeContext.PublicKey].ToString()); var clientCipher = _encryptionAlgorithms[_exchangeContext.ClientEncryption](); var serverCipher = _encryptionAlgorithms[_exchangeContext.ServerEncryption](); var serverHmac = _hmacAlgorithms[_exchangeContext.ServerHmac](); var clientHmac = _hmacAlgorithms[_exchangeContext.ClientHmac](); var clientExchangeValue = message.E; var serverExchangeValue = kexAlg.CreateKeyExchange(); var sharedSecret = kexAlg.DecryptKeyExchange(clientExchangeValue); var hostKeyAndCerts = hostKeyAlg.CreateKeyAndCertificatesData(); var exchangeHash = ComputeExchangeHash(kexAlg, hostKeyAndCerts, clientExchangeValue, serverExchangeValue, sharedSecret); if (SessionId == null) { SessionId = exchangeHash; } var clientCipherIV = ComputeEncryptionKey(kexAlg, exchangeHash, clientCipher.BlockSize >> 3, sharedSecret, 'A'); var serverCipherIV = ComputeEncryptionKey(kexAlg, exchangeHash, serverCipher.BlockSize >> 3, sharedSecret, 'B'); var clientCipherKey = ComputeEncryptionKey(kexAlg, exchangeHash, clientCipher.KeySize >> 3, sharedSecret, 'C'); var serverCipherKey = ComputeEncryptionKey(kexAlg, exchangeHash, serverCipher.KeySize >> 3, sharedSecret, 'D'); var clientHmacKey = ComputeEncryptionKey(kexAlg, exchangeHash, clientHmac.KeySize >> 3, sharedSecret, 'E'); var serverHmacKey = ComputeEncryptionKey(kexAlg, exchangeHash, serverHmac.KeySize >> 3, sharedSecret, 'F'); _exchangeContext.NewAlgorithms = new Algorithms { KeyExchange = kexAlg, PublicKey = hostKeyAlg, ClientEncryption = clientCipher.Cipher(clientCipherKey, clientCipherIV, false), ServerEncryption = serverCipher.Cipher(serverCipherKey, serverCipherIV, true), ClientHmac = clientHmac.Hmac(clientHmacKey), ServerHmac = serverHmac.Hmac(serverHmacKey), ClientCompression = _compressionAlgorithms[_exchangeContext.ClientCompression](), ServerCompression = _compressionAlgorithms[_exchangeContext.ServerCompression](), }; var reply = new KeyExchangeDhReplyMessage { HostKey = hostKeyAndCerts, F = serverExchangeValue, Signature = hostKeyAlg.CreateSignatureData(exchangeHash), }; SendMessage(reply); SendMessage(new NewKeysMessage()); }
public void KeyExchangeDhReplyMessageConstructorTest() { KeyExchangeDhReplyMessage target = new KeyExchangeDhReplyMessage(); Assert.Inconclusive("TODO: Implement code to verify target"); }