diff options
Diffstat (limited to 'crypto/src/pqc/crypto/lms/LMOtsSignature.cs')
-rw-r--r-- | crypto/src/pqc/crypto/lms/LMOtsSignature.cs | 54 |
1 files changed, 23 insertions, 31 deletions
diff --git a/crypto/src/pqc/crypto/lms/LMOtsSignature.cs b/crypto/src/pqc/crypto/lms/LMOtsSignature.cs index c55866661..afc309be6 100644 --- a/crypto/src/pqc/crypto/lms/LMOtsSignature.cs +++ b/crypto/src/pqc/crypto/lms/LMOtsSignature.cs @@ -23,38 +23,30 @@ namespace Org.BouncyCastle.Pqc.Crypto.Lms public static LMOtsSignature GetInstance(object src) { if (src is LMOtsSignature lmOtsSignature) - { return lmOtsSignature; - } - else if (src is BinaryReader binaryReader) - { - int index = BinaryReaders.ReadInt32BigEndian(binaryReader); - LMOtsParameters parameter = LMOtsParameters.GetParametersByID(index); - - byte[] C = BinaryReaders.ReadBytesFully(binaryReader, parameter.N); - - byte[] sig = BinaryReaders.ReadBytesFully(binaryReader, parameter.P * parameter.N); - - return new LMOtsSignature(parameter, C, sig); - } - else if (src is byte[] bytes) - { - BinaryReader input = null; - try // 1.5 / 1.4 compatibility - { - input = new BinaryReader(new MemoryStream(bytes, false)); - return GetInstance(input); - } - finally - { - if (input != null) input.Close(); - } - } - else if (src is MemoryStream memoryStream) - { - return GetInstance(Streams.ReadAll(memoryStream)); - } - throw new Exception ($"cannot parse {src}"); + + if (src is BinaryReader binaryReader) + return Parse(binaryReader); + + if (src is Stream stream) + return BinaryReaders.Parse(Parse, stream, leaveOpen: true); + + if (src is byte[] bytes) + return BinaryReaders.Parse(Parse, new MemoryStream(bytes, false), leaveOpen: false); + + throw new ArgumentException($"cannot parse {src}"); + } + + internal static LMOtsSignature Parse(BinaryReader binaryReader) + { + int index = BinaryReaders.ReadInt32BigEndian(binaryReader); + LMOtsParameters parameter = LMOtsParameters.GetParametersByID(index); + + byte[] C = BinaryReaders.ReadBytesFully(binaryReader, parameter.N); + + byte[] sig = BinaryReaders.ReadBytesFully(binaryReader, parameter.P * parameter.N); + + return new LMOtsSignature(parameter, C, sig); } public LMOtsParameters ParamType => m_paramType; |