Files
hcs/Hcs.ClientNet/GostCryptography/Asn1/Ber/Asn1Utf8String.cs

99 lines
2.6 KiB
C#

using System;
using System.IO;
using System.Text;
namespace GostCryptography.Asn1.Ber
{
[Serializable]
public class Asn1Utf8String : Asn1CharString
{
public static readonly Asn1Tag Tag = new Asn1Tag(0, 0, Utf8StringTypeCode);
public Asn1Utf8String()
: base(Utf8StringTypeCode)
{
}
public Asn1Utf8String(string data)
: base(data, Utf8StringTypeCode)
{
}
private byte[] AllocByteArray(int nbytes)
{
return new byte[nbytes];
}
public override void Decode(Asn1BerDecodeBuffer buffer, bool explicitTagging, int implicitLength)
{
var num = explicitTagging ? MatchTag(buffer, Tag) : implicitLength;
var str = new Asn1OctetString();
str.Decode(buffer, false, num);
Value = Encoding.UTF8.GetString(str.Value, 0, str.Value.Length);
if (explicitTagging && (num == Asn1Status.IndefiniteLength))
{
MatchTag(buffer, Asn1Tag.Eoc);
}
}
public override int Encode(Asn1BerEncodeBuffer buffer, bool explicitTagging)
{
var len = 0;
try
{
var bytes = Encoding.UTF8.GetBytes(Value);
len = bytes.Length;
buffer.Copy(bytes);
}
catch (IOException exception)
{
Console.Out.WriteLine("This JVM does not support UTF-8 encoding");
Asn1Util.WriteStackTrace(exception, Console.Error);
}
if (explicitTagging)
{
len += buffer.EncodeTagAndLength(Tag, len);
}
return len;
}
public override void Encode(Asn1BerOutputStream outs, bool explicitTagging)
{
try
{
var bytes = Encoding.UTF8.GetBytes(Value);
if (explicitTagging)
{
outs.EncodeTag(Tag);
}
outs.EncodeLength(bytes.Length);
outs.Write(bytes);
}
catch (IOException exception)
{
Console.Out.WriteLine("This JVM does not support UTF-8 encoding");
Asn1Util.WriteStackTrace(exception, Console.Error);
}
}
private byte[] ReAllocByteArray(byte[] ba1, int nbytes)
{
var destinationArray = new byte[nbytes];
if (ba1 != null)
{
Array.Copy(ba1, 0, destinationArray, 0, ba1.Length);
}
return destinationArray;
}
}
}