154 lines
4.1 KiB
C#
154 lines
4.1 KiB
C#
using GostCryptography.Properties;
|
|
using System;
|
|
using System.Text;
|
|
|
|
namespace GostCryptography.Asn1.Ber
|
|
{
|
|
[Serializable]
|
|
public abstract class Asn1CharString : Asn1Type
|
|
{
|
|
[NonSerialized]
|
|
protected StringBuilder StringBuffer;
|
|
|
|
[NonSerialized]
|
|
private readonly short _typeCode;
|
|
|
|
[NonSerialized]
|
|
public string Value;
|
|
|
|
protected internal Asn1CharString(short typeCode)
|
|
{
|
|
Value = new StringBuilder().ToString();
|
|
_typeCode = typeCode;
|
|
}
|
|
|
|
protected internal Asn1CharString(string data, short typeCode)
|
|
{
|
|
Value = data;
|
|
_typeCode = typeCode;
|
|
}
|
|
|
|
public override int Length
|
|
{
|
|
get { return Value.Length; }
|
|
}
|
|
|
|
protected virtual void Decode(Asn1BerDecodeBuffer buffer, bool explicitTagging, int implicitLength, Asn1Tag tag)
|
|
{
|
|
int num2;
|
|
var elemLength = explicitTagging ? MatchTag(buffer, tag) : implicitLength;
|
|
var num3 = elemLength;
|
|
var num4 = 0;
|
|
|
|
if (StringBuffer == null)
|
|
{
|
|
StringBuffer = new StringBuilder();
|
|
}
|
|
|
|
var lastTag = buffer.LastTag;
|
|
|
|
if ((lastTag == null) || !lastTag.Constructed)
|
|
{
|
|
if (num3 < 0)
|
|
{
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1InvalidLengthException);
|
|
}
|
|
|
|
StringBuffer.Length = num3;
|
|
|
|
while (num3 > 0)
|
|
{
|
|
num2 = buffer.Read();
|
|
|
|
if (num2 == -1)
|
|
{
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1EndOfBufferException, buffer.ByteCount);
|
|
}
|
|
|
|
StringBuffer[num4++] = (char)num2;
|
|
num3--;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
var capacity = 0;
|
|
var context = new Asn1BerDecodeContext(buffer, elemLength);
|
|
|
|
while (!context.Expired())
|
|
{
|
|
var num5 = MatchTag(buffer, Asn1OctetString.Tag);
|
|
|
|
if (num5 <= 0)
|
|
{
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1InvalidFormatOfConstructedValue, buffer.ByteCount);
|
|
}
|
|
|
|
capacity += num5;
|
|
StringBuffer.EnsureCapacity(capacity);
|
|
|
|
while (num5 > 0)
|
|
{
|
|
num2 = buffer.Read();
|
|
|
|
if (num2 == -1)
|
|
{
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1EndOfBufferException, buffer.ByteCount);
|
|
}
|
|
|
|
StringBuffer.Append((char)num2);
|
|
num5--;
|
|
}
|
|
}
|
|
|
|
if (elemLength == Asn1Status.IndefiniteLength)
|
|
{
|
|
MatchTag(buffer, Asn1Tag.Eoc);
|
|
}
|
|
}
|
|
|
|
Value = StringBuffer.ToString();
|
|
buffer.TypeCode = (short)tag.IdCode;
|
|
}
|
|
|
|
protected virtual int Encode(Asn1BerEncodeBuffer buffer, bool explicitTagging, Asn1Tag tag)
|
|
{
|
|
var length = Value.Length;
|
|
buffer.Copy(Value);
|
|
|
|
if (explicitTagging)
|
|
{
|
|
length += buffer.EncodeTagAndLength(tag, length);
|
|
}
|
|
|
|
return length;
|
|
}
|
|
|
|
public override bool Equals(object value)
|
|
{
|
|
var str = value as Asn1CharString;
|
|
|
|
if (str == null)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return Equals(str.Value);
|
|
}
|
|
|
|
public bool Equals(string value)
|
|
{
|
|
return Value.Equals(value);
|
|
}
|
|
|
|
public override int GetHashCode()
|
|
{
|
|
return (Value != null) ? Value.GetHashCode() : base.GetHashCode();
|
|
}
|
|
|
|
public override string ToString()
|
|
{
|
|
return Value;
|
|
}
|
|
}
|
|
}
|