test/jdk/javax/net/ssl/Stapling/SSLEngineWithStapling.java
author xuelei
Mon, 25 Jun 2018 13:41:39 -0700
changeset 50768 68fa3d4026ea
parent 47216 71c04702a3d5
permissions -rw-r--r--
8196584: TLS 1.3 Implementation Reviewed-by: ascarpino, coffeys, dfuchs, jjiang, jnimeh, mullan, rhalade, ssahoo, valeriep, weijun, wetmore, xuelei Contributed-by: Adam Petcher <adam.petcher@oracle.com>, Amanda Jiang <amanda.jiang@oracle.com>, Anthony Scarpino <anthony.scarpino@oracle.com>, Bradford Wetmore <bradford.wetmore@oracle.com>, Jamil Nimeh <jamil.j.nimeh@oracle.com>, John Jiang <sha.jiang@oracle.com>, Rajan Halade <rajan.halade@oracle.com>, Sibabrata Sahoo <sibabrata.sahoo@oracle.com>, Valerie Peng <valerie.peng@oracle.com>, Weijun Wang <weijun.wang@oracle.com>, Xuelei Fan <xuelei.fan@oracle.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     1
/*
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
     2
 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     4
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     7
 * published by the Free Software Foundation.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     8
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    13
 * accompanied this code).
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    14
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    18
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    21
 * questions.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    22
 */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    23
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    24
// SunJSSE does not support dynamic system properties, no way to re-use
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    25
// system properties in samevm/agentvm mode.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    26
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    27
/*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    28
 * @test
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
    29
 * @bug 8046321 8153829
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    30
 * @summary OCSP Stapling for TLS
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    31
 * @library ../../../../java/security/testlibrary
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    32
 * @build CertificateBuilder SimpleOCSPServer
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    33
 * @run main/othervm SSLEngineWithStapling
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    34
 */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    35
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    36
/**
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    37
 * A SSLEngine usage example which simplifies the presentation
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    38
 * by removing the I/O and multi-threading concerns.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    39
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    40
 * The test creates two SSLEngines, simulating a client and server.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    41
 * The "transport" layer consists two byte buffers:  think of them
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    42
 * as directly connected pipes.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    43
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    44
 * Note, this is a *very* simple example: real code will be much more
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    45
 * involved.  For example, different threading and I/O models could be
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    46
 * used, transport mechanisms could close unexpectedly, and so on.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    47
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    48
 * When this application runs, notice that several messages
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    49
 * (wrap/unwrap) pass before any application data is consumed or
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    50
 * produced.  (For more information, please see the SSL/TLS
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    51
 * specifications.)  There may several steps for a successful handshake,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    52
 * so it's typical to see the following series of operations:
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    53
 *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    54
 *      client          server          message
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    55
 *      ======          ======          =======
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    56
 *      wrap()          ...             ClientHello
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    57
 *      ...             unwrap()        ClientHello
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    58
 *      ...             wrap()          ServerHello/Certificate
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    59
 *      unwrap()        ...             ServerHello/Certificate
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    60
 *      wrap()          ...             ClientKeyExchange
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    61
 *      wrap()          ...             ChangeCipherSpec
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    62
 *      wrap()          ...             Finished
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    63
 *      ...             unwrap()        ClientKeyExchange
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    64
 *      ...             unwrap()        ChangeCipherSpec
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    65
 *      ...             unwrap()        Finished
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    66
 *      ...             wrap()          ChangeCipherSpec
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    67
 *      ...             wrap()          Finished
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    68
 *      unwrap()        ...             ChangeCipherSpec
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    69
 *      unwrap()        ...             Finished
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    70
 */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    71
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    72
import javax.net.ssl.*;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    73
import javax.net.ssl.SSLEngineResult.*;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    74
import java.io.*;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    75
import java.math.BigInteger;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    76
import java.security.*;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    77
import java.nio.*;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    78
import java.security.cert.CertPathValidatorException;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    79
import java.security.cert.PKIXBuilderParameters;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    80
import java.security.cert.X509Certificate;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    81
import java.security.cert.X509CertSelector;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    82
import java.util.ArrayList;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    83
import java.util.Collections;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    84
import java.util.Date;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    85
import java.util.HashMap;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    86
import java.util.List;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    87
import java.util.Map;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    88
import java.util.concurrent.TimeUnit;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    89
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    90
import sun.security.testlibrary.SimpleOCSPServer;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    91
import sun.security.testlibrary.CertificateBuilder;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    92
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    93
public class SSLEngineWithStapling {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    94
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    95
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    96
     * Enables logging of the SSLEngine operations.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    97
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    98
    private static final boolean logging = true;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
    99
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   100
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   101
     * Enables the JSSE system debugging system property:
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   102
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   103
     *     -Djavax.net.debug=all
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   104
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   105
     * This gives a lot of low-level information about operations underway,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   106
     * including specific handshake messages, and might be best examined
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   107
     * after gaining some familiarity with this application.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   108
     */
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   109
    private static final boolean debug = true;
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   110
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   111
    private SSLEngine clientEngine;     // client Engine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   112
    private ByteBuffer clientOut;       // write side of clientEngine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   113
    private ByteBuffer clientIn;        // read side of clientEngine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   114
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   115
    private SSLEngine serverEngine;     // server Engine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   116
    private ByteBuffer serverOut;       // write side of serverEngine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   117
    private ByteBuffer serverIn;        // read side of serverEngine
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   118
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   119
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   120
     * For data transport, this example uses local ByteBuffers.  This
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   121
     * isn't really useful, but the purpose of this example is to show
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   122
     * SSLEngine concepts, not how to do network transport.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   123
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   124
    private ByteBuffer cTOs;            // "reliable" transport client->server
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   125
    private ByteBuffer sTOc;            // "reliable" transport server->client
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   126
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   127
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   128
     * The following is to set up the keystores.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   129
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   130
    static final String passwd = "passphrase";
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   131
    static final String ROOT_ALIAS = "root";
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   132
    static final String INT_ALIAS = "intermediate";
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   133
    static final String SSL_ALIAS = "ssl";
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   134
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   135
    // PKI components we will need for this test
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   136
    static KeyStore rootKeystore;           // Root CA Keystore
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   137
    static KeyStore intKeystore;            // Intermediate CA Keystore
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   138
    static KeyStore serverKeystore;         // SSL Server Keystore
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   139
    static KeyStore trustStore;             // SSL Client trust store
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   140
    static SimpleOCSPServer rootOcsp;       // Root CA OCSP Responder
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   141
    static int rootOcspPort;                // Port number for root OCSP
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   142
    static SimpleOCSPServer intOcsp;        // Intermediate CA OCSP Responder
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   143
    static int intOcspPort;                 // Port number for intermed. OCSP
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   144
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   145
    // Extra configuration parameters and constants
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   146
    static final String[] TLS13ONLY = new String[] { "TLSv1.3" };
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   147
    static final String[] TLS12MAX =
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   148
            new String[] { "TLSv1.2", "TLSv1.1", "TLSv1" };
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   149
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   150
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   151
     * Main entry point for this test.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   152
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   153
    public static void main(String args[]) throws Exception {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   154
        if (debug) {
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   155
            System.setProperty("javax.net.debug", "ssl:handshake");
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   156
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   157
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   158
        // Create the PKI we will use for the test and start the OCSP servers
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   159
        createPKI();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   160
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   161
        // Set the certificate entry in the intermediate OCSP responder
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   162
        // with a revocation date of 8 hours ago.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   163
        X509Certificate sslCert =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   164
                (X509Certificate)serverKeystore.getCertificate(SSL_ALIAS);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   165
        Map<BigInteger, SimpleOCSPServer.CertStatusInfo> revInfo =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   166
            new HashMap<>();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   167
        revInfo.put(sslCert.getSerialNumber(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   168
                new SimpleOCSPServer.CertStatusInfo(
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   169
                        SimpleOCSPServer.CertStatus.CERT_STATUS_REVOKED,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   170
                        new Date(System.currentTimeMillis() -
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   171
                                TimeUnit.HOURS.toMillis(8))));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   172
        intOcsp.updateStatusDb(revInfo);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   173
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   174
        // Create a list of TLS protocol configurations we can use to
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   175
        // drive tests with different handshaking models.
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   176
        List<String[]> allowedProtList = List.of(TLS12MAX, TLS13ONLY);
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   177
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   178
        for (String[] protocols : allowedProtList) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   179
            SSLEngineWithStapling test = new SSLEngineWithStapling();
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   180
            try {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   181
                test.runTest(protocols);
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   182
                throw new RuntimeException("Expected failure due to " +
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   183
                        "revocation did not occur");
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   184
            } catch (Exception e) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   185
                if (!checkClientValidationFailure(e,
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   186
                        CertPathValidatorException.BasicReason.REVOKED)) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   187
                    System.out.println(
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   188
                            "*** Didn't find the exception we wanted");
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   189
                    throw e;
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   190
                }
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   191
            }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   192
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   193
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   194
        System.out.println("Test Passed.");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   195
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   196
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   197
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   198
     * Create an initialized SSLContext to use for these tests.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   199
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   200
    public SSLEngineWithStapling() throws Exception {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   201
        System.setProperty("javax.net.ssl.keyStore", "");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   202
        System.setProperty("javax.net.ssl.keyStorePassword", "");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   203
        System.setProperty("javax.net.ssl.trustStore", "");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   204
        System.setProperty("javax.net.ssl.trustStorePassword", "");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   205
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   206
        // Enable OCSP Stapling on both client and server sides, but turn off
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   207
        // client-side OCSP for revocation checking.  This ensures that the
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   208
        // revocation information from the test has to come via stapling.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   209
        System.setProperty("jdk.tls.client.enableStatusRequestExtension",
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   210
                Boolean.toString(true));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   211
        System.setProperty("jdk.tls.server.enableStatusRequestExtension",
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   212
                Boolean.toString(true));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   213
        Security.setProperty("ocsp.enable", "false");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   214
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   215
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   216
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   217
     * Run the test.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   218
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   219
     * Sit in a tight loop, both engines calling wrap/unwrap regardless
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   220
     * of whether data is available or not.  We do this until both engines
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   221
     * report back they are closed.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   222
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   223
     * The main loop handles all of the I/O phases of the SSLEngine's
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   224
     * lifetime:
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   225
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   226
     *     initial handshaking
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   227
     *     application data transfer
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   228
     *     engine closing
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   229
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   230
     * One could easily separate these phases into separate
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   231
     * sections of code.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   232
     */
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   233
    private void runTest(String[] protocols) throws Exception {
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   234
        boolean dataDone = false;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   235
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   236
        createSSLEngines(protocols);
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   237
        createBuffers();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   238
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   239
        SSLEngineResult clientResult;   // results from client's last operation
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   240
        SSLEngineResult serverResult;   // results from server's last operation
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   241
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   242
        /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   243
         * Examining the SSLEngineResults could be much more involved,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   244
         * and may alter the overall flow of the application.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   245
         *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   246
         * For example, if we received a BUFFER_OVERFLOW when trying
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   247
         * to write to the output pipe, we could reallocate a larger
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   248
         * pipe, but instead we wait for the peer to drain it.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   249
         */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   250
        while (!isEngineClosed(clientEngine) ||
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   251
                !isEngineClosed(serverEngine)) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   252
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   253
            log("================");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   254
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   255
            clientResult = clientEngine.wrap(clientOut, cTOs);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   256
            log("client wrap: ", clientResult);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   257
            runDelegatedTasks(clientResult, clientEngine);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   258
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   259
            serverResult = serverEngine.wrap(serverOut, sTOc);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   260
            log("server wrap: ", serverResult);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   261
            runDelegatedTasks(serverResult, serverEngine);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   262
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   263
            cTOs.flip();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   264
            sTOc.flip();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   265
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   266
            log("----");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   267
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   268
            clientResult = clientEngine.unwrap(sTOc, clientIn);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   269
            log("client unwrap: ", clientResult);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   270
            runDelegatedTasks(clientResult, clientEngine);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   271
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   272
            serverResult = serverEngine.unwrap(cTOs, serverIn);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   273
            log("server unwrap: ", serverResult);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   274
            runDelegatedTasks(serverResult, serverEngine);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   275
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   276
            cTOs.compact();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   277
            sTOc.compact();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   278
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   279
            /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   280
             * After we've transfered all application data between the client
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   281
             * and server, we close the clientEngine's outbound stream.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   282
             * This generates a close_notify handshake message, which the
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   283
             * server engine receives and responds by closing itself.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   284
             */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   285
            if (!dataDone && (clientOut.limit() == serverIn.position()) &&
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   286
                    (serverOut.limit() == clientIn.position())) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   287
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   288
                /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   289
                 * A sanity check to ensure we got what was sent.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   290
                 */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   291
                checkTransfer(serverOut, clientIn);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   292
                checkTransfer(clientOut, serverIn);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   293
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   294
                log("\tClosing clientEngine's *OUTBOUND*...");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   295
                clientEngine.closeOutbound();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   296
                dataDone = true;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   297
            }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   298
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   299
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   300
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   301
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   302
     * Using the SSLContext created during object creation,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   303
     * create/configure the SSLEngines we'll use for this test.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   304
     */
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   305
    private void createSSLEngines(String[] protocols) throws Exception {
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   306
        // Initialize the KeyManager and TrustManager for the server
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   307
        KeyManagerFactory servKmf = KeyManagerFactory.getInstance("PKIX");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   308
        servKmf.init(serverKeystore, passwd.toCharArray());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   309
        TrustManagerFactory servTmf =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   310
                TrustManagerFactory.getInstance("PKIX");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   311
        servTmf.init(trustStore);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   312
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   313
        // Initialize the TrustManager for the client with revocation checking
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   314
        PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(trustStore,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   315
                new X509CertSelector());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   316
        pkixParams.setRevocationEnabled(true);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   317
        ManagerFactoryParameters mfp =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   318
                new CertPathTrustManagerParameters(pkixParams);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   319
        TrustManagerFactory cliTmf =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   320
                TrustManagerFactory.getInstance("PKIX");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   321
        cliTmf.init(mfp);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   322
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   323
        // Create the SSLContexts from the factories
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   324
        SSLContext servCtx = SSLContext.getInstance("TLS");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   325
        servCtx.init(servKmf.getKeyManagers(), servTmf.getTrustManagers(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   326
                null);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   327
        SSLContext cliCtx = SSLContext.getInstance("TLS");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   328
        cliCtx.init(null, cliTmf.getTrustManagers(), null);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   329
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   330
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   331
        /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   332
         * Configure the serverEngine to act as a server in the SSL/TLS
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   333
         * handshake.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   334
         */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   335
        serverEngine = servCtx.createSSLEngine();
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   336
        serverEngine.setEnabledProtocols(protocols);
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   337
        serverEngine.setUseClientMode(false);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   338
        serverEngine.setNeedClientAuth(false);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   339
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   340
        /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   341
         * Similar to above, but using client mode instead.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   342
         */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   343
        clientEngine = cliCtx.createSSLEngine("client", 80);
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   344
        clientEngine.setEnabledProtocols(protocols);
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   345
        clientEngine.setUseClientMode(true);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   346
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   347
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   348
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   349
     * Create and size the buffers appropriately.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   350
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   351
    private void createBuffers() {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   352
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   353
        /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   354
         * We'll assume the buffer sizes are the same
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   355
         * between client and server.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   356
         */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   357
        SSLSession session = clientEngine.getSession();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   358
        int appBufferMax = session.getApplicationBufferSize();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   359
        int netBufferMax = session.getPacketBufferSize();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   360
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   361
        /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   362
         * We'll make the input buffers a bit bigger than the max needed
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   363
         * size, so that unwrap()s following a successful data transfer
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   364
         * won't generate BUFFER_OVERFLOWS.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   365
         *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   366
         * We'll use a mix of direct and indirect ByteBuffers for
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   367
         * tutorial purposes only.  In reality, only use direct
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   368
         * ByteBuffers when they give a clear performance enhancement.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   369
         */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   370
        clientIn = ByteBuffer.allocate(appBufferMax + 50);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   371
        serverIn = ByteBuffer.allocate(appBufferMax + 50);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   372
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   373
        cTOs = ByteBuffer.allocateDirect(netBufferMax);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   374
        sTOc = ByteBuffer.allocateDirect(netBufferMax);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   375
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   376
        clientOut = ByteBuffer.wrap("Hi Server, I'm Client".getBytes());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   377
        serverOut = ByteBuffer.wrap("Hello Client, I'm Server".getBytes());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   378
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   379
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   380
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   381
     * If the result indicates that we have outstanding tasks to do,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   382
     * go ahead and run them in this thread.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   383
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   384
    private static void runDelegatedTasks(SSLEngineResult result,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   385
            SSLEngine engine) throws Exception {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   386
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   387
        if (result.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   388
            Runnable runnable;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   389
            while ((runnable = engine.getDelegatedTask()) != null) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   390
                log("\trunning delegated task...");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   391
                runnable.run();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   392
            }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   393
            HandshakeStatus hsStatus = engine.getHandshakeStatus();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   394
            if (hsStatus == HandshakeStatus.NEED_TASK) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   395
                throw new Exception(
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   396
                    "handshake shouldn't need additional tasks");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   397
            }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   398
            log("\tnew HandshakeStatus: " + hsStatus);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   399
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   400
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   401
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   402
    private static boolean isEngineClosed(SSLEngine engine) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   403
        return (engine.isOutboundDone() && engine.isInboundDone());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   404
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   405
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   406
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   407
     * Simple check to make sure everything came across as expected.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   408
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   409
    private static void checkTransfer(ByteBuffer a, ByteBuffer b)
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   410
            throws Exception {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   411
        a.flip();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   412
        b.flip();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   413
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   414
        if (!a.equals(b)) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   415
            throw new Exception("Data didn't transfer cleanly");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   416
        } else {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   417
            log("\tData transferred cleanly");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   418
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   419
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   420
        a.position(a.limit());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   421
        b.position(b.limit());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   422
        a.limit(a.capacity());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   423
        b.limit(b.capacity());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   424
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   425
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   426
    /*
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   427
     * Logging code
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   428
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   429
    private static boolean resultOnce = true;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   430
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   431
    private static void log(String str, SSLEngineResult result) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   432
        if (!logging) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   433
            return;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   434
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   435
        if (resultOnce) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   436
            resultOnce = false;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   437
            System.out.println("The format of the SSLEngineResult is: \n" +
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   438
                "\t\"getStatus() / getHandshakeStatus()\" +\n" +
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   439
                "\t\"bytesConsumed() / bytesProduced()\"\n");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   440
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   441
        HandshakeStatus hsStatus = result.getHandshakeStatus();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   442
        log(str +
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   443
            result.getStatus() + "/" + hsStatus + ", " +
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   444
            result.bytesConsumed() + "/" + result.bytesProduced() +
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   445
            " bytes");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   446
        if (hsStatus == HandshakeStatus.FINISHED) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   447
            log("\t...ready for application data");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   448
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   449
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   450
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   451
    private static void log(String str) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   452
        if (logging) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   453
            System.out.println(str);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   454
        }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   455
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   456
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   457
        /**
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   458
     * Creates the PKI components necessary for this test, including
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   459
     * Root CA, Intermediate CA and SSL server certificates, the keystores
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   460
     * for each entity, a client trust store, and starts the OCSP responders.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   461
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   462
    private static void createPKI() throws Exception {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   463
        CertificateBuilder cbld = new CertificateBuilder();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   464
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   465
        keyGen.initialize(2048);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   466
        KeyStore.Builder keyStoreBuilder =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   467
                KeyStore.Builder.newInstance("PKCS12", null,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   468
                        new KeyStore.PasswordProtection(passwd.toCharArray()));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   469
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   470
        // Generate Root, IntCA, EE keys
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   471
        KeyPair rootCaKP = keyGen.genKeyPair();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   472
        log("Generated Root CA KeyPair");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   473
        KeyPair intCaKP = keyGen.genKeyPair();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   474
        log("Generated Intermediate CA KeyPair");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   475
        KeyPair sslKP = keyGen.genKeyPair();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   476
        log("Generated SSL Cert KeyPair");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   477
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   478
        // Set up the Root CA Cert
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   479
        cbld.setSubjectName("CN=Root CA Cert, O=SomeCompany");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   480
        cbld.setPublicKey(rootCaKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   481
        cbld.setSerialNumber(new BigInteger("1"));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   482
        // Make a 3 year validity starting from 60 days ago
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   483
        long start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(60);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   484
        long end = start + TimeUnit.DAYS.toMillis(1085);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   485
        cbld.setValidity(new Date(start), new Date(end));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   486
        addCommonExts(cbld, rootCaKP.getPublic(), rootCaKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   487
        addCommonCAExts(cbld);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   488
        // Make our Root CA Cert!
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   489
        X509Certificate rootCert = cbld.build(null, rootCaKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   490
                "SHA256withRSA");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   491
        log("Root CA Created:\n" + certInfo(rootCert));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   492
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   493
        // Now build a keystore and add the keys and cert
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   494
        rootKeystore = keyStoreBuilder.getKeyStore();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   495
        java.security.cert.Certificate[] rootChain = {rootCert};
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   496
        rootKeystore.setKeyEntry(ROOT_ALIAS, rootCaKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   497
                passwd.toCharArray(), rootChain);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   498
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   499
        // Now fire up the OCSP responder
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   500
        rootOcsp = new SimpleOCSPServer(rootKeystore, passwd, ROOT_ALIAS, null);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   501
        rootOcsp.enableLog(logging);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   502
        rootOcsp.setNextUpdateInterval(3600);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   503
        rootOcsp.start();
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   504
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   505
        // Wait 5 seconds for server ready
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   506
        for (int i = 0; (i < 100 && !rootOcsp.isServerReady()); i++) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   507
            Thread.sleep(50);
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   508
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   509
        if (!rootOcsp.isServerReady()) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   510
            throw new RuntimeException("Server not ready yet");
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   511
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   512
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   513
        rootOcspPort = rootOcsp.getPort();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   514
        String rootRespURI = "http://localhost:" + rootOcspPort;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   515
        log("Root OCSP Responder URI is " + rootRespURI);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   516
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   517
        // Now that we have the root keystore and OCSP responder we can
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   518
        // create our intermediate CA.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   519
        cbld.reset();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   520
        cbld.setSubjectName("CN=Intermediate CA Cert, O=SomeCompany");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   521
        cbld.setPublicKey(intCaKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   522
        cbld.setSerialNumber(new BigInteger("100"));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   523
        // Make a 2 year validity starting from 30 days ago
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   524
        start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(30);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   525
        end = start + TimeUnit.DAYS.toMillis(730);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   526
        cbld.setValidity(new Date(start), new Date(end));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   527
        addCommonExts(cbld, intCaKP.getPublic(), rootCaKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   528
        addCommonCAExts(cbld);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   529
        cbld.addAIAExt(Collections.singletonList(rootRespURI));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   530
        // Make our Intermediate CA Cert!
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   531
        X509Certificate intCaCert = cbld.build(rootCert, rootCaKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   532
                "SHA256withRSA");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   533
        log("Intermediate CA Created:\n" + certInfo(intCaCert));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   534
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   535
        // Provide intermediate CA cert revocation info to the Root CA
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   536
        // OCSP responder.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   537
        Map<BigInteger, SimpleOCSPServer.CertStatusInfo> revInfo =
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   538
            new HashMap<>();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   539
        revInfo.put(intCaCert.getSerialNumber(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   540
                new SimpleOCSPServer.CertStatusInfo(
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   541
                        SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   542
        rootOcsp.updateStatusDb(revInfo);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   543
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   544
        // Now build a keystore and add the keys, chain and root cert as a TA
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   545
        intKeystore = keyStoreBuilder.getKeyStore();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   546
        java.security.cert.Certificate[] intChain = {intCaCert, rootCert};
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   547
        intKeystore.setKeyEntry(INT_ALIAS, intCaKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   548
                passwd.toCharArray(), intChain);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   549
        intKeystore.setCertificateEntry(ROOT_ALIAS, rootCert);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   550
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   551
        // Now fire up the Intermediate CA OCSP responder
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   552
        intOcsp = new SimpleOCSPServer(intKeystore, passwd,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   553
                INT_ALIAS, null);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   554
        intOcsp.enableLog(logging);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   555
        intOcsp.setNextUpdateInterval(3600);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   556
        intOcsp.start();
37309
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   557
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   558
        // Wait 5 seconds for server ready
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   559
        for (int i = 0; (i < 100 && !intOcsp.isServerReady()); i++) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   560
            Thread.sleep(50);
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   561
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   562
        if (!intOcsp.isServerReady()) {
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   563
            throw new RuntimeException("Server not ready yet");
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   564
        }
8f530b9d18f4 8153829: javax/net/ssl/Stapling/HttpsUrlConnClient.java fails intermittently with NullPointerException
rhalade
parents: 32032
diff changeset
   565
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   566
        intOcspPort = intOcsp.getPort();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   567
        String intCaRespURI = "http://localhost:" + intOcspPort;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   568
        log("Intermediate CA OCSP Responder URI is " + intCaRespURI);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   569
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   570
        // Last but not least, let's make our SSLCert and add it to its own
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   571
        // Keystore
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   572
        cbld.reset();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   573
        cbld.setSubjectName("CN=SSLCertificate, O=SomeCompany");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   574
        cbld.setPublicKey(sslKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   575
        cbld.setSerialNumber(new BigInteger("4096"));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   576
        // Make a 1 year validity starting from 7 days ago
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   577
        start = System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   578
        end = start + TimeUnit.DAYS.toMillis(365);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   579
        cbld.setValidity(new Date(start), new Date(end));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   580
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   581
        // Add extensions
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   582
        addCommonExts(cbld, sslKP.getPublic(), intCaKP.getPublic());
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   583
        boolean[] kuBits = {true, false, true, false, false, false,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   584
            false, false, false};
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   585
        cbld.addKeyUsageExt(kuBits);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   586
        List<String> ekuOids = new ArrayList<>();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   587
        ekuOids.add("1.3.6.1.5.5.7.3.1");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   588
        ekuOids.add("1.3.6.1.5.5.7.3.2");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   589
        cbld.addExtendedKeyUsageExt(ekuOids);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   590
        cbld.addSubjectAltNameDNSExt(Collections.singletonList("localhost"));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   591
        cbld.addAIAExt(Collections.singletonList(intCaRespURI));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   592
        // Make our SSL Server Cert!
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   593
        X509Certificate sslCert = cbld.build(intCaCert, intCaKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   594
                "SHA256withRSA");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   595
        log("SSL Certificate Created:\n" + certInfo(sslCert));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   596
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   597
        // Provide SSL server cert revocation info to the Intermeidate CA
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   598
        // OCSP responder.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   599
        revInfo = new HashMap<>();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   600
        revInfo.put(sslCert.getSerialNumber(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   601
                new SimpleOCSPServer.CertStatusInfo(
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   602
                        SimpleOCSPServer.CertStatus.CERT_STATUS_GOOD));
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   603
        intOcsp.updateStatusDb(revInfo);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   604
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   605
        // Now build a keystore and add the keys, chain and root cert as a TA
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   606
        serverKeystore = keyStoreBuilder.getKeyStore();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   607
        java.security.cert.Certificate[] sslChain = {sslCert, intCaCert, rootCert};
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   608
        serverKeystore.setKeyEntry(SSL_ALIAS, sslKP.getPrivate(),
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   609
                passwd.toCharArray(), sslChain);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   610
        serverKeystore.setCertificateEntry(ROOT_ALIAS, rootCert);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   611
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   612
        // And finally a Trust Store for the client
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   613
        trustStore = keyStoreBuilder.getKeyStore();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   614
        trustStore.setCertificateEntry(ROOT_ALIAS, rootCert);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   615
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   616
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   617
    private static void addCommonExts(CertificateBuilder cbld,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   618
            PublicKey subjKey, PublicKey authKey) throws IOException {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   619
        cbld.addSubjectKeyIdExt(subjKey);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   620
        cbld.addAuthorityKeyIdExt(authKey);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   621
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   622
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   623
    private static void addCommonCAExts(CertificateBuilder cbld)
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   624
            throws IOException {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   625
        cbld.addBasicConstraintsExt(true, true, -1);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   626
        // Set key usage bits for digitalSignature, keyCertSign and cRLSign
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   627
        boolean[] kuBitSettings = {true, false, false, false, false, true,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   628
            true, false, false};
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   629
        cbld.addKeyUsageExt(kuBitSettings);
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   630
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   631
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   632
    /**
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   633
     * Helper routine that dumps only a few cert fields rather than
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   634
     * the whole toString() output.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   635
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   636
     * @param cert an X509Certificate to be displayed
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   637
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   638
     * @return the String output of the issuer, subject and
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   639
     * serial number
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   640
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   641
    private static String certInfo(X509Certificate cert) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   642
        StringBuilder sb = new StringBuilder();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   643
        sb.append("Issuer: ").append(cert.getIssuerX500Principal()).
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   644
                append("\n");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   645
        sb.append("Subject: ").append(cert.getSubjectX500Principal()).
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   646
                append("\n");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   647
        sb.append("Serial: ").append(cert.getSerialNumber()).append("\n");
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   648
        return sb.toString();
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   649
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   650
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   651
    /**
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   652
     * Checks a validation failure to see if it failed for the reason we think
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   653
     * it should.  This comes in as an SSLException of some sort, but it
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   654
     * encapsulates a CertPathValidatorException at some point in the
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   655
     * exception stack.
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   656
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   657
     * @param e the exception thrown at the top level
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   658
     * @param reason the underlying CertPathValidatorException BasicReason
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   659
     * we are expecting it to have.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   660
     *
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   661
     * @return true if the reason matches up, false otherwise.
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   662
     */
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   663
    static boolean checkClientValidationFailure(Exception e,
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   664
            CertPathValidatorException.BasicReason reason) {
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   665
        boolean result = false;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   666
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   667
        // Locate the CertPathValidatorException.  If one
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   668
        // Does not exist, then it's an automatic failure of
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   669
        // the test.
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   670
        Throwable curExc = e;
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   671
        CertPathValidatorException cpve = null;
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   672
        while (curExc != null) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   673
            if (curExc instanceof CertPathValidatorException) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   674
                cpve = (CertPathValidatorException)curExc;
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   675
            }
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   676
            curExc = curExc.getCause();
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   677
        }
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   678
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   679
        // If we get through the loop and cpve is null then we
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   680
        // we didn't find CPVE and this is a failure
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   681
        if (cpve != null) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   682
            if (cpve.getReason() == reason) {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   683
                result = true;
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   684
            } else {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   685
                System.out.println("CPVE Reason Mismatch: Expected = " +
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   686
                        reason + ", Actual = " + cpve.getReason());
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   687
            }
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   688
        } else {
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   689
            System.out.println("Failed to find an expected CPVE");
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   690
        }
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
   691
32032
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   692
        return result;
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   693
    }
22badc53802f 8046321: OCSP Stapling for TLS
jnimeh
parents:
diff changeset
   694
}