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

72 lines
1.8 KiB
C#

using GostCryptography.Properties;
using System;
namespace GostCryptography.Asn1.Ber
{
[Serializable]
public class Asn1RelativeOid : Asn1ObjectIdentifier
{
public new static readonly Asn1Tag Tag = new Asn1Tag(0, 0, RelativeOidTypeCode);
public Asn1RelativeOid()
{
}
public Asn1RelativeOid(OidValue oidValue)
: base(oidValue)
{
}
public override void Decode(Asn1BerDecodeBuffer buffer, bool explicitTagging, int implicitLength)
{
var len = explicitTagging ? MatchTag(buffer, Tag) : implicitLength;
OidValue = OidValue.FromArray(buffer.DecodeRelOidContents(len));
buffer.TypeCode = RelativeOidTypeCode;
}
public override int Encode(Asn1BerEncodeBuffer buffer, bool explicitTagging)
{
if (OidValue.Items.Length < 1)
{
throw ExceptionUtility.CryptographicException(Resources.Asn1InvalidObjectIdException);
}
var len = 0;
for (var i = OidValue.Items.Length - 1; i >= 0; i--)
{
len += buffer.EncodeIdentifier(OidValue.Items[i]);
}
if (explicitTagging)
{
len += buffer.EncodeTagAndLength(Tag, len);
}
return len;
}
public override void Encode(Asn1BerOutputStream outs, bool explicitTagging)
{
var len = 0;
foreach (var i in OidValue.Items)
{
len += Asn1RunTime.GetIdentBytesCount(i);
}
if (explicitTagging)
{
outs.EncodeTag(Tag);
}
outs.EncodeLength(len);
foreach (var i in OidValue.Items)
{
outs.EncodeIdentifier(i);
}
}
}
}