GeneratorUtilities.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System.Collections;
  4. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.CryptoPro;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.EdEC;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Iana;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Kisa;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nist;
  10. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nsri;
  11. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Ntt;
  12. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Oiw;
  13. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs;
  14. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Rosstandart;
  15. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X9;
  16. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
  17. using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Generators;
  18. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  19. namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Security
  20. {
  21. public sealed class GeneratorUtilities
  22. {
  23. private GeneratorUtilities()
  24. {
  25. }
  26. private static readonly IDictionary kgAlgorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  27. private static readonly IDictionary kpgAlgorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  28. private static readonly IDictionary defaultKeySizes = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
  29. static GeneratorUtilities()
  30. {
  31. //
  32. // key generators.
  33. //
  34. AddKgAlgorithm("AES",
  35. "AESWRAP");
  36. AddKgAlgorithm("AES128",
  37. "2.16.840.1.101.3.4.2",
  38. NistObjectIdentifiers.IdAes128Cbc,
  39. NistObjectIdentifiers.IdAes128Ccm,
  40. NistObjectIdentifiers.IdAes128Cfb,
  41. NistObjectIdentifiers.IdAes128Ecb,
  42. NistObjectIdentifiers.IdAes128Gcm,
  43. NistObjectIdentifiers.IdAes128Ofb,
  44. NistObjectIdentifiers.IdAes128Wrap);
  45. AddKgAlgorithm("AES192",
  46. "2.16.840.1.101.3.4.22",
  47. NistObjectIdentifiers.IdAes192Cbc,
  48. NistObjectIdentifiers.IdAes192Ccm,
  49. NistObjectIdentifiers.IdAes192Cfb,
  50. NistObjectIdentifiers.IdAes192Ecb,
  51. NistObjectIdentifiers.IdAes192Gcm,
  52. NistObjectIdentifiers.IdAes192Ofb,
  53. NistObjectIdentifiers.IdAes192Wrap);
  54. AddKgAlgorithm("AES256",
  55. "2.16.840.1.101.3.4.42",
  56. NistObjectIdentifiers.IdAes256Cbc,
  57. NistObjectIdentifiers.IdAes256Ccm,
  58. NistObjectIdentifiers.IdAes256Cfb,
  59. NistObjectIdentifiers.IdAes256Ecb,
  60. NistObjectIdentifiers.IdAes256Gcm,
  61. NistObjectIdentifiers.IdAes256Ofb,
  62. NistObjectIdentifiers.IdAes256Wrap);
  63. AddKgAlgorithm("BLOWFISH",
  64. "1.3.6.1.4.1.3029.1.2");
  65. AddKgAlgorithm("CAMELLIA",
  66. "CAMELLIAWRAP");
  67. AddKgAlgorithm("ARIA");
  68. AddKgAlgorithm("ARIA128",
  69. NsriObjectIdentifiers.id_aria128_cbc,
  70. NsriObjectIdentifiers.id_aria128_ccm,
  71. NsriObjectIdentifiers.id_aria128_cfb,
  72. NsriObjectIdentifiers.id_aria128_ctr,
  73. NsriObjectIdentifiers.id_aria128_ecb,
  74. NsriObjectIdentifiers.id_aria128_gcm,
  75. NsriObjectIdentifiers.id_aria128_ocb2,
  76. NsriObjectIdentifiers.id_aria128_ofb);
  77. AddKgAlgorithm("ARIA192",
  78. NsriObjectIdentifiers.id_aria192_cbc,
  79. NsriObjectIdentifiers.id_aria192_ccm,
  80. NsriObjectIdentifiers.id_aria192_cfb,
  81. NsriObjectIdentifiers.id_aria192_ctr,
  82. NsriObjectIdentifiers.id_aria192_ecb,
  83. NsriObjectIdentifiers.id_aria192_gcm,
  84. NsriObjectIdentifiers.id_aria192_ocb2,
  85. NsriObjectIdentifiers.id_aria192_ofb);
  86. AddKgAlgorithm("ARIA256",
  87. NsriObjectIdentifiers.id_aria256_cbc,
  88. NsriObjectIdentifiers.id_aria256_ccm,
  89. NsriObjectIdentifiers.id_aria256_cfb,
  90. NsriObjectIdentifiers.id_aria256_ctr,
  91. NsriObjectIdentifiers.id_aria256_ecb,
  92. NsriObjectIdentifiers.id_aria256_gcm,
  93. NsriObjectIdentifiers.id_aria256_ocb2,
  94. NsriObjectIdentifiers.id_aria256_ofb);
  95. AddKgAlgorithm("CAMELLIA128",
  96. NttObjectIdentifiers.IdCamellia128Cbc,
  97. NttObjectIdentifiers.IdCamellia128Wrap);
  98. AddKgAlgorithm("CAMELLIA192",
  99. NttObjectIdentifiers.IdCamellia192Cbc,
  100. NttObjectIdentifiers.IdCamellia192Wrap);
  101. AddKgAlgorithm("CAMELLIA256",
  102. NttObjectIdentifiers.IdCamellia256Cbc,
  103. NttObjectIdentifiers.IdCamellia256Wrap);
  104. AddKgAlgorithm("CAST5",
  105. "1.2.840.113533.7.66.10");
  106. AddKgAlgorithm("CAST6");
  107. AddKgAlgorithm("CHACHA");
  108. AddKgAlgorithm("CHACHA7539",
  109. "CHACHA20",
  110. "CHACHA20-POLY1305",
  111. PkcsObjectIdentifiers.IdAlgAeadChaCha20Poly1305);
  112. AddKgAlgorithm("DES",
  113. OiwObjectIdentifiers.DesCbc,
  114. OiwObjectIdentifiers.DesCfb,
  115. OiwObjectIdentifiers.DesEcb,
  116. OiwObjectIdentifiers.DesOfb);
  117. AddKgAlgorithm("DESEDE",
  118. "DESEDEWRAP",
  119. "TDEA",
  120. OiwObjectIdentifiers.DesEde);
  121. AddKgAlgorithm("DESEDE3",
  122. PkcsObjectIdentifiers.DesEde3Cbc,
  123. PkcsObjectIdentifiers.IdAlgCms3DesWrap);
  124. AddKgAlgorithm("GOST28147",
  125. "GOST",
  126. "GOST-28147",
  127. CryptoProObjectIdentifiers.GostR28147Cbc);
  128. AddKgAlgorithm("HC128");
  129. AddKgAlgorithm("HC256");
  130. AddKgAlgorithm("IDEA",
  131. "1.3.6.1.4.1.188.7.1.1.2");
  132. AddKgAlgorithm("NOEKEON");
  133. AddKgAlgorithm("RC2",
  134. PkcsObjectIdentifiers.RC2Cbc,
  135. PkcsObjectIdentifiers.IdAlgCmsRC2Wrap);
  136. AddKgAlgorithm("RC4",
  137. "ARC4",
  138. "1.2.840.113549.3.4");
  139. AddKgAlgorithm("RC5",
  140. "RC5-32");
  141. AddKgAlgorithm("RC5-64");
  142. AddKgAlgorithm("RC6");
  143. AddKgAlgorithm("RIJNDAEL");
  144. AddKgAlgorithm("SALSA20");
  145. AddKgAlgorithm("SEED",
  146. KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap,
  147. KisaObjectIdentifiers.IdSeedCbc);
  148. AddKgAlgorithm("SERPENT");
  149. AddKgAlgorithm("SKIPJACK");
  150. AddKgAlgorithm("SM4");
  151. AddKgAlgorithm("TEA");
  152. AddKgAlgorithm("THREEFISH-256");
  153. AddKgAlgorithm("THREEFISH-512");
  154. AddKgAlgorithm("THREEFISH-1024");
  155. AddKgAlgorithm("TNEPRES");
  156. AddKgAlgorithm("TWOFISH");
  157. AddKgAlgorithm("VMPC");
  158. AddKgAlgorithm("VMPC-KSA3");
  159. AddKgAlgorithm("XTEA");
  160. //
  161. // HMac key generators
  162. //
  163. AddHMacKeyGenerator("MD2");
  164. AddHMacKeyGenerator("MD4");
  165. AddHMacKeyGenerator("MD5",
  166. IanaObjectIdentifiers.HmacMD5);
  167. AddHMacKeyGenerator("SHA1",
  168. PkcsObjectIdentifiers.IdHmacWithSha1,
  169. IanaObjectIdentifiers.HmacSha1);
  170. AddHMacKeyGenerator("SHA224",
  171. PkcsObjectIdentifiers.IdHmacWithSha224);
  172. AddHMacKeyGenerator("SHA256",
  173. PkcsObjectIdentifiers.IdHmacWithSha256);
  174. AddHMacKeyGenerator("SHA384",
  175. PkcsObjectIdentifiers.IdHmacWithSha384);
  176. AddHMacKeyGenerator("SHA512",
  177. PkcsObjectIdentifiers.IdHmacWithSha512);
  178. AddHMacKeyGenerator("SHA512/224");
  179. AddHMacKeyGenerator("SHA512/256");
  180. AddHMacKeyGenerator("KECCAK224");
  181. AddHMacKeyGenerator("KECCAK256");
  182. AddHMacKeyGenerator("KECCAK288");
  183. AddHMacKeyGenerator("KECCAK384");
  184. AddHMacKeyGenerator("KECCAK512");
  185. AddHMacKeyGenerator("SHA3-224",
  186. NistObjectIdentifiers.IdHMacWithSha3_224);
  187. AddHMacKeyGenerator("SHA3-256",
  188. NistObjectIdentifiers.IdHMacWithSha3_256);
  189. AddHMacKeyGenerator("SHA3-384",
  190. NistObjectIdentifiers.IdHMacWithSha3_384);
  191. AddHMacKeyGenerator("SHA3-512",
  192. NistObjectIdentifiers.IdHMacWithSha3_512);
  193. AddHMacKeyGenerator("RIPEMD128");
  194. AddHMacKeyGenerator("RIPEMD160",
  195. IanaObjectIdentifiers.HmacRipeMD160);
  196. AddHMacKeyGenerator("TIGER",
  197. IanaObjectIdentifiers.HmacTiger);
  198. AddHMacKeyGenerator("GOST3411-2012-256",
  199. RosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256);
  200. AddHMacKeyGenerator("GOST3411-2012-512",
  201. RosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_512);
  202. //
  203. // key pair generators.
  204. //
  205. AddKpgAlgorithm("DH",
  206. "DIFFIEHELLMAN");
  207. AddKpgAlgorithm("DSA");
  208. AddKpgAlgorithm("EC",
  209. // TODO Should this be an alias for ECDH?
  210. X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme);
  211. AddKpgAlgorithm("ECDH",
  212. "ECIES");
  213. AddKpgAlgorithm("ECDHC");
  214. AddKpgAlgorithm("ECMQV",
  215. X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme);
  216. AddKpgAlgorithm("ECDSA");
  217. AddKpgAlgorithm("ECGOST3410",
  218. "ECGOST-3410",
  219. "GOST-3410-2001");
  220. AddKpgAlgorithm("Ed25519",
  221. "Ed25519ctx",
  222. "Ed25519ph",
  223. EdECObjectIdentifiers.id_Ed25519);
  224. AddKpgAlgorithm("Ed448",
  225. "Ed448ph",
  226. EdECObjectIdentifiers.id_Ed448);
  227. AddKpgAlgorithm("ELGAMAL");
  228. AddKpgAlgorithm("GOST3410",
  229. "GOST-3410",
  230. "GOST-3410-94");
  231. AddKpgAlgorithm("RSA",
  232. "1.2.840.113549.1.1.1");
  233. AddKpgAlgorithm("RSASSA-PSS");
  234. AddKpgAlgorithm("X25519",
  235. EdECObjectIdentifiers.id_X25519);
  236. AddKpgAlgorithm("X448",
  237. EdECObjectIdentifiers.id_X448);
  238. AddDefaultKeySizeEntries(64, "DES");
  239. AddDefaultKeySizeEntries(80, "SKIPJACK");
  240. AddDefaultKeySizeEntries(128, "AES128", "ARIA128", "BLOWFISH", "CAMELLIA128", "CAST5", "CHACHA", "DESEDE",
  241. "HC128", "HMACMD2", "HMACMD4", "HMACMD5", "HMACRIPEMD128", "IDEA", "NOEKEON",
  242. "RC2", "RC4", "RC5", "SALSA20", "SEED", "SM4", "TEA", "XTEA", "VMPC", "VMPC-KSA3");
  243. AddDefaultKeySizeEntries(160, "HMACRIPEMD160", "HMACSHA1");
  244. AddDefaultKeySizeEntries(192, "AES", "AES192", "ARIA192", "CAMELLIA192", "DESEDE3", "HMACTIGER",
  245. "RIJNDAEL", "SERPENT", "TNEPRES");
  246. AddDefaultKeySizeEntries(224, "HMACSHA3-224", "HMACKECCAK224", "HMACSHA224", "HMACSHA512/224");
  247. AddDefaultKeySizeEntries(256, "AES256", "ARIA", "ARIA256", "CAMELLIA", "CAMELLIA256", "CAST6",
  248. "CHACHA7539", "GOST28147", "HC256", "HMACGOST3411-2012-256", "HMACSHA3-256", "HMACKECCAK256",
  249. "HMACSHA256", "HMACSHA512/256", "RC5-64", "RC6", "THREEFISH-256", "TWOFISH");
  250. AddDefaultKeySizeEntries(288, "HMACKECCAK288");
  251. AddDefaultKeySizeEntries(384, "HMACSHA3-384", "HMACKECCAK384", "HMACSHA384");
  252. AddDefaultKeySizeEntries(512, "HMACGOST3411-2012-512", "HMACSHA3-512", "HMACKECCAK512", "HMACSHA512",
  253. "THREEFISH-512");
  254. AddDefaultKeySizeEntries(1024, "THREEFISH-1024");
  255. }
  256. private static void AddDefaultKeySizeEntries(int size, params string[] algorithms)
  257. {
  258. foreach (string algorithm in algorithms)
  259. {
  260. defaultKeySizes.Add(algorithm, size);
  261. }
  262. }
  263. private static void AddKgAlgorithm(
  264. string canonicalName,
  265. params object[] aliases)
  266. {
  267. kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(canonicalName)] = canonicalName;
  268. foreach (object alias in aliases)
  269. {
  270. kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = canonicalName;
  271. }
  272. }
  273. private static void AddKpgAlgorithm(
  274. string canonicalName,
  275. params object[] aliases)
  276. {
  277. kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(canonicalName)] = canonicalName;
  278. foreach (object alias in aliases)
  279. {
  280. kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = canonicalName;
  281. }
  282. }
  283. private static void AddHMacKeyGenerator(
  284. string algorithm,
  285. params object[] aliases)
  286. {
  287. string mainName = "HMAC" + algorithm;
  288. kgAlgorithms[mainName] = mainName;
  289. kgAlgorithms["HMAC-" + algorithm] = mainName;
  290. kgAlgorithms["HMAC/" + algorithm] = mainName;
  291. foreach (object alias in aliases)
  292. {
  293. kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = mainName;
  294. }
  295. }
  296. // TODO Consider making this public
  297. internal static string GetCanonicalKeyGeneratorAlgorithm(
  298. string algorithm)
  299. {
  300. return (string) kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithm)];
  301. }
  302. // TODO Consider making this public
  303. internal static string GetCanonicalKeyPairGeneratorAlgorithm(
  304. string algorithm)
  305. {
  306. return (string)kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithm)];
  307. }
  308. public static CipherKeyGenerator GetKeyGenerator(
  309. DerObjectIdentifier oid)
  310. {
  311. return GetKeyGenerator(oid.Id);
  312. }
  313. public static CipherKeyGenerator GetKeyGenerator(
  314. string algorithm)
  315. {
  316. string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
  317. if (canonicalName == null)
  318. throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
  319. int defaultKeySize = FindDefaultKeySize(canonicalName);
  320. if (defaultKeySize == -1)
  321. throw new SecurityUtilityException("KeyGenerator " + algorithm
  322. + " (" + canonicalName + ") not supported.");
  323. if (canonicalName == "DES")
  324. return new DesKeyGenerator(defaultKeySize);
  325. if (canonicalName == "DESEDE" || canonicalName == "DESEDE3")
  326. return new DesEdeKeyGenerator(defaultKeySize);
  327. return new CipherKeyGenerator(defaultKeySize);
  328. }
  329. public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
  330. DerObjectIdentifier oid)
  331. {
  332. return GetKeyPairGenerator(oid.Id);
  333. }
  334. public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
  335. string algorithm)
  336. {
  337. string canonicalName = GetCanonicalKeyPairGeneratorAlgorithm(algorithm);
  338. if (canonicalName == null)
  339. throw new SecurityUtilityException("KeyPairGenerator " + algorithm + " not recognised.");
  340. if (canonicalName == "DH")
  341. return new DHKeyPairGenerator();
  342. if (canonicalName == "DSA")
  343. return new DsaKeyPairGenerator();
  344. // "EC", "ECDH", "ECDHC", "ECDSA", "ECGOST3410", "ECMQV"
  345. if (BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.StartsWith(canonicalName, "EC"))
  346. return new ECKeyPairGenerator(canonicalName);
  347. if (canonicalName == "Ed25519")
  348. return new Ed25519KeyPairGenerator();
  349. if (canonicalName == "Ed448")
  350. return new Ed448KeyPairGenerator();
  351. if (canonicalName == "ELGAMAL")
  352. return new ElGamalKeyPairGenerator();
  353. if (canonicalName == "GOST3410")
  354. return new Gost3410KeyPairGenerator();
  355. if (canonicalName == "RSA" || canonicalName == "RSASSA-PSS")
  356. return new RsaKeyPairGenerator();
  357. if (canonicalName == "X25519")
  358. return new X25519KeyPairGenerator();
  359. if (canonicalName == "X448")
  360. return new X448KeyPairGenerator();
  361. throw new SecurityUtilityException("KeyPairGenerator " + algorithm
  362. + " (" + canonicalName + ") not supported.");
  363. }
  364. internal static int GetDefaultKeySize(
  365. DerObjectIdentifier oid)
  366. {
  367. return GetDefaultKeySize(oid.Id);
  368. }
  369. internal static int GetDefaultKeySize(
  370. string algorithm)
  371. {
  372. string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
  373. if (canonicalName == null)
  374. throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
  375. int defaultKeySize = FindDefaultKeySize(canonicalName);
  376. if (defaultKeySize == -1)
  377. throw new SecurityUtilityException("KeyGenerator " + algorithm
  378. + " (" + canonicalName + ") not supported.");
  379. return defaultKeySize;
  380. }
  381. private static int FindDefaultKeySize(
  382. string canonicalName)
  383. {
  384. if (!defaultKeySizes.Contains(canonicalName))
  385. return -1;
  386. return (int)defaultKeySizes[canonicalName];
  387. }
  388. }
  389. }
  390. #pragma warning restore
  391. #endif