SignatureScheme
using Org.BouncyCastle.Tls.Crypto;
using System;
namespace Org.BouncyCastle.Tls
{
    public abstract class SignatureScheme
    {
        public const int rsa_pkcs1_sha1 = 513;
        public const int ecdsa_sha1 = 515;
        public const int rsa_pkcs1_sha256 = 1025;
        public const int rsa_pkcs1_sha384 = 1281;
        public const int rsa_pkcs1_sha512 = 1537;
        public const int ecdsa_secp256r1_sha256 = 1027;
        public const int ecdsa_secp384r1_sha384 = 1283;
        public const int ecdsa_secp521r1_sha512 = 1539;
        public const int rsa_pss_rsae_sha256 = 2052;
        public const int rsa_pss_rsae_sha384 = 2053;
        public const int rsa_pss_rsae_sha512 = 2054;
        public const int ed25519 = 2055;
        public const int ed448 = 2056;
        public const int rsa_pss_pss_sha256 = 2057;
        public const int rsa_pss_pss_sha384 = 2058;
        public const int rsa_pss_pss_sha512 = 2059;
        public const int ecdsa_brainpoolP256r1tls13_sha256 = 2074;
        public const int ecdsa_brainpoolP384r1tls13_sha384 = 2075;
        public const int ecdsa_brainpoolP512r1tls13_sha512 = 2076;
        public const int sm2sig_sm3 = 1800;
        public static readonly int DRAFT_mldsa44 = 2308;
        public static readonly int DRAFT_mldsa65 = 2309;
        public static readonly int DRAFT_mldsa87 = 2310;
        internal const int mldsa44 = 2308;
        internal const int mldsa65 = 2309;
        internal const int mldsa87 = 2310;
        public static int From(SignatureAndHashAlgorithm sigAndHashAlg)
        {
            if (sigAndHashAlg == null)
                throw new ArgumentNullException();
            return From(sigAndHashAlg.Hash, sigAndHashAlg.Signature);
        }
        public static int From(short hashAlgorithm, short signatureAlgorithm)
        {
            return ((hashAlgorithm & 255) << 8) | (signatureAlgorithm & 255);
        }
        public static int GetCryptoHashAlgorithm(int signatureScheme)
        {
            if (signatureScheme <= 2059) {
                switch (signatureScheme) {
                case 2055:
                case 2056:
                    break;
                case 2052:
                case 2057:
                    goto IL_0062;
                case 2053:
                case 2058:
                    goto IL_0064;
                case 2054:
                case 2059:
                    goto IL_0066;
                case 1800:
                    return 7;
                default:
                    goto IL_006a;
                }
            } else {
                switch (signatureScheme) {
                case 2074:
                    goto IL_0062;
                case 2075:
                    goto IL_0064;
                case 2076:
                    goto IL_0066;
                }
                if ((uint)(signatureScheme - 2308) > 2)
                    goto IL_006a;
            }
            return -1;
            IL_006a:
            short hashAlgorithm = GetHashAlgorithm(signatureScheme);
            if (8 == hashAlgorithm || !HashAlgorithm.IsRecognized(hashAlgorithm))
                return -1;
            return TlsCryptoUtilities.GetHash(hashAlgorithm);
            IL_0062:
            return 4;
            IL_0066:
            return 6;
            IL_0064:
            return 5;
        }
        public static int GetCryptoHashAlgorithm(SignatureAndHashAlgorithm signatureAndHashAlgorithm)
        {
            return GetCryptoHashAlgorithm(From(signatureAndHashAlgorithm));
        }
        public static string GetName(int signatureScheme)
        {
            switch (signatureScheme) {
            case 513:
                return "rsa_pkcs1_sha1";
            case 515:
                return "ecdsa_sha1";
            case 1025:
                return "rsa_pkcs1_sha256";
            case 1281:
                return "rsa_pkcs1_sha384";
            case 1537:
                return "rsa_pkcs1_sha512";
            case 1027:
                return "ecdsa_secp256r1_sha256";
            case 1283:
                return "ecdsa_secp384r1_sha384";
            case 1539:
                return "ecdsa_secp521r1_sha512";
            case 2052:
                return "rsa_pss_rsae_sha256";
            case 2053:
                return "rsa_pss_rsae_sha384";
            case 2054:
                return "rsa_pss_rsae_sha512";
            case 2055:
                return "ed25519";
            case 2056:
                return "ed448";
            case 2057:
                return "rsa_pss_pss_sha256";
            case 2058:
                return "rsa_pss_pss_sha384";
            case 2059:
                return "rsa_pss_pss_sha512";
            case 2074:
                return "ecdsa_brainpoolP256r1tls13_sha256";
            case 2075:
                return "ecdsa_brainpoolP384r1tls13_sha384";
            case 2076:
                return "ecdsa_brainpoolP512r1tls13_sha512";
            case 1800:
                return "sm2sig_sm3";
            case 2308:
                return "DRAFT_mldsa44";
            case 2309:
                return "DRAFT_mldsa65";
            case 2310:
                return "DRAFT_mldsa87";
            default:
                return "UNKNOWN";
            }
        }
        public static int GetNamedGroup(int signatureScheme)
        {
            switch (signatureScheme) {
            case 2074:
                return 31;
            case 2075:
                return 32;
            case 2076:
                return 33;
            case 1027:
                return 23;
            case 1283:
                return 24;
            case 1539:
                return 25;
            case 1800:
                return 41;
            default:
                return -1;
            }
        }
        public static short GetHashAlgorithm(int signatureScheme)
        {
            return (short)((signatureScheme >> 8) & 255);
        }
        public static short GetSignatureAlgorithm(int signatureScheme)
        {
            return (short)(signatureScheme & 255);
        }
        public static SignatureAndHashAlgorithm GetSignatureAndHashAlgorithm(int signatureScheme)
        {
            return SignatureAndHashAlgorithm.GetInstance(GetHashAlgorithm(signatureScheme), GetSignatureAlgorithm(signatureScheme));
        }
        public static string GetText(int signatureScheme)
        {
            string str = Convert.ToString(signatureScheme, 16).ToUpperInvariant();
            return GetName(signatureScheme) + "(0x" + str + ")";
        }
        public static bool IsPrivate(int signatureScheme)
        {
            return signatureScheme >> 9 == 254;
        }
        public static bool IsECDsa(int signatureScheme)
        {
            if ((uint)(signatureScheme - 2074) <= 2)
                return true;
            return 3 == GetSignatureAlgorithm(signatureScheme);
        }
        public static bool isMLDsa(int signatureScheme)
        {
            if ((uint)(signatureScheme - 2308) <= 2)
                return true;
            return false;
        }
        public static bool IsRsaPss(int signatureScheme)
        {
            if ((uint)(signatureScheme - 2052) <= 2 || (uint)(signatureScheme - 2057) <= 2)
                return true;
            return false;
        }
    }
}