CMSCompressedDataStreamGenerator.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  6. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cms;
  7. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Crypto.IO;
  9. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  10. using Best.HTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  11. namespace Best.HTTP.SecureProtocol.Org.BouncyCastle.Cms
  12. {
  13. /**
  14. * General class for generating a compressed CMS message stream.
  15. * <p>
  16. * A simple example of usage.
  17. * </p>
  18. * <pre>
  19. * CMSCompressedDataStreamGenerator gen = new CMSCompressedDataStreamGenerator();
  20. *
  21. * Stream cOut = gen.Open(outputStream, CMSCompressedDataStreamGenerator.ZLIB);
  22. *
  23. * cOut.Write(data);
  24. *
  25. * cOut.Close();
  26. * </pre>
  27. */
  28. public class CmsCompressedDataStreamGenerator
  29. {
  30. public static readonly string ZLib = CmsObjectIdentifiers.ZlibCompress.Id;
  31. private int _bufferSize;
  32. /**
  33. * base constructor
  34. */
  35. public CmsCompressedDataStreamGenerator()
  36. {
  37. }
  38. /**
  39. * Set the underlying string size for encapsulated data
  40. *
  41. * @param bufferSize length of octet strings to buffer the data.
  42. */
  43. public void SetBufferSize(int bufferSize)
  44. {
  45. _bufferSize = bufferSize;
  46. }
  47. public Stream Open(Stream outStream)
  48. {
  49. return Open(outStream, CmsObjectIdentifiers.Data.Id, ZLib);
  50. }
  51. public Stream Open(Stream outStream, string compressionOid)
  52. {
  53. return Open(outStream, CmsObjectIdentifiers.Data.Id, compressionOid);
  54. }
  55. public Stream Open(Stream outStream, string contentOid, string compressionOid)
  56. {
  57. if (ZLib != compressionOid)
  58. throw new ArgumentException("Unsupported compression algorithm: " + compressionOid,
  59. nameof(compressionOid));
  60. BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);
  61. sGen.AddObject(CmsObjectIdentifiers.CompressedData);
  62. //
  63. // Compressed Data
  64. //
  65. BerSequenceGenerator cGen = new BerSequenceGenerator(
  66. sGen.GetRawOutputStream(), 0, true);
  67. // CMSVersion
  68. cGen.AddObject(new DerInteger(0));
  69. // CompressionAlgorithmIdentifier
  70. cGen.AddObject(new AlgorithmIdentifier(CmsObjectIdentifiers.ZlibCompress));
  71. //
  72. // Encapsulated ContentInfo
  73. //
  74. BerSequenceGenerator eiGen = new BerSequenceGenerator(cGen.GetRawOutputStream());
  75. eiGen.AddObject(new DerObjectIdentifier(contentOid));
  76. Stream octetStream = CmsUtilities.CreateBerOctetOutputStream(
  77. eiGen.GetRawOutputStream(), 0, true, _bufferSize);
  78. return new CmsCompressedOutputStream(
  79. Utilities.IO.Compression.ZLib.CompressOutput(octetStream, -1), sGen, cGen, eiGen);
  80. }
  81. private class CmsCompressedOutputStream
  82. : BaseOutputStream
  83. {
  84. private Stream _out;
  85. private BerSequenceGenerator _sGen;
  86. private BerSequenceGenerator _cGen;
  87. private BerSequenceGenerator _eiGen;
  88. internal CmsCompressedOutputStream(
  89. Stream outStream,
  90. BerSequenceGenerator sGen,
  91. BerSequenceGenerator cGen,
  92. BerSequenceGenerator eiGen)
  93. {
  94. _out = outStream;
  95. _sGen = sGen;
  96. _cGen = cGen;
  97. _eiGen = eiGen;
  98. }
  99. public override void Write(byte[] buffer, int offset, int count)
  100. {
  101. _out.Write(buffer, offset, count);
  102. }
  103. #if NETCOREAPP2_1_OR_GREATER || NETSTANDARD2_1_OR_GREATER || UNITY_2021_2_OR_NEWER
  104. public override void Write(ReadOnlySpan<byte> buffer)
  105. {
  106. _out.Write(buffer);
  107. }
  108. #endif
  109. public override void WriteByte(byte value)
  110. {
  111. _out.WriteByte(value);
  112. }
  113. protected override void Dispose(bool disposing)
  114. {
  115. if (disposing)
  116. {
  117. _out.Dispose();
  118. // TODO Parent context(s) should really be be closed explicitly
  119. _eiGen.Close();
  120. _cGen.Close();
  121. _sGen.Close();
  122. }
  123. base.Dispose(disposing);
  124. }
  125. }
  126. }
  127. }
  128. #pragma warning restore
  129. #endif