1 package org.bouncycastle.asn1; 2 3 import java.io.ByteArrayOutputStream; 4 import java.io.IOException; 5 6 /** 7 * Base class for an application specific object 8 */ 9 public class DERApplicationSpecific 10 extends DERObject 11 { 12 private int tag; 13 private byte[] octets; 14 15 public DERApplicationSpecific( 16 int tag, 17 byte[] octets) 18 { 19 this.tag = tag; 20 this.octets = octets; 21 } 22 23 public DERApplicationSpecific( 24 int tag, 25 DEREncodable object) 26 throws IOException 27 { 28 this.tag = tag | DERTags.CONSTRUCTED; 29 30 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 31 DEROutputStream dos = new DEROutputStream(baos); 32 33 dos.writeObject(object); 34 35 this.octets = baos.toByteArray(); 36 } 37 38 public boolean isConstructed() 39 { 40 return (tag & DERTags.CONSTRUCTED) != 0; 41 } 42 43 public byte[] getContents() 44 { 45 return octets; 46 } 47 48 public int getApplicationTag() 49 { 50 return tag & 0x1F; 51 } 52 53 public DERObject getObject() 54 throws IOException 55 { 56 return new ASN1InputStream(getContents()).readObject(); 57 } 58 59 /* (non-Javadoc) 60 * @see org.bouncycastle.asn1.DERObject#encode(org.bouncycastle.asn1.DEROutputStream) 61 */ 62 void encode(DEROutputStream out) throws IOException 63 { 64 out.writeEncoded(DERTags.APPLICATION | tag, octets); 65 } 66 67 public boolean equals( 68 Object o) 69 { 70 if ((o == null) || !(o instanceof DERApplicationSpecific)) 71 { 72 return false; 73 } 74 75 DERApplicationSpecific other = (DERApplicationSpecific)o; 76 77 if (tag != other.tag) 78 { 79 return false; 80 } 81 82 if (octets.length != other.octets.length) 83 { 84 return false; 85 } 86 87 for (int i = 0; i < octets.length; i++) 88 { 89 if (octets[i] != other.octets[i]) 90 { 91 return false; 92 } 93 } 94 95 return true; 96 } 97 98 public int hashCode() 99 { 100 byte[] b = this.getContents(); 101 int value = 0; 102 103 for (int i = 0; i != b.length; i++) 104 { 105 value ^= (b[i] & 0xff) << (i % 4); 106 } 107 108 return value ^ this.getApplicationTag(); 109 } 110 } 111