package org.bouncycastle.asn1; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Base class for objects which can be written directly to ASN.1 output streams. */ public abstract class ASN1Encodable implements DEREncodable { public static final String DER = "DER"; public static final String BER = "BER"; /** * Return the default BER or DER encoding for this object. * * @return BER/DER byte encoded object. * @throws IOException on encoding error. */ public byte[] getEncoded() throws IOException { ByteArrayOutputStream bOut = new ByteArrayOutputStream(); ASN1OutputStream aOut = new ASN1OutputStream(bOut); aOut.writeObject(this); return bOut.toByteArray(); } /** * Return either the default for "BER" or a DER encoding if "DER" is specified. * * @param encoding name of encoding to use. * @return byte encoded object. * @throws IOException on encoding error. */ public byte[] getEncoded( String encoding) throws IOException { if (encoding.equals(DER)) { ByteArrayOutputStream bOut = new ByteArrayOutputStream(); DEROutputStream dOut = new DEROutputStream(bOut); dOut.writeObject(this); return bOut.toByteArray(); } return this.getEncoded(); } /** * Return the DER encoding of the object, null if the DER encoding can not be made. * * @return a DER byte array, null otherwise. */ public byte[] getDEREncoded() { try { return this.getEncoded(DER); } catch (IOException e) { return null; } } public int hashCode() { return this.toASN1Object().hashCode(); } public boolean equals( Object o) { if (this == o) { return true; } if (!(o instanceof DEREncodable)) { return false; } DEREncodable other = (DEREncodable)o; return this.toASN1Object().equals(other.getDERObject()); } public DERObject getDERObject() { return this.toASN1Object(); } public abstract DERObject toASN1Object(); }