src/java.base/share/classes/sun/security/ssl/DTLSInputRecord.java
author wetmore
Fri, 11 May 2018 15:53:12 -0700
branchJDK-8145252-TLS13-branch
changeset 56542 56aaa6cb3693
parent 47478 438e0c9f2f17
child 56646 e57205a6e4ee
permissions -rw-r--r--
Initial TLSv1.3 Implementation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     1
/*
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
     2
 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     4
 *
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    10
 *
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    15
 * accompanied this code).
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    16
 *
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    20
 *
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 9406+5 USA
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    23
 * questions.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    24
 */
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    25
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    26
package sun.security.ssl;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    27
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    28
import java.io.*;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    29
import java.nio.*;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    30
import java.security.GeneralSecurityException;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    31
import java.util.*;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    32
import javax.crypto.BadPaddingException;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    33
import javax.net.ssl.*;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    34
import sun.security.ssl.SSLCipher.SSLReadCipher;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    35
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    36
/**
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    37
 * DTLS {@code InputRecord} implementation for {@code SSLEngine}.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    38
 */
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    39
final class DTLSInputRecord extends InputRecord implements DTLSRecord {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    40
    private DTLSReassembler reassembler = null;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    41
    private int             readEpoch;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    42
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    43
    DTLSInputRecord(HandshakeHash handshakeHash) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    44
        super(handshakeHash, SSLReadCipher.nullDTlsReadCipher());
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    45
        this.readEpoch = 0;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    46
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    47
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    48
    @Override
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    49
    void changeReadCiphers(SSLReadCipher readCipher) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    50
        this.readCipher = readCipher;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    51
        this.readEpoch++;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    52
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    53
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    54
    @Override
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 30904
diff changeset
    55
    public synchronized void close() throws IOException {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    56
        if (!isClosed) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    57
            super.close();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    58
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    59
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    60
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    61
    @Override
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    62
    boolean isEmpty() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    63
        return ((reassembler == null) || reassembler.isEmpty());
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    64
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    65
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    66
    @Override
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    67
    int estimateFragmentSize(int packetSize) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    68
        if (packetSize > 0) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    69
            return readCipher.estimateFragmentSize(packetSize, headerSize);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    70
        } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    71
            return Record.maxDataSize;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    72
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    73
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    74
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    75
    @Override
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    76
    void expectingFinishFlight() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    77
        if (reassembler != null) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    78
            reassembler.expectingFinishFlight();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    79
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    80
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    81
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    82
    @Override
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    83
    void finishHandshake() {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    84
        reassembler = null;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    85
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    86
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    87
    @Override
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    88
    Plaintext acquirePlaintext() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    89
        if (reassembler != null) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
    90
            return reassembler.acquirePlaintext();
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    91
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    92
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    93
        return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    94
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
    95
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    96
     @Override
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    97
    Plaintext[] decode(ByteBuffer[] srcs, int srcsOffset,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    98
            int srcsLength) throws IOException, BadPaddingException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
    99
        if (srcs == null || srcs.length == 0 || srcsLength == 0) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   100
            Plaintext pt = acquirePlaintext();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   101
            return pt == null ? new Plaintext[0] : new Plaintext[] { pt };
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   102
        } else if (srcsLength == 1) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   103
            return decode(srcs[srcsOffset]);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   104
        } else {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   105
            ByteBuffer packet = extract(srcs,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   106
                    srcsOffset, srcsLength, DTLSRecord.headerSize);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   107
            return decode(packet);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   108
        }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   109
    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   110
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   111
    Plaintext[] decode(ByteBuffer packet) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   112
        if (isClosed) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   113
            return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   114
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   115
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   116
        if (SSLLogger.isOn && SSLLogger.isOn("packet")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   117
            SSLLogger.fine("Raw read", packet);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   118
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   119
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   120
        // The caller should have validated the record.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   121
        int srcPos = packet.position();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   122
        int srcLim = packet.limit();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   123
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   124
        byte contentType = packet.get();                   // pos: 0
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   125
        byte majorVersion = packet.get();                  // pos: 1
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   126
        byte minorVersion = packet.get();                  // pos: 2
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   127
        byte[] recordEnS = new byte[8];                    // epoch + seqence
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   128
        packet.get(recordEnS);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   129
        int recordEpoch = ((recordEnS[0] & 0xFF) << 8) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   130
                           (recordEnS[1] & 0xFF);          // pos: 3, 4
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   131
        long recordSeq  = ((recordEnS[2] & 0xFFL) << 40) |
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   132
                          ((recordEnS[3] & 0xFFL) << 32) |
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   133
                          ((recordEnS[4] & 0xFFL) << 24) |
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   134
                          ((recordEnS[5] & 0xFFL) << 16) |
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   135
                          ((recordEnS[6] & 0xFFL) <<  8) |
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   136
                           (recordEnS[7] & 0xFFL);         // pos: 5-10
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   137
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   138
        int contentLen = ((packet.get() & 0xFF) << 8) |
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   139
                          (packet.get() & 0xFF);           // pos: 11, 12
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   140
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   141
        if (SSLLogger.isOn && SSLLogger.isOn("record")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   142
            SSLLogger.fine("READ: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   143
                    ProtocolVersion.nameOf(majorVersion, minorVersion) +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   144
                    " " + ContentType.nameOf(contentType) + ", length = " +
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   145
                    contentLen);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   146
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   147
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   148
        int recLim = srcPos + DTLSRecord.headerSize + contentLen;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   149
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   150
        if (this.readEpoch > recordEpoch) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   151
            // Reset the position of the packet buffer.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   152
            packet.position(recLim);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   153
            if (SSLLogger.isOn && SSLLogger.isOn("record")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   154
                SSLLogger.fine("READ: discard this old record", recordEnS);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   155
            }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   156
            return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   157
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   158
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   159
        // Buffer next epoch message if necessary.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   160
        if (this.readEpoch < recordEpoch) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   161
            // Discard the record younger than the current epcoh if:
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   162
            // 1. it is not a handshake message, or
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   163
            // 3. it is not of next epoch.
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   164
            if ((contentType != ContentType.HANDSHAKE.id &&
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   165
                    contentType != ContentType.CHANGE_CIPHER_SPEC.id) ||
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   166
                (reassembler == null &&
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   167
                    contentType != ContentType.HANDSHAKE.id) ||
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   168
                (this.readEpoch < (recordEpoch - 1))) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   169
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   170
                packet.position(recLim);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   171
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   172
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   173
                    SSLLogger.fine("Premature record (epoch), discard it.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   174
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   175
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   176
                return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   177
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   178
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   179
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   180
            // Not ready to decrypt this record, may be an encrypted Finished
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   181
            // message, need to buffer it.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   182
            byte[] fragment = new byte[contentLen];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   183
            packet.get(fragment);              // copy the fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   184
            RecordFragment buffered = new RecordFragment(fragment, contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   185
                    majorVersion, minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   186
                    recordEnS, recordEpoch, recordSeq, true);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   187
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   188
            if (reassembler == null) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   189
                reassembler = new DTLSReassembler(recordEpoch);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   190
            }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   191
            reassembler.queueUpFragment(buffered);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   192
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   193
            // consume the full record in the packet buffer.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   194
            packet.position(recLim);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   195
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   196
            Plaintext pt = reassembler.acquirePlaintext();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   197
            return pt == null ? null : new Plaintext[] { pt };
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   198
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   199
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   200
        //
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   201
        // Now, the message is of this epoch.
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   202
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   203
        // decrypt the fragment
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   204
        packet.limit(recLim);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   205
        packet.position(srcPos + DTLSRecord.headerSize);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   206
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   207
        ByteBuffer plaintextFragment;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   208
        try {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   209
            Plaintext plaintext =
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   210
                    readCipher.decrypt(contentType, packet, recordEnS);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   211
            plaintextFragment = plaintext.fragment;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   212
            contentType = plaintext.contentType;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   213
        } catch (GeneralSecurityException gse) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   214
            if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   215
                SSLLogger.fine("Discard invalid record: " + gse);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   216
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   217
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   218
            // invalid, discard this record [section 4.1.2.7, RFC 6347]
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   219
            return null;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   220
        } finally {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   221
            // comsume a complete record
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   222
            packet.limit(srcLim);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   223
            packet.position(recLim);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   224
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   225
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   226
        if (contentType != ContentType.CHANGE_CIPHER_SPEC.id &&
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   227
            contentType != ContentType.HANDSHAKE.id) {   // app data or alert
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   228
                                                    // no retransmission
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   229
            // Cleanup the handshake reassembler if necessary.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   230
            if ((reassembler != null) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   231
                    (reassembler.handshakeEpoch < recordEpoch)) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   232
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   233
                    SSLLogger.fine("Cleanup the handshake reassembler");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   234
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   235
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   236
                reassembler = null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   237
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   238
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   239
            return new Plaintext[] {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   240
                    new Plaintext(contentType, majorVersion, minorVersion,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   241
                            recordEpoch, Authenticator.toLong(recordEnS),
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   242
                            plaintextFragment)};
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   243
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   244
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   245
        if (contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   246
            if (reassembler == null) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   247
                reassembler = new DTLSReassembler(recordEpoch);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   248
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   249
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   250
            reassembler.queueUpChangeCipherSpec(
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   251
                    new RecordFragment(plaintextFragment, contentType,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   252
                            majorVersion, minorVersion,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   253
                            recordEnS, recordEpoch, recordSeq, false));
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   254
        } else {    // handshake record
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   255
            // One record may contain 1+ more handshake messages.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   256
            while (plaintextFragment.remaining() > 0) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   257
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   258
                HandshakeFragment hsFrag = parseHandshakeMessage(
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   259
                    contentType, majorVersion, minorVersion,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   260
                    recordEnS, recordEpoch, recordSeq, plaintextFragment);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   261
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   262
                if (hsFrag == null) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   263
                    // invalid, discard this record
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   264
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   265
                        SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   266
                                "Invalid handshake message, discard it.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   267
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   268
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   269
                    return null;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   270
                }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   271
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   272
                if (reassembler == null) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   273
                    reassembler = new DTLSReassembler(recordEpoch);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   274
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   275
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   276
                reassembler.queueUpHandshake(hsFrag);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   277
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   278
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   279
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   280
        // Completed the read of the full record.  Acquire the reassembled
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   281
        // messages.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   282
        if (reassembler != null) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   283
            Plaintext pt = reassembler.acquirePlaintext();
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   284
            return pt == null ? null : new Plaintext[] { pt };
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   285
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   286
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   287
        if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   288
             SSLLogger.fine("The reassembler is not initialized yet.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   289
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   290
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   291
        return null;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   292
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   293
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   294
    @Override
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   295
    int bytesInCompletePacket(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   296
        ByteBuffer[] srcs, int srcsOffset, int srcsLength) throws IOException {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   297
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   298
        return bytesInCompletePacket(srcs[srcsOffset]);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   299
    }
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   300
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   301
    private int bytesInCompletePacket(ByteBuffer packet) throws SSLException {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   302
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   303
        // DTLS length field is in bytes 11/12
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   304
        if (packet.remaining() < headerSize) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   305
            return -1;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   306
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   307
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   308
        // Last sanity check that it's not a wild record
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   309
        int pos = packet.position();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   310
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   311
        // Check the content type of the record.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   312
        byte contentType = packet.get(pos);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   313
        if (ContentType.valueOf(contentType) == null) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   314
            throw new SSLException(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   315
                    "Unrecognized SSL message, plaintext connection?");
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   316
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   317
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   318
        // Check the protocol version of the record.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   319
        byte majorVersion = packet.get(pos + 1);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   320
        byte minorVersion = packet.get(pos + 2);
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   321
        if (!ProtocolVersion.isNegotiable(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   322
                majorVersion, minorVersion, true, false)) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   323
            throw new SSLException("Unrecognized record version " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   324
                    ProtocolVersion.nameOf(majorVersion, minorVersion) +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   325
                    " , plaintext connection?");
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   326
        }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   327
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   328
        // Get the fragment length of the record.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   329
        int fragLen = ((packet.get(pos + 11) & 0xFF) << 8) +
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   330
                       (packet.get(pos + 12) & 0xFF) + headerSize;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   331
        if (fragLen > Record.maxFragmentSize) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   332
            throw new SSLException(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   333
                    "Record overflow, fragment length (" + fragLen +
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   334
                    ") MUST not exceed " + Record.maxFragmentSize);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   335
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   336
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   337
        return fragLen;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   338
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   339
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   340
    private static HandshakeFragment parseHandshakeMessage(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   341
            byte contentType, byte majorVersion, byte minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   342
            byte[] recordEnS, int recordEpoch, long recordSeq,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   343
            ByteBuffer plaintextFragment) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   344
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   345
        int remaining = plaintextFragment.remaining();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   346
        if (remaining < handshakeHeaderSize) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   347
            if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   348
                SSLLogger.fine("Discard invalid record: " +
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   349
                        "too small record to hold a handshake fragment");
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   350
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   351
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   352
            // invalid, discard this record [section 4.1.2.7, RFC 6347]
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   353
            return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   354
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   355
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   356
        byte handshakeType = plaintextFragment.get();       // pos: 0
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   357
        int messageLength =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   358
                ((plaintextFragment.get() & 0xFF) << 16) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   359
                ((plaintextFragment.get() & 0xFF) << 8) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   360
                 (plaintextFragment.get() & 0xFF);          // pos: 1-3
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   361
        int messageSeq =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   362
                ((plaintextFragment.get() & 0xFF) << 8) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   363
                 (plaintextFragment.get() & 0xFF);          // pos: 4/5
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   364
        int fragmentOffset =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   365
                ((plaintextFragment.get() & 0xFF) << 16) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   366
                ((plaintextFragment.get() & 0xFF) << 8) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   367
                 (plaintextFragment.get() & 0xFF);          // pos: 6-8
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   368
        int fragmentLength =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   369
                ((plaintextFragment.get() & 0xFF) << 16) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   370
                ((plaintextFragment.get() & 0xFF) << 8) |
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   371
                 (plaintextFragment.get() & 0xFF);          // pos: 9-11
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   372
        if ((remaining - handshakeHeaderSize) < fragmentLength) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   373
            if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   374
                SSLLogger.fine("Discard invalid record: " +
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   375
                        "not a complete handshake fragment in the record");
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   376
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   377
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   378
            // invalid, discard this record [section 4.1.2.7, RFC 6347]
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   379
            return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   380
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   381
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   382
        byte[] fragment = new byte[fragmentLength];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   383
        plaintextFragment.get(fragment);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   384
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   385
        return new HandshakeFragment(fragment, contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   386
                majorVersion, minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   387
                recordEnS, recordEpoch, recordSeq,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   388
                handshakeType, messageLength,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   389
                messageSeq, fragmentOffset, fragmentLength);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   390
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   391
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   392
    // buffered record fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   393
    private static class RecordFragment implements Comparable<RecordFragment> {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   394
        boolean         isCiphertext;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   395
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   396
        byte            contentType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   397
        byte            majorVersion;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   398
        byte            minorVersion;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   399
        int             recordEpoch;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   400
        long            recordSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   401
        byte[]          recordEnS;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   402
        byte[]          fragment;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   403
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   404
        RecordFragment(ByteBuffer fragBuf, byte contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   405
                byte majorVersion, byte minorVersion, byte[] recordEnS,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   406
                int recordEpoch, long recordSeq, boolean isCiphertext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   407
            this((byte[])null, contentType, majorVersion, minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   408
                    recordEnS, recordEpoch, recordSeq, isCiphertext);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   409
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   410
            this.fragment = new byte[fragBuf.remaining()];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   411
            fragBuf.get(this.fragment);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   412
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   413
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   414
        RecordFragment(byte[] fragment, byte contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   415
                byte majorVersion, byte minorVersion, byte[] recordEnS,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   416
                int recordEpoch, long recordSeq, boolean isCiphertext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   417
            this.isCiphertext = isCiphertext;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   418
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   419
            this.contentType = contentType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   420
            this.majorVersion = majorVersion;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   421
            this.minorVersion = minorVersion;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   422
            this.recordEpoch = recordEpoch;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   423
            this.recordSeq = recordSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   424
            this.recordEnS = recordEnS;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   425
            this.fragment = fragment;       // The caller should have cloned
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   426
                                            // the buffer if necessary.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   427
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   428
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   429
        @Override
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   430
        public int compareTo(RecordFragment o) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   431
            if (this.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   432
                if (o.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   433
                    // Only one incoming ChangeCipherSpec message for an epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   434
                    //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   435
                    // Ignore duplicated ChangeCipherSpec messages.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   436
                    return Integer.compare(this.recordEpoch, o.recordEpoch);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   437
                } else if ((this.recordEpoch == o.recordEpoch) &&
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   438
                        (o.contentType == ContentType.HANDSHAKE.id)) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   439
                    // ChangeCipherSpec is the latest message of an epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   440
                    return 1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   441
                }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   442
            } else if (o.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   443
                if ((this.recordEpoch == o.recordEpoch) &&
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   444
                        (this.contentType == ContentType.HANDSHAKE.id)) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   445
                    // ChangeCipherSpec is the latest message of an epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   446
                    return -1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   447
                } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   448
                    // different epoch or this is not a handshake message
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   449
                    return compareToSequence(o.recordEpoch, o.recordSeq);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   450
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   451
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   452
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   453
            return compareToSequence(o.recordEpoch, o.recordSeq);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   454
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   455
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   456
        int compareToSequence(int epoch, long seq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   457
            if (this.recordEpoch > epoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   458
                return 1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   459
            } else if (this.recordEpoch == epoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   460
                return Long.compare(this.recordSeq, seq);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   461
            } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   462
                return -1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   463
            }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   464
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   465
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   466
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   467
    // buffered handshake message
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   468
    private static final class HandshakeFragment extends RecordFragment {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   469
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   470
        byte            handshakeType;     // handshake msg_type
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   471
        int             messageSeq;        // message_seq
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   472
        int             messageLength;     // Handshake body length
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   473
        int             fragmentOffset;    // fragment_offset
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   474
        int             fragmentLength;    // fragment_length
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   475
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   476
        HandshakeFragment(byte[] fragment, byte contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   477
                byte majorVersion, byte minorVersion, byte[] recordEnS,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   478
                int recordEpoch, long recordSeq,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   479
                byte handshakeType, int messageLength,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   480
                int messageSeq, int fragmentOffset, int fragmentLength) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   481
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   482
            super(fragment, contentType, majorVersion, minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   483
                    recordEnS, recordEpoch , recordSeq, false);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   484
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   485
            this.handshakeType = handshakeType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   486
            this.messageSeq = messageSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   487
            this.messageLength = messageLength;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   488
            this.fragmentOffset = fragmentOffset;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   489
            this.fragmentLength = fragmentLength;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   490
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   491
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   492
        @Override
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   493
        public int compareTo(RecordFragment o) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   494
            if (o instanceof HandshakeFragment) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   495
                HandshakeFragment other = (HandshakeFragment)o;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   496
                if (this.messageSeq != other.messageSeq) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   497
                    // keep the insertion order of handshake messages
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   498
                    return this.messageSeq - other.messageSeq;
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   499
                } else if (this.fragmentOffset != other.fragmentOffset) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   500
                    // small fragment offset was transmitted first
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   501
                    return this.fragmentOffset - other.fragmentOffset;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   502
                } else if (this.fragmentLength == other.fragmentLength) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   503
                    // retransmissions, ignore duplicated messages.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   504
                    return 0;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   505
                }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   506
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   507
                // Should be repacked for suitable fragment length.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   508
                //
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   509
                // Note that the acquiring processes will reassemble the
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   510
                // the fragments later.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   511
                return compareToSequence(o.recordEpoch, o.recordSeq);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   512
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   513
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   514
            return super.compareTo(o);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   515
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   516
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   517
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   518
    private static final class HoleDescriptor {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   519
        int offset;             // fragment_offset
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   520
        int limit;              // fragment_offset + fragment_length
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   521
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   522
        HoleDescriptor(int offset, int limit) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   523
            this.offset = offset;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   524
            this.limit = limit;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   525
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   526
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   527
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   528
    private static final class HandshakeFlight implements Cloneable {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   529
        static final byte HF_UNKNOWN = SSLHandshake.NOT_APPLICABLE.id;
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   530
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   531
        byte        handshakeType;      // handshake type
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   532
        int         flightEpoch;        // the epoch of the first message
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   533
        int         minMessageSeq;      // minimal message sequence
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   534
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   535
        int         maxMessageSeq;      // maximum message sequence
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   536
        int         maxRecordEpoch;     // maximum record sequence number
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   537
        long        maxRecordSeq;       // maximum record sequence number
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   538
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   539
        HashMap<Byte, List<HoleDescriptor>> holesMap;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   540
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   541
        HandshakeFlight() {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   542
            this.handshakeType = HF_UNKNOWN;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   543
            this.flightEpoch = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   544
            this.minMessageSeq = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   545
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   546
            this.maxMessageSeq = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   547
            this.maxRecordEpoch = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   548
            this.maxRecordSeq = -1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   549
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   550
            this.holesMap = new HashMap<>(5);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   551
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   552
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   553
        boolean isRetransmitOf(HandshakeFlight hs) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   554
            return (hs != null) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   555
                   (this.handshakeType == hs.handshakeType) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   556
                   (this.minMessageSeq == hs.minMessageSeq);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   557
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   558
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   559
        @Override
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   560
        public Object clone() {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   561
            HandshakeFlight hf = new HandshakeFlight();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   562
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   563
            hf.handshakeType = this.handshakeType;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   564
            hf.flightEpoch = this.flightEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   565
            hf.minMessageSeq = this.minMessageSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   566
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   567
            hf.maxMessageSeq = this.maxMessageSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   568
            hf.maxRecordEpoch = this.maxRecordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   569
            hf.maxRecordSeq = this.maxRecordSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   570
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   571
            hf.holesMap = new HashMap<>(this.holesMap);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   572
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   573
            return hf;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   574
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   575
    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   576
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   577
    final class DTLSReassembler {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   578
        // The handshake epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   579
        final int handshakeEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   580
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   581
        // The buffered fragments.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   582
        TreeSet<RecordFragment> bufferedFragments = new TreeSet<>();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   583
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   584
        // The handshake flight in progress.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   585
        HandshakeFlight handshakeFlight = new HandshakeFlight();
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   586
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   587
        // The preceding handshake flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   588
        HandshakeFlight precedingFlight = null;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   589
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   590
        // Epoch, sequence number and handshake message sequence of the
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   591
        // next message acquisition of a flight.
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   592
        int         nextRecordEpoch;        // next record epoch
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   593
        long        nextRecordSeq = 0;      // next record sequence number
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   594
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   595
        // Expect ChangeCipherSpec and Finished messages for the final flight.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   596
        boolean     expectCCSFlight = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   597
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   598
        // Ready to process this flight if received all messages of the flight.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   599
        boolean     flightIsReady = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   600
        boolean     needToCheckFlight = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   601
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   602
        DTLSReassembler(int handshakeEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   603
            this.handshakeEpoch = handshakeEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   604
            this.nextRecordEpoch = handshakeEpoch;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   605
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   606
            this.handshakeFlight.flightEpoch = handshakeEpoch;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   607
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   608
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   609
        void expectingFinishFlight() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   610
            expectCCSFlight = true;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   611
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   612
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   613
        // Queue up a handshake message.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   614
        void queueUpHandshake(HandshakeFragment hsf) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   615
            if (!isDesirable(hsf)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   616
                // Not a dedired record, discard it.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   617
                return;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   618
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   619
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   620
            // Clean up the retransmission messages if necessary.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   621
            cleanUpRetransmit(hsf);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   622
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   623
            // Is it the first message of next flight?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   624
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   625
            // Note: the Finished message is handled in the final CCS flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   626
            boolean isMinimalFlightMessage = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   627
            if (handshakeFlight.minMessageSeq == hsf.messageSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   628
                isMinimalFlightMessage = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   629
            } else if ((precedingFlight != null) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   630
                    (precedingFlight.minMessageSeq == hsf.messageSeq)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   631
                isMinimalFlightMessage = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   632
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   633
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   634
            if (isMinimalFlightMessage && (hsf.fragmentOffset == 0) &&
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   635
                    (hsf.handshakeType != SSLHandshake.FINISHED.id)) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   636
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   637
                // reset the handshake flight
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   638
                handshakeFlight.handshakeType = hsf.handshakeType;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   639
                handshakeFlight.flightEpoch = hsf.recordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   640
                handshakeFlight.minMessageSeq = hsf.messageSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   641
            }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   642
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   643
            if (hsf.handshakeType == SSLHandshake.FINISHED.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   644
                handshakeFlight.maxMessageSeq = hsf.messageSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   645
                handshakeFlight.maxRecordEpoch = hsf.recordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   646
                handshakeFlight.maxRecordSeq = hsf.recordSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   647
            } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   648
                if (handshakeFlight.maxMessageSeq < hsf.messageSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   649
                    handshakeFlight.maxMessageSeq = hsf.messageSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   650
                }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   651
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   652
                int n = (hsf.recordEpoch - handshakeFlight.maxRecordEpoch);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   653
                if (n > 0) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   654
                    handshakeFlight.maxRecordEpoch = hsf.recordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   655
                    handshakeFlight.maxRecordSeq = hsf.recordSeq;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   656
                } else if (n == 0) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   657
                    // the same epoch
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   658
                    if (handshakeFlight.maxRecordSeq < hsf.recordSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   659
                        handshakeFlight.maxRecordSeq = hsf.recordSeq;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   660
                    }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   661
                }   // Otherwise, it is unlikely to happen.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   662
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   663
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   664
            boolean fragmented = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   665
            if ((hsf.fragmentOffset) != 0 ||
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   666
                (hsf.fragmentLength != hsf.messageLength)) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   667
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   668
                fragmented = true;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   669
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   670
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   671
            List<HoleDescriptor> holes =
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   672
                    handshakeFlight.holesMap.get(hsf.handshakeType);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   673
            if (holes == null) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   674
                if (!fragmented) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   675
                    holes = Collections.emptyList();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   676
                } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   677
                    holes = new LinkedList<HoleDescriptor>();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   678
                    holes.add(new HoleDescriptor(0, hsf.messageLength));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   679
                }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   680
                handshakeFlight.holesMap.put(hsf.handshakeType, holes);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   681
            } else if (holes.isEmpty()) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   682
                // Have got the full handshake message.  This record may be
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   683
                // a handshake message retransmission.  Discard this record.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   684
                //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   685
                // It's OK to discard retransmission as the handshake hash
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   686
                // is computed as if each handshake message had been sent
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   687
                // as a single fragment.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   688
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   689
                    SSLLogger.fine("Have got the full message, discard it.");
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   690
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   691
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   692
                return;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   693
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   694
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   695
            if (fragmented) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   696
                int fragmentLimit = hsf.fragmentOffset + hsf.fragmentLength;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   697
                for (int i = 0; i < holes.size(); i++) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   698
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   699
                    HoleDescriptor hole = holes.get(i);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   700
                    if ((hole.limit <= hsf.fragmentOffset) ||
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   701
                        (hole.offset >= fragmentLimit)) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   702
                        // Also discard overlapping handshake retransmissions.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   703
                        continue;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   704
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   705
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   706
                    // The ranges SHOULD NOT overlap.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   707
                    if (((hole.offset > hsf.fragmentOffset) &&
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   708
                         (hole.offset < fragmentLimit)) ||
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   709
                        ((hole.limit > hsf.fragmentOffset) &&
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   710
                         (hole.limit < fragmentLimit))) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   711
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   712
                        if (SSLLogger.isOn && SSLLogger.isOn("ssl")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   713
                            SSLLogger.fine("Discard invalid record: " +
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   714
                                "handshake fragment ranges are overlapping");
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   715
                        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   716
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   717
                        // invalid, discard it [section 4.1.2.7, RFC 6347]
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   718
                        return;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   719
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   720
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   721
                    // This record interacts with this hole, fill the hole.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   722
                    holes.remove(i);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   723
                    // i--;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   724
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   725
                    if (hsf.fragmentOffset > hole.offset) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   726
                        holes.add(new HoleDescriptor(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   727
                                hole.offset, hsf.fragmentOffset));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   728
                        // i++;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   729
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   730
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   731
                    if (fragmentLimit < hole.limit) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   732
                        holes.add(new HoleDescriptor(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   733
                                fragmentLimit, hole.limit));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   734
                        // i++;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   735
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   736
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   737
                    // As no ranges overlap, no interact with other holes.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   738
                    break;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   739
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   740
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   741
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   742
            // buffer this fragment
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   743
            if (hsf.handshakeType == SSLHandshake.FINISHED.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   744
                // Need no status update.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   745
                bufferedFragments.add(hsf);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   746
            } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   747
                bufferFragment(hsf);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   748
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   749
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   750
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   751
        // Queue up a ChangeCipherSpec message
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   752
        void queueUpChangeCipherSpec(RecordFragment rf) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   753
            if (!isDesirable(rf)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   754
                // Not a dedired record, discard it.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   755
                return;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   756
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   757
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   758
            // Clean up the retransmission messages if necessary.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   759
            cleanUpRetransmit(rf);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   760
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   761
            // Is it the first message of this flight?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   762
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   763
            // Note: the first message of the final flight is ChangeCipherSpec.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   764
            if (expectCCSFlight) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   765
                handshakeFlight.handshakeType = HandshakeFlight.HF_UNKNOWN;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   766
                handshakeFlight.flightEpoch = rf.recordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   767
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   768
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   769
            // The epoch should be the same as the first message of the flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   770
            if (handshakeFlight.maxRecordSeq < rf.recordSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   771
                handshakeFlight.maxRecordSeq = rf.recordSeq;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   772
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   773
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   774
            // buffer this fragment
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   775
            bufferFragment(rf);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   776
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   777
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   778
        // Queue up a ciphertext message.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   779
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   780
        // Note: not yet be able to decrypt the message.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   781
        void queueUpFragment(RecordFragment rf) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   782
            if (!isDesirable(rf)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   783
                // Not a dedired record, discard it.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   784
                return;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   785
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   786
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   787
            // Clean up the retransmission messages if necessary.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   788
            cleanUpRetransmit(rf);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   789
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   790
            // buffer this fragment
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   791
            bufferFragment(rf);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   792
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   793
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   794
        private void bufferFragment(RecordFragment rf) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   795
            // append this fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   796
            bufferedFragments.add(rf);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   797
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   798
            if (flightIsReady) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   799
                flightIsReady = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   800
            }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   801
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   802
            if (!needToCheckFlight) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   803
                needToCheckFlight = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   804
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   805
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   806
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   807
        private void cleanUpRetransmit(RecordFragment rf) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   808
            // Does the next flight start?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   809
            boolean isNewFlight = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   810
            if (precedingFlight != null) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   811
                if (precedingFlight.flightEpoch < rf.recordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   812
                    isNewFlight = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   813
                } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   814
                    if (rf instanceof HandshakeFragment) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   815
                        HandshakeFragment hsf = (HandshakeFragment)rf;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   816
                        if (precedingFlight.maxMessageSeq  < hsf.messageSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   817
                            isNewFlight = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   818
                        }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   819
                    } else if (
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   820
                        rf.contentType != ContentType.CHANGE_CIPHER_SPEC.id) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   821
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   822
                        // ciphertext
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   823
                        if (precedingFlight.maxRecordEpoch < rf.recordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   824
                            isNewFlight = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   825
                        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   826
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   827
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   828
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   829
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   830
            if (!isNewFlight) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   831
                // Need no cleanup.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   832
                return;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   833
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   834
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   835
            // clean up the buffer
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   836
            for (Iterator<RecordFragment> it = bufferedFragments.iterator();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   837
                    it.hasNext();) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   838
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   839
                RecordFragment frag = it.next();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   840
                boolean isOld = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   841
                if (frag.recordEpoch < precedingFlight.maxRecordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   842
                    isOld = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   843
                } else if (frag.recordEpoch == precedingFlight.maxRecordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   844
                    if (frag.recordSeq <= precedingFlight.maxRecordSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   845
                        isOld = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   846
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   847
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   848
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   849
                if (!isOld && (frag instanceof HandshakeFragment)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   850
                    HandshakeFragment hsf = (HandshakeFragment)frag;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   851
                    isOld = (hsf.messageSeq <= precedingFlight.maxMessageSeq);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   852
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   853
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   854
                if (isOld) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   855
                    it.remove();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   856
                } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   857
                    // Safe to break as items in the buffer are ordered.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   858
                    break;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   859
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   860
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   861
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   862
            // discard retransmissions of the previous flight if any.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   863
            precedingFlight = null;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   864
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   865
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   866
        // Is a desired record?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   867
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   868
        // Check for retransmission and lost records.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   869
        private boolean isDesirable(RecordFragment rf) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   870
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   871
            // Discard records old than the previous epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   872
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   873
            int previousEpoch = nextRecordEpoch - 1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   874
            if (rf.recordEpoch < previousEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   875
                // Too old to use, discard this record.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   876
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   877
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   878
                            "Too old epoch to use this record, discard it.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   879
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   880
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   881
                return false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   882
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   883
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   884
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   885
            // Allow retransmission of last flight of the previous epoch
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   886
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   887
            // For example, the last server delivered flight for session
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   888
            // resuming abbreviated handshaking consist three messages:
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   889
            //      ServerHello
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   890
            //      [ChangeCipherSpec]
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   891
            //      Finished
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   892
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   893
            // The epoch number is incremented and the sequence number is reset
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   894
            // if the ChangeCipherSpec is sent.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   895
            if (rf.recordEpoch == previousEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   896
                boolean isDesired = true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   897
                if (precedingFlight == null) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   898
                    isDesired = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   899
                } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   900
                    if (rf instanceof HandshakeFragment) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   901
                        HandshakeFragment hsf = (HandshakeFragment)rf;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   902
                        if (precedingFlight.minMessageSeq > hsf.messageSeq) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   903
                            isDesired = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   904
                        }
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   905
                    } else if (
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   906
                        rf.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   907
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   908
                        // ChangeCipherSpec
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   909
                        if (precedingFlight.flightEpoch != rf.recordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   910
                            isDesired = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   911
                        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   912
                    } else {        // ciphertext
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   913
                        if ((rf.recordEpoch < precedingFlight.maxRecordEpoch) ||
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   914
                            (rf.recordEpoch == precedingFlight.maxRecordEpoch &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   915
                                rf.recordSeq <= precedingFlight.maxRecordSeq)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   916
                            isDesired = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   917
                        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   918
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   919
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   920
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   921
                if (!isDesired) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   922
                    // Too old to use, discard this retransmitted record
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   923
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   924
                        SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   925
                                "Too old retransmission to use, discard it.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   926
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   927
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   928
                    return false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   929
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   930
            } else if ((rf.recordEpoch == nextRecordEpoch) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   931
                    (nextRecordSeq > rf.recordSeq)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   932
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   933
                // Previously disordered record for the current epoch.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   934
                //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   935
                // Should has been retransmitted. Discard this record.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   936
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   937
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   938
                            "Lagging behind record (sequence), discard it.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   939
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   940
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   941
                return false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   942
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   943
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   944
            return true;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   945
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   946
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   947
        private boolean isEmpty() {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   948
            return (bufferedFragments.isEmpty() ||
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   949
                    (!flightIsReady && !needToCheckFlight) ||
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   950
                    (needToCheckFlight && !flightIsReady()));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   951
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   952
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   953
        Plaintext acquirePlaintext() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   954
            if (bufferedFragments.isEmpty()) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   955
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   956
                    SSLLogger.fine("No received handshake messages");
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   957
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   958
                return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   959
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   960
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   961
            if (!flightIsReady && needToCheckFlight) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   962
                // check the fligth status
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   963
                flightIsReady = flightIsReady();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   964
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   965
                // Reset if this flight is ready.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   966
                if (flightIsReady) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   967
                    // Retransmitted handshake messages are not needed for
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   968
                    // further handshaking processing.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   969
                    if (handshakeFlight.isRetransmitOf(precedingFlight)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   970
                        // cleanup
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   971
                        bufferedFragments.clear();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   972
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   973
                        // Reset the next handshake flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   974
                        resetHandshakeFlight(precedingFlight);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   975
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   976
                        if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   977
                            SSLLogger.fine("Received a retransmission flight.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   978
                        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   979
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   980
                        return Plaintext.PLAINTEXT_NULL;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   981
                    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   982
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   983
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   984
                needToCheckFlight = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   985
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   986
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   987
            if (!flightIsReady) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   988
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   989
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   990
                            "The handshake flight is not ready to use: " +
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
   991
                            handshakeFlight.handshakeType);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   992
                }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   993
                return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   994
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   995
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   996
            RecordFragment rFrag = bufferedFragments.first();
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
   997
            Plaintext plaintext;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   998
            if (!rFrag.isCiphertext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
   999
                // handshake message, or ChangeCipherSpec message
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1000
                plaintext = acquireHandshakeMessage();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1001
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1002
                // Reset the handshake flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1003
                if (bufferedFragments.isEmpty()) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1004
                    // Need not to backup the holes map.  Clear up it at first.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1005
                    handshakeFlight.holesMap.clear();   // cleanup holes map
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1006
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1007
                    // Update the preceding flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1008
                    precedingFlight = (HandshakeFlight)handshakeFlight.clone();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1009
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1010
                    // Reset the next handshake flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1011
                    resetHandshakeFlight(precedingFlight);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1012
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1013
                    if (expectCCSFlight &&
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1014
                            (precedingFlight.handshakeType ==
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1015
                                    HandshakeFlight.HF_UNKNOWN)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1016
                        expectCCSFlight = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1017
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1018
                }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1019
            } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1020
                // a Finished message or other ciphertexts
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1021
                plaintext = acquireCachedMessage();
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1022
            }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1023
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1024
            return plaintext;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1025
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1026
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1027
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1028
        // Reset the handshake flight from a previous one.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1029
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1030
        private void resetHandshakeFlight(HandshakeFlight prev) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1031
            // Reset the next handshake flight.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1032
            handshakeFlight.handshakeType = HandshakeFlight.HF_UNKNOWN;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1033
            handshakeFlight.flightEpoch = prev.maxRecordEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1034
            if (prev.flightEpoch != prev.maxRecordEpoch) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1035
                // a new epoch starts
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1036
                handshakeFlight.minMessageSeq = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1037
            } else {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1038
                // stay at the same epoch
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1039
                //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1040
                // The minimal message sequence number will get updated if
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1041
                // a flight retransmission happens.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1042
                handshakeFlight.minMessageSeq = prev.maxMessageSeq + 1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1043
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1044
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1045
            // cleanup the maximum sequence number and epoch number.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1046
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1047
            // Note: actually, we need to do nothing because the reassembler
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1048
            // of handshake messages will reset them properly even for
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1049
            // retransmissions.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1050
            //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1051
            handshakeFlight.maxMessageSeq = 0;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1052
            handshakeFlight.maxRecordEpoch = handshakeFlight.flightEpoch;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1053
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1054
            // Record sequence number cannot wrap even for retransmissions.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1055
            handshakeFlight.maxRecordSeq = prev.maxRecordSeq + 1;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1056
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1057
            // cleanup holes map
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1058
            handshakeFlight.holesMap.clear();
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1059
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1060
            // Ready to accept new input record.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1061
            flightIsReady = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1062
            needToCheckFlight = false;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1063
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1064
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1065
        private Plaintext acquireCachedMessage() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1066
            RecordFragment rFrag = bufferedFragments.first();
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1067
            if (readEpoch != rFrag.recordEpoch) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1068
                if (readEpoch > rFrag.recordEpoch) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1069
                    // discard old records
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1070
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1071
                        SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1072
                                "Discard old buffered ciphertext fragments.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1073
                    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1074
                    bufferedFragments.remove(rFrag);    // popup the fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1075
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1076
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1077
                // reset the flight
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1078
                if (flightIsReady) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1079
                    flightIsReady = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1080
                }
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1081
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1082
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1083
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1084
                            "Not yet ready to decrypt the cached fragments.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1085
                }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1086
                return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1087
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1088
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1089
            bufferedFragments.remove(rFrag);    // popup the fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1090
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1091
            ByteBuffer fragment = ByteBuffer.wrap(rFrag.fragment);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1092
            ByteBuffer plaintextFragment = null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1093
            try {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1094
                Plaintext plaintext = readCipher.decrypt(
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1095
                        rFrag.contentType, fragment, rFrag.recordEnS);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1096
                plaintextFragment = plaintext.fragment;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1097
                rFrag.contentType = plaintext.contentType;
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1098
            } catch (GeneralSecurityException gse) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1099
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1100
                    SSLLogger.fine("Discard invalid record: ", gse);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1101
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1102
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1103
                // invalid, discard this record [section 4.1.2.7, RFC 6347]
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1104
                return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1105
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1106
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1107
            // The ciphtext handshake message can only be Finished (the
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1108
            // end of this flight), ClinetHello or HelloRequest (the
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1109
            // beginning of the next flight) message.  Need not to check
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1110
            // any ChangeCipherSpec message.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1111
            if (rFrag.contentType == ContentType.HANDSHAKE.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1112
                while (plaintextFragment.remaining() > 0) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1113
                    HandshakeFragment hsFrag = parseHandshakeMessage(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1114
                            rFrag.contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1115
                            rFrag.majorVersion, rFrag.minorVersion,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1116
                            rFrag.recordEnS, rFrag.recordEpoch, rFrag.recordSeq,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1117
                            plaintextFragment);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1118
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1119
                    if (hsFrag == null) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1120
                        // invalid, discard this record
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1121
                        if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1122
                            SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1123
                                    "Invalid handshake fragment, discard it",
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1124
                                    plaintextFragment);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1125
                        }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1126
                        return null;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1127
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1128
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1129
                    queueUpHandshake(hsFrag);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1130
                    // The flight ready status (flightIsReady) should have
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1131
                    // been checked and updated for the Finished handshake
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1132
                    // message before the decryption.  Please don't update
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1133
                    // flightIsReady for Finished messages.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1134
                    if (hsFrag.handshakeType != SSLHandshake.FINISHED.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1135
                        flightIsReady = false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1136
                        needToCheckFlight = true;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1137
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1138
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1139
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1140
                return acquirePlaintext();
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1141
            } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1142
                return new Plaintext(rFrag.contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1143
                        rFrag.majorVersion, rFrag.minorVersion,
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1144
                        rFrag.recordEpoch,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1145
                        Authenticator.toLong(rFrag.recordEnS),
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1146
                        plaintextFragment);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1147
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1148
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1149
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1150
        private Plaintext acquireHandshakeMessage() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1151
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1152
            RecordFragment rFrag = bufferedFragments.first();
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1153
            if (rFrag.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1154
                this.nextRecordEpoch = rFrag.recordEpoch + 1;
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1155
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1156
                // For retransmissions, the next record sequence number is a
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1157
                // positive value.  Don't worry about it as the acquiring of
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1158
                // the immediately followed Finished handshake message will
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1159
                // reset the next record sequence number correctly.
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1160
                this.nextRecordSeq = 0;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1161
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1162
                // Popup the fragment.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1163
                bufferedFragments.remove(rFrag);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1164
                return new Plaintext(rFrag.contentType,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1165
                        rFrag.majorVersion, rFrag.minorVersion,
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1166
                        rFrag.recordEpoch,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1167
                        Authenticator.toLong(rFrag.recordEnS),
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1168
                        ByteBuffer.wrap(rFrag.fragment));
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1169
            } else {    // rFrag.contentType == ContentType.HANDSHAKE.id
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1170
                HandshakeFragment hsFrag = (HandshakeFragment)rFrag;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1171
                if ((hsFrag.messageLength == hsFrag.fragmentLength) &&
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1172
                    (hsFrag.fragmentOffset == 0)) {     // no fragmentation
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1173
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1174
                    bufferedFragments.remove(rFrag);    // popup the fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1175
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1176
                    // this.nextRecordEpoch = hsFrag.recordEpoch;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1177
                    this.nextRecordSeq = hsFrag.recordSeq + 1;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1178
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1179
                    // Note: may try to avoid byte array copy in the future.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1180
                    byte[] recordFrag = new byte[hsFrag.messageLength + 4];
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1181
                    Plaintext plaintext = new Plaintext(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1182
                            hsFrag.contentType,
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1183
                            hsFrag.majorVersion, hsFrag.minorVersion,
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1184
                            hsFrag.recordEpoch,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1185
                            Authenticator.toLong(hsFrag.recordEnS),
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1186
                            ByteBuffer.wrap(recordFrag));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1187
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1188
                    // fill the handshake fragment of the record
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1189
                    recordFrag[0] = hsFrag.handshakeType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1190
                    recordFrag[1] =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1191
                            (byte)((hsFrag.messageLength >>> 16) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1192
                    recordFrag[2] =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1193
                            (byte)((hsFrag.messageLength >>> 8) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1194
                    recordFrag[3] = (byte)(hsFrag.messageLength & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1195
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1196
                    System.arraycopy(hsFrag.fragment, 0,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1197
                            recordFrag, 4, hsFrag.fragmentLength);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1198
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1199
                    // handshake hashing
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1200
                    handshakeHashing(hsFrag, plaintext);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1201
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1202
                    return plaintext;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1203
                } else {                // fragmented handshake message
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1204
                    // the first record
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1205
                    //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1206
                    // Note: may try to avoid byte array copy in the future.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1207
                    byte[] recordFrag = new byte[hsFrag.messageLength + 4];
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1208
                    Plaintext plaintext = new Plaintext(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1209
                            hsFrag.contentType,
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1210
                            hsFrag.majorVersion, hsFrag.minorVersion,
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1211
                            hsFrag.recordEpoch,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1212
                            Authenticator.toLong(hsFrag.recordEnS),
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1213
                            ByteBuffer.wrap(recordFrag));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1214
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1215
                    // fill the handshake fragment of the record
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1216
                    recordFrag[0] = hsFrag.handshakeType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1217
                    recordFrag[1] =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1218
                            (byte)((hsFrag.messageLength >>> 16) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1219
                    recordFrag[2] =
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1220
                            (byte)((hsFrag.messageLength >>> 8) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1221
                    recordFrag[3] = (byte)(hsFrag.messageLength & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1222
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1223
                    int msgSeq = hsFrag.messageSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1224
                    long maxRecodeSN = hsFrag.recordSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1225
                    HandshakeFragment hmFrag = hsFrag;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1226
                    do {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1227
                        System.arraycopy(hmFrag.fragment, 0,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1228
                                recordFrag, hmFrag.fragmentOffset + 4,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1229
                                hmFrag.fragmentLength);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1230
                        // popup the fragment
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1231
                        bufferedFragments.remove(rFrag);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1232
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1233
                        if (maxRecodeSN < hmFrag.recordSeq) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1234
                            maxRecodeSN = hmFrag.recordSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1235
                        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1236
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1237
                        // Note: may buffer retransmitted fragments in order to
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1238
                        // speed up the reassembly in the future.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1239
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1240
                        // read the next buffered record
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1241
                        if (!bufferedFragments.isEmpty()) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1242
                            rFrag = bufferedFragments.first();
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1243
                            if (rFrag.contentType != ContentType.HANDSHAKE.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1244
                                break;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1245
                            } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1246
                                hmFrag = (HandshakeFragment)rFrag;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1247
                            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1248
                        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1249
                    } while (!bufferedFragments.isEmpty() &&
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1250
                            (msgSeq == hmFrag.messageSeq));
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1251
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1252
                    // handshake hashing
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1253
                    handshakeHashing(hsFrag, plaintext);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1254
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1255
                    this.nextRecordSeq = maxRecodeSN + 1;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1256
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1257
                    return plaintext;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1258
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1259
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1260
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1261
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1262
        boolean flightIsReady() {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1263
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1264
            byte flightType = handshakeFlight.handshakeType;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1265
            if (flightType == HandshakeFlight.HF_UNKNOWN) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1266
                //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1267
                // the ChangeCipherSpec/Finished flight
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1268
                //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1269
                if (expectCCSFlight) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1270
                    // Have the ChangeCipherSpec/Finished flight been received?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1271
                    boolean isReady = hasFinishedMessage(bufferedFragments);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1272
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1273
                        SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1274
                            "Has the final flight been received? " + isReady);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1275
                    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1276
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1277
                    return isReady;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1278
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1279
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1280
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1281
                    SSLLogger.fine("No flight is received yet.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1282
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1283
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1284
                return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1285
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1286
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1287
            if ((flightType == SSLHandshake.CLIENT_HELLO.id) ||
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1288
                (flightType == SSLHandshake.HELLO_REQUEST.id) ||
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1289
                (flightType == SSLHandshake.HELLO_VERIFY_REQUEST.id)) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1290
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1291
                // single handshake message flight
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1292
                boolean isReady = hasCompleted(flightType);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1293
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1294
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1295
                            "Is the handshake message completed? " + isReady);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1296
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1297
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1298
                return isReady;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1299
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1300
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1301
            //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1302
            // the ServerHello flight
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1303
            //
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1304
            if (flightType == SSLHandshake.SERVER_HELLO.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1305
                // Firstly, check the first flight handshake message.
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1306
                if (!hasCompleted(flightType)) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1307
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1308
                        SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1309
                            "The ServerHello message is not completed yet.");
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1310
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1311
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1312
                    return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1313
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1314
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1315
                //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1316
                // an abbreviated handshake
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1317
                //
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1318
                if (hasFinishedMessage(bufferedFragments)) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1319
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1320
                        SSLLogger.fine("It's an abbreviated handshake.");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1321
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1322
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1323
                    return true;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1324
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1325
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1326
                //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1327
                // a full handshake
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1328
                //
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1329
                List<HoleDescriptor> holes = handshakeFlight.holesMap.get(
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1330
                        SSLHandshake.SERVER_HELLO_DONE.id);
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1331
                if ((holes == null) || !holes.isEmpty()) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1332
                    // Not yet got the final message of the flight.
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1333
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1334
                        SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1335
                                "Not yet got the ServerHelloDone message");
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1336
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1337
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1338
                    return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1339
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1340
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1341
                // Have all handshake message been received?
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1342
                boolean isReady = hasCompleted(bufferedFragments,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1343
                            handshakeFlight.minMessageSeq,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1344
                            handshakeFlight.maxMessageSeq);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1345
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1346
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1347
                            "Is the ServerHello flight (message " +
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1348
                            handshakeFlight.minMessageSeq + "-" +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1349
                            handshakeFlight.maxMessageSeq +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1350
                            ") completed? " + isReady);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1351
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1352
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1353
                return isReady;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1354
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1355
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1356
            //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1357
            // the ClientKeyExchange flight
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1358
            //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1359
            // Note: need to consider more messages in this flight if
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1360
            //       ht_supplemental_data and ht_certificate_url are
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1361
            //       suppported in the future.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1362
            //
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1363
            if ((flightType == SSLHandshake.CERTIFICATE.id) ||
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1364
                (flightType == SSLHandshake.CLIENT_KEY_EXCHANGE.id)) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1365
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1366
                // Firstly, check the first flight handshake message.
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1367
                if (!hasCompleted(flightType)) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1368
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1369
                        SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1370
                            "The ClientKeyExchange or client Certificate " +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1371
                            "message is not completed yet.");
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1372
                    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1373
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1374
                    return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1375
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1376
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1377
                // Is client CertificateVerify a mandatory message?
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1378
                if (flightType == SSLHandshake.CERTIFICATE.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1379
                    if (needClientVerify(bufferedFragments) &&
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1380
                        !hasCompleted(SSLHandshake.CERTIFICATE_VERIFY.id)) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1381
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1382
                        if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1383
                            SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1384
                                "Not yet have the CertificateVerify message");
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1385
                        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1386
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1387
                        return false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1388
                    }
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1389
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1390
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1391
                if (!hasFinishedMessage(bufferedFragments)) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1392
                    // not yet have the ChangeCipherSpec/Finished messages
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1393
                    if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1394
                        SSLLogger.fine(
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1395
                            "Not yet have the ChangeCipherSpec and " +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1396
                            "Finished messages");
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1397
                    }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1398
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1399
                    return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1400
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1401
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1402
                // Have all handshake message been received?
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1403
                boolean isReady = hasCompleted(bufferedFragments,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1404
                            handshakeFlight.minMessageSeq,
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1405
                            handshakeFlight.maxMessageSeq);
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1406
                if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1407
                    SSLLogger.fine(
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1408
                            "Is the ClientKeyExchange flight (message " +
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1409
                            handshakeFlight.minMessageSeq + "-" +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1410
                            handshakeFlight.maxMessageSeq +
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1411
                            ") completed? " + isReady);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1412
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1413
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1414
                return isReady;
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1415
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1416
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1417
            //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1418
            // Otherwise, need to receive more handshake messages.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1419
            //
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1420
            if (SSLLogger.isOn && SSLLogger.isOn("verbose")) {
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1421
                SSLLogger.fine("Need to receive more handshake messages");
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1422
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1423
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1424
            return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1425
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1426
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1427
        // Looking for the ChangeCipherSpec and Finished messages.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1428
        //
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1429
        // As the cached Finished message should be a ciphertext, we don't
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1430
        // exactly know a ciphertext is a Finished message or not.  According
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1431
        // to the spec of TLS/DTLS handshaking, a Finished message is always
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1432
        // sent immediately after a ChangeCipherSpec message.  The first
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1433
        // ciphertext handshake message should be the expected Finished message.
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1434
        private boolean hasFinishedMessage(Set<RecordFragment> fragments) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1435
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1436
            boolean hasCCS = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1437
            boolean hasFin = false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1438
            for (RecordFragment fragment : fragments) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1439
                if (fragment.contentType == ContentType.CHANGE_CIPHER_SPEC.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1440
                    if (hasFin) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1441
                        return true;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1442
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1443
                    hasCCS = true;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1444
                } else if (fragment.contentType == ContentType.HANDSHAKE.id) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1445
                    // Finished is the first expected message of a new epoch.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1446
                    if (fragment.isCiphertext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1447
                        if (hasCCS) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1448
                            return true;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1449
                        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1450
                        hasFin = true;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1451
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1452
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1453
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1454
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1455
            return hasFin && hasCCS;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1456
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1457
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1458
        // Is client CertificateVerify a mandatory message?
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1459
        //
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1460
        // In the current implementation, client CertificateVerify is a
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1461
        // mandatory message if the client Certificate is not empty.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1462
        private boolean needClientVerify(Set<RecordFragment> fragments) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1463
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1464
            // The caller should have checked the completion of the first
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1465
            // present handshake message.  Need not to check it again.
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1466
            for (RecordFragment rFrag : fragments) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1467
                if ((rFrag.contentType != ContentType.HANDSHAKE.id) ||
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1468
                        rFrag.isCiphertext) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1469
                    break;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1470
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1471
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1472
                HandshakeFragment hsFrag = (HandshakeFragment)rFrag;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1473
                if (hsFrag.handshakeType != SSLHandshake.CERTIFICATE.id) {
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1474
                    continue;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1475
                }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1476
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1477
                return (rFrag.fragment != null) &&
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1478
                   (rFrag.fragment.length > DTLSRecord.minCertPlaintextSize);
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1479
            }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1480
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1481
            return false;
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1482
        }
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1483
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1484
        private boolean hasCompleted(byte handshakeType) {
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1485
            List<HoleDescriptor> holes =
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1486
                    handshakeFlight.holesMap.get(handshakeType);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1487
            if (holes == null) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1488
                // not yet received this kind of handshake message
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1489
                return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1490
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1491
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1492
            return holes.isEmpty();  // no fragment hole for complete message
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1493
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1494
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1495
        private boolean hasCompleted(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1496
                Set<RecordFragment> fragments,
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1497
                int presentMsgSeq, int endMsgSeq) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1498
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1499
            // The caller should have checked the completion of the first
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1500
            // present handshake message.  Need not to check it again.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1501
            for (RecordFragment rFrag : fragments) {
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1502
                if ((rFrag.contentType != ContentType.HANDSHAKE.id) ||
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1503
                        rFrag.isCiphertext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1504
                    break;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1505
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1506
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1507
                HandshakeFragment hsFrag = (HandshakeFragment)rFrag;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1508
                if (hsFrag.messageSeq == presentMsgSeq) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1509
                    continue;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1510
                } else if (hsFrag.messageSeq == (presentMsgSeq + 1)) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1511
                    // check the completion of the handshake message
41820
3d8c88d00c9f 8167680: DTLS implementation bugs
xuelei
parents: 34687
diff changeset
  1512
                    if (!hasCompleted(hsFrag.handshakeType)) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1513
                        return false;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1514
                    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1515
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1516
                    presentMsgSeq = hsFrag.messageSeq;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1517
                } else {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1518
                    // not yet got handshake message next to presentMsgSeq
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1519
                    break;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1520
                }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1521
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1522
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1523
            return (presentMsgSeq >= endMsgSeq);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1524
                        // false: if not yet got all messages of the flight.
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1525
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1526
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1527
        private void handshakeHashing(
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1528
                HandshakeFragment hsFrag, Plaintext plaintext) {
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1529
            byte hsType = hsFrag.handshakeType;
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1530
            if (!handshakeHash.isHashable(hsType)) {
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1531
                // omitted from handshake hash computation
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1532
                return;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1533
            }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1534
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1535
            // calculate the DTLS header and reserve the handshake message
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1536
            plaintext.fragment.position(4);     // ignore the TLS header
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1537
            byte[] temporary = new byte[plaintext.fragment.remaining() + 12];
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1538
                                                // 12: handshake header size
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1539
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1540
            // Handshake.msg_type
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1541
            temporary[0] = hsFrag.handshakeType;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1542
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1543
            // Handshake.length
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1544
            temporary[1] = (byte)((hsFrag.messageLength >> 16) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1545
            temporary[2] = (byte)((hsFrag.messageLength >> 8) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1546
            temporary[3] = (byte)(hsFrag.messageLength & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1547
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1548
            // Handshake.message_seq
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1549
            temporary[4] = (byte)((hsFrag.messageSeq >> 8) & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1550
            temporary[5] = (byte)(hsFrag.messageSeq & 0xFF);
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1551
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1552
            // Handshake.fragment_offset
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1553
            temporary[6] = 0;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1554
            temporary[7] = 0;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1555
            temporary[8] = 0;
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1556
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1557
            // Handshake.fragment_length
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1558
            temporary[9] = temporary[1];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1559
            temporary[10] = temporary[2];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1560
            temporary[11] = temporary[3];
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1561
56542
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1562
            plaintext.fragment.get(temporary,
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1563
                    12, plaintext.fragment.remaining());
56aaa6cb3693 Initial TLSv1.3 Implementation
wetmore
parents: 47478
diff changeset
  1564
            handshakeHash.receive(temporary);
30904
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1565
            plaintext.fragment.position(0);     // restore the position
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1566
        }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1567
    }
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1568
}
ec0224270f90 8043758: Datagram Transport Layer Security (DTLS)
xuelei
parents:
diff changeset
  1569