{
  "format": 1,
  "kind": "dataset",
  "crit": [],
  "version": 1,
  "licence": "CC-BY-4.0",
  "generated_by": "apps/website-dev/captures/build.mjs from captures/sources.json",
  "archive": "chart-locker-v1.zip",
  "captures": [
    {
      "id": "tls13-minimal",
      "title": "The smallest decryptable TLS 1.3 exchange",
      "shows": "The smallest decryptable TLS 1.3 exchange (AES-128-GCM): a minimal synthetic handshake, one HTTP/1.1 GET and its response.",
      "success": "The GET and its 200 response decoded, the body byte for byte.",
      "exposes": "A key-schedule or record-layer bug.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/1.1",
        "TLS 1.3"
      ],
      "encrypted": true,
      "expected": {
        "check": "http1",
        "tls_cipher_suite": "0x1301",
        "exchanges": [
          {
            "method": "GET",
            "path": "/minimal",
            "status": 200,
            "body_text": "minimal-body"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's TLS and HTTP/1.1 decoder"
      ],
      "files": [
        "tls13-minimal.pcapng",
        "tls13-minimal.keys.txt",
        "tls13-minimal.expected.json",
        "tls13-minimal.md"
      ],
      "zip": "tls13-minimal.zip"
    },
    {
      "id": "tls12-h1",
      "title": "HTTP/1.1 over TLS 1.2 with AES-GCM",
      "shows": "HTTP/1.1 over TLS 1.2 with AES-128-GCM: a minimal synthetic handshake, then one GET and its response.",
      "success": "The request and the response decoded.",
      "exposes": "A TLS 1.2 PRF or explicit-nonce bug.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/1.1",
        "TLS 1.2"
      ],
      "encrypted": true,
      "expected": {
        "check": "http1",
        "tls_cipher_suite": "0xc02f",
        "exchanges": [
          {
            "method": "GET",
            "path": "/tls12",
            "status": 200,
            "body_text": "tls12-body"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's TLS and HTTP/1.1 decoder"
      ],
      "files": [
        "tls12-h1.pcapng",
        "tls12-h1.keys.txt",
        "tls12-h1.expected.json",
        "tls12-h1.md"
      ],
      "zip": "tls12-h1.zip"
    },
    {
      "id": "tls13-key-update",
      "title": "TLS 1.3 traffic keys rotated mid-connection",
      "shows": "TLS 1.3 traffic keys rotated mid-connection: the server sends a KeyUpdate between two responses on one connection.",
      "note": "Its keys file is byte-identical to tls13-minimal's, on purpose: both are built from the same synthetic handshake secrets, and the keys after the KeyUpdate are derived from those (RFC 8446 section 7.2), so the file needs no more lines.",
      "success": "Both requests and both responses decode, including the response sent under the new keys.",
      "exposes": "A decoder that keeps using the old traffic secret after a KeyUpdate.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/1.1",
        "TLS 1.3"
      ],
      "encrypted": true,
      "expected": {
        "check": "http1",
        "exchanges": [
          {
            "method": "GET",
            "path": "/pre",
            "status": 200,
            "body_text": "pre-body"
          },
          {
            "method": "GET",
            "path": "/post",
            "status": 200,
            "body_text": "post-body"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's TLS and HTTP/1.1 decoder"
      ],
      "files": [
        "tls13-key-update.pcapng",
        "tls13-key-update.keys.txt",
        "tls13-key-update.expected.json",
        "tls13-key-update.md"
      ],
      "zip": "tls13-key-update.zip"
    },
    {
      "id": "h2-early-response",
      "title": "HTTP/2 response sent while the upload is still going",
      "shows": "An HTTP/2 server sends its complete response (a 413) while the client is still uploading, then resets the stream with NO_ERROR; the rest of the upload arrives after the reset.",
      "note": "The response here is a 413; the live Sea trials case, h2.lab.shorenet.co.uk/f/h2-early-response, answers 200 instead, with the same framing.",
      "success": "The whole response, and every DATA frame of the upload, including those sent after the reset.",
      "exposes": "A parser that waits for the request to end before reading the response.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/2 (cleartext)"
      ],
      "encrypted": false,
      "expected": {
        "check": "h2-frames",
        "port": 80,
        "frames": [
          {
            "dir": "c2s",
            "type": "HEADERS",
            "stream": 1,
            "end_stream": false,
            "headers": [
              [
                ":method",
                "POST"
              ],
              [
                ":scheme",
                "https"
              ],
              [
                ":authority",
                "upload.example"
              ],
              [
                ":path",
                "/upload"
              ],
              [
                "content-type",
                "application/octet-stream"
              ]
            ]
          },
          {
            "dir": "c2s",
            "type": "DATA",
            "stream": 1,
            "end_stream": false,
            "data_text": "first-chunk-of-the-upload"
          },
          {
            "dir": "s2c",
            "type": "HEADERS",
            "stream": 1,
            "end_stream": false,
            "headers": [
              [
                ":status",
                "413"
              ],
              [
                "content-type",
                "text/plain"
              ]
            ]
          },
          {
            "dir": "s2c",
            "type": "DATA",
            "stream": 1,
            "end_stream": true,
            "data_text": "payload too large"
          },
          {
            "dir": "s2c",
            "type": "RST_STREAM",
            "stream": 1,
            "rst_code": 0
          },
          {
            "dir": "c2s",
            "type": "DATA",
            "stream": 1,
            "end_stream": false,
            "data_text": "second-chunk-sent-after-the-response"
          },
          {
            "dir": "c2s",
            "type": "DATA",
            "stream": 1,
            "end_stream": true,
            "data_text": "tail"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's HTTP/2 frame and HPACK decoder"
      ],
      "files": [
        "h2-early-response.pcapng",
        "h2-early-response.expected.json",
        "h2-early-response.md"
      ],
      "zip": "h2-early-response.zip"
    },
    {
      "id": "h2-data-reassembly",
      "title": "HTTP/2 response body spread over many frames and segments",
      "shows": "One HTTP/2 response body over TLS 1.3, spread over 60 DATA frames, each in its own TLS record, cut into small TCP segments.",
      "success": "The reassembled 60000-byte body matches its SHA-256.",
      "exposes": "Reassembly that drops or doubles bytes.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/2",
        "TLS 1.3"
      ],
      "encrypted": true,
      "expected": {
        "check": "h2-body",
        "stream": 1,
        "method": "GET",
        "path": "/large",
        "status": 200,
        "body_sha256": "e661c4ee8abf4381c60c19c2acd1cbb33e7e44f5ed7d7b85815f0022931cf3fb",
        "body_length": 60000,
        "data_frames": 60
      },
      "confirmed_by": [
        "an independent dissector's TLS decryption and HTTP/2 body reassembly"
      ],
      "files": [
        "h2-data-reassembly.pcapng",
        "h2-data-reassembly.keys.txt",
        "h2-data-reassembly.expected.json",
        "h2-data-reassembly.md"
      ],
      "zip": "h2-data-reassembly.zip"
    },
    {
      "id": "h2c-headers-out-of-order",
      "title": "HTTP/2 headers across an out-of-order segment",
      "shows": "Twelve cleartext HTTP/2 requests in small TCP segments, one segment out of order; later requests reuse HPACK table entries built by earlier ones.",
      "success": "All twelve request paths decoded.",
      "exposes": "HPACK decoded in arrival order instead of stream order.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/2 (cleartext)",
        "HPACK",
        "TCP"
      ],
      "encrypted": false,
      "expected": {
        "check": "h2c",
        "port": 80,
        "requests": [
          {
            "stream": 1,
            "path": "/alpha"
          },
          {
            "stream": 3,
            "path": "/beta"
          },
          {
            "stream": 5,
            "path": "/gamma"
          },
          {
            "stream": 7,
            "path": "/delta"
          },
          {
            "stream": 9,
            "path": "/epsilon"
          },
          {
            "stream": 11,
            "path": "/zeta"
          },
          {
            "stream": 13,
            "path": "/eta"
          },
          {
            "stream": 15,
            "path": "/theta"
          },
          {
            "stream": 17,
            "path": "/iota"
          },
          {
            "stream": 19,
            "path": "/kappa"
          },
          {
            "stream": 21,
            "path": "/lambda"
          },
          {
            "stream": 23,
            "path": "/mu"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's HTTP/2 and HPACK decoder"
      ],
      "files": [
        "h2c-headers-out-of-order.pcapng",
        "h2c-headers-out-of-order.expected.json",
        "h2c-headers-out-of-order.md"
      ],
      "zip": "h2c-headers-out-of-order.zip"
    },
    {
      "id": "h3-qpack-ooo",
      "title": "HTTP/3 with QPACK instructions out of order",
      "shows": "Twelve HTTP/3 requests whose QPACK encoder instructions arrive out of order.",
      "success": "Every request header field decoded.",
      "exposes": "A decoder that does not wait for the Required Insert Count.",
      "kind": "synthetic",
      "protocols": [
        "HTTP/3",
        "QPACK",
        "QUIC v1"
      ],
      "encrypted": true,
      "expected": {
        "check": "h3",
        "exchanges": [
          {
            "stream": 0,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/alpha"
          },
          {
            "stream": 4,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/beta"
          },
          {
            "stream": 8,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/gamma"
          },
          {
            "stream": 12,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/delta"
          },
          {
            "stream": 16,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/epsilon"
          },
          {
            "stream": 20,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/zeta"
          },
          {
            "stream": 24,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/eta"
          },
          {
            "stream": 28,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/theta"
          },
          {
            "stream": 32,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/iota"
          },
          {
            "stream": 36,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/kappa"
          },
          {
            "stream": 40,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/lambda"
          },
          {
            "stream": 44,
            "method": "GET",
            "authority": "synthetic.example",
            "path": "/mu"
          }
        ]
      },
      "confirmed_by": [
        "an independent QPACK decoder over an independent QUIC decryption"
      ],
      "files": [
        "h3-qpack-ooo.pcapng",
        "h3-qpack-ooo.keys.txt",
        "h3-qpack-ooo.expected.json",
        "h3-qpack-ooo.md"
      ],
      "zip": "h3-qpack-ooo.zip"
    },
    {
      "id": "h2-websocket-rfc8441",
      "title": "WebSocket carried inside HTTP/2",
      "shows": "WebSocket inside HTTP/2 (RFC 8441 extended CONNECT) over TLS 1.3, with permessage-deflate; two compressed messages share one compression window.",
      "success": "Every WebSocket message, inflated.",
      "exposes": "No RFC 8441 support, or a lost deflate context.",
      "kind": "synthetic",
      "protocols": [
        "WebSocket",
        "HTTP/2",
        "HPACK",
        "TLS 1.3"
      ],
      "encrypted": true,
      "expected": {
        "check": "h2-ws",
        "exchanges": [
          {
            "stream": 1,
            "method": "CONNECT",
            "protocol": "websocket",
            "url": "https://ws.example.com/chat?room=1",
            "status": 200
          },
          {
            "stream": 3,
            "method": "GET",
            "protocol": null,
            "url": "https://ws.example.com/other",
            "status": 200
          }
        ],
        "messages": [
          {
            "stream": 1,
            "dir": "c2s",
            "opcode": "TEXT",
            "text": "hello from client"
          },
          {
            "stream": 1,
            "dir": "c2s",
            "opcode": "PING",
            "hex": "70"
          },
          {
            "stream": 1,
            "dir": "s2c",
            "opcode": "TEXT",
            "text": "hello from server"
          },
          {
            "stream": 1,
            "dir": "s2c",
            "opcode": "BINARY",
            "hex": "deadbeef00010203"
          },
          {
            "stream": 1,
            "dir": "s2c",
            "opcode": "TEXT",
            "text": "compressed compressed compressed"
          },
          {
            "stream": 1,
            "dir": "s2c",
            "opcode": "TEXT",
            "text": "compressed again, same window"
          }
        ]
      },
      "confirmed_by": [
        "an independent dissector's TLS decryption, then independent HTTP/2, HPACK and WebSocket libraries"
      ],
      "files": [
        "h2-websocket-rfc8441.pcapng",
        "h2-websocket-rfc8441.keys.txt",
        "h2-websocket-rfc8441.expected.json",
        "h2-websocket-rfc8441.md"
      ],
      "zip": "h2-websocket-rfc8441.zip"
    }
  ],
  "files": [
    {
      "path": "tls13-minimal.pcapng",
      "size": 1612,
      "sha256": "fa3524774e02e533dbe2e3dff202840b81d7384889566bd2e7cf9a212892b8da"
    },
    {
      "path": "tls13-minimal.keys.txt",
      "size": 632,
      "sha256": "05405ec5fac8fb0428af5eba7ed05f802129f3392f4282401add60e04608b732"
    },
    {
      "path": "tls13-minimal.expected.json",
      "size": 238,
      "sha256": "57d265b74cdc8d450731ca27bacf5ba2e8b46f799f3b4ae069aa59ef3b465050"
    },
    {
      "path": "tls13-minimal.md",
      "size": 1150,
      "sha256": "95cd6197e045bf6233fc2da27c16febc8a7040cbc1547b3d440759f3d973d798"
    },
    {
      "path": "tls13-minimal.zip",
      "size": 23410,
      "sha256": "a2560311c91e13a48d95bdbcdfe145bbe1de98cd6004cbe2ce23d140f737daef"
    },
    {
      "path": "tls12-h1.pcapng",
      "size": 1128,
      "sha256": "829b2b0d9a63b13e333782ba9c3134808756549ddb3a4917424422a19746f2c6"
    },
    {
      "path": "tls12-h1.keys.txt",
      "size": 176,
      "sha256": "9e374083e59e16508bffd1e1916ba6192e91a1648ddabf3af7ae6b56dbd1735d"
    },
    {
      "path": "tls12-h1.expected.json",
      "size": 229,
      "sha256": "c3de73aff6c0f46d624596fe5186b8ec24c8494884c3b0f7b8cfa2a6f7051b05"
    },
    {
      "path": "tls12-h1.md",
      "size": 1018,
      "sha256": "d1ef07c79f76c5d17ccc224d41615911a7ac999e4f42c105f30ba5b73df7d94f"
    },
    {
      "path": "tls12-h1.zip",
      "size": 22269,
      "sha256": "f0b609db18523699df23b3c18f3324fcbfbf6d5b39d9cdc552c48bce727188e7"
    },
    {
      "path": "tls13-key-update.pcapng",
      "size": 2028,
      "sha256": "33adf1933940591a23c547562a65a7e77b2054da4cf2f47b8fc4171ef4751370"
    },
    {
      "path": "tls13-key-update.keys.txt",
      "size": 632,
      "sha256": "05405ec5fac8fb0428af5eba7ed05f802129f3392f4282401add60e04608b732"
    },
    {
      "path": "tls13-key-update.expected.json",
      "size": 312,
      "sha256": "da38260743c8493ac88ed5313366c96702236bb6b8a91238c13f05c20a6dcd8d"
    },
    {
      "path": "tls13-key-update.md",
      "size": 1450,
      "sha256": "1519f7fe56169f8cd5aaa482760c288863a8d18d03f8cdf0b15088dd9ce66d2d"
    },
    {
      "path": "tls13-key-update.zip",
      "size": 24236,
      "sha256": "b682e87fcc9cdcf87ac013cec269479ccaba95974366081e9cb3d779f347f93c"
    },
    {
      "path": "h2-early-response.pcapng",
      "size": 1076,
      "sha256": "7b2c5712ae7ec7827880d7b5d5ad23cada1190f373fe5b00cebe901b3a512865"
    },
    {
      "path": "h2-early-response.expected.json",
      "size": 1503,
      "sha256": "b5614459aefc46abb9deef72dbb64c47197800a3950ccfc7e3415314fee07905"
    },
    {
      "path": "h2-early-response.md",
      "size": 1386,
      "sha256": "be7390571f9f173ee713157c63085e19915977653fe846521385fde8c346d4da"
    },
    {
      "path": "h2-early-response.zip",
      "size": 23570,
      "sha256": "36c6a443326d02ef86f4b853e00a52f34ddfc4f0e2fcbf21e7e7cde6ab674392"
    },
    {
      "path": "h2-data-reassembly.pcapng",
      "size": 73616,
      "sha256": "d61b3e631242dd7a6bc1e1605236c435b35ce33a0784a0181c13790590e64ed0"
    },
    {
      "path": "h2-data-reassembly.keys.txt",
      "size": 632,
      "sha256": "6c9430ee59c5867ff35ada5ea02898e18cf246d61811ebb48a66963299b937f7"
    },
    {
      "path": "h2-data-reassembly.expected.json",
      "size": 276,
      "sha256": "b3de50787f26b8d147012889c5820650937d2cc7127009735bd3887e6cd6b39b"
    },
    {
      "path": "h2-data-reassembly.md",
      "size": 1171,
      "sha256": "a2607f2b33fb5280477160a1fa9596b227238ccb98cccae211b3a94cd50fd157"
    },
    {
      "path": "h2-data-reassembly.zip",
      "size": 95533,
      "sha256": "574a1004790bc25d32002a4b1da815156ec794217a246d48c997271ef39cedb3"
    },
    {
      "path": "h2c-headers-out-of-order.pcapng",
      "size": 1484,
      "sha256": "3f9e80047aa7fd03749190ebb58117af8348cd21c8321afa7f73cc3d69f0fbbd"
    },
    {
      "path": "h2c-headers-out-of-order.expected.json",
      "size": 773,
      "sha256": "b75c86e0733ef5fc7f6d22895f8b22eb16515f7ed1111f2bb1e928c1b163ee94"
    },
    {
      "path": "h2c-headers-out-of-order.md",
      "size": 1079,
      "sha256": "123a420c7bfd2738e5bf4e32e8e4a9f4c8a28c730d36e80e1eb6897d234f4ea8"
    },
    {
      "path": "h2c-headers-out-of-order.zip",
      "size": 23004,
      "sha256": "89123c7ad2349b27d8ea6439d401896dbbbd77d924e85eae72e3cd79259c96c6"
    },
    {
      "path": "h3-qpack-ooo.pcapng",
      "size": 15144,
      "sha256": "ef75ea3a047af61b73c52d1339a80dfeec448f3835682b23e53eb3e5c10966d3"
    },
    {
      "path": "h3-qpack-ooo.keys.txt",
      "size": 632,
      "sha256": "327ace7275112c8e33a5b80d38e92414dbcae10fb11dd2d4c7663f99c9378f0f"
    },
    {
      "path": "h3-qpack-ooo.expected.json",
      "size": 1505,
      "sha256": "b9b2bd89b8ce6ba484acfd9b963c09185d38a477e75d7bba1f6e5493265be524"
    },
    {
      "path": "h3-qpack-ooo.md",
      "size": 1091,
      "sha256": "bd8c2e52bb0351463fc57bb899b089bb03ccb509afe2eb2d67b00c8aa7c324a1"
    },
    {
      "path": "h3-qpack-ooo.zip",
      "size": 38138,
      "sha256": "80a5ce4c8e97b795c7eb5eb9813212afe6b7324a5968c6bce5c67edfc6195e2e"
    },
    {
      "path": "h2-websocket-rfc8441.pcapng",
      "size": 3308,
      "sha256": "c435fdb681341eed47b23b7f9b0ad092e19b37a2b38f0b4fd4e3c8c57d4b6e10"
    },
    {
      "path": "h2-websocket-rfc8441.keys.txt",
      "size": 632,
      "sha256": "cff239912b1b3a07c1b57dff14aed4861264b87a0a993cc5cade9865582b890c"
    },
    {
      "path": "h2-websocket-rfc8441.expected.json",
      "size": 1092,
      "sha256": "1d743633054ba379bd550b7dded31c7a4b3222854e4add162fa2c0e6791e7608"
    },
    {
      "path": "h2-websocket-rfc8441.md",
      "size": 1201,
      "sha256": "2e990fa13541b66ff598f2dcc841724795a830f5752fdf04c5da2d2fe264e4de"
    },
    {
      "path": "h2-websocket-rfc8441.zip",
      "size": 26095,
      "sha256": "3030ad9c09088d87b336ca125e422b8d9f3116d68adc49cff92295ab1961eec7"
    },
    {
      "path": "chart-locker-v1.zip",
      "size": 143598,
      "sha256": "d33924727b66cb80753b6be6fe02c1298cec95ab959f1649235d670619e440e9"
    }
  ]
}
