|
5 | 5 | package tls
|
6 | 6 |
|
7 | 7 | import (
|
| 8 | + "bytes" |
8 | 9 | "math/rand"
|
9 | 10 | "reflect"
|
10 | 11 | "testing"
|
@@ -260,3 +261,47 @@ func (*sessionState) Generate(rand *rand.Rand, size int) reflect.Value {
|
260 | 261 | }
|
261 | 262 | return reflect.ValueOf(s)
|
262 | 263 | }
|
| 264 | + |
| 265 | +func TestRejectEmptySCTList(t *testing.T) { |
| 266 | + // https://tools.ietf.org/html/rfc6962#section-3.3.1 specifies that |
| 267 | + // empty SCT lists are invalid. |
| 268 | + |
| 269 | + var random [32]byte |
| 270 | + sct := []byte{0x42, 0x42, 0x42, 0x42} |
| 271 | + serverHello := serverHelloMsg{ |
| 272 | + vers: VersionTLS12, |
| 273 | + random: random[:], |
| 274 | + scts: [][]byte{sct}, |
| 275 | + } |
| 276 | + serverHelloBytes := serverHello.marshal() |
| 277 | + |
| 278 | + var serverHelloCopy serverHelloMsg |
| 279 | + if !serverHelloCopy.unmarshal(serverHelloBytes) { |
| 280 | + t.Fatal("Failed to unmarshal initial message") |
| 281 | + } |
| 282 | + |
| 283 | + // Change serverHelloBytes so that the SCT list is empty |
| 284 | + i := bytes.Index(serverHelloBytes, sct) |
| 285 | + if i < 0 { |
| 286 | + t.Fatal("Cannot find SCT in ServerHello") |
| 287 | + } |
| 288 | + |
| 289 | + var serverHelloEmptySCT []byte |
| 290 | + serverHelloEmptySCT = append(serverHelloEmptySCT, serverHelloBytes[:i-6]...) |
| 291 | + // Append the extension length and SCT list length for an empty list. |
| 292 | + serverHelloEmptySCT = append(serverHelloEmptySCT, []byte{0, 2, 0, 0}...) |
| 293 | + serverHelloEmptySCT = append(serverHelloEmptySCT, serverHelloBytes[i+4:]...) |
| 294 | + |
| 295 | + // Update the handshake message length. |
| 296 | + serverHelloEmptySCT[1] = byte((len(serverHelloEmptySCT) - 4) >> 16) |
| 297 | + serverHelloEmptySCT[2] = byte((len(serverHelloEmptySCT) - 4) >> 8) |
| 298 | + serverHelloEmptySCT[3] = byte(len(serverHelloEmptySCT) - 4) |
| 299 | + |
| 300 | + // Update the extensions length |
| 301 | + serverHelloEmptySCT[42] = byte((len(serverHelloEmptySCT) - 44) >> 8) |
| 302 | + serverHelloEmptySCT[43] = byte((len(serverHelloEmptySCT) - 44)) |
| 303 | + |
| 304 | + if serverHelloCopy.unmarshal(serverHelloEmptySCT) { |
| 305 | + t.Fatal("Unmarshaled ServerHello with empty SCT list") |
| 306 | + } |
| 307 | +} |
0 commit comments