<PackageReference Include="BouncyCastle.Cryptography" Version="2.6.2" />

BerOctetString

using Org.BouncyCastle.Utilities; using System; namespace Org.BouncyCastle.Asn1 { public class BerOctetString : DerOctetString { public new static readonly BerOctetString Empty = new BerOctetString(Asn1OctetString.EmptyOctets); private readonly Asn1OctetString[] elements; public new static BerOctetString FromContents(byte[] contents) { if (contents == null) throw new ArgumentNullException("contents"); if (contents.Length >= 1) return new BerOctetString(Arrays.Clone(contents)); return Empty; } public new static BerOctetString FromContentsOptional(byte[] contents) { if (contents == null) return null; if (contents.Length >= 1) return new BerOctetString(Arrays.Clone(contents)); return Empty; } public static BerOctetString FromSequence(Asn1Sequence seq) { return new BerOctetString(seq.MapElements(Asn1OctetString.GetInstance)); } internal new static BerOctetString WithContents(byte[] contents) { if (contents.Length >= 1) return new BerOctetString(contents); return Empty; } internal static byte[] FlattenOctetStrings(Asn1OctetString[] octetStrings) { int num = octetStrings.Length; switch (num) { case 0: return Asn1OctetString.EmptyOctets; case 1: return octetStrings[0].contents; default: { int num2 = 0; for (int i = 0; i < num; i++) { num2 += octetStrings[i].contents.Length; } byte[] array = new byte[num2]; int num3 = 0; for (int j = 0; j < num; j++) { byte[] contents = octetStrings[j].contents; Array.Copy(contents, 0, array, num3, contents.Length); num3 += contents.Length; } return array; } } } public BerOctetString(byte[] contents) : this(contents, null) { } public BerOctetString(Asn1OctetString[] elements) : this(FlattenOctetStrings(elements), elements) { } [Obsolete("Use version without segmentLimit (which is ignored anyway)")] public BerOctetString(byte[] contents, int segmentLimit) : this(contents) { } [Obsolete("Use version without segmentLimit (which is ignored anyway)")] public BerOctetString(Asn1OctetString[] elements, int segmentLimit) : this(elements) { } private BerOctetString(byte[] contents, Asn1OctetString[] elements) : base(contents) { this.elements = elements; } internal override IAsn1Encoding GetEncoding(int encoding) { if (1 != encoding) return base.GetEncoding(encoding); if (elements == null) return new PrimitiveEncoding(0, 4, contents); Asn1Encodable[] array = elements; return new ConstructedILEncoding(0, 4, 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, contents); Asn1Encodable[] array = elements; return new ConstructedILEncoding(tagClass, tagNo, Asn1OutputStream.GetContentsEncodings(encoding, array)); } } }