summary refs log tree commit diff
path: root/crypto/src/pqc/crypto/lms/LMSSignature.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/pqc/crypto/lms/LMSSignature.cs')
-rw-r--r--crypto/src/pqc/crypto/lms/LMSSignature.cs56
1 files changed, 24 insertions, 32 deletions
diff --git a/crypto/src/pqc/crypto/lms/LMSSignature.cs b/crypto/src/pqc/crypto/lms/LMSSignature.cs
index a1ae475c1..d25a498ea 100644
--- a/crypto/src/pqc/crypto/lms/LMSSignature.cs
+++ b/crypto/src/pqc/crypto/lms/LMSSignature.cs
@@ -25,45 +25,37 @@ namespace Org.BouncyCastle.Pqc.Crypto.Lms
         public static LmsSignature GetInstance(object src)
         {
             if (src is LmsSignature lmsSignature)
-            {
                 return lmsSignature;
-            }
-            else if (src is BinaryReader binaryReader)
-            {
-                int q = BinaryReaders.ReadInt32BigEndian(binaryReader);
 
-                LMOtsSignature otsSignature = LMOtsSignature.GetInstance(src);
+            if (src is BinaryReader binaryReader)
+                return Parse(binaryReader);
 
-                int index = BinaryReaders.ReadInt32BigEndian(binaryReader);
-                LMSigParameters type = LMSigParameters.GetParametersByID(index);
+            if (src is Stream stream)
+                return BinaryReaders.Parse(Parse, stream, leaveOpen: true);
 
-                byte[][] path = new byte[type.H][];
-                for (int h = 0; h < path.Length; h++)
-                {
-                    path[h] = new byte[type.M];
-                    binaryReader.Read(path[h], 0, path[h].Length);
-                }
+            if (src is byte[] bytes)
+                return BinaryReaders.Parse(Parse, new MemoryStream(bytes, false), leaveOpen: false);
 
-                return new LmsSignature(q, otsSignature, type, path);
-            }
-            else if (src is byte[] bytes)
-            {
-                BinaryReader input = null;
-                try // 1.5 / 1.6 compatibility
-                {
-                    input = new BinaryReader(new MemoryStream(bytes, false));
-                    return GetInstance(input);
-                }
-                finally
-                {
-                    if (input != null) input.Close();// todo platform dispose
-                }
-            }
-            else if (src is MemoryStream memoryStream)
+            throw new ArgumentException($"cannot parse {src}");
+        }
+
+        internal static LmsSignature Parse(BinaryReader binaryReader)
+        {
+            int q = BinaryReaders.ReadInt32BigEndian(binaryReader);
+
+            LMOtsSignature otsSignature = LMOtsSignature.Parse(binaryReader);
+
+            int index = BinaryReaders.ReadInt32BigEndian(binaryReader);
+            LMSigParameters type = LMSigParameters.GetParametersByID(index);
+
+            byte[][] path = new byte[type.H][];
+            for (int h = 0; h < path.Length; h++)
             {
-                return GetInstance(Streams.ReadAll(memoryStream));
+                path[h] = new byte[type.M];
+                binaryReader.Read(path[h], 0, path[h].Length);
             }
-            throw new Exception ($"cannot parse {src}");
+
+            return new LmsSignature(q, otsSignature, type, path);
         }
 
         public override bool Equals(Object o)