DefaultTlsDHGroupVerifier.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.Collections.Generic;
  5. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math;
  6. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Tls.Crypto;
  7. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Tls
  8. {
  9. public class DefaultTlsDHGroupVerifier
  10. : TlsDHGroupVerifier
  11. {
  12. public static readonly int DefaultMinimumPrimeBits = 2048;
  13. private static readonly List<DHGroup> DefaultGroups = new List<DHGroup>();
  14. private static void AddDefaultGroup(DHGroup dhGroup)
  15. {
  16. DefaultGroups.Add(dhGroup);
  17. }
  18. static DefaultTlsDHGroupVerifier()
  19. {
  20. /*
  21. * These 10 standard groups are those specified in NIST SP 800-56A Rev. 3 Appendix D. Make
  22. * sure to consider the impact on BCJSSE's FIPS mode and/or usage with the BCFIPS provider
  23. * before modifying this list.
  24. */
  25. AddDefaultGroup(DHStandardGroups.rfc3526_2048);
  26. AddDefaultGroup(DHStandardGroups.rfc3526_3072);
  27. AddDefaultGroup(DHStandardGroups.rfc3526_4096);
  28. AddDefaultGroup(DHStandardGroups.rfc3526_6144);
  29. AddDefaultGroup(DHStandardGroups.rfc3526_8192);
  30. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe2048);
  31. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe3072);
  32. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe4096);
  33. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe6144);
  34. AddDefaultGroup(DHStandardGroups.rfc7919_ffdhe8192);
  35. }
  36. // IList is (DHGroup)
  37. protected readonly IList<DHGroup> m_groups;
  38. protected readonly int m_minimumPrimeBits;
  39. /// <summary>Accept named groups and various standard DH groups with 'P' at least
  40. /// <see cref="DefaultMinimumPrimeBits"/> bits.</summary>
  41. public DefaultTlsDHGroupVerifier()
  42. : this(DefaultMinimumPrimeBits)
  43. {
  44. }
  45. /// <summary>Accept named groups and various standard DH groups with 'P' at least the specified number of bits.
  46. /// </summary>
  47. /// <param name="minimumPrimeBits">the minimum bitlength of 'P'.</param>
  48. public DefaultTlsDHGroupVerifier(int minimumPrimeBits)
  49. : this(DefaultGroups, minimumPrimeBits)
  50. {
  51. }
  52. /// <summary>Accept named groups and a custom set of group parameters, subject to a minimum bitlength for 'P'.
  53. /// </summary>
  54. /// <param name="groups">a <see cref="IList{T}">list</see> of acceptable <see cref="DHGroup"/>s.</param>
  55. /// <param name="minimumPrimeBits">the minimum bitlength of 'P'.</param>
  56. public DefaultTlsDHGroupVerifier(IList<DHGroup> groups, int minimumPrimeBits)
  57. {
  58. this.m_groups = new List<DHGroup>(groups);
  59. this.m_minimumPrimeBits = minimumPrimeBits;
  60. }
  61. public virtual bool Accept(DHGroup dhGroup)
  62. {
  63. return CheckMinimumPrimeBits(dhGroup) && CheckGroup(dhGroup);
  64. }
  65. public virtual int MinimumPrimeBits
  66. {
  67. get { return m_minimumPrimeBits; }
  68. }
  69. protected virtual bool AreGroupsEqual(DHGroup a, DHGroup b)
  70. {
  71. return a == b || (AreParametersEqual(a.P, b.P) && AreParametersEqual(a.G, b.G));
  72. }
  73. protected virtual bool AreParametersEqual(BigInteger a, BigInteger b)
  74. {
  75. return a == b || a.Equals(b);
  76. }
  77. protected virtual bool CheckGroup(DHGroup dhGroup)
  78. {
  79. foreach (DHGroup group in m_groups)
  80. {
  81. if (AreGroupsEqual(dhGroup, group))
  82. return true;
  83. }
  84. return false;
  85. }
  86. protected virtual bool CheckMinimumPrimeBits(DHGroup dhGroup)
  87. {
  88. return dhGroup.P.BitLength >= MinimumPrimeBits;
  89. }
  90. }
  91. }
  92. #pragma warning restore
  93. #endif