/// <summary> /// Try get algorithm from mechanism. /// </summary> /// <param name="mechanism">Algorithm mechanism.</param> /// <param name="algorithm">Algorithm.</param> /// <returns></returns> public static bool TryGetAlgorithm(string mechanism, out IHMAC algorithm) { mechanism = mechanism.Replace('_', '-').ToUpperInvariant(); if (mechanism.EndsWith("HMAC")) { if (mechanism.EndsWith("/HMAC") || mechanism.EndsWith("-HMAC")) { mechanism = mechanism.Substring(0, mechanism.Length - 5); } else { mechanism = mechanism.Substring(0, mechanism.Length - 4); } } if (mechanism.StartsWith("HMAC")) { if (mechanism.StartsWith("HMAC/") || mechanism.StartsWith("HMAC-")) { mechanism = mechanism.Substring(5); } else { mechanism = mechanism.Substring(4); } } mechanism = mechanism.Replace('/', '-'); switch (mechanism) { case "BLAKE2B-256": algorithm = BLAKE2b_256_HMAC; return(true); case "BLAKE2B-384": algorithm = BLAKE2b_384_HMAC; return(true); case "BLAKE2B-512": algorithm = BLAKE2b_512_HMAC; return(true); case "BLAKE2S-256": algorithm = BLAKE2s_256_HMAC; return(true); case "DSTU7564-256": algorithm = DSTU7564_256_HMAC; return(true); case "DSTU7564-384": algorithm = DSTU7564_384_HMAC; return(true); case "DSTU7564-512": algorithm = DSTU7564_512_HMAC; return(true); case "GOST3411": algorithm = GOST3411_HMAC; return(true); case "GOST3411-2012-256": algorithm = GOST3411_2012_256_HMAC; return(true); case "GOST3411-2012-512": algorithm = GOST3411_2012_512_HMAC; return(true); case "KECCAK-128": case "KECCAK128": algorithm = Keccak_128_HMAC; return(true); case "KECCAK-224": case "KECCAK224": algorithm = Keccak_224_HMAC; return(true); case "KECCAK-256": case "KECCAK256": algorithm = Keccak_256_HMAC; return(true); case "KECCAK-288": case "KECCAK288": algorithm = Keccak_288_HMAC; return(true); case "KECCAK-384": case "KECCAK384": algorithm = Keccak_384_HMAC; return(true); case "KECCAK-512": case "KECCAK512": algorithm = Keccak_512_HMAC; return(true); case "MD2": algorithm = MD2_HMAC; return(true); case "MD4": algorithm = MD4_HMAC; return(true); case "MD5": algorithm = MD5_HMAC; return(true); case "RIPEMD128": case "RIPEMD-128": algorithm = RIPEMD128_HMAC; return(true); case "RIPEMD160": case "RIPEMD-160": algorithm = RIPEMD160_HMAC; return(true); case "RIPEMD256": case "RIPEMD-256": algorithm = RIPEMD256_HMAC; return(true); case "RIPEMD320": case "RIPEMD-320": algorithm = RIPEMD320_HMAC; return(true); case "SHA1": case "SHA-1": algorithm = SHA1_HMAC; return(true); case "SHA224": case "SHA-224": algorithm = SHA224_HMAC; return(true); case "SHA256": case "SHA-256": algorithm = SHA256_HMAC; return(true); case "SHA384": case "SHA-384": algorithm = SHA384_HMAC; return(true); case "SHA512": case "SHA-512": algorithm = SHA512_HMAC; return(true); case "SHA512-224": case "SHA-512-224": algorithm = SHA512_224_HMAC; return(true); case "SHA512-256": case "SHA-512-256": algorithm = SHA512_256_HMAC; return(true); case "SHA3-224": case "SHA-3-224": algorithm = SHA3_224_HMAC; return(true); case "SHA3-256": case "SHA-3-256": algorithm = SHA3_256_HMAC; return(true); case "SHA3-384": case "SHA-3-384": algorithm = SHA3_384_HMAC; return(true); case "SHA3-512": case "SHA-3-512": algorithm = SHA3_512_HMAC; return(true); case "SHAKE128": case "SHAKE-128": algorithm = SHAKE_128_HMAC; return(true); case "SHAKE256": case "SHAKE-256": algorithm = SHAKE_256_HMAC; return(true); case "SKEIN-256-256": algorithm = Skein_256_256_HMAC; return(true); case "SKEIN-512-512": algorithm = Skein_512_512_HMAC; return(true); case "SKEIN-1024-1024": algorithm = Skein_1024_1024_HMAC; return(true); case "SM3": algorithm = SM3_HMAC; return(true); case "TIGER": algorithm = Tiger_HMAC; return(true); case "WHIRLPOOL": algorithm = Whirlpool_HMAC; return(true); default: break; } if (HashAlgorithmHelper.TryGetNanoAlgorithm(mechanism, out IHashAlgorithm hashAlgorithm)) { algorithm = new HMAC(hashAlgorithm); return(true); } else { algorithm = null; return(false); } }
/// <summary> /// Try get algorithm from mechanism. /// </summary> /// <param name="mechanism">Algorithm mechanism.</param> /// <param name="algorithm">Algorithm.</param> /// <returns></returns> public static bool TryGetAlgorithm(string mechanism, out ISignatureAlgorithm algorithm) { mechanism = mechanism.Replace('_', '-').ToUpperInvariant(); switch (mechanism) { case "SHA1WITHCVC-ECDSA": case "SHA-1WITHCVC-ECDSA": algorithm = SHA1withCVC_ECDSA; return(true); case "SHA224WITHCVC-ECDSA": case "SHA-224WITHCVC-ECDSA": algorithm = SHA224withCVC_ECDSA; return(true); case "SHA256WITHCVC-ECDSA": case "SHA-256WITHCVC-ECDSA": algorithm = SHA256withCVC_ECDSA; return(true); case "SHA384WITHCVC-ECDSA": case "SHA-384WITHCVC-ECDSA": algorithm = SHA384withCVC_ECDSA; return(true); case "SHA512WITHCVC-ECDSA": case "SHA-512WITHCVC-ECDSA": algorithm = SHA512withCVC_ECDSA; return(true); case "ED25519": algorithm = new Ed25519(); return(true); case "ED25519CTX": algorithm = new Ed25519ctx(); return(true); case "ED25519PH": algorithm = new Ed25519ph(); return(true); case "ED448": algorithm = new Ed448(); return(true); case "ED448PH": algorithm = new Ed448ph(); return(true); case "GOST3411WITHECGOST3410": case "ECGOST3410": case "ECGOST3410-2001": case "ECGOST-3410": case "ECGOST-3410-2001": algorithm = GOST3411withECGOST3410; return(true); case "GOST3411WITHGOST3410": case "GOST3410": case "GOST3410-94": case "GOST-3410": case "GOST-3410-94": algorithm = GOST3411withGOST3410; return(true); case "RIPEMD160WITHPLAIN-ECDSA": case "RIPEMD-160WITHPLAIN-ECDSA": algorithm = RIPEMD160withPLAIN_ECDSA; return(true); case "SHA1WITHPLAIN-ECDSA": case "SHA-1WITHPLAIN-ECDSA": algorithm = SHA1withPLAIN_ECDSA; return(true); case "SHA224WITHPLAIN-ECDSA": case "SHA-224WITHPLAIN-ECDSA": algorithm = SHA224withPLAIN_ECDSA; return(true); case "SHA256WITHPLAIN-ECDSA": case "SHA-256WITHPLAIN-ECDSA": algorithm = SHA256withPLAIN_ECDSA; return(true); case "SHA384WITHPLAIN-ECDSA": case "SHA-384WITHPLAIN-ECDSA": algorithm = SHA384withPLAIN_ECDSA; return(true); case "SHA512WITHPLAIN-ECDSA": case "SHA-512WITHPLAIN-ECDSA": algorithm = SHA512withPLAIN_ECDSA; return(true); case "PSSWITHRSA": algorithm = PSSwithRSA; return(true); case "SHA1WITHDSA": case "SHA-1WITHDSA": algorithm = SHA1withDSA; return(true); case "SHA224WITHDSA": case "SHA-224WITHDSA": algorithm = SHA224withDSA; return(true); case "SHA256WITHDSA": case "SHA-256WITHDSA": algorithm = SHA256withDSA; return(true); case "SHA384WITHDSA": case "SHA-384WITHDSA": algorithm = SHA384withDSA; return(true); case "SHA512WITHDSA": case "SHA-512WITHDSA": algorithm = SHA512withDSA; return(true); case "SHA3-224WITHDSA": case "SHA-3-224WITHDSA": algorithm = SHA3_224withDSA; return(true); case "SHA3-256WITHDSA": case "SHA-3-256WITHDSA": algorithm = SHA3_256withDSA; return(true); case "SHA3-384WITHDSA": case "SHA-3-384WITHDSA": algorithm = SHA3_384withDSA; return(true); case "SHA3-512WITHDSA": case "SHA-3-512WITHDSA": algorithm = SHA3_512withDSA; return(true); case "SHA1WITHECDSA": case "SHA-1WITHECDSA": algorithm = SHA1withECDSA; return(true); case "SHA224WITHECDSA": case "SHA-224WITHECDSA": algorithm = SHA224withECDSA; return(true); case "SHA256WITHECDSA": case "SHA-256WITHECDSA": algorithm = SHA256withECDSA; return(true); case "SHA384WITHECDSA": case "SHA-384WITHECDSA": algorithm = SHA384withECDSA; return(true); case "SHA512WITHECDSA": case "SHA-512WITHECDSA": algorithm = SHA512withECDSA; return(true); case "SHA3-224WITHECDSA": case "SHA-3-224WITHECDSA": algorithm = SHA3_224withECDSA; return(true); case "SHA3-256WITHECDSA": case "SHA-3-256WITHECDSA": algorithm = SHA3_256withECDSA; return(true); case "SHA3-384WITHECDSA": case "SHA-3-384WITHECDSA": algorithm = SHA3_384withECDSA; return(true); case "SHA3-512WITHECDSA": case "SHA-3-512WITHECDSA": algorithm = SHA3_512withECDSA; return(true); case "MD2WITHRSA": algorithm = MD2withRSA; return(true); case "MD5WITHRSA": algorithm = MD5withRSA; return(true); case "RIPEMD128WITHRSA": case "RIPEMD-128WITHRSA": algorithm = RIPEMD128withRSA; return(true); case "RIPEMD160WITHRSA": case "RIPEMD-160WITHRSA": algorithm = RIPEMD160withRSA; return(true); case "RIPEMD256WITHRSA": case "RIPEMD-256WITHRSA": algorithm = RIPEMD256withRSA; return(true); case "SHA1WITHRSA": case "SHA-1WITHRSA": algorithm = SHA1withRSA; return(true); case "SHA224WITHRSA": case "SHA-224WITHRSA": algorithm = SHA224withRSA; return(true); case "SHA256WITHRSA": case "SHA-256WITHRSA": algorithm = SHA256withRSA; return(true); case "SHA384WITHRSA": case "SHA-384WITHRSA": algorithm = SHA384withRSA; return(true); case "SHA512WITHRSA": case "SHA-512WITHRSA": algorithm = SHA512withRSA; return(true); case "SHA3-224WITHRSA": case "SHA-3-224WITHRSA": algorithm = SHA3_224withRSA; return(true); case "SHA3-256WITHRSA": case "SHA-3-256WITHRSA": algorithm = SHA3_256withRSA; return(true); case "SHA3-384WITHRSA": case "SHA-3-384WITHRSA": algorithm = SHA3_384withRSA; return(true); case "SHA3-512WITHRSA": case "SHA-3-512WITHRSA": algorithm = SHA3_512withRSA; return(true); case "SHA1WITHRSAANDMGF1": case "SHA-1WITHRSAANDMGF1": algorithm = PSSwithRSA; return(true); case "SHA256WITHSM2": case "SHA-256WITHSM2": algorithm = SHA256withSM2; return(true); case "SM3WITHSM2": algorithm = SM3withSM2; return(true); default: break; } string prefix; string suffix; int index = mechanism.IndexOf("WITH"); if (index >= 0) { prefix = mechanism.Substring(0, index); suffix = mechanism.Substring(index + 4, mechanism.Length - index - 4); } else { prefix = string.Empty; suffix = mechanism; } if (suffix == "ELGAMAL") { algorithm = null; return(false); } if (HashAlgorithmHelper.TryGetAlgorithm(prefix, out IHashAlgorithm hashAlgorithm)) { switch (suffix) { case "CVC-ECDSA": algorithm = new CVC_ECDSA(hashAlgorithm); return(true); case "DSA": algorithm = new DSA(hashAlgorithm); return(true); case "ECDSA": algorithm = new ECDSA(hashAlgorithm); return(true); case "ECGOST3410": case "ECGOST3410-2001": case "ECGOST-3410": case "ECGOST-3410-2001": algorithm = new ECGOST3410(hashAlgorithm); return(true); case "ECNR": algorithm = new ECNR(hashAlgorithm); return(true); case "GOST3410": case "GOST3410-94": case "GOST-3410": case "GOST-3410-94": algorithm = new GOST3410(hashAlgorithm); return(true); case "PLAIN-ECDSA": algorithm = new PLAIN_ECDSA(hashAlgorithm); return(true); case "RSA": algorithm = new RSA(hashAlgorithm); return(true); case "ISO9796-2": case "RSA/ISO9796-2": case "RSAANDISO9796-2": algorithm = new RSAandISO9796_2(hashAlgorithm); return(true); case "RSAANDMGF1": algorithm = new RSAandMGF1(hashAlgorithm); return(true); case "RSA/X9.31": case "RSA/X931": case "RSAANDX931": case "RSAANDX9.31": algorithm = new RSAandX931(hashAlgorithm); return(true); case "SM2": algorithm = new SM2(hashAlgorithm); return(true); default: break; } } algorithm = null; return(false); }