You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
436 lines
18 KiB
436 lines
18 KiB
#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
|
|
|