141 lines
2.4 KiB
C#
141 lines
2.4 KiB
C#
using System;
|
|
using System.IO;
|
|
using Org.BouncyCastle.Utilities.IO;
|
|
|
|
namespace Org.BouncyCastle.Asn1;
|
|
|
|
public class DerOutputStream : FilterStream
|
|
{
|
|
public DerOutputStream(Stream os)
|
|
: base(os)
|
|
{
|
|
}
|
|
|
|
private void WriteLength(int length)
|
|
{
|
|
if (length > 127)
|
|
{
|
|
int num = 1;
|
|
uint num2 = (uint)length;
|
|
while ((num2 >>= 8) != 0)
|
|
{
|
|
num++;
|
|
}
|
|
WriteByte((byte)(num | 0x80));
|
|
for (int num3 = (num - 1) * 8; num3 >= 0; num3 -= 8)
|
|
{
|
|
WriteByte((byte)(length >> num3));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
WriteByte((byte)length);
|
|
}
|
|
}
|
|
|
|
internal void WriteEncoded(int tag, byte[] bytes)
|
|
{
|
|
WriteByte((byte)tag);
|
|
WriteLength(bytes.Length);
|
|
Write(bytes, 0, bytes.Length);
|
|
}
|
|
|
|
internal void WriteEncoded(int tag, byte first, byte[] bytes)
|
|
{
|
|
WriteByte((byte)tag);
|
|
WriteLength(bytes.Length + 1);
|
|
WriteByte(first);
|
|
Write(bytes, 0, bytes.Length);
|
|
}
|
|
|
|
internal void WriteEncoded(int tag, byte[] bytes, int offset, int length)
|
|
{
|
|
WriteByte((byte)tag);
|
|
WriteLength(length);
|
|
Write(bytes, offset, length);
|
|
}
|
|
|
|
internal void WriteTag(int flags, int tagNo)
|
|
{
|
|
if (tagNo < 31)
|
|
{
|
|
WriteByte((byte)(flags | tagNo));
|
|
return;
|
|
}
|
|
WriteByte((byte)(flags | 0x1F));
|
|
if (tagNo < 128)
|
|
{
|
|
WriteByte((byte)tagNo);
|
|
return;
|
|
}
|
|
byte[] array = new byte[5];
|
|
int num = array.Length;
|
|
array[--num] = (byte)(tagNo & 0x7F);
|
|
do
|
|
{
|
|
tagNo >>= 7;
|
|
array[--num] = (byte)((tagNo & 0x7F) | 0x80);
|
|
}
|
|
while (tagNo > 127);
|
|
Write(array, num, array.Length - num);
|
|
}
|
|
|
|
internal void WriteEncoded(int flags, int tagNo, byte[] bytes)
|
|
{
|
|
WriteTag(flags, tagNo);
|
|
WriteLength(bytes.Length);
|
|
Write(bytes, 0, bytes.Length);
|
|
}
|
|
|
|
protected void WriteNull()
|
|
{
|
|
WriteByte(5);
|
|
WriteByte(0);
|
|
}
|
|
|
|
[Obsolete("Use version taking an Asn1Encodable arg instead")]
|
|
public virtual void WriteObject(object obj)
|
|
{
|
|
if (obj == null)
|
|
{
|
|
WriteNull();
|
|
return;
|
|
}
|
|
if (obj is Asn1Object)
|
|
{
|
|
((Asn1Object)obj).Encode(this);
|
|
return;
|
|
}
|
|
if (obj is Asn1Encodable)
|
|
{
|
|
((Asn1Encodable)obj).ToAsn1Object().Encode(this);
|
|
return;
|
|
}
|
|
throw new IOException("object not Asn1Object");
|
|
}
|
|
|
|
public virtual void WriteObject(Asn1Encodable obj)
|
|
{
|
|
if (obj == null)
|
|
{
|
|
WriteNull();
|
|
}
|
|
else
|
|
{
|
|
obj.ToAsn1Object().Encode(this);
|
|
}
|
|
}
|
|
|
|
public virtual void WriteObject(Asn1Object obj)
|
|
{
|
|
if (obj == null)
|
|
{
|
|
WriteNull();
|
|
}
|
|
else
|
|
{
|
|
obj.Encode(this);
|
|
}
|
|
}
|
|
}
|