runner: Slightly simplify sequence number management
No need to store outSeq on the halfConn, removed unused parameter.
Change-Id: I3f352acee0526be93531ce67fbb4c4634733771c
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/71407
Reviewed-by: Nick Harper <nharper@chromium.org>
Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/ssl/test/runner/conn.go b/ssl/test/runner/conn.go
index 3287b01..4a31a3c 100644
--- a/ssl/test/runner/conn.go
+++ b/ssl/test/runner/conn.go
@@ -137,8 +137,6 @@
c.out.config = c.config
c.in.conn = c
c.out.conn = c
-
- c.out.updateOutSeq()
}
// Access to net.Conn methods.
@@ -188,7 +186,6 @@
recordNumberEncrypter recordNumberEncrypter
mac macFunction
seq [8]byte // 64-bit sequence number
- outSeq [8]byte // Mapped sequence number
nextCipher any // next encryption state
nextMac macFunction // next MAC algorithm
@@ -289,7 +286,7 @@
}
// incSeq increments the sequence number.
-func (hc *halfConn) incSeq(isOutgoing bool) {
+func (hc *halfConn) incSeq() {
limit := 0
increment := uint64(1)
if hc.isDTLS {
@@ -308,8 +305,6 @@
if increment != 0 {
panic("TLS: sequence number wraparound")
}
-
- hc.updateOutSeq()
}
// incNextSeq increments the starting sequence number for the next epoch.
@@ -345,8 +340,6 @@
hc.seq[i] = 0
}
}
-
- hc.updateOutSeq()
}
func (hc *halfConn) setEpoch(epoch uint16) {
@@ -359,21 +352,20 @@
for i := range hc.nextSeq {
hc.nextSeq[i] = 0
}
- hc.updateOutSeq()
}
-func (hc *halfConn) updateOutSeq() {
- if hc.config.Bugs.SequenceNumberMapping != nil {
- seqU64 := binary.BigEndian.Uint64(hc.seq[:])
- seqU64 = hc.config.Bugs.SequenceNumberMapping(seqU64)
- binary.BigEndian.PutUint64(hc.outSeq[:], seqU64)
-
- // The DTLS epoch cannot be changed.
- copy(hc.outSeq[:2], hc.seq[:2])
- return
+func (hc *halfConn) sequenceNumberForOutput() []byte {
+ if !hc.isDTLS || hc.config.Bugs.SequenceNumberMapping == nil {
+ return hc.seq[:]
}
- copy(hc.outSeq[:], hc.seq[:])
+ var seq [8]byte
+ seqU64 := binary.BigEndian.Uint64(hc.seq[:])
+ seqU64 = hc.config.Bugs.SequenceNumberMapping(seqU64)
+ binary.BigEndian.PutUint64(seq[:], seqU64)
+ // The DTLS epoch cannot be changed.
+ copy(seq[:2], hc.seq[:2])
+ return seq[:]
}
func (hc *halfConn) explicitIVLen() int {
@@ -560,7 +552,7 @@
return false, 0, nil, alertBadRecordMAC
}
}
- hc.incSeq(false)
+ hc.incSeq()
return true, contentType, payload, 0
}
@@ -636,7 +628,7 @@
// (which must be in the last two bytes of the header) should be computed for
// the unencrypted, unpadded payload. It will be updated, potentially in-place,
// with the final length.
-func (hc *halfConn) encrypt(record, payload []byte, typ recordType, headerLen int, headerHasLength bool) ([]byte, error) {
+func (hc *halfConn) encrypt(record, payload []byte, typ recordType, headerLen int, headerHasLength bool, seq []byte) ([]byte, error) {
prefixLen := len(record)
header := record[prefixLen-headerLen:]
explicitIVLen := hc.explicitIVLen()
@@ -662,7 +654,7 @@
}
if hc.mac != nil {
- record = append(record, hc.computeMAC(hc.outSeq[:], header, payload)...)
+ record = append(record, hc.computeMAC(seq, header, payload)...)
}
explicitIV := record[prefixLen : prefixLen+explicitIVLen]
@@ -674,13 +666,13 @@
}
c.XORKeyStream(record[prefixLen:], record[prefixLen:])
case *tlsAead:
- nonce := hc.outSeq[:]
+ nonce := seq
if hc.isDTLS && hc.version >= VersionTLS13 && !hc.conn.useDTLSPlaintextHeader() {
// Unlike DTLS 1.2, DTLS 1.3's nonce construction does not use
// the epoch number. We store the epoch and nonce numbers
// together, so make a copy without the epoch.
nonce = make([]byte, 8)
- copy(nonce[2:], hc.outSeq[2:])
+ copy(nonce[2:], seq[2:])
}
// Save the explicit IV, if not empty.
@@ -695,7 +687,7 @@
if hc.version < VersionTLS13 {
// (D)TLS 1.2's AD is seq_num || type || version || plaintext length
additionalData = make([]byte, 13)
- copy(additionalData, hc.outSeq[:])
+ copy(additionalData, seq)
copy(additionalData[8:], header[:3])
additionalData[11] = byte(len(payload) >> 8)
additionalData[12] = byte(len(payload))
@@ -736,7 +728,7 @@
record[prefixLen-2] = byte(n >> 8)
record[prefixLen-1] = byte(n)
}
- hc.incSeq(true)
+ hc.incSeq()
return record, nil
}
@@ -1292,7 +1284,7 @@
record[3] = byte(m >> 8) // encrypt will update this
record[4] = byte(m)
- record, err = c.out.encrypt(record, data[:m], typ, tlsRecordHeaderLen, true /* header has length */)
+ record, err = c.out.encrypt(record, data[:m], typ, tlsRecordHeaderLen, true /* header has length */, c.out.seq[:])
if err != nil {
return
}
@@ -1470,7 +1462,7 @@
return errors.New("tls: sequence mismatch")
}
copy(c.in.seq[2:], seq)
- c.in.incSeq(false)
+ c.in.incSeq()
} else {
if bytes.Compare(seq, c.in.nextSeq[:]) < 0 {
return errors.New("tls: sequence mismatch")
diff --git a/ssl/test/runner/dtls.go b/ssl/test/runner/dtls.go
index 201b6b8..5eef430 100644
--- a/ssl/test/runner/dtls.go
+++ b/ssl/test/runner/dtls.go
@@ -411,7 +411,7 @@
// appendDTLS13RecordHeader appends to b the record header for a record of length
// recordLen.
-func (c *Conn) appendDTLS13RecordHeader(b []byte, recordLen int) []byte {
+func (c *Conn) appendDTLS13RecordHeader(b, seq []byte, recordLen int) []byte {
// Set the top 3 bits on the type byte to indicate the DTLS 1.3 record
// header format.
typ := byte(0x20)
@@ -428,12 +428,12 @@
typ |= 0x04
}
// Set the epoch bits
- typ |= c.out.outSeq[1] & 0x3
+ typ |= seq[1] & 0x3
b = append(b, typ)
if c.config.DTLSUseShortSeqNums {
- b = append(b, c.out.outSeq[7])
+ b = append(b, seq[7])
} else {
- b = append(b, c.out.outSeq[6], c.out.outSeq[7])
+ b = append(b, seq[6], seq[7])
}
if !c.config.DTLSRecordHeaderOmitLength {
b = append(b, byte(recordLen>>8), byte(recordLen))
@@ -467,21 +467,22 @@
useDTLS13RecordHeader := c.out.version >= VersionTLS13 && c.out.cipher != nil && !c.useDTLSPlaintextHeader()
headerHasLength := true
record := make([]byte, 0, dtlsMaxRecordHeaderLen+len(data)+c.out.maxEncryptOverhead(len(data)))
+ seq := c.out.sequenceNumberForOutput()
if useDTLS13RecordHeader {
- record = c.appendDTLS13RecordHeader(record, len(data))
+ record = c.appendDTLS13RecordHeader(record, seq, len(data))
headerHasLength = !c.config.DTLSRecordHeaderOmitLength
} else {
record = append(record, byte(typ))
record = append(record, byte(vers>>8))
record = append(record, byte(vers))
// DTLS records include an explicit sequence number.
- record = append(record, c.out.outSeq[:]...)
+ record = append(record, seq...)
record = append(record, byte(len(data)>>8))
record = append(record, byte(len(data)))
}
recordHeaderLen := len(record)
- record, err = c.out.encrypt(record, data, typ, recordHeaderLen, headerHasLength)
+ record, err = c.out.encrypt(record, data, typ, recordHeaderLen, headerHasLength, seq)
if err != nil {
return
}