diff options
author | Konstantin Kretov <konstantin.kretov@jetbrains.com> | 2023-12-28 15:23:55 +0100 |
---|---|---|
committer | Alexander Scheel <alexander.scheel@keyfactor.com> | 2024-02-12 11:08:13 -0500 |
commit | 2a508f3ffe7843efcd188f6349f3125a25158351 (patch) | |
tree | 517e04edb9060d26aae2719d6b71dbf832c4923f /crypto | |
parent | Test invalid DerGeneralizedTime with explicit zone (diff) | |
download | BouncyCastle.NET-ed25519-2a508f3ffe7843efcd188f6349f3125a25158351.tar.xz |
Added support for PKCS7 signed content in CMS. Port from Java BC. #310 #232
Diffstat (limited to 'crypto')
-rw-r--r-- | crypto/src/cms/CMSSignedData.cs | 13 | ||||
-rw-r--r-- | crypto/src/cms/Pkcs7ProcessableObject.cs | 48 |
2 files changed, 59 insertions, 2 deletions
diff --git a/crypto/src/cms/CMSSignedData.cs b/crypto/src/cms/CMSSignedData.cs index a19fe27ab..77da9b95d 100644 --- a/crypto/src/cms/CMSSignedData.cs +++ b/crypto/src/cms/CMSSignedData.cs @@ -5,6 +5,7 @@ using System.IO; using Org.BouncyCastle.Asn1; using Org.BouncyCastle.Asn1.Cms; using Org.BouncyCastle.Asn1.X509; +using Org.BouncyCastle.cms; using Org.BouncyCastle.Operators.Utilities; using Org.BouncyCastle.Utilities.Collections; using Org.BouncyCastle.X509; @@ -115,8 +116,16 @@ namespace Org.BouncyCastle.Cms // if (signedData.EncapContentInfo.Content != null) { - this.signedContent = new CmsProcessableByteArray( - ((Asn1OctetString)signedData.EncapContentInfo.Content).GetOctets()); + if (signedData.EncapContentInfo.Content is Asn1OctetString) + { + signedContent = new CmsProcessableByteArray( + ((Asn1OctetString)(signedData.EncapContentInfo.Content)).GetOctets()); + } + else + { + signedContent = new Pkcs7ProcessableObject(signedData.EncapContentInfo.ContentType, + signedData.EncapContentInfo.Content); + } } // else // { diff --git a/crypto/src/cms/Pkcs7ProcessableObject.cs b/crypto/src/cms/Pkcs7ProcessableObject.cs new file mode 100644 index 000000000..1042b6ff5 --- /dev/null +++ b/crypto/src/cms/Pkcs7ProcessableObject.cs @@ -0,0 +1,48 @@ +using System.IO; +using Org.BouncyCastle.Asn1; +using Org.BouncyCastle.Cms; + +namespace Org.BouncyCastle.cms +{ + public class Pkcs7ProcessableObject : CmsProcessable + { + public DerObjectIdentifier ContentType { get; } + public Asn1Encodable Content { get; } + + public Pkcs7ProcessableObject(DerObjectIdentifier contentType, Asn1Encodable content) + { + ContentType = contentType; + Content = content; + } + + public void Write(Stream outStream) + { + using (var sw = new BinaryWriter(outStream)) + { + if (Content is Asn1Sequence) + { + Asn1Sequence seq = Asn1Sequence.GetInstance(Content); + + foreach (Asn1Encodable enc in seq) + { + sw.Write(enc.ToAsn1Object().GetEncoded(Asn1Encodable.Der)); + } + } + else + { + byte[] encoded = Content.ToAsn1Object().GetEncoded(Asn1Encodable.Der); + int index = 1; + while ((encoded[index] & 0xff) > 127) + { + index++; + } + + index++; + sw.Write(encoded, index, encoded.Length - index); + } + } + } + + public object GetContent() => Content; + } +} \ No newline at end of file |