TlsDHKeyExchange.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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 key exchange.</summary>
  9. public class TlsDHKeyExchange
  10. : AbstractTlsKeyExchange
  11. {
  12. private static int CheckKeyExchange(int keyExchange)
  13. {
  14. switch (keyExchange)
  15. {
  16. case KeyExchangeAlgorithm.DH_DSS:
  17. case KeyExchangeAlgorithm.DH_RSA:
  18. return keyExchange;
  19. default:
  20. throw new ArgumentException("unsupported key exchange algorithm", "keyExchange");
  21. }
  22. }
  23. protected TlsCredentialedAgreement m_agreementCredentials;
  24. protected TlsCertificate m_dhPeerCertificate;
  25. public TlsDHKeyExchange(int keyExchange)
  26. : base(CheckKeyExchange(keyExchange))
  27. {
  28. }
  29. public override void SkipServerCredentials()
  30. {
  31. throw new TlsFatalAlert(AlertDescription.internal_error);
  32. }
  33. public override void ProcessServerCredentials(TlsCredentials serverCredentials)
  34. {
  35. this.m_agreementCredentials = TlsUtilities.RequireAgreementCredentials(serverCredentials);
  36. }
  37. public override void ProcessServerCertificate(Certificate serverCertificate)
  38. {
  39. this.m_dhPeerCertificate = serverCertificate.GetCertificateAt(0).CheckUsageInRole(TlsCertificateRole.DH);
  40. }
  41. public override short[] GetClientCertificateTypes()
  42. {
  43. return new short[]{ ClientCertificateType.dss_fixed_dh, ClientCertificateType.rsa_fixed_dh };
  44. }
  45. public override void SkipClientCredentials()
  46. {
  47. throw new TlsFatalAlert(AlertDescription.unexpected_message);
  48. }
  49. public override void ProcessClientCredentials(TlsCredentials clientCredentials)
  50. {
  51. this.m_agreementCredentials = TlsUtilities.RequireAgreementCredentials(clientCredentials);
  52. }
  53. public override void GenerateClientKeyExchange(Stream output)
  54. {
  55. /*
  56. * RFC 2246 7.4.7.2 If the client certificate already contains a suitable Diffie-Hellman
  57. * key, then Yc is implicit and does not need to be sent again. In this case, the Client Key
  58. * Exchange message will be sent, but will be empty.
  59. */
  60. }
  61. public override void ProcessClientCertificate(Certificate clientCertificate)
  62. {
  63. this.m_dhPeerCertificate = clientCertificate.GetCertificateAt(0).CheckUsageInRole(TlsCertificateRole.DH);
  64. }
  65. public override void ProcessClientKeyExchange(Stream input)
  66. {
  67. // For dss_fixed_dh and rsa_fixed_dh, the key arrived in the client certificate
  68. }
  69. public override bool RequiresCertificateVerify
  70. {
  71. get { return false; }
  72. }
  73. public override TlsSecret GeneratePreMasterSecret()
  74. {
  75. return m_agreementCredentials.GenerateAgreement(m_dhPeerCertificate);
  76. }
  77. }
  78. }
  79. #pragma warning restore
  80. #endif