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);
}
[Obsolete("Use 'IsMLDsaScheme' instead")]
public static bool isMLDsa(int signatureScheme)
{
return IsMLDsaScheme(signatureScheme);
}
public static bool IsMLDsaScheme(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;
}
}
}