{
  "note": "Generated by xtask. Every primitive is validated against its RFC's published vectors before these are computed. Regenerate with `cargo xtask vectors`, never hand-edit.",
  "conventions": {
    "integers": "big-endian, fixed width, no padding, no length prefix",
    "concatenation": "the | operator joins fixed-width fields with no separator",
    "hmac": "HMAC-SHA256, truncated to the LEFTMOST 16 bytes where 16 is specified",
    "hkdf": "HKDF-SHA256 (RFC 5869) with salt, IKM and info as named arguments",
    "cbor": "RFC 8949 section 4.2 deterministic encoding"
  },
  "inputs": {
    "printed_secret": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
    "device_id": "4f524947494e38392044454d4f203031",
    "challenge": "a0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
    "next_challenge": "c0c1c2c3c4c5c6c7c8c9cacbcccdcecf",
    "client_nonce": "b0b1b2b3b4b5b6b7b8b9babbbcbdbebf",
    "client_id": 7,
    "session_id": 3,
    "req_id": 17,
    "counter": 66,
    "label": "kitchen phone",
    "epoch": 1,
    "protocol_major": 1,
    "protocol_minor": 0,
    "model": "Origin89 CTRL-1 (G0B1)",
    "provisioned": false,
    "pairing_open": true,
    "fw_controller": "o89-stm32 0.1.0+1a2b3c",
    "fw_comms": "esp32c6 0.2.0-unverified",
    "capabilities": 247,
    "log_oldest_seq": 1,
    "log_newest_seq": 256,
    "state_seq": 255,
    "time_known": true,
    "reported_limits": {
      "max_sessions": 8,
      "max_channels": 32,
      "max_clients": 8,
      "max_event_queue": 16,
      "max_inflight": 4,
      "max_cmd_dedup": 32
    }
  },
  "qr": {
    "len": 104,
    "payload": "km43:1:4f524947494e38392044454d4f203031:000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f"
  },
  "limits": {
    "max_payload": 1024,
    "cobs_input": 1026,
    "max_cobs_overhead": 5,
    "max_frame_including_delimiter": 1032
  },
  "derived_keys": {
    "client_key": {
      "salt": "4f524947494e38392044454d4f203031",
      "ikm": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
      "info": "6b6d34332f76312f636c69656e742d6b65790000000100000007",
      "info_readable": "'km43/v1/client-key' | epoch:u32be | client_id:u32be",
      "L": 32,
      "out": "eadf9347ac95af6e8d164d90883965d670a003c52785f1052fba086b05a1a853"
    },
    "session_key": {
      "salt": "a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf",
      "ikm": "eadf9347ac95af6e8d164d90883965d670a003c52785f1052fba086b05a1a853",
      "info": "6b6d34332f76312f73657373696f6e2d6b65790003",
      "info_readable": "'km43/v1/session-key' | session_id:u16be",
      "L": 32,
      "out": "ba9ddffe57f11ccceeb5699cbaa5e1c196b719e9e867d97b05dd3b855d0f7601"
    },
    "pair_key": {
      "salt": "4f524947494e38392044454d4f203031",
      "ikm": "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f",
      "info": "6b6d34332f76312f706169722d6b6579",
      "info_readable": "'km43/v1/pair-key'",
      "L": 32,
      "out": "d2b669d733ae985424f2930404f5b5976fc52776deaf02a853f14d43c0b73007"
    }
  },
  "macs": {
    "pair_proof": {
      "key": "pair_key",
      "preimage": "6b6d34332f76312f706169722d70726f6f664f524947494e38392044454d4f203031a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf016b69746368656e2070686f6e65",
      "preimage_readable": "'km43/v1/pair-proof' | device_id[16] | challenge[16] | client_nonce[16] | client_kind:u8 | label (UTF-8, no NUL, last)",
      "out16": "22171c0449d848381e6d99ed7c92d1bd"
    },
    "pair_ack_mac": {
      "key": "pair_key",
      "preimage": "6b6d34332f76312f706169722d61636b4f524947494e38392044454d4f203031a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf010000000700000001c0c1c2c3c4c5c6c7c8c9cacbcccdcecf",
      "preimage_readable": "'km43/v1/pair-ack' | device_id[16] | challenge[16] | client_nonce[16] | outcome:u8 | client_id:u32be | epoch:u32be | next_challenge[16]",
      "out16": "4a7937d934b87b750a254a05289f030b"
    },
    "hello_proof": {
      "key": "client_key",
      "inner_body_cbor": "a5010102000307046d6f38392d636c6920302e312e300550b0b1b2b3b4b5b6b7b8b9babbbcbdbebf",
      "preimage": "6b6d34332f76312f68656c6c6f2d70726f6f66a0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebf00000007a5010102000307046d6f38392d636c6920302e312e300550b0b1b2b3b4b5b6b7b8b9babbbcbdbebf",
      "preimage_readable": "'km43/v1/hello-proof' | challenge[16] | client_nonce[16] | client_id:u32be | payload",
      "out16": "8418a3ffb064b88022622123ce6a4f01"
    },
    "signed_request": {
      "key": "session_key",
      "type": 8,
      "operation_cbor": "a301182a0219010103a101190384",
      "preimage": "6b6d34332f76312f72657108000300000011000000070000000000000042a301182a0219010103a101190384",
      "preimage_readable": "'km43/v1/req' | type:u8 | session_id:u16be | req_id:u32be | client_id:u32be | counter:u64be | operation",
      "out16": "078cc3c1d821bc16a1d6ab81e11ec30d",
      "full_body_cbor": "a40107021842034ea301182a0219010103a1011903840450078cc3c1d821bc16a1d6ab81e11ec30d"
    },
    "wrapper_request": {
      "key": "session_key",
      "type": 5,
      "inner_body_cbor": "a2011904c0021840",
      "preimage": "6b6d34332f76312f77727105000300000011a2011904c0021840",
      "preimage_readable": "'km43/v1/wrq' | type:u8 | session_id:u16be | req_id:u32be | payload",
      "out16": "dc50348012c95f28990c26c4f0f84cb5",
      "full_body_cbor": "a20148a2011904c00218400250dc50348012c95f28990c26c4f0f84cb5"
    },
    "response": {
      "key": "session_key",
      "type": 136,
      "inner_body_cbor": "a301182a0201037267656e657261746f72207374617274696e67",
      "preimage": "6b6d34332f76312f72737088000300000011a301182a0201037267656e657261746f72207374617274696e67",
      "preimage_readable": "'km43/v1/rsp' | type:u8 | session_id:u16be | req_id:u32be | payload",
      "out16": "879f149683b569b80d2b190a955eccba",
      "full_body_cbor": "a201581aa301182a0201037267656e657261746f72207374617274696e670250879f149683b569b80d2b190a955eccba"
    },
    "event": {
      "key": "session_key",
      "type": 4,
      "inner_body_cbor": "a4011904d2021b0000018f1e2a3b400319020104a201030201",
      "preimage": "6b6d34332f76312f65767404000300000000a4011904d2021b0000018f1e2a3b400319020104a201030201",
      "preimage_readable": "'km43/v1/evt' | type:u8 | session_id:u16be | 0x00000000 | payload",
      "out16": "98b7711ad5f1162b6eb7d2dc41d863ef",
      "full_body_cbor": "a2015819a4011904d2021b0000018f1e2a3b400319020104a201030201025098b7711ad5f1162b6eb7d2dc41d863ef"
    }
  },
  "bodies": {
    "discover_0x80": {
      "type": 128,
      "authentication": "none; no key exists yet, so there is no MAC to publish",
      "body_readable": "{1:protocol_major=1, 2:protocol_minor=0, 3:device_id, 4:model, 5:provisioned=false, 6:pairing_open=true, 7:challenge, 8:epoch=1}",
      "body_cbor": "a80101020003504f524947494e38392044454d4f20303104764f726967696e3839204354524c2d312028473042312905f406f50750a0a1a2a3a4a5a6a7a8a9aaabacadaeaf0801",
      "body_len": 71
    },
    "hello_0x81": {
      "type": 129,
      "authentication": "this is the inner body; on the wire it is key 1 of the wrapper, whose key 2 is a MAC under session_key with the label 'km43/v1/rsp'",
      "body_readable": "{1:protocol_major=1, 2:protocol_minor=0, 3:session_id=3, 4:fw_controller, 5:fw_comms, 6:capabilities=0xf7, 7:log_oldest_seq=1, 8:log_newest_seq=256, 9:state_seq=255, 10:time_known=true, 11:counter=65, 12:max_sessions=8, 13:max_channels=32, 14:max_clients=8, 15:max_event_queue=16, 16:max_inflight=4, 17:max_cmd_dedup=32}",
      "capabilities_readable": "bit 0 log readable, 1 config writable, 2 commands accepted, 4 clock settable, 5 counted state of charge, 6 AC metering, 7 a behaviour is in shadow mode; bit 3 firmware update is clear",
      "counter_readable": "the highest counter already accepted from client_id 7, which is why the signed_request vector's 0x42 is the next value that is not a replay",
      "sequence_spaces": "keys 7 and 8 are log positions and key 9 is the state store's own counter; the two spaces must never be compared, and 255 sitting beside 256 here is what that trap looks like",
      "body_cbor": "b101010200030304766f38392d73746d333220302e312e302b3161326233630578186573703332633620302e322e302d756e76657269666965640618f70701081901000918ff0af50b18410c080d18200e080f101004111820",
      "body_len": 89
    },
    "snapshot_0x82": {
      "type": 130,
      "authentication": "this is the inner body; on the wire it is key 1 of the wrapper, whose key 2 is a MAC under session_key with the label 'km43/v1/rsp'",
      "body_readable": "{1:seq=256, 2:at, 3:values}",
      "values_readable": "channel 1 battery voltage 24.800 V measured; channel 2 probe temperature −21.500 °C, which is where an unsigned field would show; channel 3 ambient temperature absent, carrying NO key 3 rather than a zero; channel 4 generator state 3 running, an answer rather than a measurement; channel 5 state of charge 41.2 % stale, carrying both the last value and the time it was taken",
      "request_body_cbor": "a0",
      "request_readable": "Snapshot 0x02 is the wrapper around an empty inner body, and a body is a CBOR map (P-011), so the empty inner body is the empty map a0 and not a payload of no bytes",
      "body_cbor": "a301190100021b0000018bcfe568000385a4010102190101031960e00401a5010202190302033953fb0401051b0000018bcfe56800a30103021903010405a401040219050103030402a50105021901040319019c0404051b0000018bcf409c80",
      "body_len": 96,
      "at_the_cap_readable": "the widest body max_channels allows: 32 values with every field at the top of its range, key 3 at the i32 floor P-089 sets, and both timestamps present. Nothing here is a plausible reading — it is the size a fully configured site has to fit, which is the one cap this document got wrong once",
      "at_the_cap_body_cbor": "a3011bffffffffffffffff021bffffffffffffffff039820a50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffffa50119ffff0219ffff033a7fffffff0401051bffffffffffffffff",
      "at_the_cap_body_len": 888
    }
  },
  "crc16": [
    {
      "label": "empty",
      "input": "",
      "crc": "0xffff"
    },
    {
      "label": "single zero",
      "input": "00",
      "crc": "0xe1f0"
    },
    {
      "label": "no zeros",
      "input": "6f726967696e3839",
      "crc": "0xe9bd"
    },
    {
      "label": "embedded zero",
      "input": "11223300445566",
      "crc": "0x1ee7"
    }
  ],
  "cobs": [
    {
      "label": "empty",
      "input": "",
      "encoded": "01"
    },
    {
      "label": "single zero",
      "input": "00",
      "encoded": "0101"
    },
    {
      "label": "no zeros",
      "input": "6f726967696e3839",
      "encoded": "096f726967696e3839"
    },
    {
      "label": "embedded zero",
      "input": "11223300445566",
      "encoded": "0411223304445566"
    },
    {
      "label": "254 non-zero bytes (block boundary)",
      "input": "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe",
      "encoded": "ff0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe"
    },
    {
      "label": "255 non-zero bytes (boundary + 1)",
      "input": "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe41",
      "encoded": "ff0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe0241"
    },
    {
      "label": "254 non-zero bytes then a zero (the silent-loss case)",
      "input": "0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe00",
      "encoded": "ff0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfe0101"
    }
  ],
  "frame": {
    "envelope_cbor": "8418880311a201581aa301182a0201037267656e657261746f72207374617274696e670250879f149683b569b80d2b190a955eccba",
    "envelope_readable": "[type:0x88, session_id:3, req_id:17, {1:payload, 2:mac}]",
    "crc16_ccitt_false": "0x0444",
    "crc_covers": "the CBOR envelope bytes exactly, from first byte to last",
    "pre_cobs": "8418880311a201581aa301182a0201037267656e657261746f72207374617274696e670250879f149683b569b80d2b190a955eccba4404",
    "encoded_with_delimiter": "388418880311a201581aa301182a0201037267656e657261746f72207374617274696e670250879f149683b569b80d2b190a955eccba440400",
    "encoded_len": 57
  }
}
