init commit
This commit is contained in:
@@ -0,0 +1,122 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user