1b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootpackage org.bouncycastle.cert.ocsp;
2b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
3b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport java.io.ByteArrayInputStream;
4b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport java.io.IOException;
5b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport java.io.InputStream;
6b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
7b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ASN1Exception;
8b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ASN1InputStream;
9b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ASN1Primitive;
10b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ocsp.BasicOCSPResponse;
11b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ocsp.OCSPObjectIdentifiers;
12b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ocsp.OCSPResponse;
13b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.asn1.ocsp.ResponseBytes;
14b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootimport org.bouncycastle.cert.CertIOException;
15b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
16b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Rootpublic class OCSPResp
17b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root{
18b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int SUCCESSFUL = 0;  // Response has valid confirmations
19b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int MALFORMED_REQUEST = 1;  // Illegal confirmation request
20b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int INTERNAL_ERROR = 2;  // Internal error in issuer
21b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int TRY_LATER = 3;  // Try again later
22b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    // (4) is not used
23b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int SIG_REQUIRED = 5;  // Must sign the request
24b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public static final int UNAUTHORIZED = 6;  // Request unauthorized
25b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
26b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    private OCSPResponse    resp;
27b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
28b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public OCSPResp(
29b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        OCSPResponse    resp)
30b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
31b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        this.resp = resp;
32b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
33b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
34b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public OCSPResp(
35b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        byte[]          resp)
36b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        throws IOException
37b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
38b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        this(new ByteArrayInputStream(resp));
39b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
40b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
41b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public OCSPResp(
42b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        InputStream resp)
43b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        throws IOException
44b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
45b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        this(new ASN1InputStream(resp));
46b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
47b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
48b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    private OCSPResp(
49b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        ASN1InputStream aIn)
50b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        throws IOException
51b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
52b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        try
53b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
54b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            this.resp = OCSPResponse.getInstance(aIn.readObject());
55b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
56b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        catch (IllegalArgumentException e)
57b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
58b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            throw new CertIOException("malformed response: " + e.getMessage(), e);
59b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
60b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        catch (ClassCastException e)
61b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
62b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            throw new CertIOException("malformed response: " + e.getMessage(), e);
63b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
64b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        catch (ASN1Exception e)
65b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
66b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            throw new CertIOException("malformed response: " + e.getMessage(), e);
67b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
68b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
69b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        if (resp == null)
70b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
71b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            throw new CertIOException("malformed response: no response data found");
72b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
73b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
74b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
75b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public int getStatus()
76b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
77b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return this.resp.getResponseStatus().getValue().intValue();
78b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
79b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
80b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public Object getResponseObject()
81b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        throws OCSPException
82b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
83b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        ResponseBytes   rb = this.resp.getResponseBytes();
84b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
85b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        if (rb == null)
86b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
87b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            return null;
88b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
89b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
90b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        if (rb.getResponseType().equals(OCSPObjectIdentifiers.id_pkix_ocsp_basic))
91b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
92b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            try
93b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            {
94b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root                ASN1Primitive obj = ASN1Primitive.fromByteArray(rb.getResponse().getOctets());
95b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root                return new BasicOCSPResp(BasicOCSPResponse.getInstance(obj));
96b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            }
97b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            catch (Exception e)
98b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            {
99b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root                throw new OCSPException("problem decoding object: " + e, e);
100b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            }
101b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
102b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
103b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return rb.getResponse();
104b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
105b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
106b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    /**
107b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root     * return the ASN.1 encoded representation of this object.
108b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root     */
109b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public byte[] getEncoded()
110b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        throws IOException
111b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
112b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return resp.getEncoded();
113b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
114b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
115b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public boolean equals(Object o)
116b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
117b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        if (o == this)
118b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
119b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            return true;
120b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
121b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
122b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        if (!(o instanceof OCSPResp))
123b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        {
124b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root            return false;
125b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        }
126b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
127b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        OCSPResp r = (OCSPResp)o;
128b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
129b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return resp.equals(r.resp);
130b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
131b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
132b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public int hashCode()
133b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
134b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return resp.hashCode();
135b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
136b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root
137b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    public OCSPResponse toASN1Structure()
138b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    {
139b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root        return resp;
140b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root    }
141b50b4a37e3d49e05b024c189c026bef7ea290ca8Kenny Root}
142