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

HssSignature

public sealed class HssSignature : IEncodable
using Org.BouncyCastle.Utilities; using Org.BouncyCastle.Utilities.IO; using System; using System.IO; using System.Runtime.CompilerServices; using System.Text; namespace Org.BouncyCastle.Pqc.Crypto.Lms { public sealed class HssSignature : IEncodable { private readonly int m_lMinus1; private readonly LmsSignedPubKey[] m_signedPubKeys; private readonly LmsSignature m_signature; public int LMinus1 => m_lMinus1; internal LmsSignedPubKey[] SignedPubKeys => m_signedPubKeys; public LmsSignature Signature => m_signature; public HssSignature(int lMinus1, LmsSignedPubKey[] signedPubKey, LmsSignature signature) { m_lMinus1 = lMinus1; m_signedPubKeys = signedPubKey; m_signature = signature; } public static HssSignature GetInstance(object src, int L) { HssSignature hssSignature = src as HssSignature; if (hssSignature != null) return hssSignature; BinaryReader binaryReader = src as BinaryReader; if (binaryReader != null) return Parse(L, binaryReader); Stream stream = src as Stream; if (stream != null) return Parse(L, stream, true); byte[] array = src as byte[]; if (array != null) return Parse(L, new MemoryStream(array, false), false); DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(13, 1); defaultInterpolatedStringHandler.AppendLiteral("cannot parse "); defaultInterpolatedStringHandler.AppendFormatted<object>(src); throw new ArgumentException(defaultInterpolatedStringHandler.ToStringAndClear()); } internal static HssSignature Parse(int L, BinaryReader binaryReader) { int num = BinaryReaders.ReadInt32BigEndian(binaryReader); if (num != L - 1) throw new Exception("nspk exceeded maxNspk"); LmsSignedPubKey[] array = new LmsSignedPubKey[num]; for (int i = 0; i < num; i++) { LmsSignature signature = LmsSignature.Parse(binaryReader); LmsPublicKeyParameters publicKey = LmsPublicKeyParameters.Parse(binaryReader); array[i] = new LmsSignedPubKey(signature, publicKey); } LmsSignature signature2 = LmsSignature.Parse(binaryReader); return new HssSignature(num, array, signature2); } private static HssSignature Parse(int L, Stream stream, bool leaveOpen) { using (BinaryReader binaryReader = new BinaryReader(stream, Encoding.UTF8, leaveOpen)) return Parse(L, binaryReader); } [Obsolete("Use 'LMinus1' instead")] public int GetLMinus1() { return m_lMinus1; } public LmsSignedPubKey[] GetSignedPubKeys() { return (LmsSignedPubKey[])m_signedPubKeys?.Clone(); } public override bool Equals(object other) { if (this == other) return true; HssSignature hssSignature = other as HssSignature; if (hssSignature != null && m_lMinus1 == hssSignature.m_lMinus1) { object[] signedPubKeys = m_signedPubKeys; object[] a = signedPubKeys; signedPubKeys = hssSignature.m_signedPubKeys; if (Arrays.AreEqual(a, signedPubKeys)) return object.Equals(m_signature, hssSignature.m_signature); } return false; } public override int GetHashCode() { int lMinus = m_lMinus1; int num = 31 * lMinus; object[] signedPubKeys = m_signedPubKeys; lMinus = num + Arrays.GetHashCode(signedPubKeys); return 31 * lMinus + Objects.GetHashCode(m_signature); } public byte[] GetEncoded() { Composer composer = Composer.Compose(); composer.U32Str(m_lMinus1); if (m_signedPubKeys != null) { LmsSignedPubKey[] signedPubKeys = m_signedPubKeys; foreach (LmsSignedPubKey encodable in signedPubKeys) { composer.Bytes(encodable); } } composer.Bytes(m_signature); return composer.Build(); } } }