<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.0-beta.106" />

TlsRsaKeyExchange

using Org.BouncyCastle.Tls.Crypto; using System; using System.IO; namespace Org.BouncyCastle.Tls { public class TlsRsaKeyExchange : AbstractTlsKeyExchange { protected TlsCredentialedDecryptor m_serverCredentials; protected TlsEncryptor m_serverEncryptor; protected TlsSecret m_preMasterSecret; private static int CheckKeyExchange(int keyExchange) { if (keyExchange == 1) return keyExchange; throw new ArgumentException("unsupported key exchange algorithm", "keyExchange"); } public TlsRsaKeyExchange(int keyExchange) : base(CheckKeyExchange(keyExchange)) { } public override void SkipServerCredentials() { throw new TlsFatalAlert(80); } public override void ProcessServerCredentials(TlsCredentials serverCredentials) { m_serverCredentials = TlsUtilities.RequireDecryptorCredentials(serverCredentials); } public override void ProcessServerCertificate(Certificate serverCertificate) { m_serverEncryptor = serverCertificate.GetCertificateAt(0).CreateEncryptor(3); } public override short[] GetClientCertificateTypes() { return new short[3] { 1, 2, 64 }; } public override void ProcessClientCredentials(TlsCredentials clientCredentials) { TlsUtilities.RequireSignerCredentials(clientCredentials); } public override void GenerateClientKeyExchange(Stream output) { m_preMasterSecret = TlsUtilities.GenerateEncryptedPreMasterSecret(m_context, m_serverEncryptor, output); } public override void ProcessClientKeyExchange(Stream input) { byte[] ciphertext = TlsUtilities.ReadEncryptedPms(m_context, input); m_preMasterSecret = m_serverCredentials.Decrypt(new TlsCryptoParameters(m_context), ciphertext); } public override TlsSecret GeneratePreMasterSecret() { TlsSecret preMasterSecret = m_preMasterSecret; m_preMasterSecret = null; return preMasterSecret; } } }