summary refs log tree commit diff
path: root/crypto/src/asn1/cmp/PKIHeader.cs
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/src/asn1/cmp/PKIHeader.cs')
-rw-r--r--crypto/src/asn1/cmp/PKIHeader.cs189
1 files changed, 62 insertions, 127 deletions
diff --git a/crypto/src/asn1/cmp/PKIHeader.cs b/crypto/src/asn1/cmp/PKIHeader.cs
index c000c8b98..71dc18e7d 100644
--- a/crypto/src/asn1/cmp/PKIHeader.cs
+++ b/crypto/src/asn1/cmp/PKIHeader.cs
@@ -10,7 +10,7 @@ namespace Org.BouncyCastle.Asn1.Cmp
         /**
          * Value for a "null" recipient or sender.
          */
-        public static readonly GeneralName NULL_NAME = new GeneralName(X509Name.GetInstance(new DerSequence()));
+        public static readonly GeneralName NULL_NAME = new GeneralName(X509Name.GetInstance(DerSequence.Empty));
 
         public static readonly int CMP_1999 = 1;
         public static readonly int CMP_2000 = 2;
@@ -29,143 +29,77 @@ namespace Org.BouncyCastle.Asn1.Cmp
             return new PkiHeader(Asn1Sequence.GetInstance(taggedObject, declaredExplicit));
         }
 
-        private readonly DerInteger pvno;
-        private readonly GeneralName sender;
-        private readonly GeneralName recipient;
-        private readonly Asn1GeneralizedTime messageTime;
-        private readonly AlgorithmIdentifier protectionAlg;
-        private readonly Asn1OctetString senderKID;       // KeyIdentifier
-        private readonly Asn1OctetString recipKID;        // KeyIdentifier
-        private readonly Asn1OctetString transactionID;
-        private readonly Asn1OctetString senderNonce;
-        private readonly Asn1OctetString recipNonce;
-        private readonly PkiFreeText freeText;
-        private readonly Asn1Sequence generalInfo;
+        private readonly DerInteger m_pvno;
+        private readonly GeneralName m_sender;
+        private readonly GeneralName m_recipient;
+        private readonly Asn1GeneralizedTime m_messageTime;
+        private readonly AlgorithmIdentifier m_protectionAlg;
+        private readonly Asn1OctetString m_senderKID;       // KeyIdentifier
+        private readonly Asn1OctetString m_recipKID;        // KeyIdentifier
+        private readonly Asn1OctetString m_transactionID;
+        private readonly Asn1OctetString m_senderNonce;
+        private readonly Asn1OctetString m_recipNonce;
+        private readonly PkiFreeText m_freeText;
+        private readonly Asn1Sequence m_generalInfo;
 
         private PkiHeader(Asn1Sequence seq)
         {
-            pvno = DerInteger.GetInstance(seq[0]);
-            sender = GeneralName.GetInstance(seq[1]);
-            recipient = GeneralName.GetInstance(seq[2]);
-
-            for (int pos = 3; pos < seq.Count; ++pos)
-            {
-                Asn1TaggedObject tObj = Asn1TaggedObject.GetInstance(seq[pos]);
-                if (!tObj.HasContextTag())
-                    throw new ArgumentException("unknown tag: " + Asn1Utilities.GetTagText(tObj));
-
-                switch (tObj.TagNo)
-                {
-                case 0:
-                    messageTime = Asn1GeneralizedTime.GetInstance(tObj, true);
-                    break;
-                case 1:
-                    protectionAlg = AlgorithmIdentifier.GetInstance(tObj, true);
-                    break;
-                case 2:
-                    senderKID = Asn1OctetString.GetInstance(tObj, true);
-                    break;
-                case 3:
-                    recipKID = Asn1OctetString.GetInstance(tObj, true);
-                    break;
-                case 4:
-                    transactionID = Asn1OctetString.GetInstance(tObj, true);
-                    break;
-                case 5:
-                    senderNonce = Asn1OctetString.GetInstance(tObj, true);
-                    break;
-                case 6:
-                    recipNonce = Asn1OctetString.GetInstance(tObj, true);
-                    break;
-                case 7:
-                    freeText = PkiFreeText.GetInstance(tObj, true);
-                    break;
-                case 8:
-                    generalInfo = Asn1Sequence.GetInstance(tObj, true);
-                    break;
-                default:
-                    throw new ArgumentException("unknown tag number: " + tObj.TagNo);
-                }
-            }
-        }
-
-        public PkiHeader(
-            int pvno,
-            GeneralName sender,
-            GeneralName recipient)
+            int count = seq.Count, pos = 0;
+            if (count < 3 || count > 12)
+                throw new ArgumentException("Bad sequence size: " + count, nameof(seq));
+
+            m_pvno = DerInteger.GetInstance(seq[pos++]);
+            m_sender = GeneralName.GetInstance(seq[pos++]);
+            m_recipient = GeneralName.GetInstance(seq[pos++]);
+            m_messageTime = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 0, true, Asn1GeneralizedTime.GetInstance);
+            m_protectionAlg = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 1, true, AlgorithmIdentifier.GetInstance);
+            m_senderKID = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 2, true, Asn1OctetString.GetInstance);
+            m_recipKID = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 3, true, Asn1OctetString.GetInstance);
+            m_transactionID = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 4, true, Asn1OctetString.GetInstance);
+            m_senderNonce = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 5, true, Asn1OctetString.GetInstance);
+            m_recipNonce = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 6, true, Asn1OctetString.GetInstance);
+            m_freeText = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 7, true, PkiFreeText.GetInstance);
+            m_generalInfo = Asn1Utilities.ReadOptionalContextTagged(seq, ref pos, 8, true, Asn1Sequence.GetInstance);
+
+            if (pos != count)
+                throw new ArgumentException("Unexpected elements in sequence", nameof(seq));
+        }
+
+        public PkiHeader(int pvno, GeneralName sender, GeneralName recipient)
             : this(new DerInteger(pvno), sender, recipient)
         {
         }
 
-        private PkiHeader(
-            DerInteger pvno,
-            GeneralName sender,
-            GeneralName recipient)
+        private PkiHeader(DerInteger pvno, GeneralName sender, GeneralName recipient)
         {
-            this.pvno = pvno;
-            this.sender = sender;
-            this.recipient = recipient;
+            m_pvno = pvno ?? throw new ArgumentNullException(nameof(pvno));
+            m_sender = sender ?? throw new ArgumentNullException(nameof(sender));
+            m_recipient = recipient ?? throw new ArgumentNullException(nameof(recipient));
         }
 
-        public virtual DerInteger Pvno
-        {
-            get { return pvno; }
-        }
+        public virtual DerInteger Pvno => m_pvno;
 
-        public virtual GeneralName Sender
-        {
-            get { return sender; }
-        }
+        public virtual GeneralName Sender => m_sender;
 
-        public virtual GeneralName Recipient
-        {
-            get { return recipient; }
-        }
+        public virtual GeneralName Recipient => m_recipient;
 
-        public virtual Asn1GeneralizedTime MessageTime
-        {
-            get { return messageTime; }
-        }
+        public virtual Asn1GeneralizedTime MessageTime => m_messageTime;
 
-        public virtual AlgorithmIdentifier ProtectionAlg
-        {
-            get { return protectionAlg; }
-        }
+        public virtual AlgorithmIdentifier ProtectionAlg => m_protectionAlg;
 
-        public virtual Asn1OctetString SenderKID
-        {   
-            get { return senderKID; }
-        }
+        public virtual Asn1OctetString SenderKID => m_senderKID;
 
-        public virtual Asn1OctetString RecipKID
-        {   
-            get { return recipKID; }
-        }
+        public virtual Asn1OctetString RecipKID => m_recipKID;
 
-        public virtual Asn1OctetString TransactionID
-        {   
-            get { return transactionID; }
-        }
+        public virtual Asn1OctetString TransactionID => m_transactionID;
 
-        public virtual Asn1OctetString SenderNonce
-        {   
-            get { return senderNonce; }
-        }
+        public virtual Asn1OctetString SenderNonce => m_senderNonce;
 
-        public virtual Asn1OctetString RecipNonce
-        {   
-            get { return recipNonce; }
-        }
+        public virtual Asn1OctetString RecipNonce => m_recipNonce;
 
-        public virtual PkiFreeText FreeText
-        {
-            get { return freeText; }
-        }
+        public virtual PkiFreeText FreeText => m_freeText;
 
-        public virtual InfoTypeAndValue[] GetGeneralInfo()
-        {
-            return generalInfo?.MapElements(InfoTypeAndValue.GetInstance);
-        }
+        public virtual InfoTypeAndValue[] GetGeneralInfo() => m_generalInfo?.MapElements(InfoTypeAndValue.GetInstance);
 
         /**
          * <pre>
@@ -207,16 +141,17 @@ namespace Org.BouncyCastle.Asn1.Cmp
          */
         public override Asn1Object ToAsn1Object()
         {
-            Asn1EncodableVector v = new Asn1EncodableVector(pvno, sender, recipient);
-            v.AddOptionalTagged(true, 0, messageTime);
-            v.AddOptionalTagged(true, 1, protectionAlg);
-            v.AddOptionalTagged(true, 2, senderKID);
-            v.AddOptionalTagged(true, 3, recipKID);
-            v.AddOptionalTagged(true, 4, transactionID);
-            v.AddOptionalTagged(true, 5, senderNonce);
-            v.AddOptionalTagged(true, 6, recipNonce);
-            v.AddOptionalTagged(true, 7, freeText);
-            v.AddOptionalTagged(true, 8, generalInfo);
+            Asn1EncodableVector v = new Asn1EncodableVector(12);
+            v.Add(m_pvno, m_sender, m_recipient);
+            v.AddOptionalTagged(true, 0, m_messageTime);
+            v.AddOptionalTagged(true, 1, m_protectionAlg);
+            v.AddOptionalTagged(true, 2, m_senderKID);
+            v.AddOptionalTagged(true, 3, m_recipKID);
+            v.AddOptionalTagged(true, 4, m_transactionID);
+            v.AddOptionalTagged(true, 5, m_senderNonce);
+            v.AddOptionalTagged(true, 6, m_recipNonce);
+            v.AddOptionalTagged(true, 7, m_freeText);
+            v.AddOptionalTagged(true, 8, m_generalInfo);
             return new DerSequence(v);
         }
     }