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}