TlsDheKeyExchange.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Tls.Crypto;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  7. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  8. {
  9. public class TlsDheKeyExchange
  10. : AbstractTlsKeyExchange
  11. {
  12. private static int CheckKeyExchange(int keyExchange)
  13. {
  14. switch (keyExchange)
  15. {
  16. case KeyExchangeAlgorithm.DHE_DSS:
  17. case KeyExchangeAlgorithm.DHE_RSA:
  18. return keyExchange;
  19. default:
  20. throw new ArgumentException("unsupported key exchange algorithm", "keyExchange");
  21. }
  22. }
  23. protected TlsDHGroupVerifier m_dhGroupVerifier;
  24. protected TlsDHConfig m_dhConfig;
  25. protected TlsCredentialedSigner m_serverCredentials = null;
  26. protected TlsCertificate m_serverCertificate = null;
  27. protected TlsAgreement m_agreement;
  28. public TlsDheKeyExchange(int keyExchange, TlsDHGroupVerifier dhGroupVerifier)
  29. : this(keyExchange, dhGroupVerifier, null)
  30. {
  31. }
  32. public TlsDheKeyExchange(int keyExchange, TlsDHConfig dhConfig)
  33. : this(keyExchange, null, dhConfig)
  34. {
  35. }
  36. private TlsDheKeyExchange(int keyExchange, TlsDHGroupVerifier dhGroupVerifier, TlsDHConfig dhConfig)
  37. : base(CheckKeyExchange(keyExchange))
  38. {
  39. this.m_dhGroupVerifier = dhGroupVerifier;
  40. this.m_dhConfig = dhConfig;
  41. }
  42. public override void SkipServerCredentials()
  43. {
  44. throw new TlsFatalAlert(AlertDescription.internal_error);
  45. }
  46. public override void ProcessServerCredentials(TlsCredentials serverCredentials)
  47. {
  48. this.m_serverCredentials = TlsUtilities.RequireSignerCredentials(serverCredentials);
  49. }
  50. public override void ProcessServerCertificate(Certificate serverCertificate)
  51. {
  52. this.m_serverCertificate = serverCertificate.GetCertificateAt(0);
  53. }
  54. public override bool RequiresServerKeyExchange
  55. {
  56. get { return true; }
  57. }
  58. public override byte[] GenerateServerKeyExchange()
  59. {
  60. DigestInputBuffer digestBuffer = new DigestInputBuffer();
  61. TlsDHUtilities.WriteDHConfig(m_dhConfig, digestBuffer);
  62. this.m_agreement = m_context.Crypto.CreateDHDomain(m_dhConfig).CreateDH();
  63. byte[] y = m_agreement.GenerateEphemeral();
  64. TlsUtilities.WriteOpaque16(y, digestBuffer);
  65. TlsUtilities.GenerateServerKeyExchangeSignature(m_context, m_serverCredentials, null, digestBuffer);
  66. return digestBuffer.ToArray();
  67. }
  68. public override void ProcessServerKeyExchange(Stream input)
  69. {
  70. DigestInputBuffer digestBuffer = new DigestInputBuffer();
  71. Stream teeIn = new TeeInputStream(input, digestBuffer);
  72. this.m_dhConfig = TlsDHUtilities.ReceiveDHConfig(m_context, m_dhGroupVerifier, teeIn);
  73. byte[] y = TlsUtilities.ReadOpaque16(teeIn, 1);
  74. TlsUtilities.VerifyServerKeyExchangeSignature(m_context, input, m_serverCertificate, null, digestBuffer);
  75. this.m_agreement = m_context.Crypto.CreateDHDomain(m_dhConfig).CreateDH();
  76. m_agreement.ReceivePeerValue(y);
  77. }
  78. public override short[] GetClientCertificateTypes()
  79. {
  80. return new short[]{ ClientCertificateType.dss_sign, ClientCertificateType.ecdsa_sign,
  81. ClientCertificateType.rsa_sign };
  82. }
  83. public override void ProcessClientCredentials(TlsCredentials clientCredentials)
  84. {
  85. TlsUtilities.RequireSignerCredentials(clientCredentials);
  86. }
  87. public override void GenerateClientKeyExchange(Stream output)
  88. {
  89. byte[] y = m_agreement.GenerateEphemeral();
  90. TlsUtilities.WriteOpaque16(y, output);
  91. }
  92. public override void ProcessClientKeyExchange(Stream input)
  93. {
  94. m_agreement.ReceivePeerValue(TlsUtilities.ReadOpaque16(input, 1));
  95. }
  96. public override TlsSecret GeneratePreMasterSecret()
  97. {
  98. return m_agreement.CalculateSecret();
  99. }
  100. }
  101. }
  102. #pragma warning restore
  103. #endif