init commit
This commit is contained in:
@@ -0,0 +1,197 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user