1 package org.bouncycastle.asn1; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 6 import org.bouncycastle.util.Encodable; 7 8 /** 9 * Base class for defining an ASN.1 object. 10 */ 11 public abstract class ASN1Object 12 implements ASN1Encodable, Encodable 13 { 14 /** 15 * Return the default BER or DER encoding for this object. 16 * 17 * @return BER/DER byte encoded object. 18 * @throws java.io.IOException on encoding error. 19 */ getEncoded()20 public byte[] getEncoded() 21 throws IOException 22 { 23 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 24 ASN1OutputStream aOut = new ASN1OutputStream(bOut); 25 26 aOut.writeObject(this); 27 28 return bOut.toByteArray(); 29 } 30 31 /** 32 * Return either the default for "BER" or a DER encoding if "DER" is specified. 33 * 34 * @param encoding name of encoding to use. 35 * @return byte encoded object. 36 * @throws IOException on encoding error. 37 */ getEncoded( String encoding)38 public byte[] getEncoded( 39 String encoding) 40 throws IOException 41 { 42 if (encoding.equals(ASN1Encoding.DER)) 43 { 44 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 45 DEROutputStream dOut = new DEROutputStream(bOut); 46 47 dOut.writeObject(this); 48 49 return bOut.toByteArray(); 50 } 51 else if (encoding.equals(ASN1Encoding.DL)) 52 { 53 ByteArrayOutputStream bOut = new ByteArrayOutputStream(); 54 DLOutputStream dOut = new DLOutputStream(bOut); 55 56 dOut.writeObject(this); 57 58 return bOut.toByteArray(); 59 } 60 61 return this.getEncoded(); 62 } 63 hashCode()64 public int hashCode() 65 { 66 return this.toASN1Primitive().hashCode(); 67 } 68 equals( Object o)69 public boolean equals( 70 Object o) 71 { 72 if (this == o) 73 { 74 return true; 75 } 76 77 if (!(o instanceof ASN1Encodable)) 78 { 79 return false; 80 } 81 82 ASN1Encodable other = (ASN1Encodable)o; 83 84 return this.toASN1Primitive().equals(other.toASN1Primitive()); 85 } 86 87 /** 88 * @deprecated use toASN1Primitive() 89 * @return the underlying primitive type. 90 */ toASN1Object()91 public ASN1Primitive toASN1Object() 92 { 93 return this.toASN1Primitive(); 94 } 95 96 /** 97 * Return true if obj is a byte array and represents an object with the given tag value. 98 * 99 * @param obj object of interest. 100 * @param tagValue tag value to check for. 101 * @return true if obj is a byte encoding starting with the given tag value, false otherwise. 102 */ hasEncodedTagValue(Object obj, int tagValue)103 protected static boolean hasEncodedTagValue(Object obj, int tagValue) 104 { 105 return (obj instanceof byte[]) && ((byte[])obj)[0] == tagValue; 106 } 107 108 /** 109 * Method providing a primitive representation of this object suitable for encoding. 110 * @return a primitive representation of this object. 111 */ toASN1Primitive()112 public abstract ASN1Primitive toASN1Primitive(); 113 } 114