0N/A/*
2362N/A * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.security.provider.certpath;
0N/A
0N/Aimport java.io.IOException;
1652N/Aimport java.util.Collections;
1652N/Aimport java.util.List;
0N/Aimport sun.misc.HexDumpEncoder;
0N/Aimport sun.security.util.*;
0N/A
0N/A/**
0N/A * This class can be used to generate an OCSP request and send it over
0N/A * an outputstream. Currently we do not support signing requests
0N/A * The OCSP Request is specified in RFC 2560 and
0N/A * the ASN.1 definition is as follows:
0N/A * <pre>
0N/A *
0N/A * OCSPRequest ::= SEQUENCE {
0N/A * tbsRequest TBSRequest,
0N/A * optionalSignature [0] EXPLICIT Signature OPTIONAL }
0N/A *
0N/A * TBSRequest ::= SEQUENCE {
0N/A * version [0] EXPLICIT Version DEFAULT v1,
0N/A * requestorName [1] EXPLICIT GeneralName OPTIONAL,
0N/A * requestList SEQUENCE OF Request,
0N/A * requestExtensions [2] EXPLICIT Extensions OPTIONAL }
0N/A *
0N/A * Signature ::= SEQUENCE {
0N/A * signatureAlgorithm AlgorithmIdentifier,
0N/A * signature BIT STRING,
0N/A * certs [0] EXPLICIT SEQUENCE OF Certificate OPTIONAL
0N/A * }
0N/A *
0N/A * Version ::= INTEGER { v1(0) }
0N/A *
0N/A * Request ::= SEQUENCE {
0N/A * reqCert CertID,
0N/A * singleRequestExtensions [0] EXPLICIT Extensions OPTIONAL }
0N/A *
0N/A * CertID ::= SEQUENCE {
0N/A * hashAlgorithm AlgorithmIdentifier,
0N/A * issuerNameHash OCTET STRING, -- Hash of Issuer's DN
0N/A * issuerKeyHash OCTET STRING, -- Hash of Issuers public key
0N/A * serialNumber CertificateSerialNumber
0N/A * }
0N/A *
0N/A * </pre>
0N/A *
0N/A * @author Ram Marti
0N/A */
0N/A
0N/Aclass OCSPRequest {
0N/A
0N/A private static final Debug debug = Debug.getInstance("certpath");
5140N/A private static final boolean dump = debug.isOn("ocsp");
0N/A
1652N/A // List of request CertIds
1652N/A private final List<CertId> certIds;
0N/A
0N/A /*
0N/A * Constructs an OCSPRequest. This constructor is used
0N/A * to construct an unsigned OCSP Request for a single user cert.
0N/A */
1652N/A OCSPRequest(CertId certId) {
1652N/A this.certIds = Collections.singletonList(certId);
0N/A }
0N/A
1652N/A OCSPRequest(List<CertId> certIds) {
1652N/A this.certIds = certIds;
1652N/A }
1652N/A
0N/A byte[] encodeBytes() throws IOException {
0N/A
0N/A // encode tbsRequest
0N/A DerOutputStream tmp = new DerOutputStream();
1652N/A DerOutputStream requestsOut = new DerOutputStream();
1652N/A for (CertId certId : certIds) {
1652N/A DerOutputStream certIdOut = new DerOutputStream();
1652N/A certId.encode(certIdOut);
1652N/A requestsOut.write(DerValue.tag_Sequence, certIdOut);
0N/A }
0N/A
1652N/A tmp.write(DerValue.tag_Sequence, requestsOut);
0N/A // No extensions supported
0N/A DerOutputStream tbsRequest = new DerOutputStream();
0N/A tbsRequest.write(DerValue.tag_Sequence, tmp);
0N/A
0N/A // OCSPRequest without the signature
0N/A DerOutputStream ocspRequest = new DerOutputStream();
0N/A ocspRequest.write(DerValue.tag_Sequence, tbsRequest);
0N/A
0N/A byte[] bytes = ocspRequest.toByteArray();
0N/A
0N/A if (dump) {
0N/A HexDumpEncoder hexEnc = new HexDumpEncoder();
5140N/A debug.println("\nOCSPRequest bytes... ");
5140N/A debug.println(hexEnc.encode(bytes) + "\n");
0N/A }
0N/A
1652N/A return bytes;
0N/A }
0N/A
1652N/A List<CertId> getCertIds() {
1652N/A return certIds;
0N/A }
0N/A}