DefaultTlsDHVerifier.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Agreement;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Math;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  9. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Tls
  10. {
  11. public class DefaultTlsDHVerifier
  12. : TlsDHVerifier
  13. {
  14. public static readonly int DefaultMinimumPrimeBits = 2048;
  15. protected static readonly IList DefaultGroups = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateArrayList();
  16. private static void AddDefaultGroup(DHParameters dhParameters)
  17. {
  18. DefaultGroups.Add(dhParameters);
  19. }
  20. static DefaultTlsDHVerifier()
  21. {
  22. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe2048);
  23. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe3072);
  24. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe4096);
  25. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe6144);
  26. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe8192);
  27. AddDefaultGroup(DHStandardGroups.rfc3526_1536);
  28. AddDefaultGroup(DHStandardGroups.rfc3526_2048);
  29. AddDefaultGroup(DHStandardGroups.rfc3526_3072);
  30. AddDefaultGroup(DHStandardGroups.rfc3526_4096);
  31. AddDefaultGroup(DHStandardGroups.rfc3526_6144);
  32. AddDefaultGroup(DHStandardGroups.rfc3526_8192);
  33. }
  34. // IList is (DHParameters)
  35. protected readonly IList mGroups;
  36. protected readonly int mMinimumPrimeBits;
  37. /// <summary>Accept various standard DH groups with 'P' at least <c>DefaultMinimumPrimeBits</c> bits.</summary>
  38. public DefaultTlsDHVerifier()
  39. : this(DefaultMinimumPrimeBits)
  40. {
  41. }
  42. /// <summary>Accept various standard DH groups with 'P' at least the specified number of bits.</summary>
  43. public DefaultTlsDHVerifier(int minimumPrimeBits)
  44. : this(DefaultGroups, minimumPrimeBits)
  45. {
  46. }
  47. /// <summary>Accept a custom set of group parameters, subject to a minimum bitlength for 'P'.</summary>
  48. /// <param name="groups">An <c>IList</c> of acceptable <c>DHParameters</c>.</param>
  49. /// <param name="minimumPrimeBits">The minimum acceptable bitlength of the 'P' parameter.</param>
  50. public DefaultTlsDHVerifier(IList groups, int minimumPrimeBits)
  51. {
  52. this.mGroups = groups;
  53. this.mMinimumPrimeBits = minimumPrimeBits;
  54. }
  55. public virtual bool Accept(DHParameters dhParameters)
  56. {
  57. return CheckMinimumPrimeBits(dhParameters) && CheckGroup(dhParameters);
  58. }
  59. public virtual int MinimumPrimeBits
  60. {
  61. get { return mMinimumPrimeBits; }
  62. }
  63. protected virtual bool AreGroupsEqual(DHParameters a, DHParameters b)
  64. {
  65. return a == b || (AreParametersEqual(a.P, b.P) && AreParametersEqual(a.G, b.G));
  66. }
  67. protected virtual bool AreParametersEqual(BigInteger a, BigInteger b)
  68. {
  69. return a == b || a.Equals(b);
  70. }
  71. protected virtual bool CheckGroup(DHParameters dhParameters)
  72. {
  73. foreach (DHParameters group in mGroups)
  74. {
  75. if (AreGroupsEqual(dhParameters, group))
  76. {
  77. return true;
  78. }
  79. }
  80. return false;
  81. }
  82. protected virtual bool CheckMinimumPrimeBits(DHParameters dhParameters)
  83. {
  84. return dhParameters.P.BitLength >= MinimumPrimeBits;
  85. }
  86. }
  87. }
  88. #pragma warning restore
  89. #endif