diff options
Diffstat (limited to 'crypto/src/cms')
-rw-r--r-- | crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs | 47 | ||||
-rw-r--r-- | crypto/src/cms/CMSCompressedDataStreamGenerator.cs | 24 | ||||
-rw-r--r-- | crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs | 39 | ||||
-rw-r--r-- | crypto/src/cms/CMSSignedDataStreamGenerator.cs | 35 | ||||
-rw-r--r-- | crypto/src/cms/CMSUtils.cs | 6 |
5 files changed, 83 insertions, 68 deletions
diff --git a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs index fd2c743bb..054a9c45e 100644 --- a/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSAuthenticatedDataStreamGenerator.cs @@ -140,31 +140,30 @@ namespace Org.BouncyCastle.Cms authGen.AddObject(new DerInteger(AuthenticatedData.CalculateVersion(null))); Stream authRaw = authGen.GetRawOutputStream(); - Asn1Generator recipGen = _berEncodeRecipientSet - ? (Asn1Generator) new BerSetGenerator(authRaw) - : new DerSetGenerator(authRaw); - - foreach (Asn1Encodable ae in recipientInfos) + using (var recipGen = _berEncodeRecipientSet + ? (Asn1Generator)new BerSetGenerator(authRaw) + : new DerSetGenerator(authRaw)) { - recipGen.AddObject(ae); - } - - recipGen.Close(); + foreach (Asn1Encodable ae in recipientInfos) + { + recipGen.AddObject(ae); + } + } authGen.AddObject(macAlgId); BerSequenceGenerator eiGen = new BerSequenceGenerator(authRaw); eiGen.AddObject(CmsObjectIdentifiers.Data); - Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream( - eiGen.GetRawOutputStream(), 0, true, _bufferSize); + BerOctetStringGenerator octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, true); + Stream octetOutputStream = octGen.GetOctetOutputStream(_bufferSize); IMac mac = MacUtilities.GetMac(macAlgId.Algorithm); // TODO Confirm no ParametersWithRandom needed mac.Init(cipherParameters); Stream mOut = new TeeOutputStream(octetOutputStream, new MacSink(mac)); - return new CmsAuthenticatedDataOutputStream(mOut, mac, cGen, authGen, eiGen); + return new CmsAuthenticatedDataOutputStream(mOut, mac, cGen, authGen, eiGen, octGen); } catch (SecurityUtilityException e) { @@ -214,23 +213,26 @@ namespace Org.BouncyCastle.Cms { private readonly Stream macStream; private readonly IMac mac; - private readonly BerSequenceGenerator cGen; + private readonly BerSequenceGenerator cGen; private readonly BerSequenceGenerator authGen; private readonly BerSequenceGenerator eiGen; + private readonly BerOctetStringGenerator octGen; - public CmsAuthenticatedDataOutputStream( + public CmsAuthenticatedDataOutputStream( Stream macStream, IMac mac, - BerSequenceGenerator cGen, + BerSequenceGenerator cGen, BerSequenceGenerator authGen, - BerSequenceGenerator eiGen) - { + BerSequenceGenerator eiGen, + BerOctetStringGenerator octGen) + { this.macStream = macStream; this.mac = mac; this.cGen = cGen; this.authGen = authGen; this.eiGen = eiGen; - } + this.octGen = octGen; + } public override void Write(byte[] buffer, int offset, int count) { @@ -255,17 +257,18 @@ namespace Org.BouncyCastle.Cms { macStream.Dispose(); - // TODO Parent context(s) should really be be closed explicitly + // TODO Parent context(s) should really be be closed explicitly - eiGen.Close(); + octGen.Dispose(); + eiGen.Dispose(); // [TODO] auth attributes go here byte[] macOctets = MacUtilities.DoFinal(mac); authGen.AddObject(new DerOctetString(macOctets)); // [TODO] unauth attributes go here - authGen.Close(); - cGen.Close(); + authGen.Dispose(); + cGen.Dispose(); } base.Dispose(disposing); } diff --git a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs index 64a978c6d..f992a8269 100644 --- a/crypto/src/cms/CMSCompressedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSCompressedDataStreamGenerator.cs @@ -87,11 +87,11 @@ namespace Org.BouncyCastle.Cms eiGen.AddObject(new DerObjectIdentifier(contentOid)); - Stream octetStream = CmsUtilities.CreateBerOctetOutputStream( - eiGen.GetRawOutputStream(), 0, true, _bufferSize); + BerOctetStringGenerator octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, true); + Stream octetStream = octGen.GetOctetOutputStream(_bufferSize); - return new CmsCompressedOutputStream( - Utilities.IO.Compression.ZLib.CompressOutput(octetStream, -1), sGen, cGen, eiGen); + return new CmsCompressedOutputStream( + Utilities.IO.Compression.ZLib.CompressOutput(octetStream, -1), sGen, cGen, eiGen, octGen); } private class CmsCompressedOutputStream @@ -101,17 +101,20 @@ namespace Org.BouncyCastle.Cms private BerSequenceGenerator _sGen; private BerSequenceGenerator _cGen; private BerSequenceGenerator _eiGen; + private BerOctetStringGenerator _octGen; - internal CmsCompressedOutputStream( + internal CmsCompressedOutputStream( Stream outStream, BerSequenceGenerator sGen, BerSequenceGenerator cGen, - BerSequenceGenerator eiGen) + BerSequenceGenerator eiGen, + BerOctetStringGenerator octGen) { _out = outStream; _sGen = sGen; _cGen = cGen; _eiGen = eiGen; + _octGen = octGen; } public override void Write(byte[] buffer, int offset, int count) @@ -137,11 +140,12 @@ namespace Org.BouncyCastle.Cms { _out.Dispose(); - // TODO Parent context(s) should really be be closed explicitly + // TODO Parent context(s) should really be be closed explicitly - _eiGen.Close(); - _cGen.Close(); - _sGen.Close(); + _octGen.Dispose(); + _eiGen.Dispose(); + _cGen.Dispose(); + _sGen.Dispose(); } base.Dispose(disposing); } diff --git a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs index cfd3dde10..64d501a41 100644 --- a/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSEnvelopedDataStreamGenerator.cs @@ -142,29 +142,28 @@ namespace Org.BouncyCastle.Cms envGen.AddObject(this.Version); Stream envRaw = envGen.GetRawOutputStream(); - Asn1Generator recipGen = _berEncodeRecipientSet - ? (Asn1Generator) new BerSetGenerator(envRaw) - : new DerSetGenerator(envRaw); - - foreach (Asn1Encodable ae in recipientInfos) + using (var recipGen = _berEncodeRecipientSet + ? (Asn1Generator)new BerSetGenerator(envRaw) + : new DerSetGenerator(envRaw)) { - recipGen.AddObject(ae); - } - - recipGen.Close(); + foreach (Asn1Encodable ae in recipientInfos) + { + recipGen.AddObject(ae); + } + } BerSequenceGenerator eiGen = new BerSequenceGenerator(envRaw); eiGen.AddObject(CmsObjectIdentifiers.Data); eiGen.AddObject(encAlgID); - Stream octetOutputStream = CmsUtilities.CreateBerOctetOutputStream( - eiGen.GetRawOutputStream(), 0, false, _bufferSize); + BerOctetStringGenerator octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, false); + Stream octetOutputStream = octGen.GetOctetOutputStream(_bufferSize); IBufferedCipher cipher = CipherUtilities.GetCipher(encAlgID.Algorithm); cipher.Init(true, new ParametersWithRandom(cipherParameters, m_random)); CipherStream cOut = new CipherStream(octetOutputStream, null, cipher); - return new CmsEnvelopedDataOutputStream(this, cOut, cGen, envGen, eiGen); + return new CmsEnvelopedDataOutputStream(this, cOut, cGen, envGen, eiGen, octGen); } catch (SecurityUtilityException e) { @@ -220,19 +219,22 @@ namespace Org.BouncyCastle.Cms private readonly BerSequenceGenerator _cGen; private readonly BerSequenceGenerator _envGen; private readonly BerSequenceGenerator _eiGen; + private readonly BerOctetStringGenerator _octGen; - public CmsEnvelopedDataOutputStream( + public CmsEnvelopedDataOutputStream( CmsEnvelopedGenerator outer, CipherStream outStream, BerSequenceGenerator cGen, BerSequenceGenerator envGen, - BerSequenceGenerator eiGen) + BerSequenceGenerator eiGen, + BerOctetStringGenerator octGen) { _outer = outer; _out = outStream; _cGen = cGen; _envGen = envGen; _eiGen = eiGen; + _octGen = octGen; } public override void Write(byte[] buffer, int offset, int count) @@ -258,9 +260,10 @@ namespace Org.BouncyCastle.Cms { _out.Dispose(); - // TODO Parent context(s) should really be closed explicitly + // TODO Parent context(s) should really be closed explicitly - _eiGen.Close(); + _octGen.Dispose(); + _eiGen.Dispose(); if (_outer.unprotectedAttributeGenerator != null) { @@ -272,8 +275,8 @@ namespace Org.BouncyCastle.Cms _envGen.AddObject(new DerTaggedObject(false, 1, unprotectedAttrs)); } - _envGen.Close(); - _cGen.Close(); + _envGen.Dispose(); + _cGen.Dispose(); } base.Dispose(disposing); } diff --git a/crypto/src/cms/CMSSignedDataStreamGenerator.cs b/crypto/src/cms/CMSSignedDataStreamGenerator.cs index a4e960ba6..33b661761 100644 --- a/crypto/src/cms/CMSSignedDataStreamGenerator.cs +++ b/crypto/src/cms/CMSSignedDataStreamGenerator.cs @@ -570,18 +570,23 @@ namespace Org.BouncyCastle.Cms BerSequenceGenerator eiGen = new BerSequenceGenerator(sigGen.GetRawOutputStream()); eiGen.AddObject(contentTypeOid); - // If encapsulating, add the data as an octet string in the sequence - Stream encapStream = encapsulate - ? CmsUtilities.CreateBerOctetOutputStream(eiGen.GetRawOutputStream(), 0, true, _bufferSize) - : null; + BerOctetStringGenerator octGen = null; + Stream encapStream = null; - // Also send the data to 'dataOutputStream' if necessary - Stream teeStream = GetSafeTeeOutputStream(dataOutputStream, encapStream); + // If encapsulating, add the data as an octet string in the sequence + if (encapsulate) + { + octGen = new BerOctetStringGenerator(eiGen.GetRawOutputStream(), 0, true); + encapStream = octGen.GetOctetOutputStream(_bufferSize); + } + + // Also send the data to 'dataOutputStream' if necessary + Stream teeStream = GetSafeTeeOutputStream(dataOutputStream, encapStream); // Let all the digests see the data as it is written Stream digStream = AttachDigestsToOutputStream(m_messageDigests.Values, teeStream); - return new CmsSignedDataOutputStream(this, digStream, signedContentType, sGen, sigGen, eiGen); + return new CmsSignedDataOutputStream(this, digStream, signedContentType, sGen, sigGen, eiGen, octGen); } private void RegisterDigestOid( @@ -761,14 +766,16 @@ namespace Org.BouncyCastle.Cms private BerSequenceGenerator _sGen; private BerSequenceGenerator _sigGen; private BerSequenceGenerator _eiGen; + private BerOctetStringGenerator _octGen; - public CmsSignedDataOutputStream( + public CmsSignedDataOutputStream( CmsSignedDataStreamGenerator outer, Stream outStream, string contentOID, BerSequenceGenerator sGen, BerSequenceGenerator sigGen, - BerSequenceGenerator eiGen) + BerSequenceGenerator eiGen, + BerOctetStringGenerator octGen) { this.outer = outer; @@ -777,6 +784,7 @@ namespace Org.BouncyCastle.Cms _sGen = sGen; _sigGen = sigGen; _eiGen = eiGen; + _octGen = octGen; } public override void Write(byte[] buffer, int offset, int count) @@ -811,7 +819,10 @@ namespace Org.BouncyCastle.Cms // TODO Parent context(s) should really be be closed explicitly - _eiGen.Close(); + // Only for encapsulation + _octGen?.Dispose(); + + _eiGen.Dispose(); outer.m_digests.Clear(); // clear the current preserved digest state @@ -896,8 +907,8 @@ namespace Org.BouncyCastle.Cms WriteToGenerator(_sigGen, new DerSet(signerInfos)); - _sigGen.Close(); - _sGen.Close(); + _sigGen.Dispose(); + _sGen.Dispose(); } private static void WriteToGenerator(Asn1Generator ag, Asn1Encodable ae) diff --git a/crypto/src/cms/CMSUtils.cs b/crypto/src/cms/CMSUtils.cs index 1a1577c4e..99258c995 100644 --- a/crypto/src/cms/CMSUtils.cs +++ b/crypto/src/cms/CMSUtils.cs @@ -176,12 +176,6 @@ namespace Org.BouncyCastle.Cms return new DerSet(v); } - internal static Stream CreateBerOctetOutputStream(Stream s, int tagNo, bool isExplicit, int bufferSize) - { - BerOctetStringGenerator octGen = new BerOctetStringGenerator(s, tagNo, isExplicit); - return octGen.GetOctetOutputStream(bufferSize); - } - internal static TbsCertificateStructure GetTbsCertificateStructure(X509Certificate cert) { return TbsCertificateStructure.GetInstance(Asn1Object.FromByteArray(cert.GetTbsCertificate())); |