[bogo] Compute length in record header before encrypting.
Change-Id: I55e33a605ce81a75e26e6d49ad7e7a76b17e39a0
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/69108
Commit-Queue: Bob Beck <bbe@google.com>
Reviewed-by: Bob Beck <bbe@google.com>
diff --git a/ssl/test/runner/conn.go b/ssl/test/runner/conn.go
index bda9b92..ca1a037 100644
--- a/ssl/test/runner/conn.go
+++ b/ssl/test/runner/conn.go
@@ -571,20 +571,6 @@
// encrypt
if hc.cipher != nil {
- // Add TLS 1.3 padding.
- if hc.version >= VersionTLS13 {
- paddingLen := hc.config.Bugs.RecordPadding
- if hc.config.Bugs.OmitRecordContents {
- b.resize(recordHeaderLen + paddingLen)
- } else {
- b.resize(len(b.data) + 1 + paddingLen)
- b.data[len(b.data)-paddingLen-1] = byte(typ)
- }
- for i := 0; i < paddingLen; i++ {
- b.data[len(b.data)-paddingLen+i] = 0
- }
- }
-
switch c := hc.cipher.(type) {
case cipher.Stream:
c.XORKeyStream(payload, payload)
@@ -606,11 +592,8 @@
additionalData[11] = byte(payloadLen >> 8)
additionalData[12] = byte(payloadLen)
} else {
- additionalData = make([]byte, 5)
- copy(additionalData, b.data[:3])
- n := len(b.data) - recordHeaderLen
- additionalData[3] = byte(n >> 8)
- additionalData[4] = byte(n)
+ additionalData = make([]byte, recordHeaderLen)
+ copy(additionalData, b.data)
}
c.Seal(payload[:0], nonce, payload, additionalData)
@@ -1186,6 +1169,28 @@
return c.doWriteRecord(typ, data)
}
+func (c *Conn) addTLS13Padding(b *block, recordHeaderLen, recordLen int, typ recordType) int {
+ if c.out.version < VersionTLS13 || c.out.cipher == nil {
+ return recordLen
+ }
+ paddingLen := c.config.Bugs.RecordPadding
+ if c.config.Bugs.OmitRecordContents {
+ recordLen = paddingLen
+ b.resize(recordHeaderLen + paddingLen)
+ } else {
+ recordLen += 1 + paddingLen
+ b.resize(len(b.data) + 1 + paddingLen)
+ b.data[len(b.data)-paddingLen-1] = byte(typ)
+ }
+ for i := 0; i < paddingLen; i++ {
+ b.data[len(b.data)-paddingLen+i] = 0
+ }
+ if c, ok := c.out.cipher.(*tlsAead); ok {
+ recordLen += c.Overhead()
+ }
+ return recordLen
+}
+
func (c *Conn) doWriteRecord(typ recordType, data []byte) (n int, err error) {
recordHeaderLen := c.out.recordHeaderLen()
b := c.out.newBlock()
@@ -1205,6 +1210,7 @@
m = 6
}
}
+ plaintextLen := m
explicitIVLen := 0
explicitIVIsSeq := false
first = false
@@ -1228,7 +1234,7 @@
explicitIVIsSeq = true
}
}
- b.resize(recordHeaderLen + explicitIVLen + m)
+ b.resize(recordHeaderLen + explicitIVLen + plaintextLen)
b.data[0] = byte(typ)
if c.vers >= VersionTLS13 && c.out.cipher != nil {
b.data[0] = byte(recordTypeApplicationData)
@@ -1255,10 +1261,13 @@
if c.vers == 0 && c.config.Bugs.SendInitialRecordVersion != 0 {
vers = c.config.Bugs.SendInitialRecordVersion
}
+ copy(b.data[recordHeaderLen+explicitIVLen:], data)
+ // Add TLS 1.3 padding.
+ recordLen := c.addTLS13Padding(b, recordHeaderLen, plaintextLen, typ)
b.data[1] = byte(vers >> 8)
b.data[2] = byte(vers)
- b.data[3] = byte(m >> 8)
- b.data[4] = byte(m)
+ b.data[3] = byte(recordLen >> 8)
+ b.data[4] = byte(recordLen)
if explicitIVLen > 0 {
explicitIV := b.data[recordHeaderLen : recordHeaderLen+explicitIVLen]
if explicitIVIsSeq {
@@ -1269,14 +1278,13 @@
}
}
}
- copy(b.data[recordHeaderLen+explicitIVLen:], data)
c.out.encrypt(b, explicitIVLen, typ)
_, err = c.conn.Write(b.data)
if err != nil {
break
}
- n += m
- data = data[m:]
+ n += plaintextLen
+ data = data[plaintextLen:]
}
c.out.freeBlock(b)