123 lines
2.3 KiB
C#
123 lines
2.3 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.IO;
|
|
using Org.BouncyCastle.Utilities;
|
|
|
|
namespace Org.BouncyCastle.Asn1;
|
|
|
|
public class BerOctetString : DerOctetString, IEnumerable
|
|
{
|
|
private const int MaxLength = 1000;
|
|
|
|
private readonly IEnumerable octs;
|
|
|
|
public static BerOctetString FromSequence(Asn1Sequence seq)
|
|
{
|
|
IList list = Platform.CreateArrayList();
|
|
foreach (Asn1Encodable item in seq)
|
|
{
|
|
list.Add(item);
|
|
}
|
|
return new BerOctetString(list);
|
|
}
|
|
|
|
private static byte[] ToBytes(IEnumerable octs)
|
|
{
|
|
MemoryStream memoryStream = new MemoryStream();
|
|
foreach (DerOctetString oct in octs)
|
|
{
|
|
byte[] octets = oct.GetOctets();
|
|
memoryStream.Write(octets, 0, octets.Length);
|
|
}
|
|
return memoryStream.ToArray();
|
|
}
|
|
|
|
public BerOctetString(byte[] str)
|
|
: base(str)
|
|
{
|
|
}
|
|
|
|
public BerOctetString(IEnumerable octets)
|
|
: base(ToBytes(octets))
|
|
{
|
|
octs = octets;
|
|
}
|
|
|
|
public BerOctetString(Asn1Object obj)
|
|
: base(obj)
|
|
{
|
|
}
|
|
|
|
public BerOctetString(Asn1Encodable obj)
|
|
: base(obj.ToAsn1Object())
|
|
{
|
|
}
|
|
|
|
public override byte[] GetOctets()
|
|
{
|
|
return str;
|
|
}
|
|
|
|
public IEnumerator GetEnumerator()
|
|
{
|
|
if (octs == null)
|
|
{
|
|
return GenerateOcts().GetEnumerator();
|
|
}
|
|
return octs.GetEnumerator();
|
|
}
|
|
|
|
[Obsolete("Use GetEnumerator() instead")]
|
|
public IEnumerator GetObjects()
|
|
{
|
|
return GetEnumerator();
|
|
}
|
|
|
|
private IList GenerateOcts()
|
|
{
|
|
IList list = Platform.CreateArrayList();
|
|
for (int i = 0; i < str.Length; i += 1000)
|
|
{
|
|
int num = System.Math.Min(str.Length, i + 1000);
|
|
byte[] array = new byte[num - i];
|
|
Array.Copy(str, i, array, 0, array.Length);
|
|
list.Add(new DerOctetString(array));
|
|
}
|
|
return list;
|
|
}
|
|
|
|
internal override void Encode(DerOutputStream derOut)
|
|
{
|
|
if (derOut is Asn1OutputStream || derOut is BerOutputStream)
|
|
{
|
|
derOut.WriteByte(36);
|
|
derOut.WriteByte(128);
|
|
{
|
|
IEnumerator enumerator = GetEnumerator();
|
|
try
|
|
{
|
|
while (enumerator.MoveNext())
|
|
{
|
|
DerOctetString obj = (DerOctetString)enumerator.Current;
|
|
derOut.WriteObject(obj);
|
|
}
|
|
}
|
|
finally
|
|
{
|
|
IDisposable disposable = enumerator as IDisposable;
|
|
if (disposable != null)
|
|
{
|
|
disposable.Dispose();
|
|
}
|
|
}
|
|
}
|
|
derOut.WriteByte(0);
|
|
derOut.WriteByte(0);
|
|
}
|
|
else
|
|
{
|
|
base.Encode(derOut);
|
|
}
|
|
}
|
|
}
|