<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.1" />

SignatureAndHashAlgorithm

public sealed class SignatureAndHashAlgorithm
RFC 5246 7.4.1.4.1
using System; using System.IO; namespace Org.BouncyCastle.Tls { public sealed class SignatureAndHashAlgorithm { public static readonly SignatureAndHashAlgorithm ecdsa_brainpoolP256r1tls13_sha256 = Create(2074); public static readonly SignatureAndHashAlgorithm ecdsa_brainpoolP384r1tls13_sha384 = Create(2075); public static readonly SignatureAndHashAlgorithm ecdsa_brainpoolP512r1tls13_sha512 = Create(2076); public static readonly SignatureAndHashAlgorithm ed25519 = Create(2055); public static readonly SignatureAndHashAlgorithm ed448 = Create(2056); public static readonly SignatureAndHashAlgorithm gostr34102012_256 = Create(8, 64); public static readonly SignatureAndHashAlgorithm gostr34102012_512 = Create(8, 65); public static readonly SignatureAndHashAlgorithm rsa_pss_rsae_sha256 = Create(2052); public static readonly SignatureAndHashAlgorithm rsa_pss_rsae_sha384 = Create(2053); public static readonly SignatureAndHashAlgorithm rsa_pss_rsae_sha512 = Create(2054); public static readonly SignatureAndHashAlgorithm rsa_pss_pss_sha256 = Create(2057); public static readonly SignatureAndHashAlgorithm rsa_pss_pss_sha384 = Create(2058); public static readonly SignatureAndHashAlgorithm rsa_pss_pss_sha512 = Create(2059); private readonly short m_hash; private readonly short m_signature; public short Hash => m_hash; public short Signature => m_signature; public static SignatureAndHashAlgorithm GetInstance(short hashAlgorithm, short signatureAlgorithm) { if (hashAlgorithm == 8) return GetInstanceIntrinsic(signatureAlgorithm); return Create(hashAlgorithm, signatureAlgorithm); } private static SignatureAndHashAlgorithm GetInstanceIntrinsic(short signatureAlgorithm) { switch (signatureAlgorithm) { case 7: return ed25519; case 8: return ed448; case 64: return gostr34102012_256; case 65: return gostr34102012_512; case 4: return rsa_pss_rsae_sha256; case 5: return rsa_pss_rsae_sha384; case 6: return rsa_pss_rsae_sha512; case 9: return rsa_pss_pss_sha256; case 10: return rsa_pss_pss_sha384; case 11: return rsa_pss_pss_sha512; case 26: return ecdsa_brainpoolP256r1tls13_sha256; case 27: return ecdsa_brainpoolP384r1tls13_sha384; case 28: return ecdsa_brainpoolP512r1tls13_sha512; default: return Create(8, signatureAlgorithm); } } private static SignatureAndHashAlgorithm Create(int signatureScheme) { short hashAlgorithm = SignatureScheme.GetHashAlgorithm(signatureScheme); short signatureAlgorithm = SignatureScheme.GetSignatureAlgorithm(signatureScheme); return Create(hashAlgorithm, signatureAlgorithm); } private static SignatureAndHashAlgorithm Create(short hashAlgorithm, short signatureAlgorithm) { return new SignatureAndHashAlgorithm(hashAlgorithm, signatureAlgorithm); } public SignatureAndHashAlgorithm(short hash, short signature) { if ((hash & 255) != hash) throw new ArgumentException("should be a uint8", "hash"); if ((signature & 255) != signature) throw new ArgumentException("should be a uint8", "signature"); m_hash = hash; m_signature = signature; } public void Encode(Stream output) { TlsUtilities.WriteUint8(Hash, output); TlsUtilities.WriteUint8(Signature, output); } public static SignatureAndHashAlgorithm Parse(Stream input) { short hashAlgorithm = TlsUtilities.ReadUint8(input); short signatureAlgorithm = TlsUtilities.ReadUint8(input); return GetInstance(hashAlgorithm, signatureAlgorithm); } public override bool Equals(object obj) { if (!(obj is SignatureAndHashAlgorithm)) return false; SignatureAndHashAlgorithm signatureAndHashAlgorithm = (SignatureAndHashAlgorithm)obj; if (signatureAndHashAlgorithm.Hash == Hash) return signatureAndHashAlgorithm.Signature == Signature; return false; } public override int GetHashCode() { return (Hash << 16) | Signature; } public override string ToString() { return "{" + HashAlgorithm.GetText(Hash) + "," + SignatureAlgorithm.GetText(Signature) + "}"; } } }