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) + "}";
}
}
}