DerGenerator
using Org.BouncyCastle.Utilities.IO;
using System.IO;
namespace Org.BouncyCastle.Asn1
{
public abstract class DerGenerator : Asn1Generator
{
private bool _tagged;
private bool _isExplicit;
private int _tagNo;
protected DerGenerator(Stream outStream)
: base(outStream)
{
}
protected DerGenerator(Stream outStream, int tagNo, bool isExplicit)
: base(outStream)
{
_tagged = true;
_isExplicit = isExplicit;
_tagNo = tagNo;
}
internal void WriteDerEncoded(int tag, byte[] bytes)
{
if (_tagged) {
int num = _tagNo | 128;
if (_isExplicit) {
int tag2 = _tagNo | 32 | 128;
MemoryStream memoryStream = new MemoryStream();
WriteDerEncoded(memoryStream, tag, bytes);
WriteDerEncoded(base.OutStream, tag2, memoryStream.ToArray());
} else {
if ((tag & 32) != 0)
num |= 32;
WriteDerEncoded(base.OutStream, num, bytes);
}
} else
WriteDerEncoded(base.OutStream, tag, bytes);
}
internal static void WriteDerEncoded(Stream outStream, int tag, byte[] bytes)
{
outStream.WriteByte((byte)tag);
WriteLength(outStream, bytes.Length);
outStream.Write(bytes, 0, bytes.Length);
}
internal static void WriteDerEncoded(Stream outStream, int tag, Stream inStream)
{
WriteDerEncoded(outStream, tag, Streams.ReadAll(inStream));
}
private static void WriteLength(Stream outStream, int length)
{
if (length > 127) {
int num = 1;
int num2 = length;
while ((num2 >>= 8) != 0) {
num++;
}
outStream.WriteByte((byte)(num | 128));
for (int num3 = (num - 1) * 8; num3 >= 0; num3 -= 8) {
outStream.WriteByte((byte)(length >> num3));
}
} else
outStream.WriteByte((byte)length);
}
}
}