src/java.base/share/classes/sun/security/ssl/SSLExtensions.java
author wetmore
Fri, 11 May 2018 15:53:12 -0700
branchJDK-8145252-TLS13-branch
changeset 56542 56aaa6cb3693
parent 48225 src/java.base/share/classes/sun/security/ssl/HelloExtensions.java@718669e6b375
child 56584 a0f3377c58c7
permissions -rw-r--r--
Initial TLSv1.3 Implementation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     1
/*
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
     2
 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
90ce3da70b43 Initial load
duke
parents:
diff changeset
     4
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
90ce3da70b43 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1579
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1579
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    10
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
90ce3da70b43 Initial load
duke
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
90ce3da70b43 Initial load
duke
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
90ce3da70b43 Initial load
duke
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
90ce3da70b43 Initial load
duke
parents:
diff changeset
    15
 * accompanied this code).
90ce3da70b43 Initial load
duke
parents:
diff changeset
    16
 *
90ce3da70b43 Initial load
duke
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
90ce3da70b43 Initial load
duke
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
90ce3da70b43 Initial load
duke
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
90ce3da70b43 Initial load
duke
parents:
diff changeset
    20
 *
5506
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1579
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1579
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
202f599c92aa 6943119: Rebrand source copyright notices
ohair
parents: 1579
diff changeset
    23
 * questions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    24
 */
90ce3da70b43 Initial load
duke
parents:
diff changeset
    25
90ce3da70b43 Initial load
duke
parents:
diff changeset
    26
package sun.security.ssl;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    27
90ce3da70b43 Initial load
duke
parents:
diff changeset
    28
import java.io.IOException;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    29
import java.nio.ByteBuffer;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    30
import java.text.MessageFormat;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    31
import java.util.*;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    32
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    33
import sun.security.ssl.SSLHandshake.HandshakeMessage;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    34
import sun.security.util.HexDumpEncoder;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    35
90ce3da70b43 Initial load
duke
parents:
diff changeset
    36
/**
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    37
 * SSL/(D)TLS extensions in a handshake message.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    38
 */
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    39
final class SSLExtensions {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    40
    private final HandshakeMessage handshakeMessage;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    41
    private Map<SSLExtension, byte[]> extMap = new LinkedHashMap<>();
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    42
    private int encodedLength;
90ce3da70b43 Initial load
duke
parents:
diff changeset
    43
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    44
    // Extension map for debug logging
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    45
    private final Map<Integer, byte[]> logMap =
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    46
            SSLLogger.isOn ? null : new LinkedHashMap<>();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    47
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    48
    SSLExtensions(HandshakeMessage handshakeMessage) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    49
        this.handshakeMessage = handshakeMessage;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    50
        this.encodedLength = 2;         // 2: the length of the extensions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    51
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
    52
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    53
    SSLExtensions(HandshakeMessage hm,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    54
            ByteBuffer m, SSLExtension[] extensions) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    55
        this.handshakeMessage = hm;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    56
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    57
        int len = Record.getInt16(m);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    58
        encodedLength = len + 2;        // 2: the length of the extensions.
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
    59
        while (len > 0) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    60
            int extId = Record.getInt16(m);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    61
            int extLen = Record.getInt16(m);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    62
            if (extLen > m.remaining()) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    63
                hm.handshakeContext.conContext.fatal(Alert.ILLEGAL_PARAMETER,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    64
                        "Error parsing extension (" + extId +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    65
                        "): no sufficient data");
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    66
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    67
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    68
            SSLHandshake handshakeType = hm.handshakeType();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    69
            if (SSLExtension.isConsumable(extId) &&
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    70
                    SSLExtension.valueOf(handshakeType, extId) == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    71
                hm.handshakeContext.conContext.fatal(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    72
                        Alert.UNSUPPORTED_EXTENSION,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    73
                        "extension (" + extId +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    74
                        ") should not be presented in " + handshakeType.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    75
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    76
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    77
            boolean isSupported = false;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    78
            for (SSLExtension extension : extensions) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    79
                if ((extension.id != extId) ||
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    80
                        (extension.onLoadConcumer == null)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    81
                    continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    82
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    83
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    84
                if (extension.handshakeType != handshakeType) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    85
                    hm.handshakeContext.conContext.fatal(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    86
                            Alert.UNSUPPORTED_EXTENSION,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    87
                            "extension (" + extId + ") should not be " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    88
                            "presented in " + handshakeType.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    89
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    90
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    91
                byte[] extData = new byte[extLen];
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    92
                m.get(extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    93
                extMap.put(extension, extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    94
                if (logMap != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    95
                    logMap.put(extId, extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    96
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    97
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    98
                isSupported = true;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
    99
                break;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   100
            }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   101
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   102
            if (!isSupported) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   103
                if (logMap != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   104
                    // cache the extension for debug logging
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   105
                    byte[] extData = new byte[extLen];
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   106
                    m.get(extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   107
                    logMap.put(extId, extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   108
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   109
                    if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   110
                        SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   111
                                "Ignore unknown or unsupported extension",
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   112
                                toString(extId, extData));
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   113
                    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   114
                } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   115
                    // ignore the extension
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   116
                    int pos = m.position() + extLen;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   117
                    m.position(pos);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   118
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   119
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   120
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   121
            len -= extLen + 4;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   122
        }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   123
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   124
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   125
    byte[] get(SSLExtension ext) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   126
        return extMap.get(ext);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   127
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   128
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   129
    /**
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   130
     * Consume the specified extensions.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   131
     */
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   132
    void consumeOnLoad(HandshakeContext context,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   133
            SSLExtension[] extensions) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   134
        for (SSLExtension extension : extensions) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   135
            if (context.negotiatedProtocol != null &&
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   136
                    !extension.isAvailable(context.negotiatedProtocol)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   137
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   138
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   139
                        "Ignore unsupported extension: " + extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   140
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   141
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   142
                // context.conContext.fatal(Alert.UNSUPPORTED_EXTENSION,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   143
                //         context.negotiatedProtocol + " does not support " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   144
                //         extension + " extension");
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   145
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   146
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   147
            if (!extMap.containsKey(extension)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   148
                if (extension.onLoadAbsence != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   149
                    extension.absent(context, handshakeMessage);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   150
                } else if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   151
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   152
                        "Ignore unavailable extension: " + extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   153
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   154
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   155
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   156
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   157
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   158
            if (extension.onLoadConcumer == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   159
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   160
                    SSLLogger.warning(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   161
                        "Ignore unsupported extension: " + extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   162
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   163
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   164
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   165
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   166
            ByteBuffer m = ByteBuffer.wrap(extMap.get(extension));
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   167
            extension.consumeOnLoad(context, handshakeMessage, m);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   168
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   169
            if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   170
                SSLLogger.fine("Consumed extension: " + extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   171
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   172
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   173
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   174
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   175
    /**
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   176
     * Consider impact of the specified extensions.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   177
     */
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   178
    void consumeOnTrade(HandshakeContext context,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   179
            SSLExtension[] extensions) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   180
        for (SSLExtension extension : extensions) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   181
            if (!extMap.containsKey(extension)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   182
                // No impact could be expected, so just ignore the absence.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   183
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   184
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   185
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   186
            if (extension.onTradeConsumer == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   187
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   188
                    SSLLogger.warning(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   189
                            "Ignore impact of unsupported extension: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   190
                            extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   191
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   192
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   193
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   194
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   195
            extension.consumeOnTrade(context, handshakeMessage);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   196
            if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   197
                SSLLogger.fine("Populated with extension: " + extension.name);
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   198
            }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   199
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   200
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   201
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   202
    /**
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   203
     * Produce extension values for the specified extensions.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   204
     */
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   205
    void produce(HandshakeContext context,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   206
            SSLExtension[] extensions) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   207
        for (SSLExtension extension : extensions) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   208
            if (extMap.containsKey(extension)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   209
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   210
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   211
                            "Ignore, duplicated extension: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   212
                            extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   213
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   214
                continue;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   215
            }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   216
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   217
            if (extension.networkProducer == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   218
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   219
                    SSLLogger.warning(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   220
                            "Ignore, no extension producer defined: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   221
                            extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   222
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   223
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   224
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   225
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   226
            byte[] encoded = extension.produce(context, handshakeMessage);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   227
            if (encoded != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   228
                extMap.put(extension, encoded);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   229
                encodedLength += encoded.length + 4; // extension_type (2)
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   230
                                                     // extension_data length(2)
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   231
            } else if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   232
                // The extension is not available in the context.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   233
                SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   234
                        "Ignore, context unavailable extension: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   235
                        extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   236
            }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   237
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   238
    }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   239
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   240
    /**
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   241
     * Produce extension values for the specified extensions, replacing if
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   242
     * there is an existing extension value for a specified extension.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   243
     */
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   244
    void reproduce(HandshakeContext context,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   245
            SSLExtension[] extensions) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   246
        for (SSLExtension extension : extensions) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   247
            if (extension.networkProducer == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   248
                if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   249
                    SSLLogger.warning(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   250
                            "Ignore, no extension producer defined: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   251
                            extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   252
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   253
                continue;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   254
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   255
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   256
            byte[] encoded = extension.produce(context, handshakeMessage);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   257
            if (encoded != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   258
                if (extMap.containsKey(extension)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   259
                    byte[] old = extMap.replace(extension, encoded);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   260
                    if (old != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   261
                        encodedLength -= old.length + 4;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   262
                    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   263
                    encodedLength += encoded.length + 4;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   264
                } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   265
                    extMap.put(extension, encoded);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   266
                    encodedLength += encoded.length + 4;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   267
                                                    // extension_type (2)
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   268
                                                    // extension_data length(2)
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   269
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   270
            } else if (SSLLogger.isOn && SSLLogger.isOn("ssl,handshake")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   271
                // The extension is not available in the context.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   272
                SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   273
                        "Ignore, context unavailable extension: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   274
                        extension.name);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   275
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   276
        }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   277
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   278
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   279
    // Note that TLS 1.3 may use empty extensions.  Please consider it while
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   280
    // using this method.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   281
    int length() {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   282
        if (extMap.isEmpty()) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   283
            return 0;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   284
        } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   285
            return encodedLength;
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   286
        }
90ce3da70b43 Initial load
duke
parents:
diff changeset
   287
    }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   288
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   289
    // Note that TLS 1.3 may use empty extensions.  Please consider it while
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   290
    // using this method.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   291
    void send(HandshakeOutStream hos) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   292
        int extsLen = length();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   293
        if (extsLen == 0) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   294
            return;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   295
        }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   296
        hos.putInt16(extsLen - 2);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   297
        // extensions must be sent in the order they appear in the enum
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   298
        for (SSLExtension ext : SSLExtension.values()) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   299
            byte[] extData = extMap.get(ext);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   300
            if (extData != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   301
                hos.putInt16(ext.id);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   302
                hos.putBytes16(extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   303
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   304
        }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   305
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   306
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   307
    @Override
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   308
    public String toString() {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   309
        if (extMap.isEmpty() && (logMap == null || logMap.isEmpty())) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   310
            return "<no extension>";
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   311
        } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   312
            StringBuilder builder = new StringBuilder(512);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   313
            if (logMap != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   314
                for (Map.Entry<Integer, byte[]> en : logMap.entrySet()) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   315
                    SSLExtension ext = SSLExtension.valueOf(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   316
                            handshakeMessage.handshakeType(), en.getKey());
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   317
                    if (builder.length() != 0) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   318
                        builder.append(",\n");
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   319
                    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   320
                    if (ext != null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   321
                        builder.append(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   322
                                ext.toString(ByteBuffer.wrap(en.getValue())));
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   323
                    } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   324
                        builder.append(toString(en.getKey(), en.getValue()));
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   325
                    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   326
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   327
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   328
                return builder.toString();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   329
            } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   330
                for (Map.Entry<SSLExtension, byte[]> en : extMap.entrySet()) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   331
                    if (builder.length() != 0) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   332
                        builder.append(",\n");
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   333
                    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   334
                    builder.append(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   335
                        en.getKey().toString(ByteBuffer.wrap(en.getValue())));
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   336
                }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   337
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   338
                return builder.toString();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   339
            }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   340
        }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   341
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   342
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   343
    private static String toString(int extId, byte[] extData) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   344
        MessageFormat messageFormat = new MessageFormat(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   345
            "\"unknown extension ({0})\": '{'\n" +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   346
            "{1}\n" +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   347
            "'}'",
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   348
            Locale.ENGLISH);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   349
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   350
        HexDumpEncoder hexEncoder = new HexDumpEncoder();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   351
        String encoded = hexEncoder.encodeBuffer(extData);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   352
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   353
        Object[] messageFields = {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   354
            extId,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   355
            Utilities.indent(encoded)
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   356
        };
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   357
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   358
        return messageFormat.format(messageFields);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 48225
diff changeset
   359
    }
2
90ce3da70b43 Initial load
duke
parents:
diff changeset
   360
}