summary refs log tree commit diff
path: root/crypto/src/cmp
diff options
context:
space:
mode:
authorDavid Hook <dgh@bouncycastle.org>2019-01-14 18:10:49 +1100
committerDavid Hook <dgh@bouncycastle.org>2019-01-14 18:10:49 +1100
commita723aca1e07f57af70d7596a4fe3961045cdb0d9 (patch)
tree9c2c3b608e823c2705855a63069d3d8326fecaf5 /crypto/src/cmp
parentNist algs and ProtectedMessageTests (diff)
downloadBouncyCastle.NET-ed25519-a723aca1e07f57af70d7596a4fe3961045cdb0d9.tar.xz
packaging fix
Diffstat (limited to 'crypto/src/cmp')
-rw-r--r--crypto/src/cmp/CertificateConfirmationContent.cs45
-rw-r--r--crypto/src/cmp/CertificateConfirmationContentBuilder.cs73
-rw-r--r--crypto/src/cmp/CertificateStatus.cs55
-rw-r--r--crypto/src/cmp/CmpException.cs26
4 files changed, 199 insertions, 0 deletions
diff --git a/crypto/src/cmp/CertificateConfirmationContent.cs b/crypto/src/cmp/CertificateConfirmationContent.cs
new file mode 100644
index 000000000..882bd2091
--- /dev/null
+++ b/crypto/src/cmp/CertificateConfirmationContent.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Org.BouncyCastle.Cms;
+using Org.BouncyCastle.Asn1.Cmp;
+
+
+namespace Org.BouncyCastle.Cmp
+{
+    public class CertificateConfirmationContent
+    {
+        private DefaultDigestAlgorithmIdentifierFinder digestAlgFinder;
+        private CertConfirmContent content;
+
+
+        public CertificateConfirmationContent(CertConfirmContent content)
+        {
+            this.content = content;
+        }
+
+        public CertificateConfirmationContent(CertConfirmContent content,
+            DefaultDigestAlgorithmIdentifierFinder digestAlgFinder)
+        {
+            this.content = content;
+            this.digestAlgFinder = digestAlgFinder;
+        }
+
+        public CertConfirmContent ToAsn1Structure()
+        {
+            return content;
+        }
+
+        public CertificateStatus[] GetStatusMessages()
+        {
+            CertStatus[] statusArray = content.ToCertStatusArray();
+            CertificateStatus[] ret = new CertificateStatus[statusArray.Length];
+            for (int i = 0; i != ret.Length; i++)
+            {
+                ret[i] = new CertificateStatus(digestAlgFinder, statusArray[i]);
+            }
+
+            return ret;
+        } 
+    }
+}
diff --git a/crypto/src/cmp/CertificateConfirmationContentBuilder.cs b/crypto/src/cmp/CertificateConfirmationContentBuilder.cs
new file mode 100644
index 000000000..126484917
--- /dev/null
+++ b/crypto/src/cmp/CertificateConfirmationContentBuilder.cs
@@ -0,0 +1,73 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
+using Org.BouncyCastle.Asn1;
+using Org.BouncyCastle.Asn1.Cmp;
+using Org.BouncyCastle.Asn1.X509;
+using Org.BouncyCastle.Cms;
+using Org.BouncyCastle.Crypto.IO;
+using Org.BouncyCastle.Math;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.X509;
+
+namespace Org.BouncyCastle.Cmp
+{
+    public class CertificateConfirmationContentBuilder
+    {
+        DefaultSignatureAlgorithmIdentifierFinder sigAlgFinder = new DefaultSignatureAlgorithmIdentifierFinder();
+        private DefaultDigestAlgorithmIdentifierFinder digestAlgFinder;
+        private ArrayList acceptedCerts = new ArrayList();
+        private ArrayList acceptedReqIds = new ArrayList();
+
+        public CertificateConfirmationContentBuilder() : this(new DefaultDigestAlgorithmIdentifierFinder())
+        {
+
+        }
+    
+        public CertificateConfirmationContentBuilder(DefaultDigestAlgorithmIdentifierFinder digestAlgFinder)
+        {
+            this.digestAlgFinder = digestAlgFinder;
+        }
+
+        public CertificateConfirmationContentBuilder AddAcceptedCertificate(X509Certificate certHolder,
+            BigInteger certReqId)
+        {
+            acceptedCerts.Add(certHolder);
+            acceptedReqIds.Add(certReqId);
+            return this;
+        }
+
+        public CertificateConfirmationContent Build()
+        {
+            Asn1EncodableVector v = new Asn1EncodableVector();
+            for (int i = 0; i != acceptedCerts.Count; i++)
+            {
+                X509Certificate cert = (X509Certificate) acceptedCerts[i];
+                BigInteger reqId = (BigInteger) acceptedReqIds[i];
+
+
+                
+                AlgorithmIdentifier algorithmIdentifier =  sigAlgFinder.Find(cert.SigAlgName);
+
+                AlgorithmIdentifier digAlg = digestAlgFinder.find(algorithmIdentifier);
+                if (digAlg == null)
+                {
+                    throw new CmpException("cannot find algorithm for digest from signature");
+                }
+
+                DigestSink sink = new DigestSink(DigestUtilities.GetDigest(digAlg.Algorithm));
+
+                sink.Write(cert.GetEncoded());
+
+                byte[] dig = new byte[sink.Digest.GetDigestSize()];
+                sink.Digest.DoFinal(dig, 0);
+
+                v.Add(new CertStatus(dig,reqId));
+            }
+
+            return new CertificateConfirmationContent(CertConfirmContent.GetInstance(new DerSequence(v)),
+                digestAlgFinder);
+        }
+    }
+}
diff --git a/crypto/src/cmp/CertificateStatus.cs b/crypto/src/cmp/CertificateStatus.cs
new file mode 100644
index 000000000..e8c3546dd
--- /dev/null
+++ b/crypto/src/cmp/CertificateStatus.cs
@@ -0,0 +1,55 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+using Org.BouncyCastle.Asn1.Cmp;
+using Org.BouncyCastle.Asn1.X509;
+using Org.BouncyCastle.Cms;
+using Org.BouncyCastle.Crypto.IO;
+using Org.BouncyCastle.Math;
+using Org.BouncyCastle.Security;
+using Org.BouncyCastle.Utilities;
+using Org.BouncyCastle.X509;
+
+namespace Org.BouncyCastle.Cmp
+{
+    public class CertificateStatus
+    {
+        private DefaultSignatureAlgorithmIdentifierFinder sigAlgFinder = new DefaultSignatureAlgorithmIdentifierFinder();
+        private DefaultDigestAlgorithmIdentifierFinder digestAlgFinder;
+        private CertStatus certStatus;
+
+        public CertificateStatus(DefaultDigestAlgorithmIdentifierFinder digestAlgFinder, CertStatus certStatus)
+        {
+            this.digestAlgFinder = digestAlgFinder;
+            this.certStatus = certStatus;
+        }
+
+         public PkiStatusInfo PkiStatusInfo
+         {
+             get { return certStatus.StatusInfo; }
+         }
+
+        public BigInteger CertRequestId
+        {
+            get { return certStatus.CertReqID.Value; }
+        }
+
+        public bool IsVerified(X509Certificate cert)
+        {
+
+            AlgorithmIdentifier digAlg = digestAlgFinder.find( sigAlgFinder.Find(cert.SigAlgName));
+            if (digAlg == null)
+            {
+                throw new CmpException("cannot find algorithm for digest from signature "+cert.SigAlgName);
+            }
+
+            DigestSink digestSink = new DigestSink(DigestUtilities.GetDigest(digAlg.Algorithm));
+
+            digestSink.Write(cert.GetEncoded());
+
+            byte[] digest = new byte[digestSink.Digest.GetDigestSize()];
+            digestSink.Digest.DoFinal(digest, 0);
+            return Arrays.ConstantTimeAreEqual(certStatus.CertHash.GetOctets(), digest);
+        }
+    }
+}
diff --git a/crypto/src/cmp/CmpException.cs b/crypto/src/cmp/CmpException.cs
new file mode 100644
index 000000000..7ecdf5af8
--- /dev/null
+++ b/crypto/src/cmp/CmpException.cs
@@ -0,0 +1,26 @@
+using System;
+using System.Collections.Generic;
+using System.Runtime.Serialization;
+using System.Text;
+
+namespace Org.BouncyCastle.Cmp
+{
+    public class CmpException : Exception
+    {
+        public CmpException()
+        {
+        }
+
+        public CmpException(string message) : base(message)
+        {
+        }
+
+        public CmpException(string message, Exception innerException) : base(message, innerException)
+        {
+        }
+
+        protected CmpException(SerializationInfo info, StreamingContext context) : base(info, context)
+        {
+        }
+    }
+}