{"generated_at":"2026-02-25T15:55:39.963Z","generator":"generate_vectors.js","reference_packages":{"hyperdht":"6.29.0","hypercore-crypto":"3.6.1","compact-encoding":"2.19.0","sodium-universal":"5.0.1"},"sections":{"keypair":{"description":"Ed25519 keypair generation via crypto_sign_seed_keypair","tests":[{"name":"keypair_from_seed_A","input":{"seed":"0100000000000000000000000000000000000000000000000000000000000000"},"output":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","secret_key":"0100000000000000000000000000000000000000000000000000000000000000cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"}},{"name":"keypair_from_seed_B","input":{"seed":"0200000000000000000000000000000000000000000000000000000000000000"},"output":{"public_key":"6b79c57e6a095239282c04818e96112f3f03a4001ba97a564c23852a3f1ea5fc","secret_key":"02000000000000000000000000000000000000000000000000000000000000006b79c57e6a095239282c04818e96112f3f03a4001ba97a564c23852a3f1ea5fc"}},{"name":"keypair_sizes","input":{},"output":{"public_key_size":32,"secret_key_size":64}}]},"namespace":{"description":"Namespace derivation: BLAKE2b(name) then BLAKE2b(hash || id) per ID","tests":[{"name":"hyperdht_namespaces","input":{"name":"hyperswarm/dht","ids":[4,5,6,0,1]},"output":{"ns_announce":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d497","ns_unannounce":"ded293cd93fb395e756ecf5fff426529e72c36eacc22e5ed944d9099a2561e32","ns_mutable_put":"668e823edd5ce7f5338d68bf1161f4a3c28ce437ee2ab49efd30d99366039b1e","ns_peer_handshake":"14d6d4b49214ab1033ed204976caa258bae9e1e8543b9ad1fd996a910b0c4e3a","ns_peer_holepunch":"f1191cd5e67b10b54a507033280ed1ff0e12278268d5679c8f93d417210d168b"}},{"name":"hyperdht_namespaces_match_constants","input":{},"output":{"NS_ANNOUNCE":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d497","NS_UNANNOUNCE":"ded293cd93fb395e756ecf5fff426529e72c36eacc22e5ed944d9099a2561e32","NS_MUTABLE_PUT":"668e823edd5ce7f5338d68bf1161f4a3c28ce437ee2ab49efd30d99366039b1e","NS_PEER_HANDSHAKE":"14d6d4b49214ab1033ed204976caa258bae9e1e8543b9ad1fd996a910b0c4e3a","NS_PEER_HOLEPUNCH":"f1191cd5e67b10b54a507033280ed1ff0e12278268d5679c8f93d417210d168b"}},{"name":"sequential_ids","input":{"name":"hyperswarm/dht","ids":[0,1,2,3,4]},"output":["14d6d4b49214ab1033ed204976caa258bae9e1e8543b9ad1fd996a910b0c4e3a","f1191cd5e67b10b54a507033280ed1ff0e12278268d5679c8f93d417210d168b","0ea5f9f225bac23c9e6396d3f8842089c4723d72163be3c7cbcb56485c969834","c9e2bffb41e679fcae30a0328a33d111d99fa1f538c9411ebfe70cea6818c059","36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d497"]}]},"token":{"description":"Token generation: BLAKE2b(key=secret, data=host_string)","tests":[{"name":"token_generation","input":{"secret":"aabb000000000000000000000000000000000000000000000000000000000000"},"output":[{"host":"127.0.0.1","token":"961353f7fa646276ff888a822407881c4058142d29beac5383828a8f0cce187e"},{"host":"192.168.1.100","token":"24b0cfd5d0bccb904d77d07d52823e35cee70a93ac9b66f8b38cfd8d0628acfd"},{"host":"10.0.0.1","token":"6925d970f2693fc5b87da35b3bcef75ef15182b0aeb38e31aa6a3918b8cfd3e7"}]}]},"varint":{"description":"Compact encoding varint: 0-252=1B, 253-65535=3B(0xfd+LE16), 65536+=5B(0xfe+LE32)","tests":[{"name":"varint_0","input":{"value":0},"output":{"encoded":"00","byte_length":1}},{"name":"varint_1","input":{"value":1},"output":{"encoded":"01","byte_length":1}},{"name":"varint_127","input":{"value":127},"output":{"encoded":"7f","byte_length":1}},{"name":"varint_252","input":{"value":252},"output":{"encoded":"fc","byte_length":1}},{"name":"varint_253","input":{"value":253},"output":{"encoded":"fdfd00","byte_length":3}},{"name":"varint_254","input":{"value":254},"output":{"encoded":"fdfe00","byte_length":3}},{"name":"varint_255","input":{"value":255},"output":{"encoded":"fdff00","byte_length":3}},{"name":"varint_256","input":{"value":256},"output":{"encoded":"fd0001","byte_length":3}},{"name":"varint_1000","input":{"value":1000},"output":{"encoded":"fde803","byte_length":3}},{"name":"varint_65535","input":{"value":65535},"output":{"encoded":"fdffff","byte_length":3}},{"name":"varint_65536","input":{"value":65536},"output":{"encoded":"fe00000100","byte_length":5}},{"name":"varint_100000","input":{"value":100000},"output":{"encoded":"fea0860100","byte_length":5}},{"name":"varint_4294967295","input":{"value":4294967295},"output":{"encoded":"feffffffff","byte_length":5}}]},"peer_record":{"description":"Peer record: fixed32(publicKey) + ipv4Array(relayAddresses)","tests":[{"name":"peer_no_relays","input":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[]},"output":{"encoded":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00","byte_length":33}},{"name":"peer_one_relay","input":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[{"host":"192.168.1.100","port":49737}]},"output":{"encoded":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc01c0a8016449c2","byte_length":39}},{"name":"peer_two_relays","input":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[{"host":"10.0.0.1","port":12345},{"host":"172.16.0.5","port":54321}]},"output":{"encoded":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc020a0000013930ac10000531d4","byte_length":45}}]},"announce_message":{"description":"Announce message: flags(varint) + optional(peer, refresh, signature, bump)","tests":[{"name":"announce_peer_and_sig","input":{"flags_expected":5},"output":{"encoded":"05cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab","byte_length":98}},{"name":"announce_with_refresh","input":{"flags_expected":7},"output":{"encoded":"07cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab","byte_length":130}},{"name":"announce_with_bump","input":{"flags_expected":13},"output":{"encoded":"0dcecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00abababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab2a","byte_length":99}},{"name":"announce_full","input":{"flags_expected":15},"output":{"encoded":"0fcecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababab2a","byte_length":131}}]},"announce_signable":{"description":"Announce signable: NS(32) || BLAKE2b_batch(target, node_id, token, encoded_peer, refresh)(32) = 64 bytes. CRITICAL: each node gets different signable because token and node_id differ.","tests":[{"name":"signable_no_refresh","input":{"target":"1111111111111111111111111111111111111111111111111111111111111111","token":"2222222222222222222222222222222222222222222222222222222222222222","node_id":"3333333333333333333333333333333333333333333333333333333333333333","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[],"refresh":null,"namespace":"ANNOUNCE"},"output":{"signable":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d4979074a45aa8cd45221b0372e0bec953fd690549422a02502eaf9c7a4abeaee0a5","signable_length":64,"ns_prefix":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d497","hash_suffix":"9074a45aa8cd45221b0372e0bec953fd690549422a02502eaf9c7a4abeaee0a5","encoded_peer":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc00"}},{"name":"signable_with_refresh","input":{"target":"1111111111111111111111111111111111111111111111111111111111111111","token":"2222222222222222222222222222222222222222222222222222222222222222","node_id":"3333333333333333333333333333333333333333333333333333333333333333","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[],"refresh":"4444444444444444444444444444444444444444444444444444444444444444","namespace":"ANNOUNCE"},"output":{"signable":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d49737f85196a44379da05881a3b79c7292cec7db5d3f3842292dc830e6fbf14e72a","signable_length":64}},{"name":"signable_unannounce","input":{"target":"1111111111111111111111111111111111111111111111111111111111111111","token":"2222222222222222222222222222222222222222222222222222222222222222","node_id":"3333333333333333333333333333333333333333333333333333333333333333","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[],"refresh":null,"namespace":"UNANNOUNCE"},"output":{"signable":"ded293cd93fb395e756ecf5fff426529e72c36eacc22e5ed944d9099a2561e329074a45aa8cd45221b0372e0bec953fd690549422a02502eaf9c7a4abeaee0a5","signable_length":64}},{"name":"signable_different_node_id","note":"MUST differ from signable_no_refresh because node_id is different. This proves per-node signatures.","input":{"target":"1111111111111111111111111111111111111111111111111111111111111111","token":"2222222222222222222222222222222222222222222222222222222222222222","node_id":"5555555555555555555555555555555555555555555555555555555555555555","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[],"refresh":null,"namespace":"ANNOUNCE"},"output":{"signable":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d497ae4a99c43943f06907576bb24949b943d01a5cb6fdc61ddd9912267d35971843","differs_from_test_1":true}},{"name":"signable_different_token","note":"MUST differ from signable_no_refresh because token is different.","input":{"target":"1111111111111111111111111111111111111111111111111111111111111111","token":"6666666666666666666666666666666666666666666666666666666666666666","node_id":"3333333333333333333333333333333333333333333333333333333333333333","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","relay_addresses":[],"refresh":null,"namespace":"ANNOUNCE"},"output":{"signable":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d4975cfbc04929ff1d1f8aa3620293fd5fab5aa5ec44f5b933caac8079030e5ce516","differs_from_test_1":true}},{"name":"sign_and_verify","input":{"signable":"36386adddf9f6fd60db83a6f42fc159d1146aa8644037664230aaa1f0179d4979074a45aa8cd45221b0372e0bec953fd690549422a02502eaf9c7a4abeaee0a5","secret_key":"0100000000000000000000000000000000000000000000000000000000000000cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"},"output":{"signature":"19853793de83460153c19416796c3dd5b5b4dbc142753e4edb69a91ba918dfd484b6a30036c26cc9eeedbf8949aef58bb2a927eac1f346e04d180b0719d1bf03","signature_length":64,"verifies":true}}]},"mutable_signable":{"description":"Mutable storage signable: NS_MUTABLE_PUT(32) || seq(varint) || value","tests":[{"name":"mutable_target","input":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"},"output":{"target":"70451163390b682cb51537ff6e443a0ce3f4b33a7577341b683e1205d7a2329a"}},{"name":"mutable_signable","input":{"seq":42,"value":"68656c6c6f20776f726c64","secret_key":"0100000000000000000000000000000000000000000000000000000000000000cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"},"output":{"signable":"668e823edd5ce7f5338d68bf1161f4a3c28ce437ee2ab49efd30d99366039b1e2a68656c6c6f20776f726c64","signable_length":44,"signature":"bfc88f94049b6b5d14d359a75b8c5a6dc7185b4c9e1cb123f72d782bc8d3c9edbf886acdf97ce1b8bd85516eac8d5802f3a1b5a109f296d0343790dbb16d7704"}}]},"immutable":{"description":"Immutable storage: target = BLAKE2b(value)","tests":[{"name":"immutable_target","input":{"value":"7465737420696d6d757461626c652076616c7565"},"output":{"target":"7faea992762cc375be74c4e73403c15b7be7122c1b57548683104dc58b64328b"}}]},"noise_ik":{"description":"Noise IK uses Ed25519 keys with noise-curve-ed for DH. Prologue = NS.PEER_HANDSHAKE.","tests":[{"name":"ed25519_to_curve25519_sk","input":{"ed25519_secret_key":"0100000000000000000000000000000000000000000000000000000000000000cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"},"output":{"curve25519_secret_key":"c80c265ecc82dd8cee6e56ce44e45dafd7a0c5750df914b253a1fb7a8af66d5b"}},{"name":"ed25519_to_curve25519_pk","input":{"ed25519_public_key":"6b79c57e6a095239282c04818e96112f3f03a4001ba97a564c23852a3f1ea5fc"},"output":{"curve25519_public_key":"e83676dfe12d4fc0ab48b96626d6aef7f6458b8526ac967a65ded117a3357a6f"}},{"name":"dh_result","input":{"initiator_ed_sk":"0100000000000000000000000000000000000000000000000000000000000000cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc","responder_ed_pk":"6b79c57e6a095239282c04818e96112f3f03a4001ba97a564c23852a3f1ea5fc"},"output":{"shared_secret":"610bd735680ed0c589b03062d56a08d544747115fae60184ba46092297aa713f"}},{"name":"noise_prologue","input":{},"output":{"prologue":"14d6d4b49214ab1033ed204976caa258bae9e1e8543b9ad1fd996a910b0c4e3a"}}]},"noise_payload":{"description":"NoisePayload encoding — sent inside Noise IK handshake","tests":[{"name":"basic_payload","input":{"version":1,"error":0,"firewall":1,"holepunch":null,"addresses4":[{"host":"192.168.1.100","port":12345}],"addresses6":[],"udx":{"id":1,"seq":0,"reusable":false},"secretStream":{"id":0,"seq":0},"relayAddresses":[]},"output":{"encoded":"015a000101c0a801643930010001000100","byte_length":17}}]},"blake2b_batch":{"description":"BLAKE2b batch hash (crypto_generichash_batch). NOTE: empty input at end DOES NOT change hash (verified below).","tests":[{"name":"single_input","input":{"inputs":["1111111111111111111111111111111111111111111111111111111111111111"]},"output":{"hash":"d4ffaeeac45aa41825e0bc3f875570af061acbf0b950ad752ff0f9463fe13ad5"}},{"name":"three_inputs","input":{"inputs":["1111111111111111111111111111111111111111111111111111111111111111","2222222222222222222222222222222222222222222222222222222222222222","3333333333333333333333333333333333333333333333333333333333333333"]},"output":{"hash":"b31d6d29a669ed7bf1a0379e77cf5b28e2b5f9d53a7504690b907ac8626ac0ab"}},{"name":"three_inputs_plus_empty","input":{"inputs":["1111111111111111111111111111111111111111111111111111111111111111","2222222222222222222222222222222222222222222222222222222222222222","3333333333333333333333333333333333333333333333333333333333333333",""]},"output":{"hash":"b31d6d29a669ed7bf1a0379e77cf5b28e2b5f9d53a7504690b907ac8626ac0ab"}},{"name":"empty_input_matters","input":{},"output":{"with_empty_equals_without":true,"note":"If true, empty trailing input does not affect hash. If false, C++ must include it."}}]},"ipv4":{"description":"IPv4 address encoding: 4 bytes host (network order) + 2 bytes port (LE)","tests":[{"name":"ipv4_127_0_0_1_49737","input":{"host":"127.0.0.1","port":49737},"output":{"encoded":"7f00000149c2","byte_length":6}},{"name":"ipv4_192_168_1_100_12345","input":{"host":"192.168.1.100","port":12345},"output":{"encoded":"c0a801643930","byte_length":6}},{"name":"ipv4_10_0_0_1_443","input":{"host":"10.0.0.1","port":443},"output":{"encoded":"0a000001bb01","byte_length":6}},{"name":"ipv4_255_255_255_255_65535","input":{"host":"255.255.255.255","port":65535},"output":{"encoded":"ffffffffffff","byte_length":6}}]},"find_peer_target":{"description":"FIND_PEER target = BLAKE2b(publicKey), NOT the raw public key","tests":[{"name":"find_peer_target","input":{"public_key":"cecc1507dc1ddd7295951c290888f095adb9044d1b73d696e6df065d683bd4fc"},"output":{"target":"70451163390b682cb51537ff6e443a0ce3f4b33a7577341b683e1205d7a2329a"}}]}}}