73 lines
2.0 KiB
C#
73 lines
2.0 KiB
C#
using GostCryptography.Asn1.Ber;
|
|
using GostCryptography.Properties;
|
|
|
|
namespace GostCryptography.Asn1.Gost
|
|
{
|
|
public abstract class GostAsn1Choice : Asn1Choice
|
|
{
|
|
private const byte Null = 1;
|
|
private const byte Params = 2;
|
|
|
|
protected abstract short TagForm { get; }
|
|
protected abstract int TagIdCode { get; }
|
|
protected abstract Asn1Type CreateParams();
|
|
|
|
public override string ElemName
|
|
{
|
|
get
|
|
{
|
|
switch (ChoiceId)
|
|
{
|
|
case Null:
|
|
return "null_";
|
|
case Params:
|
|
return "params_";
|
|
}
|
|
|
|
return "UNDEFINED";
|
|
}
|
|
}
|
|
|
|
public override void Decode(Asn1BerDecodeBuffer buffer, bool explicitTagging, int implicitLength)
|
|
{
|
|
var tag = new Asn1Tag();
|
|
buffer.Mark();
|
|
|
|
var num = buffer.DecodeTagAndLength(tag);
|
|
|
|
if (tag.Equals(0, 0, NullTypeCode))
|
|
{
|
|
buffer.Reset();
|
|
|
|
SetElement(Null, new NullParams());
|
|
Element.Decode(buffer, true, num);
|
|
}
|
|
else
|
|
{
|
|
if (!tag.Equals(0, TagForm, TagIdCode))
|
|
{
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1InvalidChoiceOptionTagException, tag, buffer.ByteCount);
|
|
}
|
|
|
|
buffer.Reset();
|
|
|
|
SetElement(Params, CreateParams());
|
|
Element.Decode(buffer, true, num);
|
|
}
|
|
}
|
|
|
|
public override int Encode(Asn1BerEncodeBuffer buffer, bool explicitTagging)
|
|
{
|
|
switch (ChoiceId)
|
|
{
|
|
case Null:
|
|
return GetElement().Encode(buffer, true);
|
|
case Params:
|
|
return GetElement().Encode(buffer, true);
|
|
}
|
|
|
|
throw ExceptionUtility.CryptographicException(Resources.Asn1InvalidChoiceOptionException);
|
|
}
|
|
}
|
|
}
|