123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
- #pragma warning disable
- using System.Collections;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.CryptoPro;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.EdEC;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Iana;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Kisa;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nist;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Nsri;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Ntt;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Oiw;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Pkcs;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Rosstandart;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X9;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Crypto.Generators;
- using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
- namespace BestHTTP.SecureProtocol.Org.BouncyCastle.Security
- {
- public sealed class GeneratorUtilities
- {
- private GeneratorUtilities()
- {
- }
- private static readonly IDictionary kgAlgorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
- private static readonly IDictionary kpgAlgorithms = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
- private static readonly IDictionary defaultKeySizes = BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.CreateHashtable();
- static GeneratorUtilities()
- {
- //
- // key generators.
- //
- AddKgAlgorithm("AES",
- "AESWRAP");
- AddKgAlgorithm("AES128",
- "2.16.840.1.101.3.4.2",
- NistObjectIdentifiers.IdAes128Cbc,
- NistObjectIdentifiers.IdAes128Ccm,
- NistObjectIdentifiers.IdAes128Cfb,
- NistObjectIdentifiers.IdAes128Ecb,
- NistObjectIdentifiers.IdAes128Gcm,
- NistObjectIdentifiers.IdAes128Ofb,
- NistObjectIdentifiers.IdAes128Wrap);
- AddKgAlgorithm("AES192",
- "2.16.840.1.101.3.4.22",
- NistObjectIdentifiers.IdAes192Cbc,
- NistObjectIdentifiers.IdAes192Ccm,
- NistObjectIdentifiers.IdAes192Cfb,
- NistObjectIdentifiers.IdAes192Ecb,
- NistObjectIdentifiers.IdAes192Gcm,
- NistObjectIdentifiers.IdAes192Ofb,
- NistObjectIdentifiers.IdAes192Wrap);
- AddKgAlgorithm("AES256",
- "2.16.840.1.101.3.4.42",
- NistObjectIdentifiers.IdAes256Cbc,
- NistObjectIdentifiers.IdAes256Ccm,
- NistObjectIdentifiers.IdAes256Cfb,
- NistObjectIdentifiers.IdAes256Ecb,
- NistObjectIdentifiers.IdAes256Gcm,
- NistObjectIdentifiers.IdAes256Ofb,
- NistObjectIdentifiers.IdAes256Wrap);
- AddKgAlgorithm("BLOWFISH",
- "1.3.6.1.4.1.3029.1.2");
- AddKgAlgorithm("CAMELLIA",
- "CAMELLIAWRAP");
- AddKgAlgorithm("ARIA");
- AddKgAlgorithm("ARIA128",
- NsriObjectIdentifiers.id_aria128_cbc,
- NsriObjectIdentifiers.id_aria128_ccm,
- NsriObjectIdentifiers.id_aria128_cfb,
- NsriObjectIdentifiers.id_aria128_ctr,
- NsriObjectIdentifiers.id_aria128_ecb,
- NsriObjectIdentifiers.id_aria128_gcm,
- NsriObjectIdentifiers.id_aria128_ocb2,
- NsriObjectIdentifiers.id_aria128_ofb);
- AddKgAlgorithm("ARIA192",
- NsriObjectIdentifiers.id_aria192_cbc,
- NsriObjectIdentifiers.id_aria192_ccm,
- NsriObjectIdentifiers.id_aria192_cfb,
- NsriObjectIdentifiers.id_aria192_ctr,
- NsriObjectIdentifiers.id_aria192_ecb,
- NsriObjectIdentifiers.id_aria192_gcm,
- NsriObjectIdentifiers.id_aria192_ocb2,
- NsriObjectIdentifiers.id_aria192_ofb);
- AddKgAlgorithm("ARIA256",
- NsriObjectIdentifiers.id_aria256_cbc,
- NsriObjectIdentifiers.id_aria256_ccm,
- NsriObjectIdentifiers.id_aria256_cfb,
- NsriObjectIdentifiers.id_aria256_ctr,
- NsriObjectIdentifiers.id_aria256_ecb,
- NsriObjectIdentifiers.id_aria256_gcm,
- NsriObjectIdentifiers.id_aria256_ocb2,
- NsriObjectIdentifiers.id_aria256_ofb);
- AddKgAlgorithm("CAMELLIA128",
- NttObjectIdentifiers.IdCamellia128Cbc,
- NttObjectIdentifiers.IdCamellia128Wrap);
- AddKgAlgorithm("CAMELLIA192",
- NttObjectIdentifiers.IdCamellia192Cbc,
- NttObjectIdentifiers.IdCamellia192Wrap);
- AddKgAlgorithm("CAMELLIA256",
- NttObjectIdentifiers.IdCamellia256Cbc,
- NttObjectIdentifiers.IdCamellia256Wrap);
- AddKgAlgorithm("CAST5",
- "1.2.840.113533.7.66.10");
- AddKgAlgorithm("CAST6");
- AddKgAlgorithm("CHACHA");
- AddKgAlgorithm("CHACHA7539",
- "CHACHA20",
- "CHACHA20-POLY1305",
- PkcsObjectIdentifiers.IdAlgAeadChaCha20Poly1305);
- AddKgAlgorithm("DES",
- OiwObjectIdentifiers.DesCbc,
- OiwObjectIdentifiers.DesCfb,
- OiwObjectIdentifiers.DesEcb,
- OiwObjectIdentifiers.DesOfb);
- AddKgAlgorithm("DESEDE",
- "DESEDEWRAP",
- "TDEA",
- OiwObjectIdentifiers.DesEde);
- AddKgAlgorithm("DESEDE3",
- PkcsObjectIdentifiers.DesEde3Cbc,
- PkcsObjectIdentifiers.IdAlgCms3DesWrap);
- AddKgAlgorithm("GOST28147",
- "GOST",
- "GOST-28147",
- CryptoProObjectIdentifiers.GostR28147Cbc);
- AddKgAlgorithm("HC128");
- AddKgAlgorithm("HC256");
- AddKgAlgorithm("IDEA",
- "1.3.6.1.4.1.188.7.1.1.2");
- AddKgAlgorithm("NOEKEON");
- AddKgAlgorithm("RC2",
- PkcsObjectIdentifiers.RC2Cbc,
- PkcsObjectIdentifiers.IdAlgCmsRC2Wrap);
- AddKgAlgorithm("RC4",
- "ARC4",
- "1.2.840.113549.3.4");
- AddKgAlgorithm("RC5",
- "RC5-32");
- AddKgAlgorithm("RC5-64");
- AddKgAlgorithm("RC6");
- AddKgAlgorithm("RIJNDAEL");
- AddKgAlgorithm("SALSA20");
- AddKgAlgorithm("SEED",
- KisaObjectIdentifiers.IdNpkiAppCmsSeedWrap,
- KisaObjectIdentifiers.IdSeedCbc);
- AddKgAlgorithm("SERPENT");
- AddKgAlgorithm("SKIPJACK");
- AddKgAlgorithm("SM4");
- AddKgAlgorithm("TEA");
- AddKgAlgorithm("THREEFISH-256");
- AddKgAlgorithm("THREEFISH-512");
- AddKgAlgorithm("THREEFISH-1024");
- AddKgAlgorithm("TNEPRES");
- AddKgAlgorithm("TWOFISH");
- AddKgAlgorithm("VMPC");
- AddKgAlgorithm("VMPC-KSA3");
- AddKgAlgorithm("XTEA");
- //
- // HMac key generators
- //
- AddHMacKeyGenerator("MD2");
- AddHMacKeyGenerator("MD4");
- AddHMacKeyGenerator("MD5",
- IanaObjectIdentifiers.HmacMD5);
- AddHMacKeyGenerator("SHA1",
- PkcsObjectIdentifiers.IdHmacWithSha1,
- IanaObjectIdentifiers.HmacSha1);
- AddHMacKeyGenerator("SHA224",
- PkcsObjectIdentifiers.IdHmacWithSha224);
- AddHMacKeyGenerator("SHA256",
- PkcsObjectIdentifiers.IdHmacWithSha256);
- AddHMacKeyGenerator("SHA384",
- PkcsObjectIdentifiers.IdHmacWithSha384);
- AddHMacKeyGenerator("SHA512",
- PkcsObjectIdentifiers.IdHmacWithSha512);
- AddHMacKeyGenerator("SHA512/224");
- AddHMacKeyGenerator("SHA512/256");
- AddHMacKeyGenerator("KECCAK224");
- AddHMacKeyGenerator("KECCAK256");
- AddHMacKeyGenerator("KECCAK288");
- AddHMacKeyGenerator("KECCAK384");
- AddHMacKeyGenerator("KECCAK512");
- AddHMacKeyGenerator("SHA3-224",
- NistObjectIdentifiers.IdHMacWithSha3_224);
- AddHMacKeyGenerator("SHA3-256",
- NistObjectIdentifiers.IdHMacWithSha3_256);
- AddHMacKeyGenerator("SHA3-384",
- NistObjectIdentifiers.IdHMacWithSha3_384);
- AddHMacKeyGenerator("SHA3-512",
- NistObjectIdentifiers.IdHMacWithSha3_512);
- AddHMacKeyGenerator("RIPEMD128");
- AddHMacKeyGenerator("RIPEMD160",
- IanaObjectIdentifiers.HmacRipeMD160);
- AddHMacKeyGenerator("TIGER",
- IanaObjectIdentifiers.HmacTiger);
- AddHMacKeyGenerator("GOST3411-2012-256",
- RosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_256);
- AddHMacKeyGenerator("GOST3411-2012-512",
- RosstandartObjectIdentifiers.id_tc26_hmac_gost_3411_12_512);
- //
- // key pair generators.
- //
- AddKpgAlgorithm("DH",
- "DIFFIEHELLMAN");
- AddKpgAlgorithm("DSA");
- AddKpgAlgorithm("EC",
- // TODO Should this be an alias for ECDH?
- X9ObjectIdentifiers.DHSinglePassStdDHSha1KdfScheme);
- AddKpgAlgorithm("ECDH",
- "ECIES");
- AddKpgAlgorithm("ECDHC");
- AddKpgAlgorithm("ECMQV",
- X9ObjectIdentifiers.MqvSinglePassSha1KdfScheme);
- AddKpgAlgorithm("ECDSA");
- AddKpgAlgorithm("ECGOST3410",
- "ECGOST-3410",
- "GOST-3410-2001");
- AddKpgAlgorithm("Ed25519",
- "Ed25519ctx",
- "Ed25519ph",
- EdECObjectIdentifiers.id_Ed25519);
- AddKpgAlgorithm("Ed448",
- "Ed448ph",
- EdECObjectIdentifiers.id_Ed448);
- AddKpgAlgorithm("ELGAMAL");
- AddKpgAlgorithm("GOST3410",
- "GOST-3410",
- "GOST-3410-94");
- AddKpgAlgorithm("RSA",
- "1.2.840.113549.1.1.1");
- AddKpgAlgorithm("RSASSA-PSS");
- AddKpgAlgorithm("X25519",
- EdECObjectIdentifiers.id_X25519);
- AddKpgAlgorithm("X448",
- EdECObjectIdentifiers.id_X448);
- AddDefaultKeySizeEntries(64, "DES");
- AddDefaultKeySizeEntries(80, "SKIPJACK");
- AddDefaultKeySizeEntries(128, "AES128", "ARIA128", "BLOWFISH", "CAMELLIA128", "CAST5", "CHACHA", "DESEDE",
- "HC128", "HMACMD2", "HMACMD4", "HMACMD5", "HMACRIPEMD128", "IDEA", "NOEKEON",
- "RC2", "RC4", "RC5", "SALSA20", "SEED", "SM4", "TEA", "XTEA", "VMPC", "VMPC-KSA3");
- AddDefaultKeySizeEntries(160, "HMACRIPEMD160", "HMACSHA1");
- AddDefaultKeySizeEntries(192, "AES", "AES192", "ARIA192", "CAMELLIA192", "DESEDE3", "HMACTIGER",
- "RIJNDAEL", "SERPENT", "TNEPRES");
- AddDefaultKeySizeEntries(224, "HMACSHA3-224", "HMACKECCAK224", "HMACSHA224", "HMACSHA512/224");
- AddDefaultKeySizeEntries(256, "AES256", "ARIA", "ARIA256", "CAMELLIA", "CAMELLIA256", "CAST6",
- "CHACHA7539", "GOST28147", "HC256", "HMACGOST3411-2012-256", "HMACSHA3-256", "HMACKECCAK256",
- "HMACSHA256", "HMACSHA512/256", "RC5-64", "RC6", "THREEFISH-256", "TWOFISH");
- AddDefaultKeySizeEntries(288, "HMACKECCAK288");
- AddDefaultKeySizeEntries(384, "HMACSHA3-384", "HMACKECCAK384", "HMACSHA384");
- AddDefaultKeySizeEntries(512, "HMACGOST3411-2012-512", "HMACSHA3-512", "HMACKECCAK512", "HMACSHA512",
- "THREEFISH-512");
- AddDefaultKeySizeEntries(1024, "THREEFISH-1024");
- }
- private static void AddDefaultKeySizeEntries(int size, params string[] algorithms)
- {
- foreach (string algorithm in algorithms)
- {
- defaultKeySizes.Add(algorithm, size);
- }
- }
- private static void AddKgAlgorithm(
- string canonicalName,
- params object[] aliases)
- {
- kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(canonicalName)] = canonicalName;
- foreach (object alias in aliases)
- {
- kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = canonicalName;
- }
- }
- private static void AddKpgAlgorithm(
- string canonicalName,
- params object[] aliases)
- {
- kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(canonicalName)] = canonicalName;
- foreach (object alias in aliases)
- {
- kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = canonicalName;
- }
- }
- private static void AddHMacKeyGenerator(
- string algorithm,
- params object[] aliases)
- {
- string mainName = "HMAC" + algorithm;
- kgAlgorithms[mainName] = mainName;
- kgAlgorithms["HMAC-" + algorithm] = mainName;
- kgAlgorithms["HMAC/" + algorithm] = mainName;
- foreach (object alias in aliases)
- {
- kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(alias.ToString())] = mainName;
- }
- }
- // TODO Consider making this public
- internal static string GetCanonicalKeyGeneratorAlgorithm(
- string algorithm)
- {
- return (string) kgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithm)];
- }
- // TODO Consider making this public
- internal static string GetCanonicalKeyPairGeneratorAlgorithm(
- string algorithm)
- {
- return (string)kpgAlgorithms[BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.ToUpperInvariant(algorithm)];
- }
- public static CipherKeyGenerator GetKeyGenerator(
- DerObjectIdentifier oid)
- {
- return GetKeyGenerator(oid.Id);
- }
- public static CipherKeyGenerator GetKeyGenerator(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
- int defaultKeySize = FindDefaultKeySize(canonicalName);
- if (defaultKeySize == -1)
- throw new SecurityUtilityException("KeyGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
- if (canonicalName == "DES")
- return new DesKeyGenerator(defaultKeySize);
- if (canonicalName == "DESEDE" || canonicalName == "DESEDE3")
- return new DesEdeKeyGenerator(defaultKeySize);
- return new CipherKeyGenerator(defaultKeySize);
- }
- public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
- DerObjectIdentifier oid)
- {
- return GetKeyPairGenerator(oid.Id);
- }
- public static IAsymmetricCipherKeyPairGenerator GetKeyPairGenerator(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyPairGeneratorAlgorithm(algorithm);
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyPairGenerator " + algorithm + " not recognised.");
- if (canonicalName == "DH")
- return new DHKeyPairGenerator();
- if (canonicalName == "DSA")
- return new DsaKeyPairGenerator();
- // "EC", "ECDH", "ECDHC", "ECDSA", "ECGOST3410", "ECMQV"
- if (BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.StartsWith(canonicalName, "EC"))
- return new ECKeyPairGenerator(canonicalName);
- if (canonicalName == "Ed25519")
- return new Ed25519KeyPairGenerator();
- if (canonicalName == "Ed448")
- return new Ed448KeyPairGenerator();
- if (canonicalName == "ELGAMAL")
- return new ElGamalKeyPairGenerator();
- if (canonicalName == "GOST3410")
- return new Gost3410KeyPairGenerator();
- if (canonicalName == "RSA" || canonicalName == "RSASSA-PSS")
- return new RsaKeyPairGenerator();
- if (canonicalName == "X25519")
- return new X25519KeyPairGenerator();
- if (canonicalName == "X448")
- return new X448KeyPairGenerator();
- throw new SecurityUtilityException("KeyPairGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
- }
- internal static int GetDefaultKeySize(
- DerObjectIdentifier oid)
- {
- return GetDefaultKeySize(oid.Id);
- }
- internal static int GetDefaultKeySize(
- string algorithm)
- {
- string canonicalName = GetCanonicalKeyGeneratorAlgorithm(algorithm);
- if (canonicalName == null)
- throw new SecurityUtilityException("KeyGenerator " + algorithm + " not recognised.");
- int defaultKeySize = FindDefaultKeySize(canonicalName);
- if (defaultKeySize == -1)
- throw new SecurityUtilityException("KeyGenerator " + algorithm
- + " (" + canonicalName + ") not supported.");
- return defaultKeySize;
- }
- private static int FindDefaultKeySize(
- string canonicalName)
- {
- if (!defaultKeySizes.Contains(canonicalName))
- return -1;
- return (int)defaultKeySizes[canonicalName];
- }
- }
- }
- #pragma warning restore
- #endif
|