BerBitString
using System;
namespace Org.BouncyCastle.Asn1
{
public class BerBitString : DLBitString
{
private readonly DerBitString[] elements;
public static BerBitString FromSequence(Asn1Sequence seq)
{
return new BerBitString(seq.MapElements(DerBitString.GetInstance));
}
internal static byte[] FlattenBitStrings(DerBitString[] bitStrings)
{
int num = bitStrings.Length;
switch (num) {
case 0:
return DerBitString.EmptyOctetsContents;
case 1:
return bitStrings[0].m_contents;
default: {
int num2 = num - 1;
int num3 = 0;
for (int i = 0; i < num2; i++) {
byte[] contents = bitStrings[i].m_contents;
if (contents[0] != 0)
throw new ArgumentException("only the last nested bitstring can have padding", "bitStrings");
num3 += contents.Length - 1;
}
byte[] contents2 = bitStrings[num2].m_contents;
byte b = contents2[0];
num3 += contents2.Length;
byte[] array = new byte[num3];
array[0] = b;
int num4 = 1;
for (int j = 0; j < num; j++) {
byte[] contents3 = bitStrings[j].m_contents;
int num5 = contents3.Length - 1;
Array.Copy(contents3, 1, array, num4, num5);
num4 += num5;
}
return array;
}
}
}
public BerBitString(byte data, int padBits)
: base(data, padBits)
{
elements = null;
}
public BerBitString(byte[] data)
: this(data, 0)
{
}
public BerBitString(byte[] data, int padBits)
: base(data, padBits)
{
elements = null;
}
[Obsolete("Use version without segmentLimit (which is ignored anyway)")]
public BerBitString(byte[] data, int padBits, int segmentLimit)
: this(data, padBits)
{
}
public BerBitString(int namedBits)
: base(namedBits)
{
elements = null;
}
public BerBitString(Asn1Encodable obj)
: this(obj.GetDerEncoded(), 0)
{
}
public BerBitString(DerBitString[] elements)
: base(FlattenBitStrings(elements), false)
{
this.elements = elements;
}
[Obsolete("Use version without segmentLimit (which is ignored anyway)")]
public BerBitString(DerBitString[] elements, int segmentLimit)
: this(elements)
{
}
internal BerBitString(byte[] contents, bool check)
: base(contents, check)
{
elements = null;
}
internal override IAsn1Encoding GetEncoding(int encoding)
{
if (1 != encoding)
return base.GetEncoding(encoding);
if (elements == null)
return new PrimitiveEncoding(0, 3, m_contents);
Asn1Encodable[] array = elements;
return new ConstructedILEncoding(0, 3, Asn1OutputStream.GetContentsEncodings(encoding, array));
}
internal override IAsn1Encoding GetEncodingImplicit(int encoding, int tagClass, int tagNo)
{
if (1 != encoding)
return base.GetEncodingImplicit(encoding, tagClass, tagNo);
if (elements == null)
return new PrimitiveEncoding(tagClass, tagNo, m_contents);
Asn1Encodable[] array = elements;
return new ConstructedILEncoding(tagClass, tagNo, Asn1OutputStream.GetContentsEncodings(encoding, array));
}
}
}