116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1; 216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException; 416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 553b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro/** 653b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Base class for ASN.1 primitive objects. These are the actual objects used to generate byte encodings. 753b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro */ 816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic abstract class ASN1Primitive 916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro extends ASN1Object 1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{ 1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1Primitive() 1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro /** 1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * Create a base ASN.1 object from a byte stream. 1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * 1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @param data the byte stream to parse. 2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro * @return the base ASN.1 object represented by the byte stream. 21bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro * @exception IOException if there is a problem parsing the data, or parsing the stream did not exhaust the available data. 2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro */ 2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public static ASN1Primitive fromByteArray(byte[] data) 2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throws IOException 2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1InputStream aIn = new ASN1InputStream(data); 2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro try 2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 30bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro ASN1Primitive o = aIn.readObject(); 31bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 32bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro if (aIn.available() != 0) 33bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro { 34bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro throw new IOException("Extra data detected in stream"); 35bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro } 36bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro 37bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro return o; 3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro catch (ClassCastException e) 4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro throw new IOException("cannot recognise object in stream"); 4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public final boolean equals(Object o) 4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 4716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro if (this == o) 4816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return true; 5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return (o instanceof ASN1Encodable) && asn1Equals(((ASN1Encodable)o).toASN1Primitive()); 5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public ASN1Primitive toASN1Primitive() 5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return this; 5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 6053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro /** 6153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Return the current object as one which encodes using Distinguished Encoding Rules. 6253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * 6353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * @return a DER version of this. 6453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro */ 6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1Primitive toDERObject() 6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return this; 6816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 6916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 7053b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro /** 7153b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * Return the current object as one which encodes using Definite Length encoding. 7253b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * 7353b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro * @return a DL version of this. 7453b61f9fe9d58034fcc7021137e92460f91b70ceSergio Giro */ 7516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro ASN1Primitive toDLObject() 7616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro { 7716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro return this; 7816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro } 7916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro public abstract int hashCode(); 8116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro abstract boolean isConstructed(); 8316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro abstract int encodedLength() throws IOException; 8516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro abstract void encode(ASN1OutputStream out) throws IOException; 8716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro 8816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro abstract boolean asn1Equals(ASN1Primitive o); 8916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}