summary refs log tree commit diff
path: root/crypto/src/pqc/crypto/lms/LMOtsSignature.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/pqc/crypto/lms/LMOtsSignature.cs')
-rw-r--r--crypto/src/pqc/crypto/lms/LMOtsSignature.cs54
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;