116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
5bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro/**
6bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro * Parser DER EXTERNAL tagged objects.
7bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro */
816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class DERExternalParser
916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    implements ASN1Encodable, InMemoryRepresentable
1016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private ASN1StreamParser _parser;
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    /**
14bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * Base constructor.
15bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     *
16bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * @param parser the underlying parser to read the DER EXTERNAL from.
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro     */
1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public DERExternalParser(ASN1StreamParser parser)
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        this._parser = parser;
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
2216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
2316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Encodable readObject()
2416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws IOException
2516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
2616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return _parser.readObject();
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
29bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    /**
30bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * Return an in-memory, encodable, representation of the EXTERNAL object.
31bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     *
32bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * @return a DERExternal.
33bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * @throws IOException if there is an issue loading the data.
34bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     */
3516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive getLoadedObject()
3616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws IOException
3716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return new DERExternal(_parser.readVector());
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IllegalArgumentException e)
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
4416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new ASN1Exception(e.getMessage(), e);
4516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
4616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
47bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro
48bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro    /**
49bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * Return an DERExternal representing this parser and its contents.
50bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     *
51bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     * @return an DERExternal
52bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro     */
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive toASN1Primitive()
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
55bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        try
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return getLoadedObject();
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
59bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        catch (IOException ioe)
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
6116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new ASN1ParsingException("unable to get DER object", ioe);
6216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
63bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro        catch (IllegalArgumentException ioe)
6416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
6516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new ASN1ParsingException("unable to get DER object", ioe);
6616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
6716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
68bdb7b3d37025690a0434040b4e0d0623d9fa74afSergio Giro}