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