ECKeyPairGenerator.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  5. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.Sec;
  6. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X9;
  7. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.EC;
  8. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  9. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math;
  10. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math.EC;
  11. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Math.EC.Multiplier;
  12. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Security;
  13. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.Generators
  14. {
  15. public class ECKeyPairGenerator
  16. : IAsymmetricCipherKeyPairGenerator
  17. {
  18. private readonly string algorithm;
  19. private ECDomainParameters parameters;
  20. private DerObjectIdentifier publicKeyParamSet;
  21. private SecureRandom random;
  22. public ECKeyPairGenerator()
  23. : this("EC")
  24. {
  25. }
  26. public ECKeyPairGenerator(
  27. string algorithm)
  28. {
  29. if (algorithm == null)
  30. throw new ArgumentNullException("algorithm");
  31. this.algorithm = ECKeyParameters.VerifyAlgorithmName(algorithm);
  32. }
  33. public void Init(
  34. KeyGenerationParameters parameters)
  35. {
  36. if (parameters is ECKeyGenerationParameters)
  37. {
  38. ECKeyGenerationParameters ecP = (ECKeyGenerationParameters) parameters;
  39. this.publicKeyParamSet = ecP.PublicKeyParamSet;
  40. this.parameters = ecP.DomainParameters;
  41. }
  42. else
  43. {
  44. DerObjectIdentifier oid;
  45. switch (parameters.Strength)
  46. {
  47. case 192:
  48. oid = X9ObjectIdentifiers.Prime192v1;
  49. break;
  50. case 224:
  51. oid = SecObjectIdentifiers.SecP224r1;
  52. break;
  53. case 239:
  54. oid = X9ObjectIdentifiers.Prime239v1;
  55. break;
  56. case 256:
  57. oid = X9ObjectIdentifiers.Prime256v1;
  58. break;
  59. case 384:
  60. oid = SecObjectIdentifiers.SecP384r1;
  61. break;
  62. case 521:
  63. oid = SecObjectIdentifiers.SecP521r1;
  64. break;
  65. default:
  66. throw new InvalidParameterException("unknown key size.");
  67. }
  68. X9ECParameters ecps = FindECCurveByOid(oid);
  69. this.publicKeyParamSet = oid;
  70. this.parameters = new ECDomainParameters(
  71. ecps.Curve, ecps.G, ecps.N, ecps.H, ecps.GetSeed());
  72. }
  73. this.random = parameters.Random;
  74. if (this.random == null)
  75. {
  76. this.random = CryptoServicesRegistrar.GetSecureRandom();
  77. }
  78. }
  79. /**
  80. * Given the domain parameters this routine generates an EC key
  81. * pair in accordance with X9.62 section 5.2.1 pages 26, 27.
  82. */
  83. public AsymmetricCipherKeyPair GenerateKeyPair()
  84. {
  85. BigInteger n = parameters.N;
  86. BigInteger d;
  87. int minWeight = n.BitLength >> 2;
  88. for (;;)
  89. {
  90. d = new BigInteger(n.BitLength, random);
  91. if (d.CompareTo(BigInteger.One) < 0 || d.CompareTo(n) >= 0)
  92. continue;
  93. if (WNafUtilities.GetNafWeight(d) < minWeight)
  94. continue;
  95. break;
  96. }
  97. ECPoint q = CreateBasePointMultiplier().Multiply(parameters.G, d);
  98. if (publicKeyParamSet != null)
  99. {
  100. return new AsymmetricCipherKeyPair(
  101. new ECPublicKeyParameters(algorithm, q, publicKeyParamSet),
  102. new ECPrivateKeyParameters(algorithm, d, publicKeyParamSet));
  103. }
  104. return new AsymmetricCipherKeyPair(
  105. new ECPublicKeyParameters(algorithm, q, parameters),
  106. new ECPrivateKeyParameters(algorithm, d, parameters));
  107. }
  108. protected virtual ECMultiplier CreateBasePointMultiplier()
  109. {
  110. return new FixedPointCombMultiplier();
  111. }
  112. internal static X9ECParameters FindECCurveByName(string name)
  113. {
  114. X9ECParameters ecP = CustomNamedCurves.GetByName(name);
  115. if (ecP == null)
  116. {
  117. ecP = ECNamedCurveTable.GetByName(name);
  118. }
  119. return ecP;
  120. }
  121. internal static X9ECParametersHolder FindECCurveByNameLazy(string name)
  122. {
  123. X9ECParametersHolder holder = CustomNamedCurves.GetByNameLazy(name);
  124. if (holder == null)
  125. {
  126. holder = ECNamedCurveTable.GetByNameLazy(name);
  127. }
  128. return holder;
  129. }
  130. internal static X9ECParameters FindECCurveByOid(DerObjectIdentifier oid)
  131. {
  132. X9ECParameters ecP = CustomNamedCurves.GetByOid(oid);
  133. if (ecP == null)
  134. {
  135. ecP = ECNamedCurveTable.GetByOid(oid);
  136. }
  137. return ecP;
  138. }
  139. internal static X9ECParametersHolder FindECCurveByOidLazy(DerObjectIdentifier oid)
  140. {
  141. X9ECParametersHolder holder = CustomNamedCurves.GetByOidLazy(oid);
  142. if (holder == null)
  143. {
  144. holder = ECNamedCurveTable.GetByOidLazy(oid);
  145. }
  146. return holder;
  147. }
  148. internal static ECPublicKeyParameters GetCorrespondingPublicKey(
  149. ECPrivateKeyParameters privKey)
  150. {
  151. ECDomainParameters ec = privKey.Parameters;
  152. ECPoint q = new FixedPointCombMultiplier().Multiply(ec.G, privKey.D);
  153. if (privKey.PublicKeyParamSet != null)
  154. {
  155. return new ECPublicKeyParameters(privKey.AlgorithmName, q, privKey.PublicKeyParamSet);
  156. }
  157. return new ECPublicKeyParameters(privKey.AlgorithmName, q, ec);
  158. }
  159. }
  160. }
  161. #pragma warning restore
  162. #endif