CMSCompressedDataStreamGenerator.cs 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. #if !BESTHTTP_DISABLE_ALTERNATE_SSL && (!UNITY_WEBGL || UNITY_EDITOR)
  2. #pragma warning disable
  3. using System;
  4. using System.IO;
  5. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1;
  6. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.Cms;
  7. using BestHTTP.SecureProtocol.Org.BouncyCastle.Asn1.X509;
  8. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities;
  9. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.IO;
  10. using BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Zlib;
  11. namespace BestHTTP.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 const string ZLib = "1.2.840.113549.1.9.16.3.8";
  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(
  44. int bufferSize)
  45. {
  46. _bufferSize = bufferSize;
  47. }
  48. public Stream Open(
  49. Stream outStream,
  50. string compressionOID)
  51. {
  52. return Open(outStream, CmsObjectIdentifiers.Data.Id, compressionOID);
  53. }
  54. public Stream Open(
  55. Stream outStream,
  56. string contentOID,
  57. string compressionOID)
  58. {
  59. BerSequenceGenerator sGen = new BerSequenceGenerator(outStream);
  60. sGen.AddObject(CmsObjectIdentifiers.CompressedData);
  61. //
  62. // Compressed Data
  63. //
  64. BerSequenceGenerator cGen = new BerSequenceGenerator(
  65. sGen.GetRawOutputStream(), 0, true);
  66. // CMSVersion
  67. cGen.AddObject(new DerInteger(0));
  68. // CompressionAlgorithmIdentifier
  69. cGen.AddObject(new AlgorithmIdentifier(new DerObjectIdentifier(ZLib)));
  70. //
  71. // Encapsulated ContentInfo
  72. //
  73. BerSequenceGenerator eiGen = new BerSequenceGenerator(cGen.GetRawOutputStream());
  74. eiGen.AddObject(new DerObjectIdentifier(contentOID));
  75. Stream octetStream = CmsUtilities.CreateBerOctetOutputStream(
  76. eiGen.GetRawOutputStream(), 0, true, _bufferSize);
  77. return new CmsCompressedOutputStream(
  78. new ZOutputStream(octetStream, JZlib.Z_DEFAULT_COMPRESSION), sGen, cGen, eiGen);
  79. }
  80. private class CmsCompressedOutputStream
  81. : BaseOutputStream
  82. {
  83. private ZOutputStream _out;
  84. private BerSequenceGenerator _sGen;
  85. private BerSequenceGenerator _cGen;
  86. private BerSequenceGenerator _eiGen;
  87. internal CmsCompressedOutputStream(
  88. ZOutputStream outStream,
  89. BerSequenceGenerator sGen,
  90. BerSequenceGenerator cGen,
  91. BerSequenceGenerator eiGen)
  92. {
  93. _out = outStream;
  94. _sGen = sGen;
  95. _cGen = cGen;
  96. _eiGen = eiGen;
  97. }
  98. public override void WriteByte(
  99. byte b)
  100. {
  101. _out.WriteByte(b);
  102. }
  103. public override void Write(
  104. byte[] bytes,
  105. int off,
  106. int len)
  107. {
  108. _out.Write(bytes, off, len);
  109. }
  110. #if PORTABLE || NETFX_CORE
  111. protected override void Dispose(bool disposing)
  112. {
  113. if (disposing)
  114. {
  115. BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.Dispose(_out);
  116. // TODO Parent context(s) should really be be closed explicitly
  117. _eiGen.Close();
  118. _cGen.Close();
  119. _sGen.Close();
  120. }
  121. base.Dispose(disposing);
  122. }
  123. #else
  124. public override void Close()
  125. {
  126. BestHTTP.SecureProtocol.Org.BouncyCastle.Utilities.Platform.Dispose(_out);
  127. // TODO Parent context(s) should really be be closed explicitly
  128. _eiGen.Close();
  129. _cGen.Close();
  130. _sGen.Close();
  131. base.Close();
  132. }
  133. #endif
  134. }
  135. }
  136. }
  137. #pragma warning restore
  138. #endif