116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropackage org.bouncycastle.asn1;
216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.IOException;
416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport java.io.InputStream;
516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giroimport org.bouncycastle.util.io.Streams;
716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
84caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro/**
94caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro * A parser for indefinite-length OCTET STRINGs.
104caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro */
1116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giropublic class BEROctetStringParser
1216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    implements ASN1OctetStringParser
1316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro{
1416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    private ASN1StreamParser _parser;
1516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
1616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    BEROctetStringParser(
1716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        ASN1StreamParser parser)
1816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
1916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        _parser = parser;
2016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
2116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
224caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro    /**
234caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * Return an InputStream representing the contents of the OCTET STRING.
244caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     *
254caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * @return an InputStream with its source as the OCTET STRING content.
264caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     */
2716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public InputStream getOctetStream()
2816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
2916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new ConstructedOctetStream(_parser);
3016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
3116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
324caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro    /**
334caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * Return an in-memory, encodable, representation of the OCTET STRING.
344caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     *
354caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * @return a BEROctetString.
364caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * @throws IOException if there is an issue loading the data.
374caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     */
3816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive getLoadedObject()
3916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        throws IOException
4016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
4116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        return new BEROctetString(Streams.readAll(getOctetStream()));
4216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
4316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro
444caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro    /**
454caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * Return an BEROctetString representing this parser and its contents.
464caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     *
474caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     * @return an BEROctetString
484caba4cfca3316673ae4e330e8a47932bed8a53aSergio Giro     */
4916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    public ASN1Primitive toASN1Primitive()
5016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    {
5116f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        try
5216f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5316f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            return getLoadedObject();
5416f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5516f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        catch (IOException e)
5616f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        {
5716f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro            throw new ASN1ParsingException("IOException converting stream to byte array: " + e.getMessage(), e);
5816f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro        }
5916f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro    }
6016f9ee464b68937f45d009d9c1b0eb9b544a8deeSergio Giro}
61