TlsDheKeyExchange.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using System.IO;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  9. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
  10. {
  11. public class TlsDheKeyExchange
  12. : TlsDHKeyExchange
  13. {
  14. protected TlsSignerCredentials mServerCredentials = null;
  15. [Obsolete("Use constructor that takes a TlsDHVerifier")]
  16. public TlsDheKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, DHParameters dhParameters)
  17. : this(keyExchange, supportedSignatureAlgorithms, new DefaultTlsDHVerifier(), dhParameters)
  18. {
  19. }
  20. public TlsDheKeyExchange(int keyExchange, IList supportedSignatureAlgorithms, TlsDHVerifier dhVerifier, DHParameters dhParameters)
  21. : base(keyExchange, supportedSignatureAlgorithms, dhVerifier, dhParameters)
  22. {
  23. }
  24. public override void ProcessServerCredentials(TlsCredentials serverCredentials)
  25. {
  26. if (!(serverCredentials is TlsSignerCredentials))
  27. throw new TlsFatalAlert(AlertDescription.internal_error);
  28. ProcessServerCertificate(serverCredentials.Certificate);
  29. this.mServerCredentials = (TlsSignerCredentials)serverCredentials;
  30. }
  31. public override byte[] GenerateServerKeyExchange()
  32. {
  33. if (this.mDHParameters == null)
  34. throw new TlsFatalAlert(AlertDescription.internal_error);
  35. DigestInputBuffer buf = new DigestInputBuffer();
  36. this.mDHAgreePrivateKey = TlsDHUtilities.GenerateEphemeralServerKeyExchange(mContext.SecureRandom,
  37. this.mDHParameters, buf);
  38. /*
  39. * RFC 5246 4.7. digitally-signed element needs SignatureAndHashAlgorithm from TLS 1.2
  40. */
  41. SignatureAndHashAlgorithm signatureAndHashAlgorithm = TlsUtilities.GetSignatureAndHashAlgorithm(
  42. mContext, mServerCredentials);
  43. IDigest d = TlsUtilities.CreateHash(signatureAndHashAlgorithm);
  44. SecurityParameters securityParameters = mContext.SecurityParameters;
  45. d.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
  46. d.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
  47. buf.UpdateDigest(d);
  48. byte[] hash = DigestUtilities.DoFinal(d);
  49. byte[] signature = mServerCredentials.GenerateCertificateSignature(hash);
  50. DigitallySigned signed_params = new DigitallySigned(signatureAndHashAlgorithm, signature);
  51. signed_params.Encode(buf);
  52. return buf.ToArray();
  53. }
  54. public override void ProcessServerKeyExchange(Stream input)
  55. {
  56. SecurityParameters securityParameters = mContext.SecurityParameters;
  57. SignerInputBuffer buf = new SignerInputBuffer();
  58. Stream teeIn = new TeeInputStream(input, buf);
  59. this.mDHParameters = TlsDHUtilities.ReceiveDHParameters(mDHVerifier, teeIn);
  60. this.mDHAgreePublicKey = new DHPublicKeyParameters(TlsDHUtilities.ReadDHParameter(teeIn), mDHParameters);
  61. DigitallySigned signed_params = ParseSignature(input);
  62. ISigner signer = InitVerifyer(mTlsSigner, signed_params.Algorithm, securityParameters);
  63. buf.UpdateSigner(signer);
  64. if (!signer.VerifySignature(signed_params.Signature))
  65. throw new TlsFatalAlert(AlertDescription.decrypt_error);
  66. }
  67. protected virtual ISigner InitVerifyer(TlsSigner tlsSigner, SignatureAndHashAlgorithm algorithm,
  68. SecurityParameters securityParameters)
  69. {
  70. ISigner signer = tlsSigner.CreateVerifyer(algorithm, this.mServerPublicKey);
  71. signer.BlockUpdate(securityParameters.clientRandom, 0, securityParameters.clientRandom.Length);
  72. signer.BlockUpdate(securityParameters.serverRandom, 0, securityParameters.serverRandom.Length);
  73. return signer;
  74. }
  75. }
  76. }
  77. #pragma warning restore
  78. #endif