multihash-codetable-0.1.0/.cargo_vcs_info.json0000644000000001470000000000100147520ustar { "git": { "sha1": "16e68d8203c787768688dab8aed4295a32f33bf0" }, "path_in_vcs": "codetable" }multihash-codetable-0.1.0/Cargo.lock0000644000000711660000000000100127360ustar # This file is automatically @generated by Cargo. # It is not intended for manual editing. version = 3 [[package]] name = "anes" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstyle" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" [[package]] name = "arrayref" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" [[package]] name = "arrayvec" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" [[package]] name = "autocfg" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "blake2b_simd" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" dependencies = [ "arrayref", "arrayvec", "constant_time_eq", ] [[package]] name = "blake2s_simd" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" dependencies = [ "arrayref", "arrayvec", "constant_time_eq", ] [[package]] name = "blake3" version = "1.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ae2468a89544a466886840aa467a25b766499f4f04bf7d9fcd10ecee9fccef" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", "digest", ] [[package]] name = "block-buffer" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "cast" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "ciborium" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" dependencies = [ "ciborium-io", "ciborium-ll", "serde", ] [[package]] name = "ciborium-io" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" [[package]] name = "ciborium-ll" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" dependencies = [ "ciborium-io", "half", ] [[package]] name = "clap" version = "4.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" dependencies = [ "anstyle", "bitflags", "clap_lex", ] [[package]] name = "clap_lex" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" [[package]] name = "constant_time_eq" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" [[package]] name = "core2" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b49ba7ef1ad6107f8824dbe97de947cbaac53c44e7f9756a1fba0d37c1eec505" dependencies = [ "memchr", ] [[package]] name = "cpufeatures" version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] [[package]] name = "criterion" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", "is-terminal", "itertools", "num-traits", "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", "serde_derive", "serde_json", "tinytemplate", "walkdir", ] [[package]] name = "criterion-plot" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1" dependencies = [ "cast", "itertools", ] [[package]] name = "crossbeam-channel" version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" dependencies = [ "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" dependencies = [ "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" version = "0.9.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", "memoffset", "scopeguard", ] [[package]] name = "crossbeam-utils" version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" dependencies = [ "cfg-if", ] [[package]] name = "crypto-common" version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", "typenum", ] [[package]] name = "digest" version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", "subtle", ] [[package]] name = "either" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" [[package]] name = "errno" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" dependencies = [ "errno-dragonfly", "libc", "windows-sys", ] [[package]] name = "errno-dragonfly" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" dependencies = [ "cc", "libc", ] [[package]] name = "generic-array" version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", ] [[package]] name = "getrandom" version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "libc", "wasi", ] [[package]] name = "half" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" [[package]] name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hermit-abi" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" dependencies = [ "libc", ] [[package]] name = "hermit-abi" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" [[package]] name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "indexmap" version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown", ] [[package]] name = "io-lifetimes" version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ "hermit-abi 0.3.1", "libc", "windows-sys", ] [[package]] name = "is-terminal" version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adcf93614601c8129ddf72e2d5633df827ba6551541c6d8c59520a371475be1f" dependencies = [ "hermit-abi 0.3.1", "io-lifetimes", "rustix", "windows-sys", ] [[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ "either", ] [[package]] name = "itoa" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "js-sys" version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2f37a4a5928311ac501dee68b3c7613a1037d0edb30c8e5427bd832d55d1b790" dependencies = [ "wasm-bindgen", ] [[package]] name = "keccak" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ "cpufeatures", ] [[package]] name = "libc" version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "linux-raw-sys" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "log" version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "memchr" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ "autocfg", ] [[package]] name = "multihash" version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fd59dcc2bbe70baabeac52cd22ae52c55eefe6c38ff11a9439f16a350a939f2" dependencies = [ "core2", "unsigned-varint", ] [[package]] name = "multihash-codetable" version = "0.1.0" dependencies = [ "blake2b_simd", "blake2s_simd", "blake3", "core2", "criterion", "digest", "hex", "multihash-derive", "rand", "ripemd", "serde", "sha-1", "sha2", "sha3", "strobe-rs", "unsigned-varint", ] [[package]] name = "multihash-derive" version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "890e72cb7396cb99ed98c1246a97b243cc16394470d94e0bc8b0c2c11d84290e" dependencies = [ "core2", "multihash", "multihash-derive-impl", ] [[package]] name = "multihash-derive-impl" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d38685e08adb338659871ecfc6ee47ba9b22dcc8abcf6975d379cc49145c3040" dependencies = [ "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", "syn 1.0.109", "synstructure", ] [[package]] name = "num-traits" version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" dependencies = [ "autocfg", ] [[package]] name = "num_cpus" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" dependencies = [ "hermit-abi 0.2.6", "libc", ] [[package]] name = "once_cell" version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" [[package]] name = "oorandom" version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "plotters" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2538b639e642295546c50fcd545198c9d64ee2a38620a628724a3b266d5fbf97" dependencies = [ "num-traits", "plotters-backend", "plotters-svg", "wasm-bindgen", "web-sys", ] [[package]] name = "plotters-backend" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "193228616381fecdc1224c62e96946dfbc73ff4384fba576e052ff8c1bea8142" [[package]] name = "plotters-svg" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f9a81d2759aae1dae668f783c308bc5c8ebd191ff4184aaa1b37f65a6ae5a56f" dependencies = [ "plotters-backend", ] [[package]] name = "ppv-lite86" version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-crate" version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" dependencies = [ "once_cell", "toml_edit", ] [[package]] name = "proc-macro-error" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", "syn 1.0.109", "version_check", ] [[package]] name = "proc-macro-error-attr" version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ "proc-macro2", "quote", "version_check", ] [[package]] name = "proc-macro2" version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] [[package]] name = "quote" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] [[package]] name = "rand" version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", "rand_core", ] [[package]] name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] name = "rayon" version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" dependencies = [ "either", "rayon-core", ] [[package]] name = "rayon-core" version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" dependencies = [ "crossbeam-channel", "crossbeam-deque", "crossbeam-utils", "num_cpus", ] [[package]] name = "regex" version = "1.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d0ab3ca65655bb1e41f2a8c8cd662eb4fb035e67c3f78da1d61dffe89d07300f" dependencies = [ "regex-syntax", ] [[package]] name = "regex-syntax" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "436b050e76ed2903236f032a59761c1eb99e1b0aead2c257922771dab1fc8c78" [[package]] name = "ripemd" version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ "digest", ] [[package]] name = "rustix" version = "0.37.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acf8729d8542766f1b2cf77eb034d52f40d375bb8b615d0b147089946e16613d" dependencies = [ "bitflags", "errno", "io-lifetimes", "libc", "linux-raw-sys", "windows-sys", ] [[package]] name = "ryu" version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" [[package]] name = "same-file" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" dependencies = [ "winapi-util", ] [[package]] name = "scopeguard" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" version = "1.0.163" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", "syn 2.0.18", ] [[package]] name = "serde_json" version = "1.0.96" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" dependencies = [ "itoa", "ryu", "serde", ] [[package]] name = "sha-1" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sha2" version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" dependencies = [ "cfg-if", "cpufeatures", "digest", ] [[package]] name = "sha3" version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest", "keccak", ] [[package]] name = "strobe-rs" version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabb238a1cccccfa4c4fb703670c0d157e1256c1ba695abf1b93bd2bb14bab2d" dependencies = [ "bitflags", "byteorder", "keccak", "subtle", "zeroize", ] [[package]] name = "subtle" version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "syn" version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] [[package]] name = "synstructure" version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ "proc-macro2", "quote", "syn 1.0.109", "unicode-xid", ] [[package]] name = "tinytemplate" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" dependencies = [ "serde", "serde_json", ] [[package]] name = "toml_datetime" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" [[package]] name = "toml_edit" version = "0.19.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" dependencies = [ "indexmap", "toml_datetime", "winnow", ] [[package]] name = "typenum" version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "unicode-ident" version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unicode-xid" version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" [[package]] name = "unsigned-varint" version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86a8dc7f45e4c1b0d30e43038c38f274e77af056aa5f74b93c2cf9eb3c1c836" [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "walkdir" version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", "winapi-util", ] [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bba0e8cb82ba49ff4e229459ff22a191bbe9a1cb3a341610c9c33efc27ddf73" dependencies = [ "cfg-if", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19b04bc93f9d6bdee709f6bd2118f57dd6679cf1176a1af464fca3ab0d66d8fb" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", "syn 2.0.18", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14d6b024f1a526bb0234f52840389927257beb670610081360e5a03c5df9c258" dependencies = [ "quote", "wasm-bindgen-macro-support", ] [[package]] name = "wasm-bindgen-macro-support" version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed9d5b4305409d1fc9482fee2d7f9bcbf24b3972bf59817ef757e23982242a93" [[package]] name = "web-sys" version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] name = "winapi" version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" dependencies = [ "winapi-i686-pc-windows-gnu", "winapi-x86_64-pc-windows-gnu", ] [[package]] name = "winapi-i686-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi", ] [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ "windows-targets", ] [[package]] name = "windows-targets" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" dependencies = [ "windows_aarch64_gnullvm", "windows_aarch64_msvc", "windows_i686_gnu", "windows_i686_msvc", "windows_x86_64_gnu", "windows_x86_64_gnullvm", "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" [[package]] name = "windows_aarch64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" [[package]] name = "windows_i686_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" [[package]] name = "windows_i686_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" [[package]] name = "windows_x86_64_gnu" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" [[package]] name = "windows_x86_64_gnullvm" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" [[package]] name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" [[package]] name = "winnow" version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" dependencies = [ "memchr", ] [[package]] name = "zeroize" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", "syn 2.0.18", ] multihash-codetable-0.1.0/Cargo.toml0000644000000046550000000000100127600ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" name = "multihash-codetable" version = "0.1.0" description = "Default multihash code-table with cryptographically secure hash implementations" license = "MIT" repository = "https://github.com/multiformats/rust-multihash" [[test]] name = "lib" required-features = [ "sha1", "sha2", "sha3", "ripemd", "strobe", "blake2b", "blake2s", "blake3", ] [[bench]] name = "multihash" harness = false [dependencies.blake2b_simd] version = "1.0.0" optional = true default-features = false [dependencies.blake2s_simd] version = "1.0.0" optional = true default-features = false [dependencies.blake3] version = "1.2.0" optional = true default-features = false [dependencies.core2] version = "0.4.0" default-features = false [dependencies.digest] version = "0.10.1" optional = true default-features = false [dependencies.multihash-derive] version = "0.9.0" default-features = false [dependencies.ripemd] version = "0.1.1" optional = true default-features = false [dependencies.serde] version = "1.0.158" features = ["derive"] optional = true [dependencies.sha-1] version = "0.10.0" optional = true default-features = false [dependencies.sha2] version = "0.10.0" optional = true default-features = false [dependencies.sha3] version = "0.10.0" optional = true default-features = false [dependencies.strobe-rs] version = "0.8.1" optional = true default-features = false [dev-dependencies.criterion] version = "0.5.1" [dev-dependencies.hex] version = "0.4.2" [dev-dependencies.rand] version = "0.8.5" [dev-dependencies.unsigned-varint] version = "0.7.1" default-features = false [features] blake2b = ["dep:blake2b_simd"] blake2s = ["dep:blake2s_simd"] default = ["std"] sha1 = ["dep:sha-1"] std = [ "blake2b_simd?/std", "blake2s_simd?/std", "blake3?/std", "digest?/std", "sha-1?/std", "sha2?/std", "sha3?/std", "strobe-rs?/std", "ripemd?/std", "multihash-derive/std", "core2/std", ] strobe = ["dep:strobe-rs"] multihash-codetable-0.1.0/Cargo.toml.orig000064400000000000000000000035371046102023000164370ustar 00000000000000[package] name = "multihash-codetable" description = "Default multihash code-table with cryptographically secure hash implementations" version = "0.1.0" repository = "https://github.com/multiformats/rust-multihash" license = "MIT" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [features] default = ["std"] std = ["blake2b_simd?/std", "blake2s_simd?/std", "blake3?/std", "digest?/std", "sha-1?/std", "sha2?/std", "sha3?/std", "strobe-rs?/std", "ripemd?/std", "multihash-derive/std", "core2/std"] sha1 = ["dep:sha-1"] strobe = ["dep:strobe-rs"] blake2b = ["dep:blake2b_simd"] blake2s = ["dep:blake2s_simd"] [dependencies] blake2b_simd = { version = "1.0.0", default-features = false, optional = true } blake2s_simd = { version = "1.0.0", default-features = false, optional = true } blake3 = { version = "1.2.0", default-features = false, optional = true } digest = { version = "0.10.1", default-features = false, optional = true } sha-1 = { version = "0.10.0", default-features = false, optional = true } sha2 = { version = "0.10.0", default-features = false, optional = true } sha3 = { version = "0.10.0", default-features = false, optional = true } strobe-rs = { version = "0.8.1", default-features = false, optional = true } ripemd = { version = "0.1.1", default-features = false, optional = true } multihash-derive = { version = "0.9.0", path = "../derive", default-features = false } core2 = { version = "0.4.0", default-features = false } serde = { version = "1.0.158", features = ["derive"], optional = true } [dev-dependencies] hex = "0.4.2" unsigned-varint = { version = "0.7.1", default-features = false } criterion = "0.5.1" rand = "0.8.5" [[bench]] name = "multihash" harness = false [[test]] name = "lib" required-features = ["sha1", "sha2", "sha3", "ripemd", "strobe", "blake2b", "blake2s", "blake3"] multihash-codetable-0.1.0/benches/multihash.rs000064400000000000000000000065231046102023000175210ustar 00000000000000use criterion::{black_box, criterion_group, criterion_main, Criterion}; use rand::Rng; use multihash_codetable::{ Blake2b256, Blake2b512, Blake2s128, Blake2s256, Blake3_256, Keccak224, Keccak256, Keccak384, Keccak512, Sha1, Sha2_256, Sha2_512, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Strobe256, Strobe512, }; use multihash_derive::Hasher; macro_rules! group_digest { ($criterion:ident, $( $id:expr => $hash:ident, $input:expr)* ) => {{ let mut group = $criterion.benchmark_group("digest"); $( group.bench_function($id, |b| { b.iter(|| { let mut hasher = $hash::default(); hasher.update(black_box($input)); let _ = black_box(hasher.finalize()); }) }); )* group.finish(); }}; } macro_rules! group_stream { ($criterion:ident, $( $id:expr => $hash:ident, $input:expr)* ) => {{ let mut group = $criterion.benchmark_group("stream"); $( group.bench_function($id, |b| { b.iter(|| { let input = black_box($input); let mut hasher = <$hash>::default(); for i in 0..3 { let start = i * 256; hasher.update(&input[start..(start + 256)]); } let _ = black_box(hasher.finalize()); }) }); )* group.finish(); }}; } fn bench_digest(c: &mut Criterion) { let mut rng = rand::thread_rng(); let data: Vec = (0..1024).map(|_| rng.gen()).collect(); group_digest!(c, "sha1" => Sha1, &data "sha2_256" => Sha2_256, &data "sha2_512" => Sha2_512, &data "sha3_224" => Sha3_224, &data "sha3_256" => Sha3_256, &data "sha3_384" => Sha3_384, &data "sha3_512" => Sha3_512, &data "keccak_224" => Keccak224, &data "keccak_256" => Keccak256, &data "keccak_384" => Keccak384, &data "keccak_512" => Keccak512, &data "blake2b_256" => Blake2b256, &data "blake2b_512" => Blake2b512, &data "blake2s_128" => Blake2s128, &data "blake2s_256" => Blake2s256, &data "blake3_256" => Blake3_256, &data "strobe_256" => Strobe256, &data "strobe_512" => Strobe512, &data ); } /// Chunks the data into 256-byte slices. fn bench_stream(c: &mut Criterion) { let mut rng = rand::thread_rng(); let data: Vec = (0..1024).map(|_| rng.gen()).collect(); group_stream!(c, "sha1" => Sha1, &data "sha2_256" => Sha2_256, &data "sha2_512" => Sha2_512, &data "sha3_224" => Sha3_224, &data "sha3_256" => Sha3_256, &data "sha3_384" => Sha3_384, &data "sha3_512" => Sha3_512, &data "keccak_224" => Keccak224, &data "keccak_256" => Keccak256, &data "keccak_384" => Keccak384, &data "keccak_512" => Keccak512, &data "blake2b_256" => Blake2b256, &data "blake2b_512" => Blake2b512, &data "blake2s_128" => Blake2s128, &data "blake2s_256" => Blake2s256, &data "blake3_256" => Blake3_256, &data "strobe_256" => Strobe256, &data "strobe_512" => Strobe512, &data ); } criterion_group!(benches, bench_digest, bench_stream); criterion_main!(benches); multihash-codetable-0.1.0/examples/custom_table.rs000064400000000000000000000037541046102023000204160ustar 00000000000000use std::convert::TryFrom; use multihash_codetable::Sha2_256; use multihash_derive::{Hasher, MultihashDigest}; // You can implement a custom hasher. This is a SHA2 256-bit hasher that returns a hash that is // truncated to 160 bits. #[derive(Default, Debug)] pub struct Sha2_256Truncated20(Sha2_256); impl Hasher for Sha2_256Truncated20 { fn update(&mut self, input: &[u8]) { self.0.update(input) } fn finalize(&mut self) -> &[u8] { &self.0.finalize()[..20] } fn reset(&mut self) { self.0.reset(); } } #[derive(Clone, Copy, Debug, Eq, MultihashDigest, PartialEq)] #[mh(alloc_size = 64)] pub enum Code { /// Example for using a custom hasher which returns truncated hashes #[mh(code = 0x12, hasher = Sha2_256Truncated20)] Sha2_256Truncated20, /// Example for using a hasher with a bit size that is not exported by default #[mh(code = 0xb219, hasher = multihash_codetable::Blake2bHasher::<25>)] Blake2b200, } fn main() { // Create new hashes from some input data. This is done through the `Code` enum we derived // Multihash from. let blake_hash = Code::Blake2b200.digest(b"hello world!"); println!("{blake_hash:02x?}"); let truncated_sha2_hash = Code::Sha2_256Truncated20.digest(b"hello world!"); println!("{truncated_sha2_hash:02x?}"); // Sometimes you might not need to hash new data, you just want to get the information about // a Multihash. let truncated_sha2_bytes = truncated_sha2_hash.to_bytes(); let unknown_hash = Multihash::from_bytes(&truncated_sha2_bytes).unwrap(); println!("SHA2 256-bit hash truncated to 160 bits:"); println!(" code: {:x?}", unknown_hash.code()); println!(" size: {}", unknown_hash.size()); println!(" digest: {:02x?}", unknown_hash.digest()); // Though you might want to hash something new, with the same hasher that some other Multihash // used. Code::try_from(unknown_hash.code()) .unwrap() .digest(b"hashing something new"); } multihash-codetable-0.1.0/examples/manual_mh.rs000064400000000000000000000014171046102023000176700ustar 00000000000000use multihash_codetable::Code; use multihash_derive::MultihashDigest; /// prefix/multihash generating tool to aid when adding new tests fn prefix_util() { use unsigned_varint::encode; // change these as needed let empty = Code::Sha2_256.wrap(&[]).unwrap().to_bytes(); let hash = "7c8357577f51d4f0a8d393aa1aaafb28863d9421"; // encode things let len = (hash.len() / 2) as u64; // always hex so len bytes is always half let mut buf = encode::u64_buffer(); let len = encode::u64(len, &mut buf); let code_hex = hex::encode(&empty[..1]); // change if longer/shorter prefix let len_hex = hex::encode(len); println!("prefix hex: code: {code_hex}, len: {len_hex}"); println!("{code_hex}{len_hex}{hash}"); } fn main() { prefix_util() } multihash-codetable-0.1.0/src/hasher_impl.rs000064400000000000000000000166411046102023000172000ustar 00000000000000#[cfg(any(feature = "strobe", feature = "identity", feature = "blake3"))] macro_rules! derive_write { ($name:ident) => { impl core2::io::Write for $name { fn write(&mut self, buf: &[u8]) -> core2::io::Result { use multihash_derive::Hasher as _; self.update(buf); Ok(buf.len()) } fn flush(&mut self) -> core2::io::Result<()> { Ok(()) } } }; } #[cfg(any(feature = "blake2b", feature = "blake2s", feature = "blake3"))] macro_rules! derive_hasher_blake { ($module:ident, $name:ident) => { /// Multihash hasher. #[derive(Debug)] pub struct $name { state: $module::State, digest: [u8; S], } impl Default for $name { fn default() -> Self { let mut params = $module::Params::new(); params.hash_length(S); Self { state: params.to_state(), digest: [0; S], } } } impl multihash_derive::Hasher for $name { fn update(&mut self, input: &[u8]) { self.state.update(input); } fn finalize(&mut self) -> &[u8] { let digest = self.state.finalize(); let digest_bytes = digest.as_bytes(); let digest_out = &mut self.digest[..digest_bytes.len().max(S)]; digest_out.copy_from_slice(digest_bytes); digest_out } fn reset(&mut self) { let Self { state, .. } = Self::default(); self.state = state; } } derive_write!($name); }; } #[cfg(feature = "blake2b")] pub mod blake2b { derive_hasher_blake!(blake2b_simd, Blake2bHasher); /// 256 bit blake2b hasher. pub type Blake2b256 = Blake2bHasher<32>; /// 512 bit blake2b hasher. pub type Blake2b512 = Blake2bHasher<64>; } #[cfg(feature = "blake2s")] pub mod blake2s { derive_hasher_blake!(blake2s_simd, Blake2sHasher); /// 256 bit blake2b hasher. pub type Blake2s128 = Blake2sHasher<16>; /// 512 bit blake2b hasher. pub type Blake2s256 = Blake2sHasher<32>; } #[cfg(feature = "blake3")] pub mod blake3 { /// Multihash hasher. #[derive(Debug)] pub struct Blake3Hasher { hasher: ::blake3::Hasher, digest: [u8; S], } impl Blake3Hasher { /// using blake3's XOF function, fills the given slice with hash output pub fn finalize_xof_fill(&mut self, digest_out: &mut [u8]) { let mut digest = self.hasher.finalize_xof(); digest.fill(digest_out) } } impl Default for Blake3Hasher { fn default() -> Self { let hasher = ::blake3::Hasher::new(); Self { hasher, digest: [0; S], } } } impl multihash_derive::Hasher for Blake3Hasher { fn update(&mut self, input: &[u8]) { self.hasher.update(input); } fn finalize(&mut self) -> &[u8] { let mut output = self.hasher.finalize_xof(); output.fill(&mut self.digest); &self.digest } fn reset(&mut self) { self.hasher.reset(); } } derive_write!(Blake3Hasher); /// blake3-256 hasher. pub type Blake3_256 = Blake3Hasher<32>; } #[cfg(any( feature = "sha1", feature = "sha2", feature = "sha3", feature = "ripemd" ))] macro_rules! derive_rustcrypto_hasher { ($module:ty, $name:ident, $size:expr) => { /// Multihash hasher. #[derive(Debug)] pub struct $name { state: $module, digest: [u8; $size], } impl Default for $name { fn default() -> Self { $name { state: Default::default(), digest: [0; $size], } } } impl ::multihash_derive::Hasher for $name { fn update(&mut self, input: &[u8]) { use digest::Digest; self.state.update(input) } fn finalize(&mut self) -> &[u8] { use digest::Digest; let digest = self.state.clone().finalize(); let digest_bytes = digest.as_slice(); let digest_out = &mut self.digest[..digest_bytes.len().max($size)]; digest_out.copy_from_slice(digest_bytes); digest_out } fn reset(&mut self) { use digest::Digest; self.state.reset(); } } impl core2::io::Write for $name { fn write(&mut self, buf: &[u8]) -> core2::io::Result { use multihash_derive::Hasher as _; self.update(buf); Ok(buf.len()) } fn flush(&mut self) -> core2::io::Result<()> { Ok(()) } } }; } #[cfg(feature = "sha1")] pub mod sha1 { derive_rustcrypto_hasher!(::sha1::Sha1, Sha1, 20); } #[cfg(feature = "sha2")] pub mod sha2 { derive_rustcrypto_hasher!(::sha2::Sha256, Sha2_256, 32); derive_rustcrypto_hasher!(::sha2::Sha512, Sha2_512, 64); } #[cfg(feature = "sha3")] pub mod sha3 { derive_rustcrypto_hasher!(::sha3::Sha3_224, Sha3_224, 28); derive_rustcrypto_hasher!(::sha3::Sha3_256, Sha3_256, 32); derive_rustcrypto_hasher!(::sha3::Sha3_384, Sha3_384, 48); derive_rustcrypto_hasher!(::sha3::Sha3_512, Sha3_512, 64); derive_rustcrypto_hasher!(::sha3::Keccak224, Keccak224, 28); derive_rustcrypto_hasher!(::sha3::Keccak256, Keccak256, 32); derive_rustcrypto_hasher!(::sha3::Keccak384, Keccak384, 48); derive_rustcrypto_hasher!(::sha3::Keccak512, Keccak512, 64); } #[cfg(feature = "ripemd")] pub mod ripemd { derive_rustcrypto_hasher!(::ripemd::Ripemd160, Ripemd160, 20); derive_rustcrypto_hasher!(::ripemd::Ripemd256, Ripemd256, 32); derive_rustcrypto_hasher!(::ripemd::Ripemd320, Ripemd320, 40); } #[cfg(feature = "strobe")] pub mod strobe { use strobe_rs::{SecParam, Strobe}; /// Strobe hasher. pub struct StrobeHasher { strobe: Strobe, initialized: bool, digest: [u8; S], } impl Default for StrobeHasher { fn default() -> Self { Self { strobe: Strobe::new(b"StrobeHash", SecParam::B128), initialized: false, digest: [0; S], } } } impl multihash_derive::Hasher for StrobeHasher { fn update(&mut self, input: &[u8]) { self.strobe.ad(input, self.initialized); self.initialized = true; } fn finalize(&mut self) -> &[u8] { self.strobe.clone().prf(&mut self.digest, false); &self.digest } fn reset(&mut self) { let Self { strobe, .. } = Self::default(); self.strobe = strobe; self.initialized = false; } } derive_write!(StrobeHasher); /// 256 bit strobe hasher. pub type Strobe256 = StrobeHasher<32>; /// 512 bit strobe hasher. pub type Strobe512 = StrobeHasher<64>; } multihash-codetable-0.1.0/src/lib.rs000064400000000000000000000152031046102023000154440ustar 00000000000000#![cfg_attr(not(feature = "std"), no_std)] //! A batteries-included code table of multihashes. //! //! Whilst the `multihash` crate itself only defines the data structure, this crate defines a codetable via [`multihash_derive`] for several hashers. //! Although convenient, depending on this crate will increase the dependency footprint of your project. //! //! It is only recommended as a getting-started-quickly solution. //! For production, you should either define your own codetable or rely only on the `multihash` crate itself. mod hasher_impl; pub use multihash_derive::MultihashDigest; #[cfg(feature = "blake2b")] pub use crate::hasher_impl::blake2b::{Blake2b256, Blake2b512, Blake2bHasher}; #[cfg(feature = "blake2s")] pub use crate::hasher_impl::blake2s::{Blake2s128, Blake2s256, Blake2sHasher}; #[cfg(feature = "blake3")] pub use crate::hasher_impl::blake3::{Blake3Hasher, Blake3_256}; #[cfg(feature = "ripemd")] pub use crate::hasher_impl::ripemd::{Ripemd160, Ripemd256, Ripemd320}; #[cfg(feature = "sha1")] pub use crate::hasher_impl::sha1::Sha1; #[cfg(feature = "sha2")] pub use crate::hasher_impl::sha2::{Sha2_256, Sha2_512}; #[cfg(feature = "sha3")] pub use crate::hasher_impl::sha3::{ Keccak224, Keccak256, Keccak384, Keccak512, Sha3_224, Sha3_256, Sha3_384, Sha3_512, }; #[cfg(feature = "strobe")] pub use crate::hasher_impl::strobe::{Strobe256, Strobe512, StrobeHasher}; /// Default (cryptographically secure) Multihash implementation. /// /// This is a default set of hashing algorithms. Usually applications would use their own subset of /// algorithms. See the [`multihash-derive`] crate for more information. /// /// [`multihash-derive`]: https://docs.rs/multihash-derive #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] #[derive(Copy, Clone, Debug, Eq, MultihashDigest, PartialEq)] #[mh(alloc_size = 64)] pub enum Code { /// SHA-256 (32-byte hash size) #[cfg(feature = "sha2")] #[mh(code = 0x12, hasher = crate::Sha2_256)] Sha2_256, /// SHA-512 (64-byte hash size) #[cfg(feature = "sha2")] #[mh(code = 0x13, hasher = crate::Sha2_512)] Sha2_512, /// SHA3-224 (28-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x17, hasher = crate::Sha3_224)] Sha3_224, /// SHA3-256 (32-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x16, hasher = crate::Sha3_256)] Sha3_256, /// SHA3-384 (48-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x15, hasher = crate::Sha3_384)] Sha3_384, /// SHA3-512 (64-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x14, hasher = crate::Sha3_512)] Sha3_512, /// Keccak-224 (28-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x1a, hasher = crate::Keccak224)] Keccak224, /// Keccak-256 (32-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x1b, hasher = crate::Keccak256)] Keccak256, /// Keccak-384 (48-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x1c, hasher = crate::Keccak384)] Keccak384, /// Keccak-512 (64-byte hash size) #[cfg(feature = "sha3")] #[mh(code = 0x1d, hasher = crate::Keccak512)] Keccak512, /// BLAKE2b-256 (32-byte hash size) #[cfg(feature = "blake2b")] #[mh(code = 0xb220, hasher = crate::Blake2b256)] Blake2b256, /// BLAKE2b-512 (64-byte hash size) #[cfg(feature = "blake2b")] #[mh(code = 0xb240, hasher = crate::Blake2b512)] Blake2b512, /// BLAKE2s-128 (16-byte hash size) #[cfg(feature = "blake2s")] #[mh(code = 0xb250, hasher = crate::Blake2s128)] Blake2s128, /// BLAKE2s-256 (32-byte hash size) #[cfg(feature = "blake2s")] #[mh(code = 0xb260, hasher = crate::Blake2s256)] Blake2s256, /// BLAKE3-256 (32-byte hash size) #[cfg(feature = "blake3")] #[mh(code = 0x1e, hasher = crate::Blake3_256)] Blake3_256, /// RIPEMD-160 (20-byte hash size) #[cfg(feature = "ripemd")] #[mh(code = 0x1053, hasher = crate::Ripemd160)] Ripemd160, /// RIPEMD-256 (32-byte hash size) #[cfg(feature = "ripemd")] #[mh(code = 0x1054, hasher = crate::Ripemd256)] Ripemd256, /// RIPEMD-320 (40-byte hash size) #[cfg(feature = "ripemd")] #[mh(code = 0x1055, hasher = crate::Ripemd320)] Ripemd320, } #[cfg(test)] mod tests { use super::*; use crate::hasher_impl::sha3::{Sha3_256, Sha3_512}; use multihash_derive::{Hasher, Multihash, MultihashDigest}; #[test] #[cfg(feature = "sha3")] fn test_hasher_256() { let mut hasher = Sha3_256::default(); hasher.update(b"hello world"); let digest = hasher.finalize(); let hash = Code::Sha3_256.wrap(digest).unwrap(); let hash2 = Code::Sha3_256.digest(b"hello world"); assert_eq!(hash.code(), u64::from(Code::Sha3_256)); assert_eq!(hash.size(), 32); assert_eq!(hash.digest(), digest); assert_eq!(hash, hash2); } #[test] #[cfg(feature = "sha3")] fn test_hasher_512() { let mut hasher = Sha3_512::default(); hasher.update(b"hello world"); let digest = hasher.finalize(); let hash = Code::Sha3_512.wrap(digest).unwrap(); let hash2 = Code::Sha3_512.digest(b"hello world"); assert_eq!(hash.code(), u64::from(Code::Sha3_512)); assert_eq!(hash.size(), 64); assert_eq!(hash.digest(), digest); assert_eq!(hash, hash2); } #[test] #[cfg(feature = "sha2")] fn roundtrip() { let hash = Code::Sha2_256.digest(b"hello world"); let mut buf = [0u8; 35]; let written = hash.write(&mut buf[..]).unwrap(); let hash2 = Multihash::<32>::read(&buf[..]).unwrap(); assert_eq!(hash, hash2); assert_eq!(hash.encoded_len(), written); } #[test] #[cfg(feature = "sha2")] fn test_truncate_down() { let hash = Code::Sha2_256.digest(b"hello world"); let small = hash.truncate(20); assert_eq!(small.size(), 20); } #[test] #[cfg(feature = "sha2")] fn test_truncate_up() { let hash = Code::Sha2_256.digest(b"hello world"); let small = hash.truncate(100); assert_eq!(small.size(), 32); } #[test] #[cfg(feature = "sha2")] fn test_resize_fits() { let hash = Code::Sha2_256.digest(b"hello world"); let _: Multihash<32> = hash.resize().unwrap(); } #[test] #[cfg(feature = "sha2")] fn test_resize_up() { let hash = Code::Sha2_256.digest(b"hello world"); let _: Multihash<100> = hash.resize().unwrap(); } #[test] #[cfg(feature = "sha2")] fn test_resize_truncate() { let hash = Code::Sha2_256.digest(b"hello world"); hash.resize::<20>().unwrap_err(); } } multihash-codetable-0.1.0/tests/lib.rs000064400000000000000000000404521046102023000160230ustar 00000000000000use std::io::{Cursor, Write}; use multihash_codetable::{ Blake2b256, Blake2b512, Blake2s128, Blake2s256, Blake3_256, Keccak224, Keccak256, Keccak384, Keccak512, Ripemd160, Ripemd256, Ripemd320, Sha1, Sha2_256, Sha2_512, Sha3_224, Sha3_256, Sha3_384, Sha3_512, Strobe256, Strobe512, }; use multihash_derive::{Hasher, MultihashDigest}; #[derive(Clone, Copy, Debug, Eq, MultihashDigest, PartialEq)] #[mh(alloc_size = 64)] pub enum Code { #[mh(code = 0x11, hasher = Sha1)] Sha1, #[mh(code = 0x12, hasher = Sha2_256)] Sha2_256, #[mh(code = 0x13, hasher = Sha2_512)] Sha2_512, #[mh(code = 0x17, hasher = Sha3_224)] Sha3_224, #[mh(code = 0x16, hasher = Sha3_256)] Sha3_256, #[mh(code = 0x15, hasher = Sha3_384)] Sha3_384, #[mh(code = 0x14, hasher = Sha3_512)] Sha3_512, #[mh(code = 0x1a, hasher = Keccak224)] Keccak224, #[mh(code = 0x1b, hasher = Keccak256)] Keccak256, #[mh(code = 0x1c, hasher = Keccak384)] Keccak384, #[mh(code = 0x1d, hasher = Keccak512)] Keccak512, #[mh(code = 0xb220, hasher = Blake2b256)] Blake2b256, #[mh(code = 0xb240, hasher = Blake2b512)] Blake2b512, #[mh(code = 0xb250, hasher = Blake2s128)] Blake2s128, #[mh(code = 0xb260, hasher = Blake2s256)] Blake2s256, #[mh(code = 0x1e, hasher = Blake3_256)] Blake3_256, #[mh(code = 0x3312e7, hasher = Strobe256)] Strobe256, #[mh(code = 0x3312e8, hasher = Strobe512)] Strobe512, #[cfg(feature = "ripemd")] #[mh(code = 0x1053, hasher = Ripemd160)] Ripemd160, #[cfg(feature = "ripemd")] #[mh(code = 0x1054, hasher = Ripemd256)] Ripemd256, #[cfg(feature = "ripemd")] #[mh(code = 0x1055, hasher = Ripemd320)] Ripemd320, } macro_rules! assert_encode { // Mutlihash enum member, Multihash code, input, Multihash as hex {$( $alg:ty, $code:expr, $data:expr, $expect:expr; )*} => { $( let expected = hex::decode($expect).unwrap(); // From code assert_eq!( $code.digest($data).to_bytes(), expected, "{:?} encodes correctly (from code)", stringify!($alg) ); // From incremental hashing let mut hasher = <$alg>::default(); hasher.update($data); assert_eq!( $code.wrap(hasher.finalize()).unwrap().to_bytes(), expected, "{:?} encodes correctly (from hasher)", stringify!($alg) ); )* } } #[allow(clippy::cognitive_complexity)] #[test] fn multihash_encode() { assert_encode! { Sha1, Code::Sha1, b"beep boop", "11147c8357577f51d4f0a8d393aa1aaafb28863d9421"; Sha2_256, Code::Sha2_256, b"helloworld", "1220936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af"; Sha2_256, Code::Sha2_256, b"beep boop", "122090ea688e275d580567325032492b597bc77221c62493e76330b85ddda191ef7c"; Sha2_512, Code::Sha2_512, b"hello world", "1340309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f"; Sha3_224, Code::Sha3_224, b"hello world", "171Cdfb7f18c77e928bb56faeb2da27291bd790bc1045cde45f3210bb6c5"; Sha3_256, Code::Sha3_256, b"hello world", "1620644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938"; Sha3_384, Code::Sha3_384, b"hello world", "153083bff28dde1b1bf5810071c6643c08e5b05bdb836effd70b403ea8ea0a634dc4997eb1053aa3593f590f9c63630dd90b"; Sha3_512, Code::Sha3_512, b"hello world", "1440840006653e9ac9e95117a15c915caab81662918e925de9e004f774ff82d7079a40d4d27b1b372657c61d46d470304c88c788b3a4527ad074d1dccbee5dbaa99a"; Keccak224, Code::Keccak224, b"hello world", "1A1C25f3ecfebabe99686282f57f5c9e1f18244cfee2813d33f955aae568"; Keccak256, Code::Keccak256, b"hello world", "1B2047173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"; Keccak384, Code::Keccak384, b"hello world", "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f"; Keccak512, Code::Keccak512, b"hello world", "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d"; Blake2b512, Code::Blake2b512, b"hello world", "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0"; Blake2s256, Code::Blake2s256, b"hello world", "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b"; Blake2b256, Code::Blake2b256, b"hello world", "a0e40220256c83b297114d201b30179f3f0ef0cace9783622da5974326b436178aeef610"; Blake2s128, Code::Blake2s128, b"hello world", "d0e4021037deae0226c30da2ab424a7b8ee14e83"; Blake3_256, Code::Blake3_256, b"hello world", "1e20d74981efa70a0c880b8d8c1985d075dbcbf679b99a5f9914e5aaf96b831a9e24"; } #[cfg(feature = "ripemd")] assert_encode! { Ripemd160, Code::Ripemd160, b"hello world", "d3201498c615784ccb5fe5936fbc0cbe9dfdb408d92f0f"; Ripemd256, Code::Ripemd256, b"hello world", "d420200d375cf9d9ee95a3bb15f757c81e93bb0ad963edf69dc4d12264031814608e37"; Ripemd320, Code::Ripemd320, b"hello world", "d520280e12fe7d075f8e319e07c106917eddb0135e9a10aefb50a8a07ccb0582ff1fa27b95ed5af57fd5c6"; } } macro_rules! assert_decode { {$( $code:expr, $hash:expr; )*} => { $( let hash = hex::decode($hash).unwrap(); assert_eq!( Multihash::from_bytes(&hash).unwrap().code(), u64::from($code), "{:?} decodes correctly", stringify!($code) ); )* } } #[test] fn assert_decode() { assert_decode! { Code::Sha1, "11147c8357577f51d4f0a8d393aa1aaafb28863d9421"; Code::Sha2_256, "1220936a185caaa266bb9cbe981e9e05cb78cd732b0b3280eb944412bb6f8f8f07af"; Code::Sha2_256, "122090ea688e275d580567325032492b597bc77221c62493e76330b85ddda191ef7c"; Code::Sha2_512, "1340309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f"; Code::Sha3_224, "171Cdfb7f18c77e928bb56faeb2da27291bd790bc1045cde45f3210bb6c5"; Code::Sha3_256, "1620644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938"; Code::Sha3_384, "153083bff28dde1b1bf5810071c6643c08e5b05bdb836effd70b403ea8ea0a634dc4997eb1053aa3593f590f9c63630dd90b"; Code::Sha3_512, "1440840006653e9ac9e95117a15c915caab81662918e925de9e004f774ff82d7079a40d4d27b1b372657c61d46d470304c88c788b3a4527ad074d1dccbee5dbaa99a"; Code::Keccak224, "1A1C25f3ecfebabe99686282f57f5c9e1f18244cfee2813d33f955aae568"; Code::Keccak256, "1B2047173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad"; Code::Keccak384, "1C3065fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f"; Code::Keccak512, "1D403ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d"; Code::Blake2b512, "c0e40240021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0"; Code::Blake2s256, "e0e402209aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b"; Code::Blake2b256, "a0e40220256c83b297114d201b30179f3f0ef0cace9783622da5974326b436178aeef610"; Code::Blake2s128, "d0e4021037deae0226c30da2ab424a7b8ee14e83"; Code::Blake3_256, "1e20d74981efa70a0c880b8d8c1985d075dbcbf679b99a5f9914e5aaf96b831a9e24"; } #[cfg(feature = "ripemd")] assert_decode! { Code::Ripemd160, "d3201498c615784ccb5fe5936fbc0cbe9dfdb408d92f0f"; Code::Ripemd256, "d420200d375cf9d9ee95a3bb15f757c81e93bb0ad963edf69dc4d12264031814608e37"; Code::Ripemd320, "d520280e12fe7d075f8e319e07c106917eddb0135e9a10aefb50a8a07ccb0582ff1fa27b95ed5af57fd5c6"; } } macro_rules! assert_roundtrip { ($( $code:expr, $alg:ident; )*) => { $( // Hashing with one call { let hash = $code.digest(b"helloworld"); assert_eq!( Multihash::from_bytes(&hash.to_bytes()).unwrap().code(), hash.code() ); } // Hashing incrementally { let mut hasher = <$alg>::default(); hasher.update(b"helloworld"); let hash = $code.wrap(hasher.finalize()).unwrap(); assert_eq!( Multihash::from_bytes(&hash.to_bytes()).unwrap().code(), hash.code() ); } // Hashing as `Write` implementation { let mut hasher = <$alg>::default(); hasher.write_all(b"helloworld").unwrap(); let hash = $code.wrap(hasher.finalize()).unwrap(); assert_eq!( Multihash::from_bytes(&hash.to_bytes()).unwrap().code(), hash.code() ); } )* } } #[allow(clippy::cognitive_complexity)] #[test] fn assert_roundtrip() { assert_roundtrip!( Code::Sha1, Sha1; Code::Sha2_256, Sha2_256; Code::Sha2_512, Sha2_512; Code::Sha3_224, Sha3_224; Code::Sha3_256, Sha3_256; Code::Sha3_384, Sha3_384; Code::Sha3_512, Sha3_512; Code::Keccak224, Keccak224; Code::Keccak256, Keccak256; Code::Keccak384, Keccak384; Code::Keccak512, Keccak512; Code::Blake2b512, Blake2b512; Code::Blake2s256, Blake2s256; Code::Blake3_256, Blake3_256; ); #[cfg(feature = "ripemd")] assert_roundtrip! { Code::Ripemd160, Ripemd160; Code::Ripemd256, Ripemd256; Code::Ripemd320, Ripemd320; } } /// Testing the public interface of `Multihash` and coversions to it fn multihash_methods(code: Code, prefix: &str, digest_str: &str) where H: Hasher + Default, { let digest = hex::decode(digest_str).unwrap(); let expected_bytes = hex::decode(format!("{prefix}{digest_str}")).unwrap(); let mut expected_cursor = Cursor::new(&expected_bytes); let multihash = code.digest(b"hello world"); assert_eq!(Multihash::wrap(code.into(), &digest).unwrap(), multihash); assert_eq!(multihash.code(), u64::from(code)); assert_eq!(multihash.size() as usize, digest.len()); assert_eq!(multihash.digest(), digest); assert_eq!(Multihash::read(&mut expected_cursor).unwrap(), multihash); assert_eq!(Multihash::from_bytes(&expected_bytes).unwrap(), multihash); let mut written_buf = Vec::new(); multihash.write(&mut written_buf).unwrap(); assert_eq!(written_buf, expected_bytes); assert_eq!(multihash.to_bytes(), expected_bytes); // Test from hasher digest conversion let mut hasher = H::default(); hasher.update(b"hello world"); let multihash_from_digest = code.wrap(hasher.finalize()).unwrap(); assert_eq!(multihash_from_digest.code(), u64::from(code)); assert_eq!(multihash_from_digest.size() as usize, digest.len()); assert_eq!(multihash_from_digest.digest(), digest); } #[test] fn test_multihash_methods() { multihash_methods::( Code::Sha1, "1114", "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed", ); multihash_methods::( Code::Sha2_256, "1220", "b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9", ); multihash_methods::( Code::Sha2_512, "1340", "309ecc489c12d6eb4cc40f50c902f2b4d0ed77ee511a7c7a9bcd3ca86d4cd86f989dd35bc5ff499670da34255b45b0cfd830e81f605dcf7dc5542e93ae9cd76f"); multihash_methods::( Code::Sha3_224, "171C", "dfb7f18c77e928bb56faeb2da27291bd790bc1045cde45f3210bb6c5", ); multihash_methods::( Code::Sha3_256, "1620", "644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938", ); multihash_methods::( Code::Sha3_384, "1530", "83bff28dde1b1bf5810071c6643c08e5b05bdb836effd70b403ea8ea0a634dc4997eb1053aa3593f590f9c63630dd90b"); multihash_methods::( Code::Sha3_512, "1440", "840006653e9ac9e95117a15c915caab81662918e925de9e004f774ff82d7079a40d4d27b1b372657c61d46d470304c88c788b3a4527ad074d1dccbee5dbaa99a"); multihash_methods::( Code::Keccak224, "1A1C", "25f3ecfebabe99686282f57f5c9e1f18244cfee2813d33f955aae568", ); multihash_methods::( Code::Keccak256, "1B20", "47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad", ); multihash_methods::( Code::Keccak384, "1C30", "65fc99339a2a40e99d3c40d695b22f278853ca0f925cde4254bcae5e22ece47e6441f91b6568425adc9d95b0072eb49f"); multihash_methods::( Code::Keccak512, "1D40", "3ee2b40047b8060f68c67242175660f4174d0af5c01d47168ec20ed619b0b7c42181f40aa1046f39e2ef9efc6910782a998e0013d172458957957fac9405b67d"); multihash_methods::( Code::Blake2b512, "c0e40240", "021ced8799296ceca557832ab941a50b4a11f83478cf141f51f933f653ab9fbcc05a037cddbed06e309bf334942c4e58cdf1a46e237911ccd7fcf9787cbc7fd0"); multihash_methods::( Code::Blake2s256, "e0e40220", "9aec6806794561107e594b1f6a8a6b0c92a0cba9acf5e5e93cca06f781813b0b", ); multihash_methods::( Code::Blake2b256, "a0e40220", "256c83b297114d201b30179f3f0ef0cace9783622da5974326b436178aeef610", ); multihash_methods::( Code::Blake2s128, "d0e40210", "37deae0226c30da2ab424a7b8ee14e83", ); multihash_methods::( Code::Blake3_256, "1e20", "d74981efa70a0c880b8d8c1985d075dbcbf679b99a5f9914e5aaf96b831a9e24", ); #[cfg(feature = "ripemd")] { multihash_methods::( Code::Ripemd160, "d32014", "98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f", ); multihash_methods::( Code::Ripemd256, "d42020", "0d375cf9d9ee95a3bb15f757c81e93bb0ad963edf69dc4d12264031814608e37", ); multihash_methods::( Code::Ripemd320, "d52028", "0e12fe7d075f8e319e07c106917eddb0135e9a10aefb50a8a07ccb0582ff1fa27b95ed5af57fd5c6", ); } } #[test] fn multihash_errors() { assert!( Multihash::from_bytes(&[]).is_err(), "Should error on empty data" ); assert!( Multihash::from_bytes(&[1, 2, 3]).is_err(), "Should error on invalid multihash" ); assert!( Multihash::from_bytes(&[1, 2, 3]).is_err(), "Should error on invalid prefix" ); assert!( Multihash::from_bytes(&[0x12, 0x20, 0xff]).is_err(), "Should error on correct prefix with wrong digest" ); let identity_code: u8 = 0x00; let identity_length = 3; assert!( Multihash::from_bytes(&[identity_code, identity_length, 1, 2, 3, 4]).is_err(), "Should error on wrong hash length" ); } #[test] fn blak3_non_default_digest() { use multihash_codetable::Blake3Hasher; use multihash_derive::MultihashDigest; const DIGEST_SIZE: usize = 16; pub struct ContentHasher(Blake3Hasher); pub struct ContentHash([u8; DIGEST_SIZE]); impl ContentHasher { fn new() -> ContentHasher { ContentHasher(Blake3Hasher::default()) } fn write(&mut self, input: &[u8]) { self.0.update(input); } fn finish(&mut self) -> ContentHash { let hash = multihash_codetable::Code::Blake3_256 .wrap(self.0.finalize()) .unwrap(); let resized_hash = hash.resize::().unwrap(); let mut content = ContentHash([0u8; DIGEST_SIZE]); content.0.copy_from_slice(resized_hash.digest()); content } fn reset(&mut self) { self.0.reset(); } } let mut hasher = ContentHasher::new(); hasher.write("foobar".as_bytes()); let content_hash = hasher.finish(); hasher.reset(); let expected = hex::decode("aa51dcd43d5c6c5203ee16906fd6b35d").unwrap(); assert_eq!(&content_hash.0, expected.as_slice()) }