package org.bouncycastle.asn1;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
Class representing the DER-type External
/**
* Class representing the DER-type External
*/
public class DERExternal
extends ASN1Object
{
private DERObjectIdentifier directReference;
private DERInteger indirectReference;
private ASN1Object dataValueDescriptor;
private int encoding;
private DERObject externalContent;
public DERExternal(ASN1EncodableVector vector)
{
int offset = 0;
DERObject enc = getObjFromVector(vector, offset);
if (enc instanceof DERObjectIdentifier)
{
directReference = (DERObjectIdentifier)enc;
offset++;
enc = getObjFromVector(vector, offset);
}
if (enc instanceof DERInteger)
{
indirectReference = (DERInteger) enc;
offset++;
enc = getObjFromVector(vector, offset);
}
if (!(enc instanceof DERTaggedObject))
{
dataValueDescriptor = (ASN1Object) enc;
offset++;
enc = getObjFromVector(vector, offset);
}
if (vector.size() != offset + 1)
{
throw new IllegalArgumentException("input vector too large");
}
if (!(enc instanceof DERTaggedObject))
{
throw new IllegalArgumentException("No tagged object found in vector. Structure doesn't seem to be of type External");
}
DERTaggedObject obj = (DERTaggedObject)enc;
setEncoding(obj.getTagNo());
externalContent = obj.getObject();
}
private DERObject getObjFromVector(ASN1EncodableVector v, int index)
{
if (v.size() <= index)
{
throw new IllegalArgumentException("too few objects in input vector");
}
return v.get(index).getDERObject();
}
Creates a new instance of DERExternal
See X.690 for more informations about the meaning of these parameters
Params: - directReference – The direct reference or
null
if not set. - indirectReference – The indirect reference or
null
if not set. - dataValueDescriptor – The data value descriptor or
null
if not set. - externalData – The external data in its encoded form.
/**
* Creates a new instance of DERExternal
* See X.690 for more informations about the meaning of these parameters
* @param directReference The direct reference or <code>null</code> if not set.
* @param indirectReference The indirect reference or <code>null</code> if not set.
* @param dataValueDescriptor The data value descriptor or <code>null</code> if not set.
* @param externalData The external data in its encoded form.
*/
public DERExternal(DERObjectIdentifier directReference, DERInteger indirectReference, ASN1Object dataValueDescriptor, DERTaggedObject externalData)
{
this(directReference, indirectReference, dataValueDescriptor, externalData.getTagNo(), externalData.getDERObject());
}
Creates a new instance of DERExternal.
See X.690 for more informations about the meaning of these parameters
Params: - directReference – The direct reference or
null
if not set. - indirectReference – The indirect reference or
null
if not set. - dataValueDescriptor – The data value descriptor or
null
if not set. - encoding – The encoding to be used for the external data
- externalData – The external data
/**
* Creates a new instance of DERExternal.
* See X.690 for more informations about the meaning of these parameters
* @param directReference The direct reference or <code>null</code> if not set.
* @param indirectReference The indirect reference or <code>null</code> if not set.
* @param dataValueDescriptor The data value descriptor or <code>null</code> if not set.
* @param encoding The encoding to be used for the external data
* @param externalData The external data
*/
public DERExternal(DERObjectIdentifier directReference, DERInteger indirectReference, ASN1Object dataValueDescriptor, int encoding, DERObject externalData)
{
setDirectReference(directReference);
setIndirectReference(indirectReference);
setDataValueDescriptor(dataValueDescriptor);
setEncoding(encoding);
setExternalContent(externalData.getDERObject());
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode()
{
int ret = 0;
if (directReference != null)
{
ret = directReference.hashCode();
}
if (indirectReference != null)
{
ret ^= indirectReference.hashCode();
}
if (dataValueDescriptor != null)
{
ret ^= dataValueDescriptor.hashCode();
}
ret ^= externalContent.hashCode();
return ret;
}
/* (non-Javadoc)
* @see org.bouncycastle.asn1.DERObject#encode(org.bouncycastle.asn1.DEROutputStream)
*/
void encode(DEROutputStream out)
throws IOException
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (directReference != null)
{
baos.write(directReference.getDEREncoded());
}
if (indirectReference != null)
{
baos.write(indirectReference.getDEREncoded());
}
if (dataValueDescriptor != null)
{
baos.write(dataValueDescriptor.getDEREncoded());
}
DERTaggedObject obj = new DERTaggedObject(encoding, externalContent);
baos.write(obj.getDEREncoded());
out.writeEncoded(DERTags.CONSTRUCTED, DERTags.EXTERNAL, baos.toByteArray());
}
/* (non-Javadoc)
* @see org.bouncycastle.asn1.ASN1Object#asn1Equals(org.bouncycastle.asn1.DERObject)
*/
boolean asn1Equals(DERObject o)
{
if (!(o instanceof DERExternal))
{
return false;
}
if (this == o)
{
return true;
}
DERExternal other = (DERExternal)o;
if (directReference != null)
{
if (other.directReference == null || !other.directReference.equals(directReference))
{
return false;
}
}
if (indirectReference != null)
{
if (other.indirectReference == null || !other.indirectReference.equals(indirectReference))
{
return false;
}
}
if (dataValueDescriptor != null)
{
if (other.dataValueDescriptor == null || !other.dataValueDescriptor.equals(dataValueDescriptor))
{
return false;
}
}
return externalContent.equals(other.externalContent);
}
Returns the data value descriptor
Returns: The descriptor
/**
* Returns the data value descriptor
* @return The descriptor
*/
public ASN1Object getDataValueDescriptor()
{
return dataValueDescriptor;
}
Returns the direct reference of the external element
Returns: The reference
/**
* Returns the direct reference of the external element
* @return The reference
*/
public DERObjectIdentifier getDirectReference()
{
return directReference;
}
Returns the encoding of the content. Valid values are
0
single-ASN1-type
1
OCTET STRING
2
BIT STRING
Returns: The encoding
/**
* Returns the encoding of the content. Valid values are
* <ul>
* <li><code>0</code> single-ASN1-type</li>
* <li><code>1</code> OCTET STRING</li>
* <li><code>2</code> BIT STRING</li>
* </ul>
* @return The encoding
*/
public int getEncoding()
{
return encoding;
}
Returns the content of this element
Returns: The content
/**
* Returns the content of this element
* @return The content
*/
public DERObject getExternalContent()
{
return externalContent;
}
Returns the indirect reference of this element
Returns: The reference
/**
* Returns the indirect reference of this element
* @return The reference
*/
public DERInteger getIndirectReference()
{
return indirectReference;
}
Sets the data value descriptor
Params: - dataValueDescriptor – The descriptor
/**
* Sets the data value descriptor
* @param dataValueDescriptor The descriptor
*/
private void setDataValueDescriptor(ASN1Object dataValueDescriptor)
{
this.dataValueDescriptor = dataValueDescriptor;
}
Sets the direct reference of the external element
Params: - directReferemce – The reference
/**
* Sets the direct reference of the external element
* @param directReferemce The reference
*/
private void setDirectReference(DERObjectIdentifier directReferemce)
{
this.directReference = directReferemce;
}
Sets the encoding of the content. Valid values are
0
single-ASN1-type
1
OCTET STRING
2
BIT STRING
Params: - encoding – The encoding
/**
* Sets the encoding of the content. Valid values are
* <ul>
* <li><code>0</code> single-ASN1-type</li>
* <li><code>1</code> OCTET STRING</li>
* <li><code>2</code> BIT STRING</li>
* </ul>
* @param encoding The encoding
*/
private void setEncoding(int encoding)
{
if (encoding < 0 || encoding > 2)
{
throw new IllegalArgumentException("invalid encoding value: " + encoding);
}
this.encoding = encoding;
}
Sets the content of this element
Params: - externalContent – The content
/**
* Sets the content of this element
* @param externalContent The content
*/
private void setExternalContent(DERObject externalContent)
{
this.externalContent = externalContent;
}
Sets the indirect reference of this element
Params: - indirectReference – The reference
/**
* Sets the indirect reference of this element
* @param indirectReference The reference
*/
private void setIndirectReference(DERInteger indirectReference)
{
this.indirectReference = indirectReference;
}
}