X509Utilities.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  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.Asn1;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.CryptoPro;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nist;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Oiw;
  10. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs;
  11. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.TeleTrust;
  12. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  13. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X9;
  14. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
  15. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Parameters;
  16. using BestHTTP.SecureProtocol.Org.BouncyCastle.Security;
  17. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  18. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Collections;
  19. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.X509
  20. {
  21. internal class X509Utilities
  22. {
  23. private static readonly IDictionary algorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  24. private static readonly IDictionary exParams = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  25. private static readonly ISet noParams = new HashSet();
  26. static X509Utilities()
  27. {
  28. algorithms.Add("MD2WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD2WithRsaEncryption);
  29. algorithms.Add("MD2WITHRSA", PkcsObjectIdentifiers.MD2WithRsaEncryption);
  30. algorithms.Add("MD5WITHRSAENCRYPTION", PkcsObjectIdentifiers.MD5WithRsaEncryption);
  31. algorithms.Add("MD5WITHRSA", PkcsObjectIdentifiers.MD5WithRsaEncryption);
  32. algorithms.Add("SHA1WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha1WithRsaEncryption);
  33. algorithms.Add("SHA1WITHRSA", PkcsObjectIdentifiers.Sha1WithRsaEncryption);
  34. algorithms.Add("SHA224WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha224WithRsaEncryption);
  35. algorithms.Add("SHA224WITHRSA", PkcsObjectIdentifiers.Sha224WithRsaEncryption);
  36. algorithms.Add("SHA256WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha256WithRsaEncryption);
  37. algorithms.Add("SHA256WITHRSA", PkcsObjectIdentifiers.Sha256WithRsaEncryption);
  38. algorithms.Add("SHA384WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha384WithRsaEncryption);
  39. algorithms.Add("SHA384WITHRSA", PkcsObjectIdentifiers.Sha384WithRsaEncryption);
  40. algorithms.Add("SHA512WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha512WithRsaEncryption);
  41. algorithms.Add("SHA512WITHRSA", PkcsObjectIdentifiers.Sha512WithRsaEncryption);
  42. algorithms.Add("SHA1WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
  43. algorithms.Add("SHA224WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
  44. algorithms.Add("SHA256WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
  45. algorithms.Add("SHA384WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
  46. algorithms.Add("SHA512WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
  47. algorithms.Add("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
  48. algorithms.Add("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD160);
  49. algorithms.Add("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
  50. algorithms.Add("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD128);
  51. algorithms.Add("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
  52. algorithms.Add("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.RsaSignatureWithRipeMD256);
  53. algorithms.Add("SHA1WITHDSA", X9ObjectIdentifiers.IdDsaWithSha1);
  54. algorithms.Add("DSAWITHSHA1", X9ObjectIdentifiers.IdDsaWithSha1);
  55. algorithms.Add("SHA224WITHDSA", NistObjectIdentifiers.DsaWithSha224);
  56. algorithms.Add("SHA256WITHDSA", NistObjectIdentifiers.DsaWithSha256);
  57. algorithms.Add("SHA384WITHDSA", NistObjectIdentifiers.DsaWithSha384);
  58. algorithms.Add("SHA512WITHDSA", NistObjectIdentifiers.DsaWithSha512);
  59. algorithms.Add("SHA1WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha1);
  60. algorithms.Add("ECDSAWITHSHA1", X9ObjectIdentifiers.ECDsaWithSha1);
  61. algorithms.Add("SHA224WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha224);
  62. algorithms.Add("SHA256WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha256);
  63. algorithms.Add("SHA384WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha384);
  64. algorithms.Add("SHA512WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha512);
  65. algorithms.Add("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
  66. algorithms.Add("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
  67. algorithms.Add("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
  68. algorithms.Add("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
  69. algorithms.Add("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
  70. //
  71. // According to RFC 3279, the ASN.1 encoding SHALL (id-dsa-with-sha1) or MUST (ecdsa-with-SHA*) omit the parameters field.
  72. // The parameters field SHALL be NULL for RSA based signature algorithms.
  73. //
  74. noParams.Add(X9ObjectIdentifiers.ECDsaWithSha1);
  75. noParams.Add(X9ObjectIdentifiers.ECDsaWithSha224);
  76. noParams.Add(X9ObjectIdentifiers.ECDsaWithSha256);
  77. noParams.Add(X9ObjectIdentifiers.ECDsaWithSha384);
  78. noParams.Add(X9ObjectIdentifiers.ECDsaWithSha512);
  79. noParams.Add(X9ObjectIdentifiers.IdDsaWithSha1);
  80. noParams.Add(NistObjectIdentifiers.DsaWithSha224);
  81. noParams.Add(NistObjectIdentifiers.DsaWithSha256);
  82. noParams.Add(NistObjectIdentifiers.DsaWithSha384);
  83. noParams.Add(NistObjectIdentifiers.DsaWithSha512);
  84. //
  85. // RFC 4491
  86. //
  87. noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x94);
  88. noParams.Add(CryptoProObjectIdentifiers.GostR3411x94WithGostR3410x2001);
  89. //
  90. // explicit params
  91. //
  92. AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);
  93. exParams.Add("SHA1WITHRSAANDMGF1", CreatePssParams(sha1AlgId, 20));
  94. AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance);
  95. exParams.Add("SHA224WITHRSAANDMGF1", CreatePssParams(sha224AlgId, 28));
  96. AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance);
  97. exParams.Add("SHA256WITHRSAANDMGF1", CreatePssParams(sha256AlgId, 32));
  98. AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance);
  99. exParams.Add("SHA384WITHRSAANDMGF1", CreatePssParams(sha384AlgId, 48));
  100. AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance);
  101. exParams.Add("SHA512WITHRSAANDMGF1", CreatePssParams(sha512AlgId, 64));
  102. }
  103. private static RsassaPssParameters CreatePssParams(
  104. AlgorithmIdentifier hashAlgId,
  105. int saltSize)
  106. {
  107. return new RsassaPssParameters(
  108. hashAlgId,
  109. new AlgorithmIdentifier(PkcsObjectIdentifiers.IdMgf1, hashAlgId),
  110. new DerInteger(saltSize),
  111. new DerInteger(1));
  112. }
  113. internal static DerObjectIdentifier GetAlgorithmOid(
  114. string algorithmName)
  115. {
  116. algorithmName = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithmName);
  117. if (algorithms.Contains(algorithmName))
  118. {
  119. return (DerObjectIdentifier) algorithms[algorithmName];
  120. }
  121. return new DerObjectIdentifier(algorithmName);
  122. }
  123. internal static AlgorithmIdentifier GetSigAlgID(
  124. DerObjectIdentifier sigOid,
  125. string algorithmName)
  126. {
  127. if (noParams.Contains(sigOid))
  128. {
  129. return new AlgorithmIdentifier(sigOid);
  130. }
  131. algorithmName = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithmName);
  132. if (exParams.Contains(algorithmName))
  133. {
  134. return new AlgorithmIdentifier(sigOid, (Asn1Encodable) exParams[algorithmName]);
  135. }
  136. return new AlgorithmIdentifier(sigOid, DerNull.Instance);
  137. }
  138. internal static IEnumerable GetAlgNames()
  139. {
  140. return new EnumerableProxy(algorithms.Keys);
  141. }
  142. internal static byte[] GetSignatureForObject(
  143. DerObjectIdentifier sigOid, // TODO Redundant now?
  144. string sigName,
  145. AsymmetricKeyParameter privateKey,
  146. SecureRandom random,
  147. Asn1Encodable ae)
  148. {
  149. if (sigOid == null)
  150. throw new ArgumentNullException("sigOid");
  151. ISigner sig = SignerUtilities.GetSigner(sigName);
  152. if (random != null)
  153. {
  154. sig.Init(true, new ParametersWithRandom(privateKey, random));
  155. }
  156. else
  157. {
  158. sig.Init(true, privateKey);
  159. }
  160. byte[] encoded = ae.GetDerEncoded();
  161. sig.BlockUpdate(encoded, 0, encoded.Length);
  162. return sig.GenerateSignature();
  163. }
  164. }
  165. }
  166. #pragma warning restore
  167. #endif