test/jdk/javax/net/ssl/Stapling/StapleEnableProps.java
author jnimeh
Thu, 24 May 2018 12:32:00 -0700
branchJDK-8145252-TLS13-branch
changeset 56606 0cabcf9cb31b
parent 56542 56aaa6cb3693
child 56636 ef5c16991f27
permissions -rw-r--r--
TLS 1.3 support in OCSP stapling jtreg tests Summary: Adds test cases for OCSP stapling using the TLS 1.3 handshake
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     1
/*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     2
 * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     4
 *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     7
 * published by the Free Software Foundation.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     8
 *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    13
 * accompanied this code).
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    14
 *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    18
 *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    21
 * questions.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    22
 */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    23
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    24
// SunJSSE does not support dynamic system properties, no way to re-use
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    25
// system properties in samevm/agentvm mode.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    26
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    27
/*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    28
 * @test
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
    29
 * @bug 8145854 8153829
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    30
 * @summary SSLContextImpl.statusResponseManager should be generated if required
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    31
 * @library ../../../../java/security/testlibrary
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    32
 * @build CertificateBuilder SimpleOCSPServer
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    33
 * @run main/othervm StapleEnableProps
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    34
 */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    35
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    36
import javax.net.ssl.*;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    37
import javax.net.ssl.SSLEngineResult.*;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    38
import java.io.*;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    39
import java.math.BigInteger;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    40
import java.security.*;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    41
import java.nio.*;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    42
import java.security.cert.X509Certificate;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    43
import java.util.ArrayList;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    44
import java.util.Collections;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    45
import java.util.Date;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    46
import java.util.HashMap;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    47
import java.util.List;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    48
import java.util.Map;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    49
import java.util.Objects;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    50
import java.util.concurrent.TimeUnit;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    51
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    52
import sun.security.testlibrary.SimpleOCSPServer;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    53
import sun.security.testlibrary.CertificateBuilder;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    54
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    55
public class StapleEnableProps {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    56
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    57
    /*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    58
     * Enables logging of the SSLEngine operations.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    59
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    60
    private static final boolean logging = true;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    61
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    62
    /*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    63
     * Enables the JSSE system debugging system property:
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    64
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    65
     *     -Djavax.net.debug=all
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    66
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    67
     * This gives a lot of low-level information about operations underway,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    68
     * including specific handshake messages, and might be best examined
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    69
     * after gaining some familiarity with this application.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    70
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    71
    private static final boolean debug = false;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    72
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    73
    // These two ByteBuffer references will be used to hang onto ClientHello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    74
    // messages with and without the status_request[_v2] extensions.  These
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    75
    // will be used in the server-side stapling tests.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    76
    private static ByteBuffer cHelloStaple;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    77
    private static ByteBuffer cHelloNoStaple;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    78
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    79
    // The following items are used to set up the keystores.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    80
    private static final String passwd = "passphrase";
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    81
    private static final String ROOT_ALIAS = "root";
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    82
    private static final String INT_ALIAS = "intermediate";
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    83
    private static final String SSL_ALIAS = "ssl";
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    84
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    85
    // PKI components we will need for this test
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    86
    private static KeyManagerFactory kmf;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    87
    private static TrustManagerFactory tmf;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    88
    private static KeyStore rootKeystore;       // Root CA Keystore
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    89
    private static KeyStore intKeystore;        // Intermediate CA Keystore
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    90
    private static KeyStore serverKeystore;     // SSL Server Keystore
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    91
    private static KeyStore trustStore;         // SSL Client trust store
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    92
    private static SimpleOCSPServer rootOcsp;   // Root CA OCSP Responder
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    93
    private static int rootOcspPort;            // Port for root OCSP
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    94
    private static SimpleOCSPServer intOcsp;    // Intermediate CA OCSP server
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    95
    private static int intOcspPort;             // Port for intermediate OCSP
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    96
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    97
    // A few helpful TLS definitions to make it easier
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    98
    private static final int HELLO_EXT_STATUS_REQ = 5;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
    99
    private static final int HELLO_EXT_STATUS_REQ_V2 = 17;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   100
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   101
    /*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   102
     * Main entry point for this test.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   103
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   104
    public static void main(String args[]) throws Exception {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   105
        if (debug) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   106
            System.setProperty("javax.net.debug", "ssl");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   107
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   108
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   109
        // Create the PKI we will use for the test and start the OCSP servers
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   110
        createPKI();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   111
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   112
        // Set up the KeyManagerFactory and TrustManagerFactory
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   113
        kmf = KeyManagerFactory.getInstance("PKIX");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   114
        kmf.init(serverKeystore, passwd.toCharArray());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   115
        tmf = TrustManagerFactory.getInstance("PKIX");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   116
        tmf.init(trustStore);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   117
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   118
        // Run the client and server property tests
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   119
        testClientProp();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   120
        testServerProp();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   121
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   122
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   123
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   124
    private static void testClientProp() throws Exception {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   125
        SSLEngineResult clientResult;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   126
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   127
        // Test with the client-side enable property set to true
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   128
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   129
        System.out.println("Client Test 1: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   130
                "jdk.tls.client.enableStatusRequestExtension = true");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   131
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   133
        System.setProperty("jdk.tls.client.enableStatusRequestExtension",
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   134
                "true");
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47216
diff changeset
   135
        SSLContext ctxStaple = SSLContext.getInstance("TLSv1.2");
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   136
        ctxStaple.init(null, tmf.getTrustManagers(), null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   137
        SSLEngine engine = ctxStaple.createSSLEngine();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   138
        engine.setUseClientMode(true);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   139
        SSLSession session = engine.getSession();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   140
        ByteBuffer clientOut = ByteBuffer.wrap("I'm a Client".getBytes());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   141
        ByteBuffer cTOs =
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   142
                ByteBuffer.allocateDirect(session.getPacketBufferSize());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   143
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   144
        // Create and check the ClientHello message
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   145
        clientResult = engine.wrap(clientOut, cTOs);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   146
        log("client wrap: ", clientResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   147
        if (clientResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   148
            throw new SSLException("Client wrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   149
                    clientResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   150
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   151
        cTOs.flip();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   152
        System.out.println(dumpHexBytes(cTOs));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   153
        checkClientHello(cTOs, true, true);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   154
        cHelloStaple = cTOs;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   155
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   156
        // Test with the property set to false
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   157
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   158
        System.out.println("Client Test 2: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   159
                "jdk.tls.client.enableStatusRequestExtension = false");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   160
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   161
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   162
        System.setProperty("jdk.tls.client.enableStatusRequestExtension",
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   163
                "false");
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47216
diff changeset
   164
        SSLContext ctxNoStaple = SSLContext.getInstance("TLSv1.2");
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   165
        ctxNoStaple.init(null, tmf.getTrustManagers(), null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   166
        engine = ctxNoStaple.createSSLEngine();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   167
        engine.setUseClientMode(true);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   168
        session = engine.getSession();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   169
        cTOs = ByteBuffer.allocateDirect(session.getPacketBufferSize());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   170
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   171
        // Create and check the ClientHello message
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   172
        clientResult = engine.wrap(clientOut, cTOs);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   173
        log("client wrap: ", clientResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   174
        if (clientResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   175
            throw new SSLException("Client wrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   176
                    clientResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   177
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   178
        cTOs.flip();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   179
        System.out.println(dumpHexBytes(cTOs));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   180
        checkClientHello(cTOs, false, false);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   181
        cHelloNoStaple = cTOs;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   182
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   183
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   184
    private static void testServerProp() throws Exception {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   185
        SSLEngineResult serverResult;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   186
        HandshakeStatus hsStat;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   187
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   188
        // Test with the server-side enable property set to true
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   189
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   190
        System.out.println("Server Test 1: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   191
                "jdk.tls.server.enableStatusRequestExtension = true");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   192
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   193
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   194
        System.setProperty("jdk.tls.server.enableStatusRequestExtension",
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   195
                "true");
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47216
diff changeset
   196
        SSLContext ctxStaple = SSLContext.getInstance("TLSv1.2");
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   197
        ctxStaple.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   198
        SSLEngine engine = ctxStaple.createSSLEngine();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   199
        engine.setUseClientMode(false);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   200
        SSLSession session = engine.getSession();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   201
        ByteBuffer serverOut = ByteBuffer.wrap("I'm a Server".getBytes());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   202
        ByteBuffer serverIn =
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   203
                ByteBuffer.allocate(session.getApplicationBufferSize() + 50);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   204
        ByteBuffer sTOc =
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   205
                ByteBuffer.allocateDirect(session.getPacketBufferSize());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   206
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   207
        // Consume the client hello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   208
        serverResult = engine.unwrap(cHelloStaple, serverIn);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   209
        log("server unwrap: ", serverResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   210
        if (serverResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   211
            throw new SSLException("Server unwrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   212
                    serverResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   213
        } else if (serverResult.getHandshakeStatus() !=
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   214
                SSLEngineResult.HandshakeStatus.NEED_TASK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   215
             throw new SSLException("Server unwrap expected NEED_TASK, got: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   216
                    serverResult.getHandshakeStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   217
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   218
        runDelegatedTasks(serverResult, engine);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   219
        if (engine.getHandshakeStatus() !=
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   220
                SSLEngineResult.HandshakeStatus.NEED_WRAP) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   221
            throw new SSLException("Expected NEED_WRAP, got: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   222
                    engine.getHandshakeStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   223
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   224
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   225
        // Generate a TLS record with the ServerHello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   226
        serverResult = engine.wrap(serverOut, sTOc);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   227
        log("client wrap: ", serverResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   228
        if (serverResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   229
            throw new SSLException("Client wrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   230
                    serverResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   231
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   232
        sTOc.flip();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   233
        System.out.println(dumpHexBytes(sTOc));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   234
        checkServerHello(sTOc, false, true);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   235
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   236
        // Flip the client hello so we can reuse it in the next test.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   237
        cHelloStaple.flip();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   238
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   239
        // Test with the server-side enable property set to false
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   240
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   241
        System.out.println("Server Test 2: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   242
                "jdk.tls.server.enableStatusRequestExtension = false");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   243
        System.out.println("=========================================");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   244
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   245
        System.setProperty("jdk.tls.server.enableStatusRequestExtension",
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   246
                "false");
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47216
diff changeset
   247
        SSLContext ctxNoStaple = SSLContext.getInstance("TLSv1.2");
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   248
        ctxNoStaple.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   249
        engine = ctxNoStaple.createSSLEngine();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   250
        engine.setUseClientMode(false);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   251
        session = engine.getSession();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   252
        serverIn = ByteBuffer.allocate(session.getApplicationBufferSize() + 50);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   253
        sTOc = ByteBuffer.allocateDirect(session.getPacketBufferSize());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   254
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   255
        // Consume the client hello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   256
        serverResult = engine.unwrap(cHelloStaple, serverIn);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   257
        log("server unwrap: ", serverResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   258
        if (serverResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   259
            throw new SSLException("Server unwrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   260
                    serverResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   261
        } else if (serverResult.getHandshakeStatus() !=
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   262
                SSLEngineResult.HandshakeStatus.NEED_TASK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   263
             throw new SSLException("Server unwrap expected NEED_TASK, got: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   264
                    serverResult.getHandshakeStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   265
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   266
        runDelegatedTasks(serverResult, engine);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   267
        if (engine.getHandshakeStatus() !=
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   268
                SSLEngineResult.HandshakeStatus.NEED_WRAP) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   269
            throw new SSLException("Expected NEED_WRAP, got: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   270
                    engine.getHandshakeStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   271
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   272
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   273
        // Generate a TLS record with the ServerHello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   274
        serverResult = engine.wrap(serverOut, sTOc);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   275
        log("client wrap: ", serverResult);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   276
        if (serverResult.getStatus() != SSLEngineResult.Status.OK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   277
            throw new SSLException("Client wrap got status: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   278
                    serverResult.getStatus());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   279
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   280
        sTOc.flip();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   281
        System.out.println(dumpHexBytes(sTOc));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   282
        checkServerHello(sTOc, false, false);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   283
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   284
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   285
    /*
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   286
     * If the result indicates that we have outstanding tasks to do,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   287
     * go ahead and run them in this thread.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   288
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   289
    private static void runDelegatedTasks(SSLEngineResult result,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   290
            SSLEngine engine) throws Exception {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   291
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   292
        if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   293
            Runnable runnable;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   294
            while ((runnable = engine.getDelegatedTask()) != null) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   295
                log("\trunning delegated task...");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   296
                runnable.run();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   297
            }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   298
            HandshakeStatus hsStatus = engine.getHandshakeStatus();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   299
            if (hsStatus == HandshakeStatus.NEED_TASK) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   300
                throw new Exception(
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   301
                    "handshake shouldn't need additional tasks");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   302
            }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   303
            log("\tnew HandshakeStatus: " + hsStatus);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   304
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   305
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   306
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   307
    private static void log(String str, SSLEngineResult result) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   308
        if (!logging) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   309
            return;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   310
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   311
        HandshakeStatus hsStatus = result.getHandshakeStatus();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   312
        log(str +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   313
            result.getStatus() + "/" + hsStatus + ", " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   314
            result.bytesConsumed() + "/" + result.bytesProduced() +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   315
            " bytes");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   316
        if (hsStatus == HandshakeStatus.FINISHED) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   317
            log("\t...ready for application data");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   318
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   319
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   320
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   321
    private static void log(String str) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   322
        if (logging) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   323
            System.out.println(str);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   324
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   325
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   326
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   327
    /**
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   328
     * Dump a ByteBuffer as a hexdump to stdout.  The dumping routine will
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   329
     * start at the current position of the buffer and run to its limit.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   330
     * After completing the dump, the position will be returned to its
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   331
     * starting point.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   332
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   333
     * @param data the ByteBuffer to dump to stdout.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   334
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   335
     * @return the hexdump of the byte array.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   336
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   337
    private static String dumpHexBytes(ByteBuffer data) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   338
        StringBuilder sb = new StringBuilder();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   339
        if (data != null) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   340
            int i = 0;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   341
            data.mark();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   342
            while (data.hasRemaining()) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   343
                if (i % 16 == 0 && i != 0) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   344
                    sb.append("\n");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   345
                }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   346
                sb.append(String.format("%02X ", data.get()));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   347
                i++;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   348
            }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   349
            data.reset();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   350
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   351
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   352
        return sb.toString();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   353
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   354
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   355
    /**
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   356
     * Tests the ClientHello for the presence (or not) of the status_request
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   357
     * and status_request_v2 hello extensions.  It is assumed that the provided
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   358
     * ByteBuffer has its position set at the first byte of the TLS record
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   359
     * containing the ClientHello and contains the entire hello message.  Upon
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   360
     * successful completion of this method the ByteBuffer will have its
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   361
     * position reset to the initial offset in the buffer.  If an exception is
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   362
     * thrown the position at the time of the exception will be preserved.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   363
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   364
     * @param data the ByteBuffer containing the ClientHello bytes
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   365
     * @param statReqPresent true if the status_request hello extension should
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   366
     * be present.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   367
     * @param statReqV2Present true if the status_request_v2 hello extension
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   368
     * should be present.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   369
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   370
     * @throws SSLException if the presence or lack of either the
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   371
     * status_request or status_request_v2 extensions is inconsistent with
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   372
     * the expected settings in the statReqPresent or statReqV2Present
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   373
     * parameters.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   374
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   375
    private static void checkClientHello(ByteBuffer data,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   376
            boolean statReqPresent, boolean statReqV2Present)
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   377
            throws SSLException {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   378
        boolean hasV1 = false;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   379
        boolean hasV2 = false;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   380
        Objects.requireNonNull(data);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   381
        data.mark();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   382
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   383
        // Process the TLS record header
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   384
        int type = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   385
        int ver_major = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   386
        int ver_minor = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   387
        int recLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   388
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   389
        // Simple sanity checks
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   390
        if (type != 22) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   391
            throw new SSLException("Not a handshake: Type = " + type);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   392
        } else if (recLen > data.remaining()) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   393
            throw new SSLException("Incomplete record in buffer: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   394
                    "Record length = " + recLen + ", Remaining = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   395
                    data.remaining());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   396
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   397
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   398
        // Grab the handshake message header.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   399
        int msgHdr = data.getInt();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   400
        int msgType = (msgHdr >> 24) & 0x000000FF;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   401
        int msgLen = msgHdr & 0x00FFFFFF;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   402
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   403
        // More simple sanity checks
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   404
        if (msgType != 1) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   405
            throw new SSLException("Not a ClientHello: Type = " + msgType);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   406
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   407
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   408
        // Skip over the protocol version and client random
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   409
        data.position(data.position() + 34);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   410
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   411
        // Jump past the session ID (if there is one)
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   412
        int sessLen = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   413
        if (sessLen != 0) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   414
            data.position(data.position() + sessLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   415
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   416
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   417
        // Jump past the cipher suites
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   418
        int csLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   419
        if (csLen != 0) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   420
            data.position(data.position() + csLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   421
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   422
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   423
        // ...and the compression
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   424
        int compLen = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   425
        if (compLen != 0) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   426
            data.position(data.position() + compLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   427
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   428
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   429
        // Now for the fun part.  Go through the extensions and look
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   430
        // for the two status request exts.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   431
        int extsLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   432
        while (data.hasRemaining()) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   433
            int extType = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   434
            int extLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   435
            hasV1 |= (extType == HELLO_EXT_STATUS_REQ);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   436
            hasV2 |= (extType == HELLO_EXT_STATUS_REQ_V2);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   437
            data.position(data.position() + extLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   438
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   439
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   440
        if (hasV1 != statReqPresent) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   441
            throw new SSLException("The status_request extension is " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   442
                    "inconsistent with the expected result: expected = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   443
                    statReqPresent + ", actual = " + hasV1);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   444
        } else if (hasV2 != statReqV2Present) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   445
            throw new SSLException("The status_request_v2 extension is " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   446
                    "inconsistent with the expected result: expected = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   447
                    statReqV2Present + ", actual = " + hasV2);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   448
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   449
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   450
        // We should be at the end of the ClientHello
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   451
        data.reset();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   452
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   453
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   454
    /**
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   455
     * Tests the ServerHello for the presence (or not) of the status_request
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   456
     * or status_request_v2 hello extension.  It is assumed that the provided
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   457
     * ByteBuffer has its position set at the first byte of the TLS record
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   458
     * containing the ServerHello and contains the entire hello message.  Upon
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   459
     * successful completion of this method the ByteBuffer will have its
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   460
     * position reset to the initial offset in the buffer.  If an exception is
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   461
     * thrown the position at the time of the exception will be preserved.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   462
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   463
     * @param statReqPresent true if the status_request hello extension should
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   464
     * be present.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   465
     * @param statReqV2Present true if the status_request_v2 hello extension
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   466
     * should be present.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   467
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   468
     * @throws SSLException if the presence or lack of either the
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   469
     * status_request or status_request_v2 extensions is inconsistent with
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   470
     * the expected settings in the statReqPresent or statReqV2Present
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   471
     * parameters.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   472
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   473
    private static void checkServerHello(ByteBuffer data,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   474
            boolean statReqPresent, boolean statReqV2Present)
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   475
            throws SSLException {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   476
        boolean hasV1 = false;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   477
        boolean hasV2 = false;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   478
        Objects.requireNonNull(data);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   479
        int startPos = data.position();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   480
        data.mark();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   481
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   482
        // Process the TLS record header
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   483
        int type = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   484
        int ver_major = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   485
        int ver_minor = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   486
        int recLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   487
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   488
        // Simple sanity checks
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   489
        if (type != 22) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   490
            throw new SSLException("Not a handshake: Type = " + type);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   491
        } else if (recLen > data.remaining()) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   492
            throw new SSLException("Incomplete record in buffer: " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   493
                    "Record length = " + recLen + ", Remaining = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   494
                    data.remaining());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   495
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   496
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   497
        // Grab the handshake message header.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   498
        int msgHdr = data.getInt();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   499
        int msgType = (msgHdr >> 24) & 0x000000FF;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   500
        int msgLen = msgHdr & 0x00FFFFFF;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   501
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   502
        // More simple sanity checks
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   503
        if (msgType != 2) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   504
            throw new SSLException("Not a ServerHello: Type = " + msgType);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   505
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   506
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   507
        // Skip over the protocol version and server random
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   508
        data.position(data.position() + 34);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   509
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   510
        // Jump past the session ID
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   511
        int sessLen = Byte.toUnsignedInt(data.get());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   512
        if (sessLen != 0) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   513
            data.position(data.position() + sessLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   514
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   515
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   516
        // Skip the cipher suite and compression method
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   517
        data.position(data.position() + 3);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   518
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   519
        // Go through the extensions and look for the request extension
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   520
        // expected by the caller.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   521
        int extsLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   522
        while (data.position() < recLen + startPos + 5) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   523
            int extType = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   524
            int extLen = Short.toUnsignedInt(data.getShort());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   525
            hasV1 |= (extType == HELLO_EXT_STATUS_REQ);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   526
            hasV2 |= (extType == HELLO_EXT_STATUS_REQ_V2);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   527
            data.position(data.position() + extLen);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   528
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   529
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   530
        if (hasV1 != statReqPresent) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   531
            throw new SSLException("The status_request extension is " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   532
                    "inconsistent with the expected result: expected = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   533
                    statReqPresent + ", actual = " + hasV1);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   534
        } else if (hasV2 != statReqV2Present) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   535
            throw new SSLException("The status_request_v2 extension is " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   536
                    "inconsistent with the expected result: expected = " +
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   537
                    statReqV2Present + ", actual = " + hasV2);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   538
        }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   539
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   540
        // Reset the position to the initial spot at the start of this method.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   541
        data.reset();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   542
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   543
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   544
    /**
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   545
     * Creates the PKI components necessary for this test, including
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   546
     * Root CA, Intermediate CA and SSL server certificates, the keystores
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   547
     * for each entity, a client trust store, and starts the OCSP responders.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   548
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   549
    private static void createPKI() throws Exception {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   550
        CertificateBuilder cbld = new CertificateBuilder();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   551
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   552
        keyGen.initialize(2048);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   553
        KeyStore.Builder keyStoreBuilder =
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   554
                KeyStore.Builder.newInstance("PKCS12", null,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   555
                        new KeyStore.PasswordProtection(passwd.toCharArray()));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   556
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   557
        // Generate Root, IntCA, EE keys
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   558
        KeyPair rootCaKP = keyGen.genKeyPair();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   559
        log("Generated Root CA KeyPair");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   560
        KeyPair intCaKP = keyGen.genKeyPair();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   561
        log("Generated Intermediate CA KeyPair");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   562
        KeyPair sslKP = keyGen.genKeyPair();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   563
        log("Generated SSL Cert KeyPair");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   564
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   565
        // Set up the Root CA Cert
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   566
        cbld.setSubjectName("CN=Root CA Cert, O=SomeCompany");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   567
        cbld.setPublicKey(rootCaKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   568
        cbld.setSerialNumber(new BigInteger("1"));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   569
        // Make a 3 year validity starting from 60 days ago
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   570
        long start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(60);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   571
        long end = start + TimeUnit.DAYS.toMillis(1085);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   572
        cbld.setValidity(new Date(start), new Date(end));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   573
        addCommonExts(cbld, rootCaKP.getPublic(), rootCaKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   574
        addCommonCAExts(cbld);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   575
        // Make our Root CA Cert!
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   576
        X509Certificate rootCert = cbld.build(null, rootCaKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   577
                "SHA256withRSA");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   578
        log("Root CA Created:\n" + certInfo(rootCert));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   579
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   580
        // Now build a keystore and add the keys and cert
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   581
        rootKeystore = keyStoreBuilder.getKeyStore();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   582
        java.security.cert.Certificate[] rootChain = {rootCert};
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   583
        rootKeystore.setKeyEntry(ROOT_ALIAS, rootCaKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   584
                passwd.toCharArray(), rootChain);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   585
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   586
        // Now fire up the OCSP responder
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   587
        rootOcsp = new SimpleOCSPServer(rootKeystore, passwd, ROOT_ALIAS, null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   588
        rootOcsp.enableLog(logging);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   589
        rootOcsp.setNextUpdateInterval(3600);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   590
        rootOcsp.start();
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   591
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   592
        // Wait 5 seconds for server ready
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   593
        for (int i = 0; (i < 100 && !rootOcsp.isServerReady()); i++) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   594
            Thread.sleep(50);
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   595
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   596
        if (!rootOcsp.isServerReady()) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   597
            throw new RuntimeException("Server not ready yet");
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   598
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   599
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   600
        rootOcspPort = rootOcsp.getPort();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   601
        String rootRespURI = "http://localhost:" + rootOcspPort;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   602
        log("Root OCSP Responder URI is " + rootRespURI);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   603
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   604
        // Now that we have the root keystore and OCSP responder we can
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   605
        // create our intermediate CA.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   606
        cbld.reset();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   607
        cbld.setSubjectName("CN=Intermediate CA Cert, O=SomeCompany");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   608
        cbld.setPublicKey(intCaKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   609
        cbld.setSerialNumber(new BigInteger("100"));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   610
        // Make a 2 year validity starting from 30 days ago
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   611
        start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(30);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   612
        end = start + TimeUnit.DAYS.toMillis(730);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   613
        cbld.setValidity(new Date(start), new Date(end));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   614
        addCommonExts(cbld, intCaKP.getPublic(), rootCaKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   615
        addCommonCAExts(cbld);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   616
        cbld.addAIAExt(Collections.singletonList(rootRespURI));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   617
        // Make our Intermediate CA Cert!
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   618
        X509Certificate intCaCert = cbld.build(rootCert, rootCaKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   619
                "SHA256withRSA");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   620
        log("Intermediate CA Created:\n" + certInfo(intCaCert));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   621
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   622
        // Provide intermediate CA cert revocation info to the Root CA
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   623
        // OCSP responder.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   624
        Map<BigInteger, SimpleOCSPServer.CertStatusInfo> revInfo =
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   625
            new HashMap<>();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   626
        revInfo.put(intCaCert.getSerialNumber(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   627
                new SimpleOCSPServer.CertStatusInfo(
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   628
                        SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   629
        rootOcsp.updateStatusDb(revInfo);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   630
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   631
        // Now build a keystore and add the keys, chain and root cert as a TA
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   632
        intKeystore = keyStoreBuilder.getKeyStore();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   633
        java.security.cert.Certificate[] intChain = {intCaCert, rootCert};
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   634
        intKeystore.setKeyEntry(INT_ALIAS, intCaKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   635
                passwd.toCharArray(), intChain);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   636
        intKeystore.setCertificateEntry(ROOT_ALIAS, rootCert);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   637
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   638
        // Now fire up the Intermediate CA OCSP responder
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   639
        intOcsp = new SimpleOCSPServer(intKeystore, passwd,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   640
                INT_ALIAS, null);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   641
        intOcsp.enableLog(logging);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   642
        intOcsp.setNextUpdateInterval(3600);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   643
        intOcsp.start();
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   644
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   645
        // Wait 5 seconds for server ready
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   646
        for (int i = 0; (i < 100 && !intOcsp.isServerReady()); i++) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   647
            Thread.sleep(50);
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   648
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   649
        if (!intOcsp.isServerReady()) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   650
            throw new RuntimeException("Server not ready yet");
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   651
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 36132
diff changeset
   652
36132
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   653
        intOcspPort = intOcsp.getPort();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   654
        String intCaRespURI = "http://localhost:" + intOcspPort;
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   655
        log("Intermediate CA OCSP Responder URI is " + intCaRespURI);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   656
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   657
        // Last but not least, let's make our SSLCert and add it to its own
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   658
        // Keystore
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   659
        cbld.reset();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   660
        cbld.setSubjectName("CN=SSLCertificate, O=SomeCompany");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   661
        cbld.setPublicKey(sslKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   662
        cbld.setSerialNumber(new BigInteger("4096"));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   663
        // Make a 1 year validity starting from 7 days ago
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   664
        start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   665
        end = start + TimeUnit.DAYS.toMillis(365);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   666
        cbld.setValidity(new Date(start), new Date(end));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   667
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   668
        // Add extensions
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   669
        addCommonExts(cbld, sslKP.getPublic(), intCaKP.getPublic());
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   670
        boolean[] kuBits = {true, false, true, false, false, false,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   671
            false, false, false};
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   672
        cbld.addKeyUsageExt(kuBits);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   673
        List<String> ekuOids = new ArrayList<>();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   674
        ekuOids.add("1.3.6.1.5.5.7.3.1");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   675
        ekuOids.add("1.3.6.1.5.5.7.3.2");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   676
        cbld.addExtendedKeyUsageExt(ekuOids);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   677
        cbld.addSubjectAltNameDNSExt(Collections.singletonList("localhost"));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   678
        cbld.addAIAExt(Collections.singletonList(intCaRespURI));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   679
        // Make our SSL Server Cert!
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   680
        X509Certificate sslCert = cbld.build(intCaCert, intCaKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   681
                "SHA256withRSA");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   682
        log("SSL Certificate Created:\n" + certInfo(sslCert));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   683
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   684
        // Provide SSL server cert revocation info to the Intermeidate CA
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   685
        // OCSP responder.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   686
        revInfo = new HashMap<>();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   687
        revInfo.put(sslCert.getSerialNumber(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   688
                new SimpleOCSPServer.CertStatusInfo(
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   689
                        SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD));
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   690
        intOcsp.updateStatusDb(revInfo);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   691
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   692
        // Now build a keystore and add the keys, chain and root cert as a TA
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   693
        serverKeystore = keyStoreBuilder.getKeyStore();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   694
        java.security.cert.Certificate[] sslChain = {sslCert, intCaCert, rootCert};
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   695
        serverKeystore.setKeyEntry(SSL_ALIAS, sslKP.getPrivate(),
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   696
                passwd.toCharArray(), sslChain);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   697
        serverKeystore.setCertificateEntry(ROOT_ALIAS, rootCert);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   698
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   699
        // And finally a Trust Store for the client
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   700
        trustStore = keyStoreBuilder.getKeyStore();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   701
        trustStore.setCertificateEntry(ROOT_ALIAS, rootCert);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   702
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   703
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   704
    private static void addCommonExts(CertificateBuilder cbld,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   705
            PublicKey subjKey, PublicKey authKey) throws IOException {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   706
        cbld.addSubjectKeyIdExt(subjKey);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   707
        cbld.addAuthorityKeyIdExt(authKey);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   708
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   709
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   710
    private static void addCommonCAExts(CertificateBuilder cbld)
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   711
            throws IOException {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   712
        cbld.addBasicConstraintsExt(true, true, -1);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   713
        // Set key usage bits for digitalSignature, keyCertSign and cRLSign
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   714
        boolean[] kuBitSettings = {true, false, false, false, false, true,
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   715
            true, false, false};
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   716
        cbld.addKeyUsageExt(kuBitSettings);
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   717
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   718
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   719
    /**
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   720
     * Helper routine that dumps only a few cert fields rather than
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   721
     * the whole toString() output.
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   722
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   723
     * @param cert an X509Certificate to be displayed
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   724
     *
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   725
     * @return the String output of the issuer, subject and
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   726
     * serial number
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   727
     */
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   728
    private static String certInfo(X509Certificate cert) {
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   729
        StringBuilder sb = new StringBuilder();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   730
        sb.append("Issuer: ").append(cert.getIssuerX500Principal()).
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   731
                append("\n");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   732
        sb.append("Subject: ").append(cert.getSubjectX500Principal()).
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   733
                append("\n");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   734
        sb.append("Serial: ").append(cert.getSerialNumber()).append("\n");
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   735
        return sb.toString();
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   736
    }
c99a60377145 8145854: SSLContextImpl.statusResponseManager should be generated if required
jnimeh
parents:
diff changeset
   737
}