LMOtsPublicKey
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.Utilities.IO;
using System;
using System.IO;
namespace Org.BouncyCastle.Pqc.Crypto.Lms
{
public sealed class LMOtsPublicKey
{
private readonly LMOtsParameters m_parameters;
private readonly byte[] m_I;
private readonly int m_q;
private readonly byte[] m_K;
public LMOtsParameters Parameters => m_parameters;
public int Q => m_q;
[Obsolete("Use 'GetI' instead")]
public byte[] I {
get {
return m_I;
}
}
[Obsolete("Use 'GetK' instead")]
public byte[] K {
get {
return m_K;
}
}
public LMOtsPublicKey(LMOtsParameters parameters, byte[] i, int q, byte[] k)
{
m_parameters = parameters;
m_I = i;
m_q = q;
m_K = k;
}
public static LMOtsPublicKey GetInstance(object src)
{
LMOtsPublicKey lMOtsPublicKey = src as LMOtsPublicKey;
if (lMOtsPublicKey != null)
return lMOtsPublicKey;
BinaryReader binaryReader = src as BinaryReader;
if (binaryReader != null)
return Parse(binaryReader);
Stream stream = src as Stream;
if (stream != null)
return BinaryReaders.Parse(Parse, stream, true);
byte[] array = src as byte[];
if (array != null)
return BinaryReaders.Parse(Parse, new MemoryStream(array, false), false);
throw new ArgumentException($"""{src}");
}
internal static LMOtsPublicKey Parse(BinaryReader binaryReader)
{
LMOtsParameters parametersByID = LMOtsParameters.GetParametersByID(BinaryReaders.ReadInt32BigEndian(binaryReader));
byte[] i = BinaryReaders.ReadBytesFully(binaryReader, 16);
int q = BinaryReaders.ReadInt32BigEndian(binaryReader);
byte[] k = BinaryReaders.ReadBytesFully(binaryReader, parametersByID.N);
return new LMOtsPublicKey(parametersByID, i, q, k);
}
public byte[] GetI()
{
return Arrays.Clone(m_I);
}
public byte[] GetK()
{
return Arrays.Clone(m_K);
}
public override bool Equals(object obj)
{
if (this == obj)
return true;
LMOtsPublicKey lMOtsPublicKey = obj as LMOtsPublicKey;
if (lMOtsPublicKey != null && m_q == lMOtsPublicKey.m_q && object.Equals(m_parameters, lMOtsPublicKey.m_parameters) && Arrays.AreEqual(m_I, lMOtsPublicKey.m_I))
return Arrays.AreEqual(m_K, lMOtsPublicKey.m_K);
return false;
}
public override int GetHashCode()
{
int q = m_q;
q = 31 * q + Objects.GetHashCode(m_parameters);
q = 31 * q + Arrays.GetHashCode(m_I);
return 31 * q + Arrays.GetHashCode(m_K);
}
public byte[] GetEncoded()
{
return Composer.Compose().U32Str(m_parameters.ID).Bytes(m_I)
.U32Str(m_q)
.Bytes(m_K)
.Build();
}
internal LmsContext CreateOtsContext(LMOtsSignature signature)
{
IDigest digest = LmsUtilities.GetDigest(m_parameters);
LmsUtilities.ByteArray(m_I, digest);
LmsUtilities.U32Str(m_q, digest);
LmsUtilities.U16Str((short)LMOts.D_MESG, digest);
LmsUtilities.ByteArray(signature.C, digest);
return new LmsContext(this, signature, digest);
}
internal LmsContext CreateOtsContext(LmsSignature signature)
{
IDigest digest = LmsUtilities.GetDigest(m_parameters);
LmsUtilities.ByteArray(m_I, digest);
LmsUtilities.U32Str(m_q, digest);
LmsUtilities.U16Str((short)LMOts.D_MESG, digest);
LmsUtilities.ByteArray(signature.OtsSignature.C, digest);
return new LmsContext(this, signature, digest);
}
}
}