summary refs log tree commit diff
path: root/crypto/src/asn1/tsp/TimeStampReq.cs
diff options
context:
space:
mode:
authorPeter Dettman <peter.dettman@bouncycastle.org>2024-07-01 19:23:46 +0700
committerPeter Dettman <peter.dettman@bouncycastle.org>2024-07-01 19:23:46 +0700
commit4e97fa1cbee0072938c5ea33ca51f4e3964f2998 (patch)
tree0aad9c9bc277429ee733c8383672cb7c6aed329a /crypto/src/asn1/tsp/TimeStampReq.cs
parentRefactoring in Asn1.Smime (diff)
downloadBouncyCastle.NET-ed25519-4e97fa1cbee0072938c5ea33ca51f4e3964f2998.tar.xz
Refactoring in Asn1.Tsp
Diffstat (limited to 'crypto/src/asn1/tsp/TimeStampReq.cs')
-rw-r--r--crypto/src/asn1/tsp/TimeStampReq.cs75
1 files changed, 27 insertions, 48 deletions
diff --git a/crypto/src/asn1/tsp/TimeStampReq.cs b/crypto/src/asn1/tsp/TimeStampReq.cs
index aa9621007..e87b24087 100644
--- a/crypto/src/asn1/tsp/TimeStampReq.cs
+++ b/crypto/src/asn1/tsp/TimeStampReq.cs
@@ -1,16 +1,15 @@
 using System;
 
 using Org.BouncyCastle.Asn1.X509;
-using Org.BouncyCastle.Utilities;
 
 namespace Org.BouncyCastle.Asn1.Tsp
 {
-	public class TimeStampReq
+    public class TimeStampReq
 		: Asn1Encodable
 	{
 		private readonly DerInteger m_version;
 		private readonly MessageImprint m_messageImprint;
-		private readonly DerObjectIdentifier m_tsaPolicy;
+		private readonly DerObjectIdentifier m_reqPolicy;
 		private readonly DerInteger m_nonce;
 		private readonly DerBoolean m_certReq;
 		private readonly X509Extensions m_extensions;
@@ -24,60 +23,40 @@ namespace Org.BouncyCastle.Asn1.Tsp
             return new TimeStampReq(Asn1Sequence.GetInstance(obj));
         }
 
-		public static TimeStampReq GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit)
-		{
-            return new TimeStampReq(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
-        }
+		public static TimeStampReq GetInstance(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
+            new TimeStampReq(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
+
+        public static TimeStampReq GetTagged(Asn1TaggedObject taggedObject, bool declaredExplicit) =>
+            new TimeStampReq(Asn1Sequence.GetTagged(taggedObject, declaredExplicit));
 
         private TimeStampReq(Asn1Sequence seq)
 		{
-			int nbObjects = seq.Count;
-			int seqStart = 0;
-
-			// version
-			m_version = DerInteger.GetInstance(seq[seqStart++]);
-
-			// messageImprint
-			m_messageImprint = MessageImprint.GetInstance(seq[seqStart++]);
-
-			for (int opt = seqStart; opt < nbObjects; opt++)
-			{
-				// tsaPolicy
-				if (seq[opt] is DerObjectIdentifier oid)
-				{
-					m_tsaPolicy = oid;
-				}
-				// nonce
-				else if (seq[opt] is DerInteger derInteger)
-				{
-					m_nonce = derInteger;
-				}
-				// certReq
-				else if (seq[opt] is DerBoolean derBoolean)
-				{
-					m_certReq = derBoolean;
-				}
-				// extensions
-				else if (seq[opt] is Asn1TaggedObject tagged)
-				{
-					if (tagged.TagNo == 0)
-					{
-						m_extensions = X509Extensions.GetInstance(tagged, false);
-					}
-				}
-			}
+            int count = seq.Count, pos = 0;
+            if (count < 2 || count > 6)
+                throw new ArgumentException("Bad sequence size: " + count, nameof(seq));
+
+			m_version = DerInteger.GetInstance(seq[pos++]);
+			m_messageImprint = MessageImprint.GetInstance(seq[pos++]);
+			m_reqPolicy = Asn1Utilities.ReadOptional(seq, ref pos, DerObjectIdentifier.GetOptional);
+            m_nonce = Asn1Utilities.ReadOptional(seq, ref pos, DerInteger.GetOptional);
+            m_certReq = Asn1Utilities.ReadOptional(seq, ref pos, DerBoolean.GetOptional) ?? DerBoolean.False;
+			m_extensions = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 0, false, X509Extensions.GetTagged);
+
+            if (pos != count)
+                throw new ArgumentException("Unexpected elements in sequence", nameof(seq));
 		}
 
+		// TODO[api] 'tsaPolicy' => 'reqPolicy'
         public TimeStampReq(MessageImprint messageImprint, DerObjectIdentifier tsaPolicy, DerInteger nonce,
             DerBoolean certReq, X509Extensions extensions)
         {
             // default
             m_version = DerInteger.One;
 
-            m_messageImprint = messageImprint;
-            m_tsaPolicy = tsaPolicy;
+            m_messageImprint = messageImprint ?? throw new ArgumentNullException(nameof(messageImprint));
+            m_reqPolicy = tsaPolicy;
             m_nonce = nonce;
-            m_certReq = certReq;
+            m_certReq = certReq ?? DerBoolean.False;
             m_extensions = extensions;
         }
 
@@ -85,7 +64,7 @@ namespace Org.BouncyCastle.Asn1.Tsp
 
 		public MessageImprint MessageImprint => m_messageImprint;
 
-		public DerObjectIdentifier ReqPolicy => m_tsaPolicy;
+		public DerObjectIdentifier ReqPolicy => m_reqPolicy;
 
 		public DerInteger Nonce => m_nonce;
 
@@ -111,9 +90,9 @@ namespace Org.BouncyCastle.Asn1.Tsp
         {
             Asn1EncodableVector v = new Asn1EncodableVector(6);
 			v.Add(m_version, m_messageImprint);
-            v.AddOptional(m_tsaPolicy, m_nonce);
+            v.AddOptional(m_reqPolicy, m_nonce);
 
-            if (m_certReq != null && m_certReq.IsTrue)
+            if (m_certReq.IsTrue)
             {
                 v.Add(m_certReq);
             }