From 7d10868ce1ed6aabfc373013b00d0cbf83783200 Mon Sep 17 00:00:00 2001 From: AE <98699388+A-EDev@users.noreply.github.com> Date: Sat, 7 Nov 2026 20:21:16 +0200 Subject: [PATCH] fix(sync): read a payload's gzip as exactly one member with no flags --- .../aedev/flow/sync2/crypto/Payloads.kt | 54 ++++++++++---- .../io/github/aedev/flow/sync2/PayloadTest.kt | 74 +++++++++++++++++++ app/src/test/resources/sync2/README.md | 2 +- app/src/test/resources/sync2/payload.json | 73 ++++++++++++++++++ 4 files changed, 186 insertions(+), 17 deletions(-) create mode 100644 app/src/test/java/io/github/aedev/flow/sync2/PayloadTest.kt diff --git a/app/src/main/java/io/github/aedev/flow/sync2/crypto/Payloads.kt b/app/src/main/java/io/github/aedev/flow/sync2/crypto/Payloads.kt index 4d134a353..a23ca5cfa 100644 --- a/app/src/main/java/io/github/aedev/flow/sync2/crypto/Payloads.kt +++ b/app/src/main/java/io/github/aedev/flow/sync2/crypto/Payloads.kt @@ -1,14 +1,18 @@ package io.github.aedev.flow.sync2.crypto import java.io.ByteArrayOutputStream -import java.io.IOException -import java.io.InputStream import java.nio.ByteBuffer -import java.util.zip.GZIPInputStream +import java.nio.ByteOrder +import java.util.zip.CRC32 +import java.util.zip.DataFormatException import java.util.zip.GZIPOutputStream +import java.util.zip.Inflater private const val MIN_SIZE = 256 private const val MAX_INFLATED = 64 * 1024 * 1024 +private const val GZIP_HEADER = 10 +private const val GZIP_TRAILER = 8 +private val GZIP_START = byteArrayOf(0x1f, 0x8b.toByte(), 8, 0) /** PADMÉ with a 256-byte floor. */ fun paddedSize(n: Int): Int { @@ -30,23 +34,41 @@ fun decodePayload(payload: ByteArray): ByteArray { val length = ByteBuffer.wrap(payload, 0, 4).int if (length < 0 || length > payload.size - 4) reject(ProtocolError.PAYLOAD) if ((4 + length until payload.size).any { payload[it] != 0.toByte() }) reject(ProtocolError.PAYLOAD) - return try { - inflate(payload.inputStream(4, length)) - } catch (_: IOException) { - reject(ProtocolError.PAYLOAD) - } + return inflate(payload, 4, length) } -private fun inflate(body: InputStream): ByteArray { - val out = ByteArrayOutputStream() - val buffer = ByteArray(8192) - GZIPInputStream(body).use { input -> - while (true) { - val read = input.read(buffer) - if (read < 0) break +/** + * The one gzip member at [start], [length] bytes long (spec/crypto.md, Payload). No library reads gzip this strictly, + * so the fixed header and trailer are read here; inflating and the CRC stay in the library. + */ +private fun inflate( + payload: ByteArray, + start: Int, + length: Int, +): ByteArray { + if (length < GZIP_HEADER + GZIP_TRAILER) reject(ProtocolError.PAYLOAD) + if (GZIP_START.indices.any { payload[start + it] != GZIP_START[it] }) reject(ProtocolError.PAYLOAD) + val inflater = Inflater(true) + try { + // The trailer stays in the input: zlib may want a byte past the stream, and what's left shows where it ended. + inflater.setInput(payload, start + GZIP_HEADER, length - GZIP_HEADER) + val out = ByteArrayOutputStream() + val crc = CRC32() + val buffer = ByteArray(8192) + while (!inflater.finished()) { + val read = inflater.inflate(buffer) + if (read == 0 && !inflater.finished()) reject(ProtocolError.PAYLOAD) + crc.update(buffer, 0, read) out.write(buffer, 0, read) if (out.size() > MAX_INFLATED) reject(ProtocolError.PAYLOAD) } + if (inflater.remaining != GZIP_TRAILER) reject(ProtocolError.PAYLOAD) + val trailer = ByteBuffer.wrap(payload, start + length - GZIP_TRAILER, GZIP_TRAILER).order(ByteOrder.LITTLE_ENDIAN) + if (trailer.int != crc.value.toInt() || trailer.int != out.size()) reject(ProtocolError.PAYLOAD) + return out.toByteArray() + } catch (_: DataFormatException) { + reject(ProtocolError.PAYLOAD) + } finally { + inflater.end() } - return out.toByteArray() } diff --git a/app/src/test/java/io/github/aedev/flow/sync2/PayloadTest.kt b/app/src/test/java/io/github/aedev/flow/sync2/PayloadTest.kt new file mode 100644 index 000000000..367ac3cc7 --- /dev/null +++ b/app/src/test/java/io/github/aedev/flow/sync2/PayloadTest.kt @@ -0,0 +1,74 @@ +package io.github.aedev.flow.sync2 + +import io.github.aedev.flow.sync2.crypto.ProtocolError +import io.github.aedev.flow.sync2.crypto.ProtocolException +import io.github.aedev.flow.sync2.crypto.decodePayload +import io.github.aedev.flow.sync2.crypto.encodePayload +import org.junit.Assert.assertArrayEquals +import org.junit.Assert.assertEquals +import org.junit.Test +import java.io.ByteArrayOutputStream +import java.nio.ByteBuffer +import java.util.Random +import java.util.zip.Deflater +import java.util.zip.DeflaterOutputStream + +/** What this device writes reads back, and what it reads stays within its limit (spec/crypto.md, Payload). */ +class PayloadTest { + private fun randomBytes(size: Int) = ByteArray(size).also { Random(size.toLong()).nextBytes(it) } + + private val mebibyte = 1024 * 1024 + + @Test + fun what_the_encoder_writes_reads_back() { + for (content in listOf(ByteArray(0), "short".toByteArray(), ByteArray(mebibyte), randomBytes(mebibyte))) { + assertArrayEquals(content, decodePayload(encodePayload(content))) + } + } + + @Test + fun the_encoder_writes_one_member_with_no_flags() { + val payload = encodePayload("short".toByteArray()) + assertArrayEquals(byteArrayOf(0x1f, 0x8b.toByte(), 8, 0), payload.copyOfRange(4, 8)) + val length = ByteBuffer.wrap(payload, 0, 4).int + assertEquals("the trailer holds the length", 5, payload[4 + length - 4].toInt()) + } + + @Test + fun content_up_to_the_limit_reads_and_past_it_is_refused() { + val limit = 64 * mebibyte + assertEquals(limit, decodePayload(encodePayload(ByteArray(limit))).size) + val error = runCatching { decodePayload(encodePayload(ByteArray(limit + 1))) }.exceptionOrNull() + assertEquals(ProtocolError.PAYLOAD, (error as? ProtocolException)?.error) + } + + private fun assertRefused(payload: ByteArray) { + val error = runCatching { decodePayload(payload) }.exceptionOrNull() + assertEquals("$error", ProtocolError.PAYLOAD, (error as? ProtocolException)?.error) + } + + private val header = byteArrayOf(0x1f, 0x8b.toByte(), 8, 0, 0, 0, 0, 0, 0, 0) + + private fun framed(body: ByteArray) = ByteBuffer.allocate(4).putInt(body.size).array() + body + + @Test + fun a_body_too_short_for_its_header_and_trailer_is_refused() { + val whole = encodePayload("short".toByteArray()).drop(4).toByteArray() + for (size in 0 until 18) assertRefused(framed(whole.copyOf(size))) + } + + @Test + fun a_stream_that_isn_t_deflate_is_refused() { + assertRefused(framed(header + ByteArray(8) { -1 } + ByteArray(8))) + } + + @Test(timeout = 30_000) + fun a_stream_cut_off_before_its_end_is_refused() { + val deflated = + ByteArrayOutputStream() + .also { out -> + DeflaterOutputStream(out, Deflater(9, true)).use { it.write(randomBytes(4096)) } + }.toByteArray() + assertRefused(framed(header + deflated.copyOf(deflated.size / 2))) + } +} diff --git a/app/src/test/resources/sync2/README.md b/app/src/test/resources/sync2/README.md index e4df2893a..015817c6c 100644 --- a/app/src/test/resources/sync2/README.md +++ b/app/src/test/resources/sync2/README.md @@ -10,7 +10,7 @@ All byte strings are lowercase hex, except inside roster entries, which use the | `derive.json` | `Derive` and `Hash` ([crypto.md](../crypto.md#labelled-derivation)) | | `ed25519.json` | Strict verification: valid, tampered, wrong key, non-canonical `S`, small-order key; the eight small-order encodings; a non-canonical key encoding | | `box.json` | Box seal and open with fixed salts; tampered ciphertext, tag, commitment and salt, wrong key, wrong AAD, truncation | -| `payload.json` | PADMÉ sizes; payload decoding; bad length, non-zero padding, corrupt gzip | +| `payload.json` | PADMÉ sizes; payload decoding, including another encoder's header bytes and a stored block; bad length, non-zero padding, corrupt gzip, more than one member, a bad or short trailer, any header flag, an empty body, bytes around the member | | `keys.json` | Member ids, epoch commitment, purpose keys, HPKE wrap with a fixed ephemeral key, wrong-epoch and wrong-member unwraps, history chain, wrap and chain paths | | `recovery.json` | Recovery secret, 24 words and derived keys; words with a bad checksum, 23 words, and a valid 12-word phrase | | `envelope.json` | Log objects of each type, including a store login, opened in stream order, a live message, a snapshot blob; truncation, magic, suite, group, unknown sender, signature, tampering, replay, gap, a log read from the middle, wrong `prev`, swapped epoch, `seq` above 253 − 1, blob hash | diff --git a/app/src/test/resources/sync2/payload.json b/app/src/test/resources/sync2/payload.json index 326a1e5c7..b3474789b 100644 --- a/app/src/test/resources/sync2/payload.json +++ b/app/src/test/resources/sync2/payload.json @@ -45,6 +45,14 @@ { "content": "7b2270726f6772657373223a302e302c22766964656f4964223a22333836313963636663343563222c227761746368656441744d73223a313739333233323030303030307d0a7b2270726f6772657373223a302e312c22766964656f4964223a22396439633437346430313530222c227761746368656441744d73223a313739333233323030373931397d0a7b2270726f6772657373223a302e322c22766964656f4964223a22303036383663373736353863222c227761746368656441744d73223a313739333233323031353833387d0a7b2270726f6772657373223a302e332c22766964656f4964223a22343666396131633866656566222c227761746368656441744d73223a313739333233323032333735377d0a7b2270726f6772657373223a302e342c22766964656f4964223a22363166343938636365343635222c227761746368656441744d73223a313739333233323033313637367d0a7b2270726f6772657373223a302e352c22766964656f4964223a22316366623361376161663531222c227761746368656441744d73223a313739333233323033393539357d0a7b2270726f6772657373223a302e362c22766964656f4964223a22326232333862363165353732222c227761746368656441744d73223a313739333233323034373531347d0a7b2270726f6772657373223a302e372c22766964656f4964223a22333833336630396634613562222c227761746368656441744d73223a313739333233323035353433337d0a7b2270726f6772657373223a302e382c22766964656f4964223a22626632393961333633313262222c227761746368656441744d73223a313739333233323036333335327d0a7b2270726f6772657373223a302e392c22766964656f4964223a22633062663366636435666233222c227761746368656441744d73223a313739333233323037313237317d0a7b2270726f6772657373223a302e31302c22766964656f4964223a22623565353439633630373362222c227761746368656441744d73223a313739333233323037393139307d0a7b2270726f6772657373223a302e31312c22766964656f4964223a22393637623933333733386637222c227761746368656441744d73223a313739333233323038373130397d0a7b2270726f6772657373223a302e31322c22766964656f4964223a22653464666366636635356636222c227761746368656441744d73223a313739333233323039353032387d0a7b2270726f6772657373223a302e31332c22766964656f4964223a22363839643361323438383161222c227761746368656441744d73223a313739333233323130323934377d0a7b2270726f6772657373223a302e31342c22766964656f4964223a22373437633763663832653233222c227761746368656441744d73223a313739333233323131303836367d0a7b2270726f6772657373223a302e31352c22766964656f4964223a22666563613761656435373630222c227761746368656441744d73223a313739333233323131383738357d0a7b2270726f6772657373223a302e31362c22766964656f4964223a22633438663834333539663735222c227761746368656441744d73223a313739333233323132363730347d0a7b2270726f6772657373223a302e31372c22766964656f4964223a22333262613466626663333536222c227761746368656441744d73223a313739333233323133343632337d0a7b2270726f6772657373223a302e31382c22766964656f4964223a22306437353735383535353537222c227761746368656441744d73223a313739333233323134323534327d0a7b2270726f6772657373223a302e31392c22766964656f4964223a22653431656561353063616435222c227761746368656441744d73223a313739333233323135303436317d0a7b2270726f6772657373223a302e32302c22766964656f4964223a22353939636635323565333332222c227761746368656441744d73223a313739333233323135383338307d0a7b2270726f6772657373223a302e32312c22766964656f4964223a22653865356231323732613738222c227761746368656441744d73223a313739333233323136363239397d0a7b2270726f6772657373223a302e32322c22766964656f4964223a22336338653163346634616561222c227761746368656441744d73223a313739333233323137343231387d0a7b2270726f6772657373223a302e32332c22766964656f4964223a22643065636664656534373030222c227761746368656441744d73223a313739333233323138323133377d0a7b2270726f6772657373223a302e32342c22766964656f4964223a22393361376363653662386365222c227761746368656441744d73223a313739333233323139303035367d0a7b2270726f6772657373223a302e32352c22766964656f4964223a22363963313230306363373031222c227761746368656441744d73223a313739333233323139373937357d0a7b2270726f6772657373223a302e32362c22766964656f4964223a22633361306432346538303430222c227761746368656441744d73223a313739333233323230353839347d0a7b2270726f6772657373223a302e32372c22766964656f4964223a22373466623363663366393031222c227761746368656441744d73223a313739333233323231333831337d0a7b2270726f6772657373223a302e32382c22766964656f4964223a22613437633638636538313466222c227761746368656441744d73223a313739333233323232313733327d0a7b2270726f6772657373223a302e32392c22766964656f4964223a22306461623366653564656566222c227761746368656441744d73223a313739333233323232393635317d0a7b2270726f6772657373223a302e33302c22766964656f4964223a22393933363334306163643935222c227761746368656441744d73223a313739333233323233373537307d0a7b2270726f6772657373223a302e33312c22766964656f4964223a22303039383138656637656432222c227761746368656441744d73223a313739333233323234353438397d0a7b2270726f6772657373223a302e33322c22766964656f4964223a22623064353234306235623538222c227761746368656441744d73223a313739333233323235333430387d0a7b2270726f6772657373223a302e33332c22766964656f4964223a22343761393066353535363236222c227761746368656441744d73223a313739333233323236313332377d0a7b2270726f6772657373223a302e33342c22766964656f4964223a22643431383161666632373035222c227761746368656441744d73223a313739333233323236393234367d0a7b2270726f6772657373223a302e33352c22766964656f4964223a22363865323238656230333337222c227761746368656441744d73223a313739333233323237373136357d0a7b2270726f6772657373223a302e33362c22766964656f4964223a22333633393534323938346634222c227761746368656441744d73223a313739333233323238353038347d0a7b2270726f6772657373223a302e33372c22766964656f4964223a22313765386661623436653639222c227761746368656441744d73223a313739333233323239333030337d0a7b2270726f6772657373223a302e33382c22766964656f4964223a22666130643263653366356631222c227761746368656441744d73223a313739333233323330303932327d0a7b2270726f6772657373223a302e33392c22766964656f4964223a22303832363065303438323837222c227761746368656441744d73223a313739333233323330383834317d0a7b2270726f6772657373223a302e34302c22766964656f4964223a22636563306266643161336363222c227761746368656441744d73223a313739333233323331363736307d0a7b2270726f6772657373223a302e34312c22766964656f4964223a22306433353338336337613738222c227761746368656441744d73223a313739333233323332343637397d0a7b2270726f6772657373223a302e34322c22766964656f4964223a22646239323134356334383937222c227761746368656441744d73223a313739333233323333323539387d0a7b2270726f6772657373223a302e34332c22766964656f4964223a22363862323965383431393464222c227761746368656441744d73223a313739333233323334303531377d0a7b2270726f6772657373223a302e34342c22766964656f4964223a22613733333434386163346662222c227761746368656441744d73223a313739333233323334383433367d0a7b2270726f6772657373223a302e34352c22766964656f4964223a22303761333635323761363738222c227761746368656441744d73223a313739333233323335363335357d0a7b2270726f6772657373223a302e34362c22766964656f4964223a22373566663064376631633966222c227761746368656441744d73223a313739333233323336343237347d0a7b2270726f6772657373223a302e34372c22766964656f4964223a22663836616666303736346366222c227761746368656441744d73223a313739333233323337323139337d0a7b2270726f6772657373223a302e34382c22766964656f4964223a22623338363037643565306461222c227761746368656441744d73223a313739333233323338303131327d0a7b2270726f6772657373223a302e34392c22766964656f4964223a22383264633031326139656233222c227761746368656441744d73223a313739333233323338383033317d0a7b2270726f6772657373223a302e35302c22766964656f4964223a22663164613938346437643134222c227761746368656441744d73223a313739333233323339353935307d0a7b2270726f6772657373223a302e35312c22766964656f4964223a22383834333737383862336232222c227761746368656441744d73223a313739333233323430333836397d0a7b2270726f6772657373223a302e35322c22766964656f4964223a22313735663162363634386335222c227761746368656441744d73223a313739333233323431313738387d0a7b2270726f6772657373223a302e35332c22766964656f4964223a22643130326235663837663136222c227761746368656441744d73223a313739333233323431393730377d0a7b2270726f6772657373223a302e35342c22766964656f4964223a22353330366562386364363562222c227761746368656441744d73223a313739333233323432373632367d0a7b2270726f6772657373223a302e35352c22766964656f4964223a22666538656334333630616663222c227761746368656441744d73223a313739333233323433353534357d0a7b2270726f6772657373223a302e35362c22766964656f4964223a22646235643461633739386637222c227761746368656441744d73223a313739333233323434333436347d0a7b2270726f6772657373223a302e35372c22766964656f4964223a22373435316336396336323664222c227761746368656441744d73223a313739333233323435313338337d0a7b2270726f6772657373223a302e35382c22766964656f4964223a22393465333830306434616637222c227761746368656441744d73223a313739333233323435393330327d0a7b2270726f6772657373223a302e35392c22766964656f4964223a22376335313632623763656531222c227761746368656441744d73223a313739333233323436373232317d", "payload": "0000040a1f8b080000000000020375d73bae5c370c06e03ecb98da08f8142977295364117a26a91cd8465204debb79a71a8dc05b0ffeab237da4a8ff1fff7cfdf2e7d7f5eddbe333fc0a9f1efffe3dd797dfe7e3f383bd601d630fd1f1f8f4f8af7d1f7fadf9dbf73fe2a7689589099e7f3f7e3953f035a5ce3ac464022aa42956b1bea7d06b0a40f132cc8a7aba1654677f4fe1d71429bb361cbed7da590ab1a9bda7c86b4ac12dd5c75852344b612c56de53f43505c7eedcacb5ad98a654adfa9e525e53a8137b2fb8d4284b115394f7143b4f9a7943ddd2b46729aac2fc9ee2af297d53ad8d0b23a5298559e93da5bea60ce89bf7981adb93a51892e1a5eec0db75a9d451c0385dcc87ba1befa9b758afccc6be2d8b7143b8f4e2c177c9dc51485b75972ca62ad0c5170fbfc5ebe446e28e2d8941a02a975f3c009bd8b0b19d16655b8c085e2ec07808de6b84df35d54a56d9886e7e09c683f010df2eac755b564e48c5e0228ca761ea4d76df8335db6264297419c60331cc287f758dbfecc05148e5428c87e225b85653186da61fa520e5524c8762ad35d0902ee6acbc9f5def524c87e2e54b7bd40c35f32ca694a8de2be650ccc3170e8936b1527e268497623a144f5863cfb5c42075e3715897623a14d7e89ed1844bf7b1b2980aa097623a14973a306ea0310cb23e8cd5aa5d8ae954cc0d26c97290eca3a2877abd14d3a1d882308f6880355d4dec8ce3a5980ec52d2abcc4be384a76d1458ef1a5980ec5305be7bd340e2b8fa9452fc57c28ae352e05813666cd8ae179eb5e8af9500c501d7d6d5b332b061215bf14f3a1b8c35412e8da352b06d258ee3d4a9cb384b50ad1d0b550d66fa820d3a5980fc553309af9de6490ee4da92497623e15fb22f2d521eeaa2cc60ccba5980fc5714e357a5bf528f22cc615fc52cc8762b4e5bb7529abd42ca632c0a5980fc5fba3a4c6e2ad3b2b8608a97429e653b1538105e2e4d9de30b8cba5580ec5637d8c26131b8f6c047d4e7d976239154fd698b786e5bd98e3b8ed522c87e2d96b5c441a97674d3f8a49eba558de268a4e75c5b75799598c80e23d111f8a9b318b788bcb219bb658e292bf14cba1182cc647256b25df1b2dac976239149bee1df7f8c651b3b6c545c82ec57228de5ea230c18a8c34c6e272b814cb3916c73b0a6cea8a6e9ac538205e8ae550ec340720b5bad2b998dde3e171bd3a0ec51b678bf29e3631abf0e7abe352ac87e228173673efdcb35e2c101f7e29d64331c651612f457c64dd4f10e3ff5c31e74411536fd7ed71e4592f0ee10697623d142b4359314ecc923e83424df4fb2be66d2ef635c23ab49d358a1877552ec57a289e5da7b461357f7a88c4447b29d6b7894271c49013cbce2a3c7e111de98a39145759a1146245f96a347afaa5580fc536140b751b6b652d3d7a5fcc263f7e02e4f6e077991000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "content": "73686f7274", + "payload": "000000191f8b0800d2029649020b2bcec82f2a0100a290288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + }, + { + "content": "73686f7274", + "payload": "0000001c1f8b0800000000000203010500faff73686f7274a290288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" } ], "negatives": [ @@ -67,6 +75,71 @@ "name": "too-short", "payload": "000000", "error": "payload" + }, + { + "name": "two-members", + "payload": "000000341f8b08000000000002032bcec82f2a0100a290288f050000001f8b080000000000020353284e4dcecf4b010028560c55070000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "two-identical-members", + "payload": "000000321f8b08000000000002032bcec82f2a0100a290288f050000001f8b08000000000002032bcec82f2a0100a290288f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "bad-crc", + "payload": "000000191f8b08000000000002032bcec82f2a0100a390288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "bad-isize", + "payload": "000000191f8b08000000000002032bcec82f2a0100a290288f050000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "truncated-trailer", + "payload": "000000151f8b08000000000002032bcec82f2a0100a290288f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "fhcrc-bad", + "payload": "0000001b1f8b080200000000020300002bcec82f2a0100a290288f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "empty-body", + "payload": "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "reserved-flag", + "payload": "000000191f8b08200000000002032bcec82f2a0100a290288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "trailing-bytes", + "payload": "000000201f8b08000000000002032bcec82f2a0100a290288f050000006761726261676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "fname", + "payload": "0000001e1f8b08080000000002036e616d65002bcec82f2a0100a290288f05000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "bad-magic", + "payload": "000000191e8b08000000000002032bcec82f2a0100a290288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "bad-method", + "payload": "000000191f8b07000000000002032bcec82f2a0100a290288f050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" + }, + { + "name": "bytes-before-trailer", + "payload": "000000201f8b08000000000002032bcec82f2a010067617262616765a290288f0500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "error": "payload" } ] }