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; } }