Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        /// <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);
        }