package org.bouncycastle.asn1; import java.io.ByteArrayOutputStream; import java.io.IOException; /** * Base class for an application specific object */ public class DERApplicationSpecific extends DERObject { private int tag; private byte[] octets; public DERApplicationSpecific( int tag, byte[] octets) { this.tag = tag; this.octets = octets; } public DERApplicationSpecific( int tag, DEREncodable object) throws IOException { this.tag = tag | DERTags.CONSTRUCTED; ByteArrayOutputStream baos = new ByteArrayOutputStream(); DEROutputStream dos = new DEROutputStream(baos); dos.writeObject(object); this.octets = baos.toByteArray(); } public boolean isConstructed() { return (tag & DERTags.CONSTRUCTED) != 0; } public byte[] getContents() { return octets; } public int getApplicationTag() { return tag & 0x1F; } public DERObject getObject() throws IOException { return new ASN1InputStream(getContents()).readObject(); } /* (non-Javadoc) * @see org.bouncycastle.asn1.DERObject#encode(org.bouncycastle.asn1.DEROutputStream) */ void encode(DEROutputStream out) throws IOException { out.writeEncoded(DERTags.APPLICATION | tag, octets); } public boolean equals( Object o) { if ((o == null) || !(o instanceof DERApplicationSpecific)) { return false; } DERApplicationSpecific other = (DERApplicationSpecific)o; if (tag != other.tag) { return false; } if (octets.length != other.octets.length) { return false; } for (int i = 0; i < octets.length; i++) { if (octets[i] != other.octets[i]) { return false; } } return true; } public int hashCode() { byte[] b = this.getContents(); int value = 0; for (int i = 0; i != b.length; i++) { value ^= (b[i] & 0xff) << (i % 4); } return value ^ this.getApplicationTag(); } }