1c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompackage org.bouncycastle.asn1;
2c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
3c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstromimport java.io.IOException;
4c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
5c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrompublic class BERTaggedObjectParser
6c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    implements ASN1TaggedObjectParser
7c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom{
86e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private boolean _constructed;
9c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    private int _tagNumber;
106e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    private ASN1StreamParser _parser;
11c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
126e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    BERTaggedObjectParser(
136e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        boolean             constructed,
146e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        int                 tagNumber,
156e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        ASN1StreamParser    parser)
166e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom    {
176e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        _constructed = constructed;
18c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        _tagNumber = tagNumber;
196e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        _parser = parser;
20c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
21c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
22c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public boolean isConstructed()
23c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
246e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return _constructed;
25c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
26c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
27c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    public int getTagNo()
28c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
29c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        return _tagNumber;
30c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
316e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Encodable getObjectParser(
33c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        int     tag,
34c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        boolean isExplicit)
35c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        throws IOException
36c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
37c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        if (isExplicit)
38c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
396e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            if (!_constructed)
406e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            {
416e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom                throw new IOException("Explicit tags must be constructed (see X.690 8.14.2)");
426e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            }
436e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return _parser.readObject();
44c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
45c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
466e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return _parser.readImplicit(_constructed, tag);
47c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
48c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive getLoadedObject()
506e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        throws IOException
51c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
526e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom        return _parser.readTaggedObject(_constructed, _tagNumber);
53c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
54c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public ASN1Primitive toASN1Primitive()
56c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    {
57c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        try
58c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
596e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            return this.getLoadedObject();
60c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
61c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        catch (IOException e)
62c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        {
636e736056d64d0e33b26cf9f7c4e351b496241fdeBrian Carlstrom            throw new ASN1ParsingException(e.getMessage());
64c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom        }
65c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom    }
66c37f4a04ef89e73a39a59f3c5a179af8c8ab5974Brian Carlstrom}
67