TlsDHanonKeyExchange.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Tls
  7. {
  8. /// <summary>(D)TLS DH_anon key exchange.</summary>
  9. public class TlsDHanonKeyExchange
  10. : AbstractTlsKeyExchange
  11. {
  12. private static int CheckKeyExchange(int keyExchange)
  13. {
  14. switch (keyExchange)
  15. {
  16. case KeyExchangeAlgorithm.DH_anon:
  17. return keyExchange;
  18. default:
  19. throw new ArgumentException("unsupported key exchange algorithm", "keyExchange");
  20. }
  21. }
  22. protected TlsDHGroupVerifier m_dhGroupVerifier;
  23. protected TlsDHConfig m_dhConfig;
  24. protected TlsAgreement m_agreement;
  25. public TlsDHanonKeyExchange(int keyExchange, TlsDHGroupVerifier dhGroupVerifier)
  26. : this(keyExchange, dhGroupVerifier, null)
  27. {
  28. }
  29. public TlsDHanonKeyExchange(int keyExchange, TlsDHConfig dhConfig)
  30. : this(keyExchange, null, dhConfig)
  31. {
  32. }
  33. private TlsDHanonKeyExchange(int keyExchange, TlsDHGroupVerifier dhGroupVerifier, TlsDHConfig dhConfig)
  34. : base(CheckKeyExchange(keyExchange))
  35. {
  36. this.m_dhGroupVerifier = dhGroupVerifier;
  37. this.m_dhConfig = dhConfig;
  38. }
  39. public override void SkipServerCredentials()
  40. {
  41. }
  42. public override void ProcessServerCredentials(TlsCredentials serverCredentials)
  43. {
  44. throw new TlsFatalAlert(AlertDescription.internal_error);
  45. }
  46. public override void ProcessServerCertificate(Certificate serverCertificate)
  47. {
  48. throw new TlsFatalAlert(AlertDescription.unexpected_message);
  49. }
  50. public override bool RequiresServerKeyExchange
  51. {
  52. get { return true; }
  53. }
  54. public override byte[] GenerateServerKeyExchange()
  55. {
  56. MemoryStream buf = new MemoryStream();
  57. TlsDHUtilities.WriteDHConfig(m_dhConfig, buf);
  58. this.m_agreement = m_context.Crypto.CreateDHDomain(m_dhConfig).CreateDH();
  59. byte[] y = m_agreement.GenerateEphemeral();
  60. TlsUtilities.WriteOpaque16(y, buf);
  61. return buf. ToArray();
  62. }
  63. public override void ProcessServerKeyExchange(Stream input)
  64. {
  65. this.m_dhConfig = TlsDHUtilities.ReceiveDHConfig(m_context, m_dhGroupVerifier, input);
  66. byte[] y = TlsUtilities.ReadOpaque16(input, 1);
  67. this.m_agreement = m_context.Crypto.CreateDHDomain(m_dhConfig).CreateDH();
  68. m_agreement.ReceivePeerValue(y);
  69. }
  70. public override short[] GetClientCertificateTypes()
  71. {
  72. return null;
  73. }
  74. public override void ProcessClientCredentials(TlsCredentials clientCredentials)
  75. {
  76. throw new TlsFatalAlert(AlertDescription.internal_error);
  77. }
  78. public override void GenerateClientKeyExchange(Stream output)
  79. {
  80. byte[] y = m_agreement.GenerateEphemeral();
  81. TlsUtilities.WriteOpaque16(y, output);
  82. }
  83. public override void ProcessClientCertificate(Certificate clientCertificate)
  84. {
  85. throw new TlsFatalAlert(AlertDescription.unexpected_message);
  86. }
  87. public override void ProcessClientKeyExchange(Stream input)
  88. {
  89. byte[] y = TlsUtilities.ReadOpaque16(input, 1);
  90. m_agreement.ReceivePeerValue(y);
  91. }
  92. public override TlsSecret GeneratePreMasterSecret()
  93. {
  94. return m_agreement.CalculateSecret();
  95. }
  96. }
  97. }
  98. #pragma warning restore
  99. #endif