test/jdk/javax/net/ssl/SSLEngine/EngineCloseOnAlert.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:
41910
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     1
/*
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     2
 * Copyright (c) 2004, 2016, Oracle and/or its affiliates. All rights reserved.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     4
 *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     7
 * published by the Free Software Foundation.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     8
 *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    13
 * accompanied this code).
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    14
 *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    18
 *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    21
 * questions.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    22
 */
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    23
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    24
/*
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    25
 * @test
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    26
 * @bug 8133632
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    27
 * @summary javax.net.ssl.SSLEngine does not properly handle received
50768
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
    28
 *      SSL fatal alerts
68fa3d4026ea 8196584: TLS 1.3 Implementation
xuelei
parents: 47216
diff changeset
    29
 * @ignore the dependent implementation details are changed
41910
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    30
 * @run main/othervm EngineCloseOnAlert
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    31
 */
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    32
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    33
import java.io.FileInputStream;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    34
import java.io.IOException;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    35
import javax.net.ssl.*;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    36
import java.nio.ByteBuffer;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    37
import java.util.*;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    38
import java.security.*;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    39
import static javax.net.ssl.SSLEngineResult.HandshakeStatus.*;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    40
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    41
public class EngineCloseOnAlert {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    42
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    43
    private static final String pathToStores = "../etc";
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    44
    private static final String keyStoreFile = "keystore";
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    45
    private static final String trustStoreFile = "truststore";
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    46
    private static final String passwd = "passphrase";
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    47
    private static final String keyFilename =
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    48
            System.getProperty("test.src", ".") + "/" + pathToStores +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    49
                "/" + keyStoreFile;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    50
    private static final String trustFilename =
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    51
            System.getProperty("test.src", ".") + "/" + pathToStores +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    52
                "/" + trustStoreFile;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    53
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    54
    private static KeyManagerFactory KMF;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    55
    private static TrustManagerFactory TMF;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    56
    private static TrustManagerFactory EMPTY_TMF;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    57
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    58
    private static final String[] TLS10ONLY = { "TLSv1" };
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    59
    private static final String[] TLS12ONLY = { "TLSv1.2" };
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    60
    private static final String[] ONECIPHER =
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    61
            { "TLS_RSA_WITH_AES_128_CBC_SHA" };
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    62
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    63
    public interface TestCase {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    64
        public void runTest() throws Exception;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    65
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    66
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    67
    public static void main(String[] args) throws Exception {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    68
        int failed = 0;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    69
        List<TestCase> testMatrix = new LinkedList<TestCase>() {{
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    70
            add(clientReceivesAlert);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    71
            add(serverReceivesAlert);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    72
        }};
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    73
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    74
        // Create the various key/trust manager factories we'll need
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    75
        createManagerFactories();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    76
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    77
        for (TestCase test : testMatrix) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    78
            try {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    79
                test.runTest();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    80
            } catch (Exception e) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    81
                System.out.println("Exception in test:\n" + e);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    82
                e.printStackTrace(System.out);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    83
                failed++;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    84
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    85
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    86
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    87
        System.out.println("Total tests: " + testMatrix.size() + ", passed: " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    88
                (testMatrix.size() - failed) + ", failed: " + failed);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    89
        if (failed > 0) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    90
            throw new RuntimeException("One or more tests failed.");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    91
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    92
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    93
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    94
    private static final TestCase clientReceivesAlert = new TestCase() {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    95
        @Override
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    96
        public void runTest() throws Exception {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    97
            System.out.println("");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    98
            System.out.println("=======================================");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
    99
            System.out.println("Test: Client receives alert from server");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   100
            System.out.println("=======================================");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   101
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   102
            // For this test, we won't initialize any keystore so the
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   103
            // server will throw an exception because it has no key/cert to
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   104
            // match the requested ciphers offered by the client.  This
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   105
            // will generate an alert from the server to the client.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   106
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   107
            SSLContext context = SSLContext.getDefault();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   108
            SSLEngine client = context.createSSLEngine();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   109
            SSLEngine server = context.createSSLEngine();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   110
            client.setUseClientMode(true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   111
            server.setUseClientMode(false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   112
            SSLEngineResult clientResult;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   113
            SSLEngineResult serverResult;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   114
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   115
            ByteBuffer raw = ByteBuffer.allocate(32768);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   116
            ByteBuffer plain = ByteBuffer.allocate(32768);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   117
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   118
            // Generate the client hello and have the server unwrap it
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   119
            client.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   120
            checkEngineState(client, NEED_UNWRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   121
            raw.flip();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   122
            System.out.println("Client-to-Server:\n-----------------\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   123
                    dumpHexBytes(raw, 16, "\n", ":"));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   124
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   125
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   126
            // The server should need to run a delegated task while processing
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   127
            // the client hello data.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   128
            serverResult = server.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   129
            checkEngineState(server, NEED_TASK, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   130
            System.out.println("Server result: " + serverResult);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   131
            runDelegatedTasks(serverResult, server);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   132
            checkEngineState(server, NEED_WRAP, true, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   133
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   134
            try {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   135
                raw.clear();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   136
                serverResult = server.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   137
                System.out.println("Server result: " + serverResult);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   138
                runDelegatedTasks(serverResult, server);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   139
            } catch (SSLException e) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   140
                // This is the expected code path
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   141
                System.out.println("Server throws exception: " + e);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   142
                System.out.println("Server engine state: " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   143
                        "isInboundDone = "+ server.isInboundDone() +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   144
                        ", isOutboundDone = " + server.isOutboundDone() +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   145
                        ", handshake status = " + server.getHandshakeStatus());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   146
                checkEngineState(server, NEED_WRAP, true, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   147
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   148
            raw.clear();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   149
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   150
            // The above should show that isInboundDone returns true, and
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   151
            // handshake status is NEED_WRAP. That is the correct behavior,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   152
            // wrap will put a fatal alert message in the buffer.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   153
            serverResult = server.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   154
            System.out.println("Server result (wrap after exception): " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   155
                    serverResult);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   156
            System.out.println("Server engine closure state: isInboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   157
                    + server.isInboundDone() + ", isOutboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   158
                    + server.isOutboundDone());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   159
            checkEngineState(server, NEED_UNWRAP, true, true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   160
            raw.flip();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   161
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   162
            System.out.println("Server-to-Client:\n-----------------\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   163
                    dumpHexBytes(raw, 16, "\n", ":"));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   164
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   165
            // Client side will read the fatal alert and throw exception.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   166
            try {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   167
                clientResult = client.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   168
                System.out.println("Client result (unwrap alert): " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   169
                    clientResult);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   170
            } catch (SSLException e) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   171
                System.out.println("Client throws exception: " + e);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   172
                System.out.println("Engine closure status: isInboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   173
                        + client.isInboundDone() + ", isOutboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   174
                        + client.isOutboundDone() + ", handshake status="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   175
                        + client.getHandshakeStatus());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   176
                checkEngineState(client, NOT_HANDSHAKING, true, true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   177
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   178
            raw.clear();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   179
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   180
            // Last test, we try to unwrap
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   181
            clientResult = client.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   182
            checkEngineState(client, NOT_HANDSHAKING, true, true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   183
            System.out.println("Client result (wrap after exception): " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   184
                    clientResult);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   185
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   186
    };
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   187
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   188
    private static final TestCase serverReceivesAlert = new TestCase() {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   189
        @Override
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   190
        public void runTest() throws Exception {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   191
            SSLContext cliContext = SSLContext.getDefault();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   192
            SSLContext servContext = SSLContext.getInstance("TLS");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   193
            servContext.init(KMF.getKeyManagers(), TMF.getTrustManagers(),
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   194
                    null);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   195
            SSLEngine client = cliContext.createSSLEngine();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   196
            SSLEngine server = servContext.createSSLEngine();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   197
            client.setUseClientMode(true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   198
            client.setEnabledProtocols(TLS12ONLY);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   199
            client.setEnabledCipherSuites(ONECIPHER);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   200
            server.setUseClientMode(false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   201
            server.setEnabledProtocols(TLS10ONLY);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   202
            SSLEngineResult clientResult;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   203
            SSLEngineResult serverResult;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   204
            ByteBuffer raw = ByteBuffer.allocate(32768);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   205
            ByteBuffer plain = ByteBuffer.allocate(32768);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   206
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   207
            System.out.println("");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   208
            System.out.println("=======================================");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   209
            System.out.println("Test: Server receives alert from client");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   210
            System.out.println("=======================================");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   211
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   212
            // Generate the client hello and have the server unwrap it
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   213
            checkEngineState(client, NOT_HANDSHAKING, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   214
            client.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   215
            checkEngineState(client, NEED_UNWRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   216
            raw.flip();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   217
            System.out.println("Client-to-Server:\n-----------------\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   218
                    dumpHexBytes(raw, 16, "\n", ":"));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   219
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   220
            // The server should need to run a delegated task while processing
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   221
            // the client hello data.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   222
            serverResult = server.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   223
            checkEngineState(server, NEED_TASK, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   224
            runDelegatedTasks(serverResult, server);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   225
            checkEngineState(server, NEED_WRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   226
            raw.compact();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   227
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   228
            // The server should now wrap the response back to the client
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   229
            server.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   230
            checkEngineState(server, NEED_UNWRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   231
            raw.flip();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   232
            System.out.println("Server-to-Client:\n-----------------\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   233
                    dumpHexBytes(raw, 16, "\n", ":"));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   234
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   235
            // The client should parse this and throw an exception because
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   236
            // It is unwiling to do TLS 1.0
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   237
            clientResult = client.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   238
            checkEngineState(client, NEED_TASK, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   239
            runDelegatedTasks(clientResult, client);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   240
            checkEngineState(client, NEED_UNWRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   241
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   242
            try {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   243
                client.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   244
            } catch (SSLException e) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   245
                System.out.println("Client throws exception: " + e);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   246
                System.out.println("Engine closure status: isInboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   247
                        + client.isInboundDone() + ", isOutboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   248
                        + client.isOutboundDone() + ", handshake status="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   249
                        + client.getHandshakeStatus());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   250
                checkEngineState(client, NEED_WRAP, true, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   251
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   252
            raw.clear();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   253
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   254
            // Now the client should wrap the exception
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   255
            client.wrap(plain, raw);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   256
            checkEngineState(client, NEED_UNWRAP, true, true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   257
            raw.flip();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   258
            System.out.println("Client-to-Server:\n-----------------\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   259
                    dumpHexBytes(raw, 16, "\n", ":"));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   260
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   261
            try {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   262
                server.unwrap(raw, plain);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   263
                checkEngineState(server, NEED_UNWRAP, false, false);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   264
            } catch (SSLException e) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   265
                System.out.println("Server throws exception: " + e);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   266
                System.out.println("Engine closure status: isInboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   267
                        + server.isInboundDone() + ", isOutboundDone="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   268
                        + server.isOutboundDone() + ", handshake status="
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   269
                        + server.getHandshakeStatus());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   270
                checkEngineState(server, NOT_HANDSHAKING, true, true);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   271
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   272
            raw.clear();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   273
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   274
    };
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   275
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   276
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   277
    /*
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   278
     * If the result indicates that we have outstanding tasks to do,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   279
     * go ahead and run them in this thread.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   280
     */
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   281
    private static void runDelegatedTasks(SSLEngineResult result,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   282
            SSLEngine engine) throws Exception {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   283
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   284
        if (result.getHandshakeStatus() ==
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   285
                SSLEngineResult.HandshakeStatus.NEED_TASK) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   286
            Runnable runnable;
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   287
            while ((runnable = engine.getDelegatedTask()) != null) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   288
                System.out.println("\trunning delegated task...");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   289
                runnable.run();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   290
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   291
            SSLEngineResult.HandshakeStatus hsStatus =
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   292
                    engine.getHandshakeStatus();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   293
            if (hsStatus == SSLEngineResult.HandshakeStatus.NEED_TASK) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   294
                throw new Exception(
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   295
                    "handshake shouldn't need additional tasks");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   296
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   297
            System.out.println("\tnew HandshakeStatus: " + hsStatus);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   298
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   299
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   300
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   301
    /**
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   302
     *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   303
     * @param data The array of bytes to dump to stdout.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   304
     * @param itemsPerLine The number of bytes to display per line
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   305
     * if the {@code lineDelim} character is blank then all bytes will be
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   306
     * printed on a single line.
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   307
     * @param lineDelim The delimiter between lines
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   308
     * @param itemDelim The delimiter between bytes
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   309
     *
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   310
     * @return The hexdump of the byte array
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   311
     */
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   312
    private static String dumpHexBytes(ByteBuffer data, int itemsPerLine,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   313
            String lineDelim, String itemDelim) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   314
        StringBuilder sb = new StringBuilder();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   315
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   316
        if (data != null) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   317
            data.mark();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   318
            for (int i = 0; i < data.limit(); i++) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   319
                if (i % itemsPerLine == 0 && i != 0) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   320
                    sb.append(lineDelim);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   321
                }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   322
                sb.append(String.format("%02X", data.get(i)));
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   323
                if (i % itemsPerLine != (itemsPerLine - 1) &&
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   324
                        i != (data.limit() -1)) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   325
                    sb.append(itemDelim);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   326
                }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   327
            }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   328
            data.reset();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   329
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   330
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   331
        return sb.toString();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   332
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   333
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   334
    private static void createManagerFactories()
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   335
            throws GeneralSecurityException, IOException {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   336
        KeyStore keystore = KeyStore.getInstance("PKCS12");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   337
        KeyStore truststore = KeyStore.getInstance("PKCS12");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   338
        KeyStore empty_ts = KeyStore.getInstance("PKCS12");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   339
        char[] passphrase = passwd.toCharArray();
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   340
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   341
        keystore.load(new FileInputStream(keyFilename), passphrase);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   342
        truststore.load(new FileInputStream(trustFilename), passphrase);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   343
        empty_ts.load(null, "".toCharArray());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   344
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   345
        KMF = KeyManagerFactory.getInstance("PKIX");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   346
        KMF.init(keystore, passphrase);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   347
        TMF = TrustManagerFactory.getInstance("PKIX");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   348
        TMF.init(truststore);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   349
        EMPTY_TMF = TrustManagerFactory.getInstance("PKIX");
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   350
        EMPTY_TMF.init(truststore);
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   351
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   352
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   353
    private static void checkEngineState(SSLEngine engine,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   354
            SSLEngineResult.HandshakeStatus expectedHSStat,
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   355
            boolean expectedInboundDone, boolean expectedOutboundDone) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   356
        if (engine.getHandshakeStatus() != expectedHSStat ||
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   357
                engine.isInboundDone() != expectedInboundDone ||
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   358
                engine.isOutboundDone() != expectedOutboundDone) {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   359
            throw new RuntimeException("Error: engine not in expected state\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   360
                    "Expected: state = " + expectedHSStat +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   361
                    ", inDone = " + expectedInboundDone +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   362
                    ", outDone = " + expectedOutboundDone + "\n" +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   363
                    "Actual: state = " + engine.getHandshakeStatus() +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   364
                    ", inDone = " + engine.isInboundDone() +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   365
                    ", outDone = " + engine.isOutboundDone());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   366
        } else {
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   367
            System.out.println((engine.getUseClientMode() ?
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   368
                    "Client" : "Server") + " handshake status: " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   369
                    engine.getHandshakeStatus() + ", inDone = " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   370
                    engine.isInboundDone() + ", outDone = " +
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   371
                    engine.isOutboundDone());
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   372
        }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   373
    }
1383904abbd0 8133632: javax.net.ssl.SSLEngine does not properly handle received SSL fatal alerts
jnimeh
parents:
diff changeset
   374
}