198 lines
4.4 KiB
C#
198 lines
4.4 KiB
C#
using System;
|
|
using System.IO;
|
|
|
|
namespace Org.BouncyCastle.Asn1;
|
|
|
|
public class DerExternal : Asn1Object
|
|
{
|
|
private DerObjectIdentifier directReference;
|
|
|
|
private DerInteger indirectReference;
|
|
|
|
private Asn1Object dataValueDescriptor;
|
|
|
|
private int encoding;
|
|
|
|
private Asn1Object externalContent;
|
|
|
|
public Asn1Object DataValueDescriptor
|
|
{
|
|
get
|
|
{
|
|
return dataValueDescriptor;
|
|
}
|
|
set
|
|
{
|
|
dataValueDescriptor = value;
|
|
}
|
|
}
|
|
|
|
public DerObjectIdentifier DirectReference
|
|
{
|
|
get
|
|
{
|
|
return directReference;
|
|
}
|
|
set
|
|
{
|
|
directReference = value;
|
|
}
|
|
}
|
|
|
|
public int Encoding
|
|
{
|
|
get
|
|
{
|
|
return encoding;
|
|
}
|
|
set
|
|
{
|
|
if (encoding < 0 || encoding > 2)
|
|
{
|
|
throw new InvalidOperationException("invalid encoding value: " + encoding);
|
|
}
|
|
encoding = value;
|
|
}
|
|
}
|
|
|
|
public Asn1Object ExternalContent
|
|
{
|
|
get
|
|
{
|
|
return externalContent;
|
|
}
|
|
set
|
|
{
|
|
externalContent = value;
|
|
}
|
|
}
|
|
|
|
public DerInteger IndirectReference
|
|
{
|
|
get
|
|
{
|
|
return indirectReference;
|
|
}
|
|
set
|
|
{
|
|
indirectReference = value;
|
|
}
|
|
}
|
|
|
|
public DerExternal(Asn1EncodableVector vector)
|
|
{
|
|
int num = 0;
|
|
Asn1Object objFromVector = GetObjFromVector(vector, num);
|
|
if (objFromVector is DerObjectIdentifier)
|
|
{
|
|
directReference = (DerObjectIdentifier)objFromVector;
|
|
num++;
|
|
objFromVector = GetObjFromVector(vector, num);
|
|
}
|
|
if (objFromVector is DerInteger)
|
|
{
|
|
indirectReference = (DerInteger)objFromVector;
|
|
num++;
|
|
objFromVector = GetObjFromVector(vector, num);
|
|
}
|
|
if (!(objFromVector is Asn1TaggedObject))
|
|
{
|
|
dataValueDescriptor = objFromVector;
|
|
num++;
|
|
objFromVector = GetObjFromVector(vector, num);
|
|
}
|
|
if (vector.Count != num + 1)
|
|
{
|
|
throw new ArgumentException("input vector too large", "vector");
|
|
}
|
|
if (!(objFromVector is Asn1TaggedObject))
|
|
{
|
|
throw new ArgumentException("No tagged object found in vector. Structure doesn't seem to be of type External", "vector");
|
|
}
|
|
Asn1TaggedObject asn1TaggedObject = (Asn1TaggedObject)objFromVector;
|
|
Encoding = asn1TaggedObject.TagNo;
|
|
if (encoding < 0 || encoding > 2)
|
|
{
|
|
throw new InvalidOperationException("invalid encoding value");
|
|
}
|
|
externalContent = asn1TaggedObject.GetObject();
|
|
}
|
|
|
|
public DerExternal(DerObjectIdentifier directReference, DerInteger indirectReference, Asn1Object dataValueDescriptor, DerTaggedObject externalData)
|
|
: this(directReference, indirectReference, dataValueDescriptor, externalData.TagNo, externalData.ToAsn1Object())
|
|
{
|
|
}
|
|
|
|
public DerExternal(DerObjectIdentifier directReference, DerInteger indirectReference, Asn1Object dataValueDescriptor, int encoding, Asn1Object externalData)
|
|
{
|
|
DirectReference = directReference;
|
|
IndirectReference = indirectReference;
|
|
DataValueDescriptor = dataValueDescriptor;
|
|
Encoding = encoding;
|
|
ExternalContent = externalData.ToAsn1Object();
|
|
}
|
|
|
|
internal override void Encode(DerOutputStream derOut)
|
|
{
|
|
MemoryStream memoryStream = new MemoryStream();
|
|
WriteEncodable(memoryStream, directReference);
|
|
WriteEncodable(memoryStream, indirectReference);
|
|
WriteEncodable(memoryStream, dataValueDescriptor);
|
|
WriteEncodable(memoryStream, new DerTaggedObject(8, externalContent));
|
|
derOut.WriteEncoded(32, 8, memoryStream.ToArray());
|
|
}
|
|
|
|
protected override int Asn1GetHashCode()
|
|
{
|
|
int num = externalContent.GetHashCode();
|
|
if (directReference != null)
|
|
{
|
|
num ^= directReference.GetHashCode();
|
|
}
|
|
if (indirectReference != null)
|
|
{
|
|
num ^= indirectReference.GetHashCode();
|
|
}
|
|
if (dataValueDescriptor != null)
|
|
{
|
|
num ^= dataValueDescriptor.GetHashCode();
|
|
}
|
|
return num;
|
|
}
|
|
|
|
protected override bool Asn1Equals(Asn1Object asn1Object)
|
|
{
|
|
if (this == asn1Object)
|
|
{
|
|
return true;
|
|
}
|
|
if (!(asn1Object is DerExternal derExternal))
|
|
{
|
|
return false;
|
|
}
|
|
if (object.Equals(directReference, derExternal.directReference) && object.Equals(indirectReference, derExternal.indirectReference) && object.Equals(dataValueDescriptor, derExternal.dataValueDescriptor))
|
|
{
|
|
return externalContent.Equals(derExternal.externalContent);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private static Asn1Object GetObjFromVector(Asn1EncodableVector v, int index)
|
|
{
|
|
if (v.Count <= index)
|
|
{
|
|
throw new ArgumentException("too few objects in input vector", "v");
|
|
}
|
|
return v[index].ToAsn1Object();
|
|
}
|
|
|
|
private static void WriteEncodable(MemoryStream ms, Asn1Encodable e)
|
|
{
|
|
if (e != null)
|
|
{
|
|
byte[] derEncoded = e.GetDerEncoded();
|
|
ms.Write(derEncoded, 0, derEncoded.Length);
|
|
}
|
|
}
|
|
}
|