runner: Parse Certificate with byteReader. Bug: 212 Change-Id: Ife51516ef0642730e601e146028b16ded99ab7ba Reviewed-on: https://boringssl-review.googlesource.com/23447 Reviewed-by: Steven Valdez <svaldez@google.com> Commit-Queue: David Benjamin <davidben@google.com> CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
diff --git a/ssl/test/runner/handshake_messages.go b/ssl/test/runner/handshake_messages.go index bec97dd..37a8c53 100644 --- a/ssl/test/runner/handshake_messages.go +++ b/ssl/test/runner/handshake_messages.go
@@ -1536,85 +1536,46 @@ } func (m *certificateMsg) unmarshal(data []byte) bool { - if len(data) < 4 { - return false - } - m.raw = data - data = data[4:] + reader := byteReader(data[4:]) - if m.hasRequestContext { - if len(data) == 0 { - return false - } - contextLen := int(data[0]) - if len(data) < 1+contextLen { - return false - } - m.requestContext = make([]byte, contextLen) - copy(m.requestContext, data[1:]) - data = data[1+contextLen:] - } - - if len(data) < 3 { - return false - } - certsLen := int(data[0])<<16 | int(data[1])<<8 | int(data[2]) - data = data[3:] - if len(data) != certsLen { + if m.hasRequestContext && !reader.readU8LengthPrefixedBytes(&m.requestContext) { return false } + var certs byteReader + if !reader.readU24LengthPrefixed(&certs) || len(reader) != 0 { + return false + } m.certificates = nil - for len(data) != 0 { - if len(data) < 3 { + for len(certs) > 0 { + var cert certificateEntry + if !certs.readU24LengthPrefixedBytes(&cert.data) { return false } - certLen := int(data[0])<<16 | int(data[1])<<8 | int(data[2]) - if len(data) < 3+certLen { - return false - } - cert := certificateEntry{ - data: data[3 : 3+certLen], - } - data = data[3+certLen:] if m.hasRequestContext { - if len(data) < 2 { + var extensions byteReader + if !certs.readU16LengthPrefixed(&extensions) { return false } - extensionsLen := int(data[0])<<8 | int(data[1]) - if len(data) < 2+extensionsLen { - return false - } - extensions := data[2 : 2+extensionsLen] - data = data[2+extensionsLen:] - for len(extensions) != 0 { - if len(extensions) < 4 { + for len(extensions) > 0 { + var extension uint16 + var body byteReader + if !extensions.readU16(&extension) || + !extensions.readU16LengthPrefixed(&body) { return false } - extension := uint16(extensions[0])<<8 | uint16(extensions[1]) - length := int(extensions[2])<<8 | int(extensions[3]) - if len(extensions) < 4+length { - return false - } - contents := extensions[4 : 4+length] - extensions = extensions[4+length:] - switch extension { case extensionStatusRequest: - if length < 4 { + var statusType byte + if !body.readU8(&statusType) || + statusType != statusTypeOCSP || + !body.readU24LengthPrefixedBytes(&cert.ocspResponse) || + len(body) != 0 { return false } - if contents[0] != statusTypeOCSP { - return false - } - respLen := int(contents[1])<<16 | int(contents[2])<<8 | int(contents[3]) - if respLen+4 != len(contents) || respLen == 0 { - return false - } - cert.ocspResponse = contents[4:] case extensionSignedCertificateTimestamp: - cert.sctList = contents + cert.sctList = []byte(body) default: return false }