diff --git a/.github/workflows/csp-benchmarks.yml b/.github/workflows/csp-benchmarks.yml index 3e17f6368..bba15dc96 100644 --- a/.github/workflows/csp-benchmarks.yml +++ b/.github/workflows/csp-benchmarks.yml @@ -22,7 +22,7 @@ permissions: env: CARGO_TERM_COLOR: always BENCH_RUNS: ${{ github.event_name == 'workflow_dispatch' && (github.event.inputs.bench_runs != '' && github.event.inputs.bench_runs || '3') || '3' }} - REQUIRED_NARGO_VERSION: "1.0.0-beta.19" + REQUIRED_NARGO_VERSION: "1.0.0-beta.20" concurrency: group: csp-benchmarks-${{ github.ref }} diff --git a/Cargo.lock b/Cargo.lock index b1f19ea22..78744247a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,8 +4,8 @@ version = 4 [[package]] name = "acir" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir_field", "base64", @@ -20,17 +20,16 @@ dependencies = [ "serde-big-array", "strum", "strum_macros", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "acir_field" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "ark-bn254", "ark-ff 0.5.0", - "ark-std 0.5.0", "cfg-if", "hex", "num-bigint", @@ -39,23 +38,24 @@ dependencies = [ [[package]] name = "acvm" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm_blackbox_solver", "brillig_vm", - "indexmap 2.13.1", + "indexmap 2.14.0", + "itertools 0.14.0", "rustc-hash", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", "tracing", ] [[package]] name = "acvm_blackbox_solver" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "aes", @@ -63,11 +63,11 @@ dependencies = [ "blake3", "cbc", "k256", - "keccak 0.2.0-rc.2", + "keccak 0.2.0", "log", "p256", "sha2 0.11.0", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] @@ -223,7 +223,7 @@ dependencies = [ "argh_shared", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -352,7 +352,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -390,7 +390,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -462,7 +462,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -472,7 +472,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -482,7 +482,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -492,7 +492,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -503,9 +503,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "f02882884d3e1bc524fb12c79f107f6ad0e1cfd498c536ffb494301740995dfe" dependencies = [ "zeroize", ] @@ -534,7 +534,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] @@ -546,14 +546,14 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "async-lsp" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa3be9cb3e4959184a598f9874641d297fb45f09940ac0e8326574a7cb81940" +checksum = "c8b8fd1e175c5ee3108095da452e816519de618beccea23aa053c00cf5e344b9" dependencies = [ "futures", "lsp-types 0.95.1", @@ -577,7 +577,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -603,20 +603,20 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "axum" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b52af3cb4058c895d37317bb27508dccc8e5f2d39454016b297bf4a400597b8" +checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" dependencies = [ "axum-core", "bytes", @@ -697,12 +697,6 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "binary-merge" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597bb81c80a54b6a4381b23faba8d7774b144c94cbd1d6fe3f1329bd776554ab" - [[package]] name = "bincode" version = "1.3.3" @@ -735,9 +729,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" [[package]] name = "bitmaps" @@ -750,9 +744,9 @@ dependencies = [ [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -806,9 +800,9 @@ dependencies = [ [[package]] name = "block-buffer" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdd35008169921d80bc60d3d0ab416eecb028c4cd653352907921d95084790be" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" dependencies = [ "hybrid-array", ] @@ -834,7 +828,7 @@ dependencies = [ "hla", "primitive-types 0.13.1", "proptest", - "rand 0.9.2", + "rand 0.9.4", "seq-macro", ] @@ -847,8 +841,8 @@ dependencies = [ [[package]] name = "bn254_blackbox_solver" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm_blackbox_solver", @@ -857,13 +851,14 @@ dependencies = [ "ark-ff 0.5.0", "ark-grumpkin", "hex", + "itertools 0.14.0", ] [[package]] name = "borsh" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +checksum = "2f3f6da4992df95bbcd9af42a6c7dcb994498fc9048230405f3b36ff7cd3f145" dependencies = [ "bytes", "cfg_aliases", @@ -871,23 +866,34 @@ dependencies = [ [[package]] name = "brillig" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir_field", + "itertools 0.14.0", "serde", ] [[package]] name = "brillig_vm" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm_blackbox_solver", + "itertools 0.14.0", "num-bigint", "num-traits", - "thiserror 1.0.69", + "thiserror 2.0.18", +] + +[[package]] +name = "bs58" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "tinyvec", ] [[package]] @@ -913,9 +919,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.2" +version = "3.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" [[package]] name = "byte-slice-cast" @@ -937,9 +943,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.11.1" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" +checksum = "8ae3f5d315924270530207e2a68396c3cc547f6dca3fbdca317cfb1a51edb593" [[package]] name = "cbc" @@ -952,9 +958,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.58" +version = "1.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1e928d4b69e3077709075a938a05ffbedfa53a84c8f766efbf8220bb1ff60e1" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" dependencies = [ "find-msvc-tools", "jobserver", @@ -980,11 +986,22 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +[[package]] +name = "chacha20" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "rand_core 0.10.1", +] + [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -1027,15 +1044,15 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "crypto-common 0.1.6", + "crypto-common 0.1.7", "inout", ] [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -1056,23 +1073,23 @@ dependencies = [ [[package]] name = "clap_complete" -version = "4.6.0" +version = "4.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19c9f1dde76b736e3681f28cec9d5a61299cbaae0fce80a68e43724ad56031eb" +checksum = "e0a7a9bfdb35811f9e59832f0f05975114d2251b415fb534108e6f34060fd772" dependencies = [ "clap", ] [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1094,9 +1111,9 @@ dependencies = [ [[package]] name = "cmov" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +checksum = "0c9ea0ac24bc397ab3c98583a3c9ba74fa56b09a4449bbe172b9b1ddb016027a" [[package]] name = "cobs" @@ -1109,11 +1126,11 @@ dependencies = [ [[package]] name = "codespan" -version = "0.11.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3362992a0d9f1dd7c3d0e89e0ab2bb540b7a95fea8cd798090e758fda2899b5e" +checksum = "583f52b0658b321b25fd6b209b6c76cf058f433071297de64e5980c3d9aad937" dependencies = [ - "codespan-reporting", + "codespan-reporting 0.13.1", "serde", ] @@ -1123,7 +1140,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc4159b76af02757139baf42c0c971c6dc155330999fbfd8eddb29b97fb2db68" dependencies = [ - "codespan-reporting", + "codespan-reporting 0.11.1", "lsp-types 0.88.0", "url", ] @@ -1133,10 +1150,20 @@ name = "codespan-reporting" version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width 0.1.14", +] + +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ "serde", "termcolor", - "unicode-width", + "unicode-width 0.2.2", ] [[package]] @@ -1190,14 +1217,13 @@ checksum = "baf0a07a401f374238ab8e2f11a104d2851bf9ce711ec69804834de8af45c7af" [[package]] name = "console" -version = "0.15.11" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" +checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "once_cell", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -1224,11 +1250,12 @@ checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst 0.2.20", ] [[package]] @@ -1259,9 +1286,9 @@ checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "convert_case" -version = "0.6.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +checksum = "affbf0190ed2caf063e3def54ff444b449371d55c58e513a95ab98eca50adb49" dependencies = [ "unicode-segmentation", ] @@ -1327,9 +1354,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -1388,25 +1415,25 @@ checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-bigint" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a0d26b245348befa0c121944541476763dcc46ede886c88f9d12e1697d27c3" +checksum = "1a52aa3fcda4e6302a9f48734f234d35d4721b96f8fe07d073f07ce9df4f0271" dependencies = [ "cpubits", "ctutils", - "getrandom 0.4.2", + "getrandom 0.4.3", "hybrid-array", "num-traits", - "rand_core 0.10.0", + "rand_core 0.10.1", "subtle", "zeroize", ] [[package]] name = "crypto-common" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", "typenum", @@ -1414,13 +1441,13 @@ dependencies = [ [[package]] name = "crypto-common" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77727bb15fa921304124b128af125e7e3b968275d1b108b379190264f4423710" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", "hybrid-array", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -1485,7 +1512,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1496,14 +1523,14 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "data-encoding" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" [[package]] name = "der" @@ -1547,7 +1574,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -1570,7 +1596,7 @@ checksum = "d08b3a0bcc0d079199cd476b2cae8435016ec11d1c0986c6901c5ac223041534" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1590,7 +1616,7 @@ checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", "const-oid 0.9.6", - "crypto-common 0.1.6", + "crypto-common 0.1.7", "subtle", ] @@ -1600,9 +1626,9 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ - "block-buffer 0.12.0", + "block-buffer 0.12.1", "const-oid 0.10.2", - "crypto-common 0.2.1", + "crypto-common 0.2.2", "ctutils", ] @@ -1650,13 +1676,13 @@ dependencies = [ [[package]] name = "displaydoc" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1681,7 +1707,7 @@ checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1713,9 +1739,9 @@ dependencies = [ [[package]] name = "ecdsa" -version = "0.17.0-rc.18" +version = "0.17.0-rc.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54fb064faabbee66e1fc8e5c5a9458d4269dc2d8b638fe86a425adb2510d1a96" +checksum = "b7c72d1455753a703ad4b90ed2a759f2bc4562024a303176439cf6e593b5ade4" dependencies = [ "der 0.8.0", "digest 0.11.3", @@ -1735,32 +1761,31 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" [[package]] name = "elliptic-curve" -version = "0.14.0-rc.32" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda94f31325c4275e9706adecbb6f0650dee2f904c915a98e3d81adaaaa757aa" +checksum = "3273f1195b6f6253ebda493d6742c8baa9b26a291674cd96d92a0f09e90e9b46" dependencies = [ "base16ct", "crypto-bigint", - "crypto-common 0.2.1", + "crypto-common 0.2.2", "digest 0.11.3", + "ff", + "group", "hybrid-array", - "once_cell", "pem-rfc7468 1.0.0", "pkcs8 0.11.0", - "rand_core 0.10.0", - "rustcrypto-ff", - "rustcrypto-group", + "rand_core 0.10.1", "sec1", "subtle", "zeroize", @@ -1816,7 +1841,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -1877,9 +1902,9 @@ dependencies = [ [[package]] name = "fastrand" -version = "2.3.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] name = "fastrlp" @@ -1914,6 +1939,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "ff" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f686ab92a9fb0eaf188f6c6c87b89490baa6fdb0db4544ba4dc47f7942489f" +dependencies = [ + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "fid-rs" version = "0.1.1" @@ -1932,17 +1967,6 @@ dependencies = [ "windows-sys 0.60.2", ] -[[package]] -name = "filetime" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox 0.1.15", -] - [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1956,7 +1980,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" dependencies = [ "byteorder", - "rand 0.8.5", + "rand 0.8.6", "rustc-hex", "static_assertions", ] @@ -1979,11 +2003,12 @@ dependencies = [ [[package]] name = "fm" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ - "codespan-reporting", + "codespan-reporting 0.11.1", "iter-extended", + "itertools 0.14.0", "serde", ] @@ -2099,7 +2124,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2142,9 +2167,9 @@ dependencies = [ [[package]] name = "generator" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9" +checksum = "b3b854b0e584ead1a33f18b2fcad7cf7be18b3875c78816b753639aa501513ae" dependencies = [ "cc", "cfg-if", @@ -2157,9 +2182,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.9" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -2194,17 +2219,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi 6.0.0", - "rand_core 0.10.0", - "wasip2", - "wasip3", + "rand_core 0.10.1", "wasm-bindgen", ] @@ -2214,11 +2237,22 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "group" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fd1a1c7a5206c5b7a3f5a0d7ccd3ff85d0c8f5133d62a02680255b0004af5f4" +dependencies = [ + "ff", + "rand_core 0.10.1", + "subtle", +] + [[package]] name = "h2" -version = "0.4.13" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -2226,7 +2260,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.13.1", + "indexmap 2.14.0", "slab", "tokio", "tokio-util", @@ -2272,9 +2306,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.16.1" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heapless" @@ -2340,9 +2374,9 @@ dependencies = [ [[package]] name = "http" -version = "1.4.0" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "6970f50e31d6fc17d3fa27329444bfa74e196cf62e95052a3f6fee181dba6425" dependencies = [ "bytes", "itoa", @@ -2385,9 +2419,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hybrid-array" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" +checksum = "9155a582abd142abc056962c29e3ce5ff2ad5469f4246b537ed42c5deba857da" dependencies = [ "subtle", "typenum", @@ -2396,9 +2430,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.9.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" +checksum = "55281c53a1894c864990125767da440a4e630446785086f52523b20033b74498" dependencies = [ "atomic-waker", "bytes", @@ -2418,16 +2452,15 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.7" +version = "0.27.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" dependencies = [ "http", "hyper", "hyper-util", "log", "rustls", - "rustls-pki-types", "tokio", "tokio-rustls", "tower-service", @@ -2580,12 +2613,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - [[package]] name = "ident_case" version = "1.0.1" @@ -2605,9 +2632,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -2654,7 +2681,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2676,23 +2703,23 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.13.1" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a8a2b9cb3e0b0c1803dbb0758ffac5de2f425b23c28f518faabd9d805342ff" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ "equivalent", - "hashbrown 0.16.1", + "hashbrown 0.17.1", "serde", "serde_core", ] [[package]] name = "inotify" -version = "0.9.6" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8069d3ec154eb856955c1c0fbffefbf5f3c40a104ec912d4797314c1801abff" +checksum = "533e68a5842e734946fe159fb03fc9bbbb254f590dd0d8ad321ae5ff7beca2c1" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.13.0", "inotify-sys", "libc", ] @@ -2716,31 +2743,12 @@ dependencies = [ "generic-array", ] -[[package]] -name = "inplace-vec-builder" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf64c2edc8226891a71f127587a2861b132d2b942310843814d5001d99a1d307" -dependencies = [ - "smallvec", -] - [[package]] name = "ipnet" version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is-terminal" version = "0.4.17" @@ -2760,8 +2768,8 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "iter-extended" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" [[package]] name = "itertools" @@ -2837,7 +2845,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -2852,9 +2860,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" dependencies = [ "once_cell", "wasm-bindgen", @@ -2862,9 +2870,9 @@ dependencies = [ [[package]] name = "jsonrpsee" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fba77a59c4c644fd48732367624d1bcf6f409f9c9a286fbc71d2f1fc0b2ea16" +checksum = "3f3f48dc3e6b8bd21e15436c1ddd0bc22a6a54e8ec46fedd6adf3425f396ec6a" dependencies = [ "jsonrpsee-core", "jsonrpsee-http-client", @@ -2875,9 +2883,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" dependencies = [ "async-trait", "bytes", @@ -2897,9 +2905,9 @@ dependencies = [ [[package]] name = "jsonrpsee-http-client" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" dependencies = [ "base64", "http-body", @@ -2920,22 +2928,22 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fa4f5daed39f982a1bb9d15449a28347490ad42b212f8eaa2a2a344a0dce9e9" +checksum = "2da3f8ab5ce1bb124b6d082e62dffe997578ceaf0aeb9f3174a214589dc00f07" dependencies = [ "heck 0.5.0", "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "jsonrpsee-types" -version = "0.25.1" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" dependencies = [ "http", "serde", @@ -2951,15 +2959,17 @@ checksum = "17ab85f84ca42c5ec520e6f3c9966ba1fd62909ce260f8837e248857d2560509" [[package]] name = "k256" -version = "0.14.0-rc.9" +version = "0.14.0-rc.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b382cbfd43caf55991a93850ce538aa1aa67bb264af367d22dfe7937c4e997d" +checksum = "905d38bdbb43bb506efa0a428b3e969ff244549832a86b18591492f503adfe37" dependencies = [ "cpubits", "ecdsa", "elliptic-curve", + "primeorder", "sha2 0.11.0", "signature 3.0.0", + "wnaf", ] [[package]] @@ -2973,18 +2983,28 @@ dependencies = [ [[package]] name = "keccak" -version = "0.2.0-rc.2" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "882b69cb15b1f78b51342322a97ccd16f5123d1dc8a3da981a95244f488e8692" +checksum = "9e24a010dd405bd7ed803e5253182815b41bf2e6a80cc3bfc066658e03a198aa" dependencies = [ + "cfg-if", "cpufeatures 0.3.0", ] [[package]] name = "konst" -version = "0.3.16" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4381b9b00c55f251f2ebe9473aef7c117e96828def1a7cb3bd3f0f903c6894e9" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97feab15b395d1860944abe6a8dd8ed9f8eadfae01750fada8427abda531d887" dependencies = [ "const_panic", "konst_kernel", @@ -3000,11 +3020,17 @@ dependencies = [ "typewit", ] +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kqueue" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" +checksum = "273c0752728918e0ac4976f2b275b6fefb9ecd400585dec929419f3844cd87b5" dependencies = [ "kqueue-sys", "libc", @@ -3012,11 +3038,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "07293a4e297ac234359b510362495713f75ea345d5307140414f20c69ffeb087" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.13.0", "libc", ] @@ -3029,17 +3055,11 @@ dependencies = [ "spin 0.9.8", ] -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - [[package]] name = "libc" -version = "0.2.184" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48f5d2a454e16a5ea0f4ced81bd44e4cfc7bd3a507b61887c99fd3538b28e4af" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libm" @@ -3049,25 +3069,11 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" -dependencies = [ - "bitflags 2.11.0", - "libc", - "redox_syscall 0.4.1", -] - -[[package]] -name = "libredox" -version = "0.1.15" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ddbf48fd451246b1f8c2610bd3b4ac0cc6e149d89832867093ab69a17194f08" +checksum = "f02ab6bace2054fb888a3c16f990117b579d14a3088e472d63c6011fa185c9d3" dependencies = [ - "bitflags 2.11.0", "libc", - "plain", - "redox_syscall 0.7.3", ] [[package]] @@ -3099,9 +3105,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad" [[package]] name = "loom" @@ -3208,7 +3214,7 @@ checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] name = "mavros-artifacts" version = "0.1.0" -source = "git+https://github.com/reilabs/mavros?rev=7550b42e03d35b44781ff37f15b50773eb2a6fa0#7550b42e03d35b44781ff37f15b50773eb2a6fa0" +source = "git+https://github.com/reilabs/mavros?rev=e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6#e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6" dependencies = [ "ark-bn254", "ark-ff 0.5.0", @@ -3219,18 +3225,18 @@ dependencies = [ [[package]] name = "mavros-opcode-gen" version = "0.1.0" -source = "git+https://github.com/reilabs/mavros?rev=7550b42e03d35b44781ff37f15b50773eb2a6fa0#7550b42e03d35b44781ff37f15b50773eb2a6fa0" +source = "git+https://github.com/reilabs/mavros?rev=e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6#e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6" dependencies = [ "proc-macro2", "quote", "stringcase", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "mavros-vm" version = "0.1.0" -source = "git+https://github.com/reilabs/mavros?rev=7550b42e03d35b44781ff37f15b50773eb2a6fa0#7550b42e03d35b44781ff37f15b50773eb2a6fa0" +source = "git+https://github.com/reilabs/mavros?rev=e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6#e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6" dependencies = [ "ark-ff 0.5.0", "mavros-artifacts", @@ -3240,9 +3246,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memoffset" @@ -3277,31 +3283,20 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.11" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +checksum = "02bd0af71c67b473010cbbc60715ee815645a4dc942899111f494b4b737d6fda" dependencies = [ "libc", "log", "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "mio" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" -dependencies = [ - "libc", - "wasi", "windows-sys 0.61.2", ] [[package]] name = "nargo" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "brillig", @@ -3315,12 +3310,12 @@ dependencies = [ "noirc_errors", "noirc_frontend", "noirc_printable_type", - "rand 0.9.2", + "rand 0.10.1", "rayon", "serde", "serde_json", "tempfile", - "thiserror 1.0.69", + "thiserror 2.0.18", "tokio", "tracing", "walkdir", @@ -3328,8 +3323,8 @@ dependencies = [ [[package]] name = "nargo_cli" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "async-lsp", @@ -3343,6 +3338,7 @@ dependencies = [ "fm", "fs2", "iter-extended", + "itertools 0.14.0", "nargo", "nargo_doc", "nargo_expand", @@ -3359,7 +3355,6 @@ dependencies = [ "noirc_errors", "noirc_evaluator", "noirc_frontend", - "notify", "notify-debouncer-full", "rayon", "rustc-hash", @@ -3367,10 +3362,10 @@ dependencies = [ "similar-asserts", "termcolor", "termion", - "thiserror 1.0.69", + "thiserror 2.0.18", "tokio", "tokio-util", - "toml 0.7.8", + "toml", "tower", "tracing", "tracing-appender", @@ -3379,8 +3374,8 @@ dependencies = [ [[package]] name = "nargo_doc" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "fm", "iter-extended", @@ -3394,8 +3389,8 @@ dependencies = [ [[package]] name = "nargo_expand" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "nargo_fmt", "noirc_driver", @@ -3404,20 +3399,20 @@ dependencies = [ [[package]] name = "nargo_fmt" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "noirc_errors", "noirc_frontend", "serde", - "thiserror 1.0.69", - "toml 0.7.8", + "thiserror 2.0.18", + "toml", ] [[package]] name = "nargo_toml" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "dirs", "fm", @@ -3425,10 +3420,10 @@ dependencies = [ "nargo", "noirc_driver", "noirc_frontend", - "semver 1.0.27", + "semver 1.0.28", "serde", - "thiserror 1.0.69", - "toml 0.7.8", + "thiserror 2.0.18", + "toml", "tracing", "url", ] @@ -3483,13 +3478,13 @@ dependencies = [ "num-integer", "num-prime", "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] name = "noir_artifact_cli" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm", @@ -3498,24 +3493,24 @@ dependencies = [ "color-eyre", "const_format", "fm", + "itertools 0.14.0", "nargo", "noirc_abi", "noirc_artifacts", - "noirc_artifacts_info", "noirc_driver", "noirc_errors", "noirc_printable_type", "serde", "serde_json", - "thiserror 1.0.69", - "toml 0.7.8", + "thiserror 2.0.18", + "toml", "tracing-subscriber", ] [[package]] name = "noir_ast_fuzzer" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm", @@ -3525,6 +3520,7 @@ dependencies = [ "color-eyre", "im", "iter-extended", + "itertools 0.14.0", "log", "nargo", "noir_greybox_fuzzer", @@ -3535,20 +3531,20 @@ dependencies = [ "noirc_evaluator", "noirc_frontend", "proptest", - "rand 0.9.2", + "rand 0.10.1", "regex", "strum", ] [[package]] name = "noir_debugger" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "bn254_blackbox_solver", "build-data", - "codespan-reporting", + "codespan-reporting 0.11.1", "dap", "easy-repl", "fm", @@ -3557,23 +3553,24 @@ dependencies = [ "noirc_errors", "noirc_printable_type", "owo-colors", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "noir_greybox_fuzzer" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "build-data", "fm", + "itertools 0.14.0", "noirc_abi", "noirc_artifacts", "num-traits", "proptest", - "rand 0.9.2", - "rand_xorshift", + "rand 0.10.1", + "rand_xorshift 0.5.0", "rayon", "sha256", "termcolor", @@ -3582,8 +3579,8 @@ dependencies = [ [[package]] name = "noir_lsp" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "async-lsp", @@ -3606,41 +3603,42 @@ dependencies = [ "serde", "serde_json", "strum", - "thiserror 1.0.69", + "thiserror 2.0.18", "tower", "wasm-bindgen", ] [[package]] name = "noirc_abi" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "iter-extended", + "itertools 0.14.0", "noirc_printable_type", "num-bigint", "num-traits", "serde", "serde_json", - "thiserror 1.0.69", - "toml 0.7.8", + "thiserror 2.0.18", + "toml", ] [[package]] name = "noirc_arena" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" [[package]] name = "noirc_artifacts" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm", "base64", - "codespan-reporting", + "codespan-reporting 0.11.1", "flate2", "fm", "noirc_abi", @@ -3648,18 +3646,17 @@ dependencies = [ "noirc_printable_type", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror 2.0.18", "tracing", ] [[package]] name = "noirc_artifacts_info" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acir", "acvm", - "clap", "iter-extended", "noirc_artifacts", "prettytable-rs", @@ -3670,8 +3667,8 @@ dependencies = [ [[package]] name = "noirc_driver" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "build-data", @@ -3690,20 +3687,21 @@ dependencies = [ [[package]] name = "noirc_errors" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ - "codespan-reporting", + "codespan-reporting 0.11.1", "fm", "noirc_span", + "rangemap", "rustc-hash", "serde", ] [[package]] name = "noirc_evaluator" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "bn254_blackbox_solver", @@ -3711,8 +3709,9 @@ dependencies = [ "chrono", "fm", "im", - "indexmap 2.13.1", + "indexmap 2.14.0", "iter-extended", + "itertools 0.14.0", "noirc_artifacts", "noirc_errors", "noirc_frontend", @@ -3728,15 +3727,14 @@ dependencies = [ "serde_json", "serde_with", "smallvec", - "thiserror 1.0.69", + "thiserror 2.0.18", "tracing", - "vec-collections", ] [[package]] name = "noirc_frontend" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "bn254_blackbox_solver", @@ -3744,6 +3742,7 @@ dependencies = [ "fm", "im", "iter-extended", + "itertools 0.14.0", "noirc_arena", "noirc_artifacts", "noirc_errors", @@ -3759,25 +3758,26 @@ dependencies = [ "smol_str", "strum", "strum_macros", - "thiserror 1.0.69", + "thiserror 2.0.18", "tracing", ] [[package]] name = "noirc_printable_type" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "acvm", "iter-extended", + "itertools 0.14.0", "serde", "serde_json", ] [[package]] name = "noirc_span" -version = "1.0.0-beta.19" -source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.19#74d6be658e1ad252f87943292ba09bdd4da80bd4" +version = "1.0.0-beta.20" +source = "git+https://github.com/noir-lang/noir?rev=v1.0.0-beta.20#b4236c1957d0c26cb65d82adc9e5447b6ff1d629" dependencies = [ "codespan", "serde", @@ -3795,37 +3795,44 @@ dependencies = [ [[package]] name = "notify" -version = "6.1.1" +version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6205bd8bb1e454ad2e27422015fb5e4f2bcc7e08fa8f27058670d208324a4d2d" +checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.0", - "crossbeam-channel", - "filetime", + "bitflags 2.13.0", "fsevent-sys", "inotify", "kqueue", "libc", "log", - "mio 0.8.11", + "mio", + "notify-types", "walkdir", - "windows-sys 0.48.0", + "windows-sys 0.60.2", ] [[package]] name = "notify-debouncer-full" -version = "0.3.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fd166739789c9ff169e654dc1501373db9d80a4c3f972817c8a4d7cf8f34e" +checksum = "c02b49179cfebc9932238d04d6079912d26de0379328872846118a0fa0dbb302" dependencies = [ - "crossbeam-channel", "file-id", "log", "notify", - "parking_lot", + "notify-types", "walkdir", ] +[[package]] +name = "notify-types" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" +dependencies = [ + "bitflags 2.13.0", +] + [[package]] name = "ntt" version = "0.1.0" @@ -3856,7 +3863,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -3870,16 +3877,16 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand 0.8.5", + "rand 0.8.6", "smallvec", "zeroize", ] [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -3925,7 +3932,7 @@ dependencies = [ "num-integer", "num-modular", "num-traits", - "rand 0.8.5", + "rand 0.8.6", ] [[package]] @@ -3957,14 +3964,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "numtoa" -version = "0.1.0" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8f8bdf33df195859076e54ab11ee78a1b208382d3a26ec40d142ffc1ecc49ef" +checksum = "6aa2c4e539b869820a2b82e1aef6ff40aa85e65decdd5185e83fb4b1249cd00f" [[package]] name = "object" @@ -3998,15 +4005,14 @@ checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] name = "openssl" -version = "0.10.76" +version = "0.10.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "951c002c75e16ea2c65b8c7e4d3d51d5530d8dfa7d060b4776828c88cfb18ecf" +checksum = "77823a27f0babb03091cb9ed9ef80af3b39dbc82f97e8fa530374b7dafd87a45" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "cfg-if", "foreign-types", "libc", - "once_cell", "openssl-macros", "openssl-sys", ] @@ -4019,7 +4025,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -4030,9 +4036,9 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] name = "openssl-sys" -version = "0.9.112" +version = "0.9.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d55af3b3e226502be1526dfdba67ab0e9c96fc293004e79576b2b9edb0dbdb" +checksum = "b47e7e6bb2c38cd930d25a23b40fa52e068c10e85f3e03a7f5ba5aaca5713695" dependencies = [ "cc", "libc", @@ -4053,7 +4059,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7d950ca161dc355eaf28f82b11345ed76c6e1f6eb1f4f4479e0323b9e2fbd0e" dependencies = [ "num-traits", - "rand 0.8.5", + "rand 0.8.6", "serde", ] @@ -4065,9 +4071,9 @@ checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] name = "p256" -version = "0.14.0-rc.9" +version = "0.14.0-rc.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b97e3bf0465157ae90975ff52dbeb1362ba618924878c9f74c25baa27a65f9a" +checksum = "c855a8d2ffd346aa03122626f22e96e3aa75e3bfe64e6bf6cb82f71821ed6ae7" dependencies = [ "ecdsa", "elliptic-curve", @@ -4078,9 +4084,9 @@ dependencies = [ [[package]] name = "p3-challenger" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20e42ba74a49c08c6e99f74cd9b343bfa31aa5721fea55079b18e3fd65f1dcbc" +checksum = "a7d2d45f5a51dc3f965e8d6da60a6c26c807e88657863d56da275eaa05ad36f1" dependencies = [ "p3-field", "p3-maybe-rayon", @@ -4092,9 +4098,9 @@ dependencies = [ [[package]] name = "p3-dft" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e63fa5eb1bd12a240089e72ae3fe10350944d9c166d00a3bfd2a1794db65cf5c" +checksum = "beabb40bc8ac7f5f95870f271fb844c7e2e1ebb7f0761a8eebb2614b56c6b1c1" dependencies = [ "itertools 0.14.0", "p3-field", @@ -4107,74 +4113,73 @@ dependencies = [ [[package]] name = "p3-field" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ebfdb6ef992ae64e9e8f449ac46516ffa584f11afbdf9ee244288c2a633cdf4" +checksum = "4819a3e4c1882431a63d4847ffa10d110017aee4cb9cf4319ca6dca191930969" dependencies = [ "itertools 0.14.0", "num-bigint", "p3-maybe-rayon", "p3-util", "paste", - "rand 0.9.2", + "rand 0.9.4", "serde", "tracing", ] [[package]] name = "p3-koala-bear" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5113f50002c56006685b7d7ae12db568150aa1d4bfb092b883d64ece20138042" +checksum = "cfb02789fca0950e246123d652bd78e75a76e3b90a651fd88dbb215cd3e81f5a" dependencies = [ "p3-challenger", "p3-field", "p3-monty-31", "p3-poseidon2", "p3-symmetric", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "p3-matrix" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5542f96504dae8100c91398fb1e3f5ec669eb9c73d9e0b018a93b5fe32bad230" +checksum = "e6fde449bd2963d394284ec46db8c647e6a5602d90601117b76752072ab54168" dependencies = [ "itertools 0.14.0", "p3-field", "p3-maybe-rayon", "p3-util", - "rand 0.9.2", + "rand 0.9.4", "serde", "tracing", - "transpose", ] [[package]] name = "p3-maybe-rayon" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e5669ca75645f99cd001e9d0289a4eeff2bc2cd9dc3c6c3aaf22643966e83df" +checksum = "54afab3883d8a14676b492709d6c4e9fa535c36718b737db0817aacfaaaa11f6" [[package]] name = "p3-mds" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "038763af23df9da653065867fd85b38626079031576c86fd537097e5be6a0da0" +checksum = "3895055d735ac96d010747b3aaabd4c2645b9fd80226960550318db2e25afb75" dependencies = [ "p3-dft", "p3-field", "p3-symmetric", "p3-util", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "p3-monty-31" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a981d60da3d8cbf8561014e2c186068578405fd69098fa75b43d4afb364a47" +checksum = "c9fe0be661891af1f703ceaf57334fcbd540804988984dc2b500dd99740e7c81" dependencies = [ "itertools 0.14.0", "num-bigint", @@ -4187,31 +4192,30 @@ dependencies = [ "p3-symmetric", "p3-util", "paste", - "rand 0.9.2", + "rand 0.9.4", "serde", "spin 0.10.0", "tracing", - "transpose", ] [[package]] name = "p3-poseidon2" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903b73e4f9a7781a18561c74dc169cf03333497b57a8dd02aaeb130c0f386599" +checksum = "2c6fc2368447576283f8b3849a36095017f25addf06eab9e33b0ce7f96b0b99d" dependencies = [ "p3-field", "p3-mds", "p3-symmetric", "p3-util", - "rand 0.9.2", + "rand 0.9.4", ] [[package]] name = "p3-symmetric" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3cd788f04e86dd5c35dd87cad29eefdb6371d2fd5f7664451382eeacae3c3ed0" +checksum = "a14456a42a7d9e65f13999706f1bca2832175935169b3a54286e18331cf1d82f" dependencies = [ "itertools 0.14.0", "p3-field", @@ -4220,11 +4224,12 @@ dependencies = [ [[package]] name = "p3-util" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "663b16021930bc600ecada915c6c3965730a3b9d6a6c23434ccf70bfc29d6881" +checksum = "911154accf66034b0eec4452956c088f92a200b37a8225c1caed74cfbd38cc8d" dependencies = [ "serde", + "transpose", ] [[package]] @@ -4252,7 +4257,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -4273,7 +4278,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.18", + "redox_syscall", "smallvec", "windows-link", ] @@ -4357,28 +4362,28 @@ checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ "fixedbitset", "hashbrown 0.15.5", - "indexmap 2.13.1", + "indexmap 2.14.0", "serde", ] [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -4420,15 +4425,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plain" -version = "0.2.3" +version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" +checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" [[package]] name = "poseidon2" @@ -4476,16 +4475,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - [[package]] name = "prettytable-rs" version = "0.10.0" @@ -4497,30 +4486,33 @@ dependencies = [ "is-terminal", "lazy_static", "term", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] name = "primefield" -version = "0.14.0-rc.9" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b52e6ee42db392378a95622b463c9740631171d1efce43fa445a569c1600cb6" +checksum = "c555a6e4eb7d4e158fcb028c835c3b8642206ddc279b5c6b202ef9a8bdb592f4" dependencies = [ "crypto-bigint", - "crypto-common 0.2.1", - "rand_core 0.10.0", - "rustcrypto-ff", + "crypto-common 0.2.2", + "ff", + "rand_core 0.10.1", "subtle", "zeroize", ] [[package]] name = "primeorder" -version = "0.14.0-rc.9" +version = "0.14.0-rc.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0556580e42c19833f5d232aca11a7687a503ee41f937b54f5ae1d50fc2a6a36a" +checksum = "4e56e6d67fdf5744e9e245ae571450fe584b91f5af261d0e40163b618e53a1f6" dependencies = [ "elliptic-curve", + "once_cell", + "primefield", + "serdect", ] [[package]] @@ -4551,7 +4543,7 @@ version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.25.10+spec-1.1.0", + "toml_edit 0.25.12+spec-1.1.0", ] [[package]] @@ -4571,11 +4563,11 @@ checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags 2.13.0", "num-traits", - "rand 0.9.2", + "rand 0.9.4", "rand_chacha 0.9.0", - "rand_xorshift", + "rand_xorshift 0.4.0", "regex-syntax", "rusty-fork", "tempfile", @@ -4584,7 +4576,7 @@ dependencies = [ [[package]] name = "provekit-bench" -version = "0.1.0" +version = "1.0.0" dependencies = [ "acir", "anyhow", @@ -4600,13 +4592,13 @@ dependencies = [ "provekit-verifier", "serde", "test-case", - "toml 0.8.23", + "toml", "whir", ] [[package]] name = "provekit-cli" -version = "0.1.0" +version = "1.0.0" dependencies = [ "acir", "anyhow", @@ -4635,7 +4627,7 @@ dependencies = [ [[package]] name = "provekit-common" -version = "0.1.0" +version = "1.0.0" dependencies = [ "acir", "anyhow", @@ -4649,7 +4641,7 @@ dependencies = [ "divan", "hex", "itertools 0.14.0", - "keccak 0.2.0-rc.2", + "keccak 0.2.0", "mavros-artifacts", "mavros-vm", "noirc_abi", @@ -4675,7 +4667,7 @@ dependencies = [ [[package]] name = "provekit-ffi" -version = "0.1.0" +version = "1.0.0" dependencies = [ "anyhow", "libc", @@ -4705,7 +4697,7 @@ dependencies = [ [[package]] name = "provekit-prover" -version = "0.1.0" +version = "1.0.0" dependencies = [ "acir", "anyhow", @@ -4726,7 +4718,7 @@ dependencies = [ [[package]] name = "provekit-r1cs-compiler" -version = "0.1.0" +version = "1.0.0" dependencies = [ "acir", "anyhow", @@ -4747,7 +4739,7 @@ dependencies = [ [[package]] name = "provekit-verifier" -version = "0.1.0" +version = "1.0.0" dependencies = [ "anyhow", "ark-std 0.5.0", @@ -4767,7 +4759,7 @@ dependencies = [ "console_error_panic_hook", "getrandom 0.2.17", "getrandom 0.3.4", - "getrandom 0.4.2", + "getrandom 0.4.3", "hex", "js-sys", "lzma-rs", @@ -4796,7 +4788,7 @@ checksum = "95c589f335db0f6aaa168a7cd27b1fc6920f5e1470c804f814d9cd6e62a0f70b" dependencies = [ "env_logger", "log", - "rand 0.10.0", + "rand 0.10.1", ] [[package]] @@ -4807,14 +4799,14 @@ checksum = "a9a28b8493dd664c8b171dd944da82d933f7d456b829bfb236738e1fe06c5ba4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "quote" -version = "1.0.45" +version = "1.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368" dependencies = [ "proc-macro2", ] @@ -4849,9 +4841,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -4861,9 +4853,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", @@ -4871,12 +4863,13 @@ dependencies = [ [[package]] name = "rand" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc266eb313df6c5c09c1c7b1fbe2510961e5bcd3add930c1e31f7ed9da0feff8" +checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207" dependencies = [ - "getrandom 0.4.2", - "rand_core 0.10.0", + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", ] [[package]] @@ -4920,9 +4913,9 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c8d0fd677905edcbeedbf2edb6494d676f0e98d54d5cf9bda0b061cb8fb8aba" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" [[package]] name = "rand_xorshift" @@ -4933,6 +4926,15 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand_xorshift" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60aa6af80be32871323012e02e6e65f8a7cc7890931ae421d217ad8fe0df2ccf" +dependencies = [ + "rand_core 0.10.1", +] + [[package]] name = "rand_xoshiro" version = "0.6.0" @@ -4961,7 +4963,7 @@ dependencies = [ "chrono", "either", "jzon", - "konst", + "konst 0.3.17", "nom", "num-bigint", "num-integer", @@ -5007,9 +5009,9 @@ dependencies = [ [[package]] name = "rayon" -version = "1.11.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" dependencies = [ "either", "rayon-core", @@ -5027,39 +5029,15 @@ dependencies = [ "wasm_sync", ] -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" -dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", ] -[[package]] -name = "redox_termios" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20145670ba436b55d91fc92d25e71160fbfbdd57831631c8d7d36377a476f1cb" - [[package]] name = "redox_users" version = "0.4.6" @@ -5067,7 +5045,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom 0.2.17", - "libredox 0.1.15", + "libredox", "thiserror 1.0.69", ] @@ -5078,7 +5056,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" dependencies = [ "getrandom 0.2.17", - "libredox 0.1.15", + "libredox", "thiserror 2.0.18", ] @@ -5099,14 +5077,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "regex" -version = "1.12.3" +version = "1.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" +checksum = "f1292b7759ae1cb9ec195452d1390a074f0cd8541ab7a5a8c31cd6db45d4a6ba" dependencies = [ "aho-corasick", "memchr", @@ -5133,9 +5111,9 @@ checksum = "cab834c73d247e67f4fae452806d17d3c7501756d98c8808d7c9c7aa7d18f973" [[package]] name = "regex-syntax" -version = "0.8.10" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" @@ -5179,12 +5157,12 @@ dependencies = [ [[package]] name = "rfc6979" -version = "0.5.0-rc.5" +version = "0.6.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23a3127ee32baec36af75b4107082d9bd823501ec14a4e016be4b6b37faa74ae" +checksum = "9935425142ac6e252364413291d96c8bc9898d0876a801824c7af4eae397b689" dependencies = [ + "ctutils", "hmac", - "subtle", ] [[package]] @@ -5253,9 +5231,9 @@ dependencies = [ [[package]] name = "ruint" -version = "1.17.2" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" +checksum = "0298da754d1395046b0afdc2f20ee76d29a8ae310cd30ffa84ed42acba9cb12a" dependencies = [ "alloy-rlp", "ark-ff 0.3.0", @@ -5270,8 +5248,8 @@ dependencies = [ "parity-scale-codec", "primitive-types 0.12.2", "proptest", - "rand 0.8.5", - "rand 0.9.2", + "rand 0.8.6", + "rand 0.9.4", "rlp", "ruint-macro", "serde_core", @@ -5305,7 +5283,7 @@ dependencies = [ "proc-macro2", "quote", "rust-embed-utils", - "syn 2.0.117", + "syn 2.0.118", "walkdir", ] @@ -5358,28 +5336,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver 1.0.27", -] - -[[package]] -name = "rustcrypto-ff" -version = "0.14.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd2a8adb347447693cd2ba0d218c4b66c62da9b0a5672b17b981e4291ec65ff6" -dependencies = [ - "rand_core 0.10.0", - "subtle", -] - -[[package]] -name = "rustcrypto-group" -version = "0.14.0-rc.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "369f9b61aa45933c062c9f6b5c3c50ab710687eca83dd3802653b140b43f85ed" -dependencies = [ - "rand_core 0.10.0", - "rustcrypto-ff", - "subtle", + "semver 1.0.28", ] [[package]] @@ -5397,7 +5354,7 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.4.15", @@ -5410,7 +5367,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "errno", "libc", "linux-raw-sys 0.12.1", @@ -5419,9 +5376,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.37" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "log", "once_cell", @@ -5434,9 +5391,9 @@ dependencies = [ [[package]] name = "rustls-native-certs" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" dependencies = [ "openssl-probe", "rustls-pki-types", @@ -5446,9 +5403,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "zeroize", ] @@ -5482,9 +5439,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.10" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "ring", "rustls-pki-types", @@ -5528,7 +5485,7 @@ dependencies = [ "scopeguard", "smallvec", "unicode-segmentation", - "unicode-width", + "unicode-width 0.1.14", "utf8parse", "winapi", ] @@ -5545,9 +5502,9 @@ dependencies = [ [[package]] name = "ruzstd" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ff0cc5e135c8870a775d3320910cd9b564ec036b4dc0b8741629020be63f01" +checksum = "a7c1c839d570d835527c9a5e4db7cb2198683a988cb9d7293fc8674e6bd58fc8" dependencies = [ "twox-hash", ] @@ -5679,7 +5636,7 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -5707,9 +5664,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] name = "semver-parser" @@ -5773,14 +5730,14 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "serde_json" -version = "1.0.149" +version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" +checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ "itoa", "memchr", @@ -5808,7 +5765,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -5834,15 +5791,16 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.18.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64", + "bs58", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.13.1", + "indexmap 2.14.0", "schemars 0.9.0", "schemars 1.2.1", "serde_core", @@ -5853,14 +5811,24 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.18.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", +] + +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", ] [[package]] @@ -5909,9 +5877,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.8" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "77fd7028345d415a4034cf8777cd4f8ab1851274233b45f84e3d955502d93874" dependencies = [ "digest 0.10.7", "keccak 0.1.6", @@ -5934,9 +5902,9 @@ checksum = "dc6fe69c597f9c37bfeeeeeb33da3530379845f10be461a66d16d03eca2ded77" [[package]] name = "shlex" -version = "1.3.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" [[package]] name = "signal-hook-registry" @@ -5965,7 +5933,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d567dcbaf0049cb8ac2608a76cd95ff9e4412e1899d389ee400918ca7537f5" dependencies = [ "digest 0.11.3", - "rand_core 0.10.0", + "rand_core 0.10.1", ] [[package]] @@ -5976,9 +5944,9 @@ checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214" [[package]] name = "similar" -version = "2.7.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" +checksum = "e6505efef05804732ed8a3f2d4f279429eb485bd69d5b0cc6b19cc02005cda16" dependencies = [ "bstr", "unicode-segmentation", @@ -5986,9 +5954,9 @@ dependencies = [ [[package]] name = "similar-asserts" -version = "1.7.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b441962c817e33508847a22bd82f03a30cff43642dc2fae8b050566121eb9a" +checksum = "997e6ca38e97437973fc9f7f50a50d1274cacd874341a4960fea90067291038c" dependencies = [ "console", "similar", @@ -6014,7 +5982,7 @@ dependencies = [ "divan", "fp-rounding", "proptest", - "rand 0.9.2", + "rand 0.9.4", "rayon", "seq-macro", "zerocopy", @@ -6037,18 +6005,18 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.15.1" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" dependencies = [ "serde", ] [[package]] name = "smawk" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +checksum = "e8e2fb0f499abb4d162f2bedad68f5ef91a1682b5a03596ddb67efd37768d100" [[package]] name = "smol_str" @@ -6085,20 +6053,14 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" +checksum = "52d1cfed4120b4d927bf7c0f86d2087a4a7d6027c906d9f9d525a80573b9be51" dependencies = [ "libc", "windows-sys 0.61.2", ] -[[package]] -name = "sorted-iter" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bceb57dc07c92cdae60f5b27b3fa92ecaaa42fe36c55e22dbfb0b44893e0b1f7" - [[package]] name = "spin" version = "0.9.8" @@ -6148,7 +6110,7 @@ dependencies = [ "digest 0.10.7", "keccak 0.1.6", "p3-koala-bear", - "rand 0.8.5", + "rand 0.8.6", "sha2 0.10.9", "sha3", "zeroize", @@ -6162,7 +6124,7 @@ dependencies = [ "blake3", "bytemuck", "keccak 0.1.6", - "rand 0.8.5", + "rand 0.8.6", "rayon", "spongefish", ] @@ -6205,21 +6167,20 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.24.1" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" [[package]] name = "strum_macros" -version = "0.24.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" dependencies = [ - "heck 0.4.1", + "heck 0.5.0", "proc-macro2", "quote", - "rustversion", - "syn 1.0.109", + "syn 2.0.118", ] [[package]] @@ -6228,6 +6189,12 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "symlink" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7973cce6668464ea31f176d85b13c7ab3bba2cb3b77a2ed26abd7801688010a" + [[package]] name = "syn" version = "1.0.109" @@ -6241,9 +6208,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.117" +version = "2.0.118" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" +checksum = "1b9ae57f904213ebb649ce6895b8a66c66f0203b9319718f69a5612a065b1422" dependencies = [ "proc-macro2", "quote", @@ -6267,7 +6234,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6276,7 +6243,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6304,7 +6271,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ "fastrand", - "getrandom 0.4.2", + "getrandom 0.4.3", "once_cell", "rustix 1.1.4", "windows-sys 0.61.2", @@ -6342,14 +6309,12 @@ dependencies = [ [[package]] name = "termion" -version = "3.0.0" +version = "4.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "417813675a504dfbbf21bfde32c03e5bf9f2413999962b479023c02848c1c7a5" +checksum = "f44138a9ae08f0f502f24104d82517ef4da7330c35acd638f1f29d3cd5475ecb" dependencies = [ "libc", - "libredox 0.0.2", "numtoa", - "redox_termios", ] [[package]] @@ -6370,7 +6335,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6381,7 +6346,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "test-case-core", ] @@ -6393,7 +6358,7 @@ checksum = "b7b3e525a49ec206798b40326a44121291b530c963cfb01018f63e135bac543d" dependencies = [ "smawk", "unicode-linebreak", - "unicode-width", + "unicode-width 0.1.14", ] [[package]] @@ -6422,7 +6387,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6433,7 +6398,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6467,12 +6432,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "85c17d80feb7334b40c484e45ed1a5273dfd8bfda537c3be2e74a06a6686f327" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -6482,15 +6446,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "dcef1a61bdb119096e153208ec5cbec23944ce8bca13be5c7f60c634f7403935" dependencies = [ "num-conv", "time-core", @@ -6506,15 +6470,30 @@ dependencies = [ "zerovec", ] +[[package]] +name = "tinyvec" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + [[package]] name = "tokio" -version = "1.51.0" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bd1c4c0fc4a7ab90fc15ef6daaa3ec3b893f004f915f2392557ed23237820cd" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", - "mio 1.2.0", + "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", @@ -6531,7 +6510,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6568,18 +6547,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "toml_edit 0.19.15", -] - [[package]] name = "toml" version = "0.8.23" @@ -6610,26 +6577,13 @@ dependencies = [ "serde_core", ] -[[package]] -name = "toml_edit" -version = "0.19.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" -dependencies = [ - "indexmap 2.13.1", - "serde", - "serde_spanned", - "toml_datetime 0.6.11", - "winnow 0.5.40", -] - [[package]] name = "toml_edit" version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.13.1", + "indexmap 2.14.0", "serde", "serde_spanned", "toml_datetime 0.6.11", @@ -6639,14 +6593,14 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.10+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82418ca169e235e6c399a84e395ab6debeb3bc90edc959bf0f48647c6a32d1b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ - "indexmap 2.13.1", + "indexmap 2.14.0", "toml_datetime 1.1.1+spec-1.1.0", "toml_parser", - "winnow 1.0.1", + "winnow 1.0.3", ] [[package]] @@ -6655,7 +6609,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.3", ] [[package]] @@ -6682,22 +6636,22 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "4cfcf7e2740e6fc6d4d688b4ef00650406bb94adf4731e43c096c3a19fe40840" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.0", "bytes", "futures-util", "http", "http-body", - "iri-string", "pin-project-lite", "tokio", "tower", "tower-layer", "tower-service", "tracing", + "url", ] [[package]] @@ -6726,11 +6680,12 @@ dependencies = [ [[package]] name = "tracing-appender" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786d480bce6247ab75f005b14ae1624ad978d3029d9113f0a22fa1ac773faeaf" +checksum = "050686193eb999b4bb3bc2acfa891a13da00f79734704c4b8b4ef1a10b368a3c" dependencies = [ "crossbeam-channel", + "symlink", "thiserror 2.0.18", "time", "tracing-subscriber", @@ -6744,7 +6699,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -6874,15 +6829,15 @@ checksum = "9ea3136b675547379c4bd395ca6b938e5ad3c3d20fad76e7fe85f9e0d011419c" [[package]] name = "typenum" -version = "1.20.0" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" [[package]] name = "typewit" -version = "1.15.0" +version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06fee3a8df48c50c55ad646a4e03b00a370da6fe1850ebf467a8d0165dfcafae" +checksum = "214ca0b2191785cbc06209b9ca1861e048e39b5ba33574b3cedd58363d5bb5f6" dependencies = [ "typewit_proc_macros", ] @@ -6949,9 +6904,9 @@ checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-width" @@ -6959,6 +6914,12 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + [[package]] name = "unicode-xid" version = "0.2.6" @@ -6998,11 +6959,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.0" +version = "1.23.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "144d6b123cef80b301b8f72a9e2ca4370ddec21950d0a103dd22c437006d2db7" dependencies = [ - "getrandom 0.4.2", + "getrandom 0.4.3", ] [[package]] @@ -7017,24 +6978,9 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vec-collections" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9965c8f2ffed1dbcd16cafe18a009642f540fa22661c6cfd6309ddb02e4982" -dependencies = [ - "binary-merge", - "inplace-vec-builder", - "lazy_static", - "num-traits", - "serde", - "smallvec", - "sorted-iter", -] - [[package]] name = "verifier-server" -version = "0.1.0" +version = "1.0.0" dependencies = [ "anyhow", "axum", @@ -7105,27 +7051,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" dependencies = [ "cfg-if", "once_cell", @@ -7133,29 +7070,17 @@ dependencies = [ "serde", "serde_json", "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" -dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "8a89f4650b770e4521aa6573724e2aed4704372151bd0de9d16a3bbabb87441a" dependencies = [ "cfg-if", + "futures-util", "js-sys", "once_cell", "wasm-bindgen", @@ -7164,9 +7089,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -7174,14 +7099,14 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", - "wasm-bindgen-backend", + "syn 2.0.118", "wasm-bindgen-shared", ] @@ -7199,35 +7124,13 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" dependencies = [ "unicode-ident", ] -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.13.1", - "wasm-encoder", - "wasmparser", -] - [[package]] name = "wasm_sync" version = "0.1.2" @@ -7239,23 +7142,11 @@ dependencies = [ "web-sys", ] -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags 2.11.0", - "hashbrown 0.15.5", - "indexmap 2.13.1", - "semver 1.0.27", -] - [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" dependencies = [ "js-sys", "wasm-bindgen", @@ -7267,14 +7158,14 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75c7f0ef91146ebfb530314f5f1d24528d7f0767efbfd31dce919275413e393e" dependencies = [ - "webpki-root-certs 1.0.6", + "webpki-root-certs 1.0.8", ] [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "0d46a5a140e6f7afeccd8eae97eff335163939eac8b929834875168b29b3d267" dependencies = [ "rustls-pki-types", ] @@ -7360,7 +7251,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -7371,7 +7262,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -7706,15 +7597,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" -[[package]] -name = "winnow" -version = "0.5.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" -dependencies = [ - "memchr", -] - [[package]] name = "winnow" version = "0.7.15" @@ -7726,99 +7608,28 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] [[package]] name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -dependencies = [ - "wit-bindgen-rust-macro", -] - -[[package]] -name = "wit-bindgen-core" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc" -dependencies = [ - "anyhow", - "heck 0.5.0", - "wit-parser", -] - -[[package]] -name = "wit-bindgen-rust" -version = "0.51.0" +version = "0.57.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" -dependencies = [ - "anyhow", - "heck 0.5.0", - "indexmap 2.13.1", - "prettyplease", - "syn 2.0.117", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", -] +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" [[package]] -name = "wit-bindgen-rust-macro" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a" -dependencies = [ - "anyhow", - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", - "wit-bindgen-core", - "wit-bindgen-rust", -] - -[[package]] -name = "wit-component" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" -dependencies = [ - "anyhow", - "bitflags 2.11.0", - "indexmap 2.13.1", - "log", - "serde", - "serde_derive", - "serde_json", - "wasm-encoder", - "wasm-metadata", - "wasmparser", - "wit-parser", -] - -[[package]] -name = "wit-parser" -version = "0.244.0" +name = "wnaf" +version = "0.14.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" +checksum = "f86421f2a70c9e6cab8d84c99fb62d8761d355bd1285443a7e7ccad15aa515f2" dependencies = [ - "anyhow", - "id-arena", - "indexmap 2.13.1", - "log", - "semver 1.0.27", - "serde", - "serde_derive", - "serde_json", - "unicode-xid", - "wasmparser", + "ff", + "group", + "hybrid-array", ] [[package]] @@ -7864,9 +7675,9 @@ dependencies = [ [[package]] name = "yoke" -version = "0.8.2" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" dependencies = [ "stable_deref_trait", "yoke-derive", @@ -7881,35 +7692,35 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eed437bf9d6692032087e337407a86f04cd8d6a16a37199ed57949d415bd68e9" +checksum = "ce1022995ff5ff5d841ad7d994facc23098cd40152f2c1d11cd607c6f530653f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.48" +version = "0.8.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" +checksum = "1ae7f38b72ec2a254e2b87ef277cf2cd4fb97cbebf944faa6f33354da0867930" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] name = "zerofrom" -version = "0.1.7" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69faa1f2a1ea75661980b013019ed6687ed0e83d069bc1114e2cc74c6c04c4df" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" dependencies = [ "zerofrom-derive", ] @@ -7922,28 +7733,28 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" dependencies = [ "zeroize_derive", ] [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] @@ -7976,7 +7787,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn 2.0.118", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index dc6ce9676..690011319 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -153,10 +153,7 @@ tracing-tracy = "=0.11.4" tracy-client = "=0.18.0" tracy-client-sys = "=0.24.3" parking_lot = "0.12" -# Version-anchored: acvm_blackbox_solver (noir beta.19) requires keccak = "0.2.0-rc.0" -# and calls keccak::f1600(), which was removed in keccak 0.2.0 stable. Pinning to -# the RC prevents `cargo update` from bumping acvm_blackbox_solver's keccak to stable. -keccak = "=0.2.0-rc.2" +keccak = "0.2.0" xz2 = "0.1.7" zerocopy = "0.8.25" zeroize = "1.8.1" @@ -176,15 +173,15 @@ getrandom03 = { package = "getrandom", version = "0.3", features = ["wasm_js"] } getrandom04 = { package = "getrandom", version = "0.4", features = ["wasm_js"] } # Noir language dependencies -acir = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -bn254_blackbox_solver = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -nargo = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -nargo_cli = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -nargo_toml = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -noir_artifact_cli = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -noirc_abi = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -noirc_artifacts = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } -noirc_driver = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.19" } +acir = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +bn254_blackbox_solver = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +nargo = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +nargo_cli = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +nargo_toml = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +noir_artifact_cli = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +noirc_abi = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +noirc_artifacts = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } +noirc_driver = { git = "https://github.com/noir-lang/noir", rev = "v1.0.0-beta.20" } # Cryptography and proof systems ark-bn254 = { version = "0.5.0", default-features = false, features = [ @@ -195,8 +192,8 @@ ark-ff = { version = "0.5", features = ["asm", "std"] } ark-poly = "0.5" ark-serialize = "0.5" ark-std = { version = "0.5", features = ["std"] } -mavros-vm = { git = "https://github.com/reilabs/mavros", rev = "7550b42e03d35b44781ff37f15b50773eb2a6fa0" } -mavros-artifacts = { git = "https://github.com/reilabs/mavros", rev = "7550b42e03d35b44781ff37f15b50773eb2a6fa0" } +mavros-vm = { git = "https://github.com/reilabs/mavros", rev = "e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6" } +mavros-artifacts = { git = "https://github.com/reilabs/mavros", rev = "e6a48ea5bff8b4c1b8b78beb765dbe96176f51d6" } spongefish = { git = "https://github.com/arkworks-rs/spongefish", features = [ "ark-ff", "sha2", diff --git a/noir-examples/babyjubjub/Nargo.toml b/noir-examples/babyjubjub/Nargo.toml index c4e410957..6b8273fbf 100644 --- a/noir-examples/babyjubjub/Nargo.toml +++ b/noir-examples/babyjubjub/Nargo.toml @@ -4,4 +4,4 @@ type = "lib" authors = [""] [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/babyjubjub/src/check_sub_group.nr b/noir-examples/babyjubjub/src/check_sub_group.nr index 34de5146f..e598aae26 100644 --- a/noir-examples/babyjubjub/src/check_sub_group.nr +++ b/noir-examples/babyjubjub/src/check_sub_group.nr @@ -1,15 +1,13 @@ use super::{BabyJubJubPoint, montgomery::MontgomeryPoint}; fn bit_element_mul_fix_scalar( - bit: u1, + bit: bool, dbl_in: MontgomeryPoint, add_in: MontgomeryPoint, ) -> (MontgomeryPoint, MontgomeryPoint) { - assert((bit == 0) | (bit == 1), "Bit must be 0 or 1 in fixed-scalar step"); - let dbl_out = dbl_in.double(); - let add_out = if bit == 1 { + let add_out = if bit { dbl_out.add(add_in) } else { add_in @@ -19,7 +17,7 @@ fn bit_element_mul_fix_scalar( } fn segment_mul_fix_scalar( - bits: [u1; N], + bits: [bool; N], base: BabyJubJubPoint, ) -> (BabyJubJubPoint, MontgomeryPoint) { assert(N >= 2, "Segment size must be >= 2 bits"); @@ -49,13 +47,13 @@ fn segment_mul_fix_scalar( (result, dbl_out_montgomery) } -pub fn esc_mul_fix_scalar(bits: [u1; 251], base: BabyJubJubPoint) -> BabyJubJubPoint { - let mut bits1: [u1; 148] = [0; 148]; +pub fn esc_mul_fix_scalar(bits: [bool; 251], base: BabyJubJubPoint) -> BabyJubJubPoint { + let mut bits1: [bool; 148] = [false; 148]; for i in 0..148 { bits1[i] = bits[i]; } - let mut bits2: [u1; 103] = [0; 103]; + let mut bits2: [bool; 103] = [false; 103]; for i in 0..103 { bits2[i] = bits[148 + i]; } diff --git a/noir-examples/babyjubjub/src/escalar_mul_fix.nr b/noir-examples/babyjubjub/src/escalar_mul_fix.nr index a986360dd..09ccbdf02 100644 --- a/noir-examples/babyjubjub/src/escalar_mul_fix.nr +++ b/noir-examples/babyjubjub/src/escalar_mul_fix.nr @@ -11,7 +11,7 @@ use std::static_assert; // Function to perform fixed-base scalar multiplication on a segment of bits, // This needs the bits + the initial generator table, generated by generator_window_table() for G or generate_window_table(current_base) fn segment_mul_fix_generator( - bits: [u1; N], + bits: [bool; N], generator_table: [MontgomeryPoint; 8], ) -> (BabyJubJubPoint, MontgomeryPoint) { // Ensure segment size is within valid range @@ -57,11 +57,11 @@ fn segment_mul_fix_generator( }; // Extract 3 bits for this window - let bit0 = if (3 * i) < N { bits[3 * i] } else { 0 }; - let bit1 = if (3 * i + 1) < N { bits[3 * i + 1] } else { 0 }; - let bit2 = if (3 * i + 2) < N { bits[3 * i + 2] } else { 0 }; + let bit0 = if (3 * i) < N { bits[3 * i] } else { false }; + let bit1 = if (3 * i + 1) < N { bits[3 * i + 1] } else { false }; + let bit2 = if (3 * i + 2) < N { bits[3 * i + 2] } else { false }; - let window_bits: [u1; 3] = [bit0, bit1, bit2]; + let window_bits: [bool; 3] = [bit0, bit1, bit2]; let selected = select_from_window(window_bits, table); window_outputs[i] = selected; @@ -102,13 +102,13 @@ fn segment_mul_fix_generator( // hard precondition: scalar < 2^251 // Returns: BabyJubJubPoint = scalar * G pub fn generator_mul_fix(scalar: Field) -> BabyJubJubPoint { - let bits: [u1; 251] = scalar.to_le_bits(); + let bits: [bool; 251] = scalar.to_le_bits(); // split bits into two segments to protect against overflows in the field - let mut bits_0: [u1; 126] = [0; 126]; + let mut bits_0: [bool; 126] = [false; 126]; for i in 0..126 { bits_0[i] = bits[i]; } - let mut bits_1: [u1; 125] = [0; 125]; + let mut bits_1: [bool; 125] = [false; 125]; for i in 0..125 { bits_1[i] = bits[i + 126]; } @@ -126,7 +126,7 @@ pub fn generator_mul_fix(scalar: Field) -> BabyJubJubPoint { #[test] fn test_segment_mul_fix_small() { let g = BabyJubJubPoint::generator(); - let bits: [u1; 3] = [1, 0, 1]; + let bits: [bool; 3] = [true, false, true]; let generator_window_table = generator_window_table(); let (result, _) = segment_mul_fix_generator(bits, generator_window_table); @@ -139,7 +139,7 @@ fn test_segment_mul_fix_small() { #[test] fn test_segment_mul_fix_medium() { let g = BabyJubJubPoint::generator(); - let bits: [u1; 9] = [1, 0, 1, 1, 0, 0, 0, 1, 1]; // 397 in LE + let bits: [bool; 9] = [true, false, true, true, false, false, false, true, true]; // 397 in LE let generator_window_table = generator_window_table(); let (result, _) = segment_mul_fix_generator(bits, generator_window_table); @@ -216,7 +216,7 @@ fn test_optimized_generator_mul_fix() { #[test] fn test_segment_mul_fix_generator() { - let bits: [u1; 9] = [1, 0, 1, 1, 0, 0, 0, 1, 1]; // 397 in LE + let bits: [bool; 9] = [true, false, true, true, false, false, false, true, true]; // 397 in LE let generator_window_table = generator_window_table(); let (result_opt, _) = segment_mul_fix_generator(bits, generator_window_table); diff --git a/noir-examples/babyjubjub/src/hash_to_curve.nr b/noir-examples/babyjubjub/src/hash_to_curve.nr index c5be86f50..88315ef42 100644 --- a/noir-examples/babyjubjub/src/hash_to_curve.nr +++ b/noir-examples/babyjubjub/src/hash_to_curve.nr @@ -3,9 +3,9 @@ // https://www.rfc-editor.org/rfc/rfc9380.html use super::BabyJubJubPoint; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; -comptime global Z: Field = 5; +global Z: Field = 5; global C1: u32 = 28; global C3: Field = 40770029410420498293352137776570907027550720424234931066070132305055; global C5: Field = 19103219067921713944291392827692070036145651957329286315305642004821462161904; @@ -13,7 +13,7 @@ global C5: Field = 1910321906792171394429139282769207003614565195732928631530564 fn hash_to_field(input: Field) -> Field { // element 0 is the DS string "OPRF_HashToField_BabyJubJub" let hash_input = [32627786498498119128812045057993354633158048678109587794777765218, input, 0]; - let hash_result = perm::x5_3(hash_input); + let hash_result = permutation::t3(hash_input); hash_result[1] } @@ -50,7 +50,7 @@ fn inverse_or_zero(x: Field) -> Field { fn pow(x: Field, y: Field) -> Field { let mut r = 1 as Field; - let b: [u1; 254] = y.to_le_bits(); + let b: [bool; 254] = y.to_le_bits(); for i in 0..254 { r *= r; @@ -132,7 +132,7 @@ fn is_quadratic_residue_or_zero(x: Field) -> bool { } fn sgn0(x: Field) -> bool { - x.sgn0() == 1 + x.sgn0() } // Map to Montgomery curve using Elligator2 diff --git a/noir-examples/babyjubjub/src/lib.nr b/noir-examples/babyjubjub/src/lib.nr index bcb4daed2..efa09eb81 100644 --- a/noir-examples/babyjubjub/src/lib.nr +++ b/noir-examples/babyjubjub/src/lib.nr @@ -32,15 +32,15 @@ global BABYJUBJUB_Fr: Field = // Bit-decomposition of the BabyJubJub subgroup order (scalar field Fr), little-endian. // NOTE: Named CHARACTERISTIC for upstream compatibility, but this is the group order (Fr), // NOT the field characteristic (prime p of the base field). -global BABYJUBJUB_CHARACTERISTIC: [u1; 251] = [ - 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, - 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, - 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 1, - 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, - 0, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, - 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, - 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, +global BABYJUBJUB_CHARACTERISTIC: [bool; 251] = [ + true, false, false, false, true, true, true, true, false, true, true, false, false, true, false, false, true, false, false, false, false, true, false, false, true, false, false, true, true, true, false, false, + false, false, true, true, true, false, true, true, true, true, true, false, true, false, false, true, false, true, false, false, true, true, true, false, true, true, true, false, false, true, true, false, + false, true, false, true, false, false, false, false, false, true, true, true, false, true, true, true, false, false, false, false, false, true, false, false, true, false, false, true, true, true, false, false, + false, false, false, true, true, true, false, true, true, false, true, true, false, true, true, true, false, true, true, true, true, true, false, false, true, true, false, true, false, true, false, true, + true, true, false, true, false, false, false, false, true, true, false, true, false, true, false, false, false, false, false, false, true, true, false, false, false, false, false, false, true, false, true, true, + false, true, true, false, true, true, false, true, false, false, false, true, false, false, false, false, false, true, false, true, false, false, false, false, true, true, true, false, true, true, false, false, + true, false, true, false, false, false, false, false, false, false, true, false, true, true, false, false, false, true, true, false, false, true, false, false, false, false, true, true, true, false, true, false, + false, true, true, true, false, false, true, true, true, false, false, true, false, false, false, true, false, false, true, true, false, false, false, false, false, true, true, ]; /// Represents a point on the BabyJubJub curve @@ -148,7 +148,7 @@ impl BabyJubJubPoint { BabyJubJubPoint::identity() } else { // Decompose scalar into 251 bits (BabyJubJub scalar field size) - let bits: [u1; 251] = scalar.to_le_bits(); + let bits: [bool; 251] = scalar.to_le_bits(); self.scalar_mul_bits(bits) } } @@ -164,7 +164,7 @@ impl BabyJubJubPoint { /// For Variable-base: use double-and-add (~N doubles, ~N/2 adds). /// Window-w needs a per-point table (2^w) and a select each window /// so windowing is reserved for fixed-base (generator) where the table is precomputed. - pub fn scalar_mul_bits(self, bits: [u1; N]) -> Self { + pub fn scalar_mul_bits(self, bits: [bool; N]) -> Self { assert(self.is_on_curve(), "Point must be on curve"); let mut result = BabyJubJubPoint::identity(); @@ -172,7 +172,7 @@ impl BabyJubJubPoint { for i in 0..N { result = result.double(); - if bits[N - 1 - i] == 1 { + if bits[N - 1 - i] { result = result.add(self); } } @@ -187,7 +187,7 @@ impl BabyJubJubPoint { BabyJubJubPoint::identity() } else { // Decompose to 254 bits - let bits: [u1; 254] = scalar_fq.to_le_bits(); + let bits: [bool; 254] = scalar_fq.to_le_bits(); self.scalar_mul_bits(bits) } @@ -198,23 +198,23 @@ impl BabyJubJubPoint { bn254::assert_lt(field_element, BABYJUBJUB_Fr); } - pub fn validate_scalar_field_with_bits(field_element: Field) -> [u1; 251] { + pub fn validate_scalar_field_with_bits(field_element: Field) -> [bool; 251] { BabyJubJubPoint::validate_babyjubjub_field(field_element); - let bits: [u1; 251] = field_element.to_le_bits(); + let bits: [bool; 251] = field_element.to_le_bits(); bits } // Precondition: This method expects that the point is on-curve. pub fn check_sub_group(self) -> bool { static_assert( - BABYJUBJUB_CHARACTERISTIC[250] == 1, + BABYJUBJUB_CHARACTERISTIC[250], "Characteristic has high bit set", ); let mut p = self; for i in 0..250 { p = p.double(); - if BABYJUBJUB_CHARACTERISTIC[249 - i] == 1 { + if BABYJUBJUB_CHARACTERISTIC[249 - i] { p = p.add(self); } } diff --git a/noir-examples/babyjubjub/src/montgomery.nr b/noir-examples/babyjubjub/src/montgomery.nr index a924e9c08..f30f3ab75 100644 --- a/noir-examples/babyjubjub/src/montgomery.nr +++ b/noir-examples/babyjubjub/src/montgomery.nr @@ -37,7 +37,7 @@ impl BabyJubJubPoint { [x, y] = [ ---, ------- ] v u + 1 */ - unconstrained fn from_montgomery_unconstrained(p: MontgomeryPoint) -> (Field, Field) { + pub unconstrained fn from_montgomery_unconstrained(p: MontgomeryPoint) -> (Field, Field) { let x = p.u / p.v; let y = (p.u - 1) / (p.u + 1); (x, y) diff --git a/noir-examples/babyjubjub/src/window_table.nr b/noir-examples/babyjubjub/src/window_table.nr index c37724445..af3f3efb9 100644 --- a/noir-examples/babyjubjub/src/window_table.nr +++ b/noir-examples/babyjubjub/src/window_table.nr @@ -69,7 +69,7 @@ pub fn generate_window_table(base: MontgomeryPoint) -> [MontgomeryPoint; 8] { table } -pub fn select_from_window(bits: [u1; 3], table: [MontgomeryPoint; 8]) -> MontgomeryPoint { +pub fn select_from_window(bits: [bool; 3], table: [MontgomeryPoint; 8]) -> MontgomeryPoint { let b0 = bits[0] as Field; let b1 = bits[1] as Field; let b2 = bits[2] as Field; @@ -101,7 +101,7 @@ fn test_window_selection() { let g = crate::BabyJubJubPoint::generator(); let table = generate_window_table(g.to_montgomery()); - let bits: [u1; 3] = [1, 0, 1]; + let bits: [bool; 3] = [true, false, true]; let selected = select_from_window(bits, table); assert(selected.u == table[5].u, "Window selection u mismatch for bits [1,0,1] -> 6B"); // 6B is at index 5 @@ -109,7 +109,7 @@ fn test_window_selection() { // Test window = 0 (bits = [0, 0, 0]) // Window value 0 should return table[0] = 1B (compensation: 0 -> 1B) - let zero_bits: [u1; 3] = [0, 0, 0]; + let zero_bits: [bool; 3] = [false, false, false]; let selected_zero = select_from_window(zero_bits, table); assert(selected_zero.u == table[0].u, "Window selection u mismatch for bits [0,0,0] -> 1B"); // 1B is at index 0 diff --git a/noir-examples/basic/Nargo.toml b/noir-examples/basic/Nargo.toml index 0ee2932ff..b1628db00 100644 --- a/noir-examples/basic/Nargo.toml +++ b/noir-examples/basic/Nargo.toml @@ -5,4 +5,4 @@ authors = [""] compiler_version = ">=0.22.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/basic/src/main.nr b/noir-examples/basic/src/main.nr index 8afc3e9da..eb3f95be6 100644 --- a/noir-examples/basic/src/main.nr +++ b/noir-examples/basic/src/main.nr @@ -1,7 +1,5 @@ -use dep::poseidon2; - fn main(plains: [Field; 2], result: Field) { - let hash = poseidon2::bn254::hash_2(plains); + let hash = poseidon2::bn254::permutation::t2(plains)[0]; print(hash); assert(hash == result); } diff --git a/noir-examples/csp-benchmarks/ecdsa_p256/Nargo.toml b/noir-examples/csp-benchmarks/ecdsa_p256/Nargo.toml index 43e892a2e..2d45e8a48 100644 --- a/noir-examples/csp-benchmarks/ecdsa_p256/Nargo.toml +++ b/noir-examples/csp-benchmarks/ecdsa_p256/Nargo.toml @@ -4,6 +4,6 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -bignum = { tag = "v0.9.2-1", git = "https://github.com/zkpassport/noir-bignum" } -bigcurve = { tag = "v0.13.2-1", git = "https://github.com/zkpassport/noir_bigcurve" } -noir_ecdsa = { tag = "v0.3.0", git = "https://github.com/zkpassport/noir-ecdsa" } +bignum = { tag = "v0.10.0-1", git = "https://github.com/zkpassport/noir-bignum" } +bigcurve = { tag = "v0.14.0-1", git = "https://github.com/zkpassport/noir_bigcurve" } +noir_ecdsa = { tag = "v0.4.1", git = "https://github.com/zkpassport/noir-ecdsa" } diff --git a/noir-examples/csp-benchmarks/poseidon2_12/Nargo.toml b/noir-examples/csp-benchmarks/poseidon2_12/Nargo.toml index 2a366e880..7f836374e 100644 --- a/noir-examples/csp-benchmarks/poseidon2_12/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon2_12/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/csp-benchmarks/poseidon2_12/src/main.nr b/noir-examples/csp-benchmarks/poseidon2_12/src/main.nr index ff1f4fb42..89cf4628c 100644 --- a/noir-examples/csp-benchmarks/poseidon2_12/src/main.nr +++ b/noir-examples/csp-benchmarks/poseidon2_12/src/main.nr @@ -1,5 +1,5 @@ -use poseidon2::bn254::hash_12; +use poseidon2::bn254::permutation::t12; fn main(inputs: [Field; 12]) -> pub Field { - hash_12(inputs) + t12(inputs)[0] } diff --git a/noir-examples/csp-benchmarks/poseidon2_16/Nargo.toml b/noir-examples/csp-benchmarks/poseidon2_16/Nargo.toml index ea96fde17..5fc4ee6f5 100644 --- a/noir-examples/csp-benchmarks/poseidon2_16/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon2_16/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/csp-benchmarks/poseidon2_16/src/main.nr b/noir-examples/csp-benchmarks/poseidon2_16/src/main.nr index 2471cdaf1..affa6b4b4 100644 --- a/noir-examples/csp-benchmarks/poseidon2_16/src/main.nr +++ b/noir-examples/csp-benchmarks/poseidon2_16/src/main.nr @@ -1,5 +1,5 @@ -use poseidon2::bn254::hash_16; +use poseidon2::bn254::permutation::t16; fn main(inputs: [Field; 16]) -> pub Field { - hash_16(inputs) + t16(inputs)[0] } diff --git a/noir-examples/csp-benchmarks/poseidon2_2/Nargo.toml b/noir-examples/csp-benchmarks/poseidon2_2/Nargo.toml index b0a505236..81e9479d1 100644 --- a/noir-examples/csp-benchmarks/poseidon2_2/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon2_2/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/csp-benchmarks/poseidon2_2/src/main.nr b/noir-examples/csp-benchmarks/poseidon2_2/src/main.nr index 7f449f350..34a916d3d 100644 --- a/noir-examples/csp-benchmarks/poseidon2_2/src/main.nr +++ b/noir-examples/csp-benchmarks/poseidon2_2/src/main.nr @@ -1,5 +1,5 @@ -use poseidon2::bn254::hash_2; +use poseidon2::bn254::permutation::t2; fn main(inputs: [Field; 2]) -> pub Field { - hash_2(inputs) + t2(inputs)[0] } diff --git a/noir-examples/csp-benchmarks/poseidon2_4/Nargo.toml b/noir-examples/csp-benchmarks/poseidon2_4/Nargo.toml index 637a4cd0f..59c3d336d 100644 --- a/noir-examples/csp-benchmarks/poseidon2_4/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon2_4/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/csp-benchmarks/poseidon2_8/Nargo.toml b/noir-examples/csp-benchmarks/poseidon2_8/Nargo.toml index aebf2e725..88593f466 100644 --- a/noir-examples/csp-benchmarks/poseidon2_8/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon2_8/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } diff --git a/noir-examples/csp-benchmarks/poseidon2_8/src/main.nr b/noir-examples/csp-benchmarks/poseidon2_8/src/main.nr index d3435ac04..a070cfc83 100644 --- a/noir-examples/csp-benchmarks/poseidon2_8/src/main.nr +++ b/noir-examples/csp-benchmarks/poseidon2_8/src/main.nr @@ -1,5 +1,5 @@ -use poseidon2::bn254::hash_8; +use poseidon2::bn254::permutation::t8; fn main(inputs: [Field; 8]) -> pub Field { - hash_8(inputs) + t8(inputs)[0] } diff --git a/noir-examples/csp-benchmarks/poseidon_12/Nargo.toml b/noir-examples/csp-benchmarks/poseidon_12/Nargo.toml index 7f2a678f8..b4aa67652 100644 --- a/noir-examples/csp-benchmarks/poseidon_12/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon_12/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/csp-benchmarks/poseidon_16/Nargo.toml b/noir-examples/csp-benchmarks/poseidon_16/Nargo.toml index 0ca558993..20ea09aba 100644 --- a/noir-examples/csp-benchmarks/poseidon_16/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon_16/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/csp-benchmarks/poseidon_2/Nargo.toml b/noir-examples/csp-benchmarks/poseidon_2/Nargo.toml index 45265a650..f42482260 100644 --- a/noir-examples/csp-benchmarks/poseidon_2/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon_2/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/csp-benchmarks/poseidon_4/Nargo.toml b/noir-examples/csp-benchmarks/poseidon_4/Nargo.toml index b7e40221c..e443efcb4 100644 --- a/noir-examples/csp-benchmarks/poseidon_4/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon_4/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/csp-benchmarks/poseidon_8/Nargo.toml b/noir-examples/csp-benchmarks/poseidon_8/Nargo.toml index eab2cec06..96177a107 100644 --- a/noir-examples/csp-benchmarks/poseidon_8/Nargo.toml +++ b/noir-examples/csp-benchmarks/poseidon_8/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon = { tag = "v0.2.6", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/eddsa_poseidon2/Nargo.toml b/noir-examples/eddsa_poseidon2/Nargo.toml index e6f518466..3a7ca31b0 100644 --- a/noir-examples/eddsa_poseidon2/Nargo.toml +++ b/noir-examples/eddsa_poseidon2/Nargo.toml @@ -4,5 +4,5 @@ type = "lib" authors = [""] [dependencies] -poseidon2 = { tag="v0.5.0-beta.0" , git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag="v0.6.1" , git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } babyjubjub = {path = "../babyjubjub"} diff --git a/noir-examples/eddsa_poseidon2/src/lib.nr b/noir-examples/eddsa_poseidon2/src/lib.nr index a767eaac8..1dfb687e5 100644 --- a/noir-examples/eddsa_poseidon2/src/lib.nr +++ b/noir-examples/eddsa_poseidon2/src/lib.nr @@ -2,7 +2,7 @@ // Complete implementation of EdDSA signature verification using Poseidon2 hash use babyjubjub::BabyJubJubPoint; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; mod tests; // Domain separator for EdDSA signatures: b"EdDSA Signature" @@ -44,7 +44,7 @@ pub fn verify_eddsa_poseidon2( assert(r_point.is_on_curve(), "R must be on curve"); // Step 4 - Compute h = Poseidon2(domain_separator, Rx, Ry, Ax, Ay, M, 0, 0) - let hash_state = perm::x5_8([ + let hash_state = permutation::t8([ DOMAIN_SEPARATOR, signature_r[0], signature_r[1], diff --git a/noir-examples/embedded_curve_msm/src/main.nr b/noir-examples/embedded_curve_msm/src/main.nr index 19a193181..d019c7562 100644 --- a/noir-examples/embedded_curve_msm/src/main.nr +++ b/noir-examples/embedded_curve_msm/src/main.nr @@ -16,7 +16,6 @@ fn main( let g = EmbeddedCurvePoint { x: 1, y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, }; let s1 = EmbeddedCurveScalar { lo: scalar1_lo, hi: scalar1_hi }; @@ -27,7 +26,7 @@ fn main( // Prevent dead-code elimination - forces the blackbox to be retained // Using is_infinite as return value ensures the MSM is computed - assert(result.is_infinite == (scalar1_lo + scalar1_hi + scalar2_lo + scalar2_hi == 0)); + assert(result.is_infinite() == (scalar1_lo + scalar1_hi + scalar2_lo + scalar2_hi == 0)); } #[test] @@ -42,7 +41,6 @@ fn test_msm() { let g = EmbeddedCurvePoint { x: 1, y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, }; let s3 = EmbeddedCurveScalar { lo: 3, hi: 0 }; let check = multi_scalar_mul([g], [s3]); diff --git a/noir-examples/many_poseidons/Nargo.toml b/noir-examples/many_poseidons/Nargo.toml index cbfd474f6..afef88dd9 100644 --- a/noir-examples/many_poseidons/Nargo.toml +++ b/noir-examples/many_poseidons/Nargo.toml @@ -4,4 +4,4 @@ type = "bin" authors = [""] [dependencies] -poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" } +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/msm_conditional/src/main.nr b/noir-examples/msm_conditional/src/main.nr index 5092f3e16..35d09a220 100644 --- a/noir-examples/msm_conditional/src/main.nr +++ b/noir-examples/msm_conditional/src/main.nr @@ -4,7 +4,6 @@ use std::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_sca global GEN: EmbeddedCurvePoint = EmbeddedCurvePoint { x: 1, y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, }; /// Exercises MultiScalarMul with a Witness predicate. @@ -21,16 +20,16 @@ fn main(condition: bool, scalar_lo: Field, scalar_hi: Field, expected_x: Field, multi_scalar_mul([GEN], [scalar]) } else { // When predicate=0, ACVM assigns identity (0, 0, true) to result. - EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true } + EmbeddedCurvePoint::point_at_infinity() }; if condition { - assert(!result.is_infinite); + assert(!result.is_infinite()); assert_eq(result.x, expected_x); assert_eq(result.y, expected_y); } else { assert(result.x == 0); assert(result.y == 0); - assert(result.is_infinite); + assert(result.is_infinite()); } } diff --git a/noir-examples/msm_conditional_nested/src/main.nr b/noir-examples/msm_conditional_nested/src/main.nr index 46dab261a..daf25450c 100644 --- a/noir-examples/msm_conditional_nested/src/main.nr +++ b/noir-examples/msm_conditional_nested/src/main.nr @@ -4,7 +4,6 @@ use std::embedded_curve_ops::{EmbeddedCurvePoint, EmbeddedCurveScalar, multi_sca global GEN: EmbeddedCurvePoint = EmbeddedCurvePoint { x: 1, y: 17631683881184975370165255887551781615748388533673675138860, - is_infinite: false, }; /// Exercises MSM with a compound predicate (outer AND inner). @@ -22,19 +21,19 @@ fn main(outer: bool, inner: bool, scalar_lo: Field, scalar_hi: Field, expected_x // predicate = outer * inner -- tests compound/nested predicate multi_scalar_mul([GEN], [s]) } else { - EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true } + EmbeddedCurvePoint::point_at_infinity() } } else { - EmbeddedCurvePoint { x: 0, y: 0, is_infinite: true } + EmbeddedCurvePoint::point_at_infinity() }; if outer & inner { - assert(!r.is_infinite); + assert(!r.is_infinite()); assert_eq(r.x, expected_x); assert_eq(r.y, expected_y); } else { assert(r.x == 0); assert(r.y == 0); - assert(r.is_infinite); + assert(r.is_infinite()); } } diff --git a/noir-examples/native_msm/src/main.nr b/noir-examples/native_msm/src/main.nr index 901722a4e..2e59ebb44 100644 --- a/noir-examples/native_msm/src/main.nr +++ b/noir-examples/native_msm/src/main.nr @@ -267,8 +267,8 @@ fn scalar_mul_wnaf(P: GPoint, scalar_lo: Field, scalar_hi: Field) -> GPointResul for i in 0..64 { r = r * 16; r += (slices[i] as Field) * 2 - 15; } r -= skew as Field; - let lo_bits: [u1; 128] = scalar_lo.to_le_bits(); - let hi_bits: [u1; 128] = scalar_hi.to_le_bits(); + let lo_bits: [bool; 128] = scalar_lo.to_le_bits(); + let hi_bits: [bool; 128] = scalar_hi.to_le_bits(); let mut expected: Field = 0; let mut pow: Field = 1; for i in 0..128 { expected += (lo_bits[i] as Field) * pow; pow *= 2; } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/Nargo.toml index 10df72565..4feca5e2a 100644 --- a/noir-examples/noir-passport-monolithic/complete_age_check/Nargo.toml +++ b/noir-examples/noir-passport-monolithic/complete_age_check/Nargo.toml @@ -4,6 +4,6 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -compare_age = { path = "../utils/compare/age" } -data_check_expiry = { path = "../utils/data-check/expiry" } -passport_validity_check = { path = "../utils/passport_validity_check" } +compare_age = { path = "vendor/utils/compare/age" } +data_check_expiry = { path = "vendor/utils/data-check/expiry" } +passport_validity_check = { path = "vendor/utils/passport_validity_check" } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/LICENSE b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/LICENSE new file mode 100644 index 000000000..7a4a3ea24 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/Nargo.toml new file mode 100644 index 000000000..1d8dbf4bd --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "compare_age_lib" +type = "lib" +authors = ["Theo Madzou", "Michael Elliot"] +compiler_version = ">=1.0.0" + +[dependencies] +date = { git = "https://github.com/madztheo/noir-date", tag = "v0.5.6" } +utils = { path = "../../utils" } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/src/lib.nr new file mode 100644 index 000000000..c0bc5a228 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/compare/age/src/lib.nr @@ -0,0 +1,72 @@ +use date::Date; +use utils::{ + get_array_slice, get_mrz_from_dg1, ID_CARD_MRZ_BIRTHDATE_INDEX, is_id_card, + PASSPORT_MRZ_BIRTHDATE_INDEX, +}; + +fn get_birthdate(dg1: [u8; 95], timestamp: u64) -> Date { + let mut birthdate_bytes = [0 as u8; 6]; + let mrz = get_mrz_from_dg1(dg1); + + // Get the slice of the MRZ representing the birthdate + if is_id_card(dg1) { + birthdate_bytes = get_array_slice( + mrz, + ID_CARD_MRZ_BIRTHDATE_INDEX, + ID_CARD_MRZ_BIRTHDATE_INDEX + 6, + ); + } else { + // Otherwise it's an ID card + birthdate_bytes = get_array_slice( + mrz, + PASSPORT_MRZ_BIRTHDATE_INDEX, + PASSPORT_MRZ_BIRTHDATE_INDEX + 6, + ); + } + + let current_date = Date::from_timestamp(timestamp); + + // Create a Date object from the birthdate using the current date as + // the pivot year to differentiate between 20th and 21st centuries + // as the format is "YYMMDD" + Date::from_bytes_short_year(birthdate_bytes, current_date) +} + +pub fn compare_age(dg1: [u8; 95], min_age: u8, max_age: u8, timestamp: u64) { + // Restrict the age to be less than 100 as the dg1 birthdate only encodes + // two digits for the year + // TODO: Add support for dg11 to support 100+ + assert((max_age < 100) & (min_age < 100), "Age must be less than 100"); + + let birthdate: Date = get_birthdate(dg1, timestamp); + + let current_date = Date::from_timestamp(timestamp); + + assert((min_age != 0) | (max_age != 0), "Either min or max age must be non-zero"); + + if (min_age != 0) & (max_age == 0) { + // Check if age is above min age + // The minimum age is more likely to be inclusive, so we use gte + assert( + current_date.gte(birthdate.add_years(min_age as u32)), + "Age is not above or equal to min age", + ); + } else if (max_age != 0) & (min_age == 0) { + // Check if age is below max age + // The maximum age is more likely to be exclusive, so we use lt + assert(current_date.lt(birthdate.add_years(max_age as u32)), "Age is not below max age"); + } else { + assert(min_age <= max_age, "Min age must be less than or equal to max age"); + + assert( + current_date.gte(birthdate.add_years(min_age as u32)), + "Age is not above or equal to min age", + ); + // This way if max_age = min_age, the proof will be valid whenever the age + // is equal to min_age = max_age + assert( + current_date.lt(birthdate.add_years((max_age + 1) as u32)), + "Age is not below max age", + ); + } +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/Nargo.toml new file mode 100644 index 000000000..0cc0ae28c --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/Nargo.toml @@ -0,0 +1,10 @@ +[package] +name = "data_check_expiry_lib" +type = "lib" +authors = ["Theo Madzou"] +compiler_version = ">=0.22.0" + +[dependencies] +date = { git = "https://github.com/madztheo/noir-date", tag = "v0.5.6" } +utils = { path = "../../utils" } +age = {path = "../../compare/age"} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/src/lib.nr new file mode 100644 index 000000000..48eab1617 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/expiry/src/lib.nr @@ -0,0 +1,36 @@ +use date::Date; +use utils::{ + get_array_slice, get_mrz_from_dg1, ID_CARD_MRZ_EXPIRY_DATE_INDEX, is_id_card, + PASSPORT_MRZ_EXPIRY_DATE_INDEX, +}; + +pub fn check_expiry(dg1: [u8; 95], current_date_timestamp: u64) { + let current_date = Date::from_timestamp(current_date_timestamp); + + let mrz = get_mrz_from_dg1(dg1); + + // We base the threshold year for the expiry date on the current date plus 30 years + // As most documents will have a 10 year validity (and some maybe 15 years?) + // So with 30 years we should be safe + let threshold_year = current_date.add_years(30); + + let mut expiry_date_bytes = [0 as u8; 6]; + + if is_id_card(dg1) { + expiry_date_bytes = get_array_slice( + mrz, + ID_CARD_MRZ_EXPIRY_DATE_INDEX, + ID_CARD_MRZ_EXPIRY_DATE_INDEX + 6, + ); + } else { + expiry_date_bytes = get_array_slice( + mrz, + PASSPORT_MRZ_EXPIRY_DATE_INDEX, + PASSPORT_MRZ_EXPIRY_DATE_INDEX + 6, + ); + } + + let expiry_date = Date::from_bytes_short_year(expiry_date_bytes, threshold_year); + + assert(current_date.lt(expiry_date), "Document is expired"); +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/Nargo.toml new file mode 100644 index 000000000..a0b4d4c7d --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/Nargo.toml @@ -0,0 +1,8 @@ +[package] +name = "data_check_integrity_lib" +type = "lib" +authors = ["Theo Madzou"] +compiler_version = ">=0.22.0" + +[dependencies] +utils = { path = "../../utils" } \ No newline at end of file diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/src/lib.nr new file mode 100644 index 000000000..90543f752 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/data-check/tbs-pubkey/src/lib.nr @@ -0,0 +1,17 @@ +pub fn verify_rsa_pubkey_in_tbs( + dsc_pubkey: [u8; DSC_KEY_SIZE], + tbs_certificate: [u8; TBS_CERT_SIZE], + pubkey_offset: u32, +) { + // Check that the public key of the DSC is the same as the one in the TBS certificate. + // And since the TBS certificate is the data signed by the private key of the CSCA certificate + // we can make sure the DSC, which signed the data of the passport, has been signed by the + // root certificate of the issuing State (i.e. CSCA certificate) by verifying the signature below + assert( + pubkey_offset + DSC_KEY_SIZE <= TBS_CERT_SIZE, + "pubkey_offset + DSC_KEY_SIZE exceeds TBS certificate size", + ); + for i in 0..DSC_KEY_SIZE { + assert(tbs_certificate[i + pubkey_offset] == dsc_pubkey[i]); + } +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/Nargo.toml new file mode 100644 index 000000000..67ecc4be4 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/Nargo.toml @@ -0,0 +1,10 @@ +[package] +name = "passport_validity_check" +type = "lib" +compiler_version = ">=1.0.0" + +[dependencies] +sig_check_rsa = { path = "../sig-check/rsa" } +utils = { path = "../utils" } +data_check_tbs_pubkey = { path = "../data-check/tbs-pubkey" } +sha256 = { tag = "v0.3.0", git = "https://github.com/noir-lang/sha256" } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/src/lib.nr new file mode 100644 index 000000000..4b1ee752e --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/passport_validity_check/src/lib.nr @@ -0,0 +1,161 @@ +// --- Needed to check the DSC signature over the signed data --- +use data_check_tbs_pubkey::verify_rsa_pubkey_in_tbs; + +// --- Needed to check the CSCA signature over the DSC pubkey --- +use sha256::sha256_var; +use sig_check_rsa::verify_signature; +use utils::check_zero_padding; + +// CONSTANTS +global SIGNED_ATTRIBUTES_MAX_SIZE: u32 = 200; +global DSC_CERT_MAX_SIZE: u32 = 1300; +global DSC_SIGNATURE_SIZE: u32 = 256; +global CSC_PUBKEY_SIZE: u32 = 512; + +/// Contains everything necessarily for checking the validity of a passport's +/// contents against its own SOD, SOD certificate, and DSC certificate against +/// an externally supplied CSC and an externally supplied DG{k} (e.g. DG1). +/// Holds all data needed to check SOD -> DSC -> CSC validity. +pub struct PassportValidityContents { + /// Signed Attributes block from SOD. + pub signed_attributes: [u8; SIGNED_ATTRIBUTES_MAX_SIZE], + /// Length of Signed Attributes. + pub signed_attributes_size: u32, + /// DSC signature over Signed Attributes. + pub dsc_signature: [u8; DSC_SIGNATURE_SIZE], + + /// DSC public exponent (usually 65537). + pub dsc_rsa_exponent: u32, + /// DSC public key modulus (2048-bit). + pub dsc_pubkey: [u8; DSC_SIGNATURE_SIZE], + /// Barrett reduction param for DSC. + pub dsc_barrett_mu: [u8; DSC_SIGNATURE_SIZE + 1], + + /// Offset of DSC pubkey inside DSC cert. + pub dsc_pubkey_offset_in_dsc_cert: u32, + /// Raw DSC certificate bytes. + pub dsc_cert: [u8; DSC_CERT_MAX_SIZE], + /// Length of DSC certificate. + pub dsc_cert_len: u32, + + /// CSC public key modulus (4096-bit). + pub csc_pubkey: [u8; CSC_PUBKEY_SIZE], + /// Barrett reduction param for CSC. + pub csc_barrett_mu: [u8; CSC_PUBKEY_SIZE + 1], + /// CSC signature over DSC cert. + pub dsc_cert_signature: [u8; CSC_PUBKEY_SIZE], + /// CSC public exponent. + pub csc_rsa_exponent: u32, + + /// eContent from SOD (hashes of DGs). + pub econtent: [u8; SIGNED_ATTRIBUTES_MAX_SIZE], + /// Length of eContent. + pub econtent_len: u32, + /// Offset of DG1 hash in eContent. + pub dg1_hash_offset: u32, + /// Offset of eContent hash in Signed Attributes. + pub econtent_hash_offset: u32, +} + +/// This function checks the following: +/// * H(SOD) is located correctly within the SOD certificate. +/// * The signature over the SOD certificate verifies against the DSC pubkey. +/// * The DSC pubkey is located correctly within the DSC certificate. +/// * The signature over the DSC certificate verifies against the CSC pubkey. +pub fn check_passport_validity(passport_validity_contents: PassportValidityContents) { + // Checks that H(SOD) is located correctly within the Signed Attributes certificate. + check_integrity_of_sod_within_sod_cert( + passport_validity_contents.signed_attributes, + passport_validity_contents.signed_attributes_size as u32, + passport_validity_contents.econtent, + passport_validity_contents.econtent_len, + passport_validity_contents.econtent_hash_offset, + ); + + // --- SOD certificate signature check --- + // The second thing asserts verify_sign(message=signed_attributes, sign=sod_signature, pubkey=dsc_pubkey) + assert(verify_signature::( + passport_validity_contents.dsc_pubkey, + passport_validity_contents.dsc_signature, + passport_validity_contents.dsc_barrett_mu, + passport_validity_contents.dsc_rsa_exponent, + passport_validity_contents.signed_attributes, + passport_validity_contents.signed_attributes_size, + 0, + )); + + // --- DSC certificate signature check --- + // The first thing checks that the appropriate substring of the `tbs_certificate` is equivalent to the `dsc_pubkey` + verify_rsa_pubkey_in_tbs( + passport_validity_contents.dsc_pubkey, + passport_validity_contents.dsc_cert, + passport_validity_contents.dsc_pubkey_offset_in_dsc_cert, + ); + + // Check the signature over the DSC + // Uses SHA-256 with a message size of 1500 and a prime of 2048 bits, + // using PKCS rather than PSS. + assert(verify_signature::( + passport_validity_contents.csc_pubkey, // This is the pubkey to verify against + passport_validity_contents.dsc_cert_signature, // This is the actual signature + passport_validity_contents.csc_barrett_mu, + passport_validity_contents.csc_rsa_exponent, + passport_validity_contents.dsc_cert, // This is `data_to_sign`, i.e. the message + passport_validity_contents.dsc_cert_len, + 0, + )); +} + +/// Exactly what the function says. Checks that the last 32 bytes within the +/// `sod_cert` match the SHA-256 hash of the `passport_sod`. +pub fn check_integrity_of_sod_within_sod_cert( + signed_attributes: [u8; 200], + signed_attributes_size: u32, + econtent: [u8; 200], + econtent_len: u32, + econtent_hash_offset: u32, +) { + // Check zero padding for signed_attributes + check_zero_padding(signed_attributes, signed_attributes_size); + + // Bounds check: ensure econtent_hash_offset + 32 doesn't exceed signed_attributes_size + assert( + econtent_hash_offset + 32 <= signed_attributes_size, + "econtent_hash_offset out of bounds", + ); + + // Clearly the SOD itself is supposed to be hashed and then concatenated with some other "stuff" + // That "stuff" is the thing which is actually signed + let econtent_hash = sha256_var(econtent, econtent_len); + + for i in 0..32 { + assert(econtent_hash[i] == signed_attributes[econtent_hash_offset + i]); + } +} + +/// Checks that H(DG1) exists as a substring of the correct offset within +/// the passport's SOD. +pub fn check_dg1_hash_within_sod( + dg1: [u8; 95], + dg1_padded_length: u32, + econtent: [u8; 200], + econtent_len: u32, + dg1_hash_offset: u32, +) { + // Check zero padding for econtent + check_zero_padding(econtent, econtent_len); + + // Bounds check: ensure dg1_hash_offset + 32 doesn't exceed econtent_len + assert(dg1_hash_offset + 32 <= econtent_len, "dg1_hash_offset out of bounds"); + + // Ensure dg1_padded_length doesn't exceed the actual array size + assert(dg1_padded_length <= 95, "dg1_padded_length out of bounds"); + + let dg1_hash = sha256_var(dg1, dg1_padded_length); + + // The DG1 hash is located at the start of the SOD + // (offset is always 0 for DG1) + for i in 0..32 { + assert(dg1_hash[i] == econtent[dg1_hash_offset + i]); + } +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/Nargo.toml new file mode 100644 index 000000000..b75b0693f --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/Nargo.toml @@ -0,0 +1,11 @@ +[package] +name = "sig_check_common" +type = "lib" +authors = ["Theo Madzou", "Michael Elliot"] +compiler_version = ">=1.0.0" + +[dependencies] +utils = { path = "../../utils" } +sha512 = { tag = "v0.2.0", git = "https://github.com/zkpassport/sha512" } +sha256 = { tag = "v0.3.0", git = "https://github.com/noir-lang/sha256" } +sha1 = { tag = "v0.11", git = "https://github.com/zac-williamson/sha1" } \ No newline at end of file diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/src/lib.nr new file mode 100644 index 000000000..bc087832f --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/common/src/lib.nr @@ -0,0 +1,63 @@ +use sha1::sha1; +use sha256::{sha224_var, sha256_var}; +use sha512::{sha384, sha512}; +use utils::check_zero_padding; + +pub fn sha1_and_check_data_to_sign( + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, +) -> [u8; 20] { + // Ensure all bytes beyond data_to_sign_len are zero to prevent them + // from being used by the prover + check_zero_padding(data_to_sign, data_to_sign_len); + // Calculate the hash of data_to_sign up to data_to_sign_len + let data_to_sign_vec = BoundedVec::from_parts(data_to_sign, data_to_sign_len); + + sha1::sha1_var(data_to_sign_vec) +} + +pub fn sha224_and_check_data_to_sign( + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, +) -> [u8; 28] { + // Ensure all bytes beyond data_to_sign_len are zero to prevent them + // from being used by the prover + check_zero_padding(data_to_sign, data_to_sign_len); + // Calculate the hash of data_to_sign up to data_to_sign_len + sha224_var(data_to_sign, data_to_sign_len) +} + +pub fn sha256_and_check_data_to_sign( + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, +) -> [u8; 32] { + // Ensure all bytes beyond data_to_sign_len are zero to prevent them + // from being used by the prover + check_zero_padding(data_to_sign, data_to_sign_len); + // Calculate the hash of data_to_sign up to data_to_sign_len + sha256_var(data_to_sign, data_to_sign_len) +} + +pub fn sha384_and_check_data_to_sign( + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, +) -> [u8; 48] { + // Ensure all bytes beyond data_to_sign_len are zero to prevent them + // from being used by the prover + check_zero_padding(data_to_sign, data_to_sign_len); + // Calculate the hash of data_to_sign up to data_to_sign_len + let data_to_sign_vec = BoundedVec::from_parts(data_to_sign, data_to_sign_len); + sha384::sha384_var(data_to_sign_vec) +} + +pub fn sha512_and_check_data_to_sign( + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, +) -> [u8; 64] { + // Ensure all bytes beyond data_to_sign_len are zero to prevent them + // from being used by the prover + check_zero_padding(data_to_sign, data_to_sign_len); + // Calculate the hash of data_to_sign up to data_to_sign_len + let data_to_sign_vec = BoundedVec::from_parts(data_to_sign, data_to_sign_len); + sha512::sha512_var(data_to_sign_vec) +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/Nargo.toml new file mode 100644 index 000000000..ad419d022 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/Nargo.toml @@ -0,0 +1,11 @@ +[package] +name = "sig_check_rsa" +type = "lib" +authors = ["Theo Madzou", "Michael Elliot"] +compiler_version = ">=1.0.0" + +[dependencies] +rsa = { git = "https://github.com/zkpassport/noir_rsa", tag = "v0.11.0" } +bignum = { git = "https://github.com/noir-lang/noir-bignum", tag = "v0.10.0" } +utils = { path = "../../utils" } +common = { path = "../common" } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/src/lib.nr new file mode 100644 index 000000000..86a8c03d5 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/sig-check/rsa/src/lib.nr @@ -0,0 +1,72 @@ +use bignum::{params::BigNumParams, RuntimeBigNum}; +use common::{ + sha1_and_check_data_to_sign, sha256_and_check_data_to_sign, sha384_and_check_data_to_sign, + sha512_and_check_data_to_sign, +}; +use rsa::rsa::{ + verify_sha1_pkcs1v15, verify_sha1_pss, verify_sha256_pkcs1v15, verify_sha256_pss, + verify_sha384_pkcs1v15, verify_sha384_pss, verify_sha512_pkcs1v15, verify_sha512_pss, +}; + +pub fn verify_signature( + pubkey_bytes: [u8; SIG_BYTES], + // This is equivalent to sig_bytes: [u8; SIG_BYTES] but because of + // an issue with the expected type for from_be_bytes we need to do it like this + sig_bytes: [u8; (((SIG_BYTES * 8) + 7) / 8)], + redc_param_bytes: [u8; SIG_BYTES + 1], + exponent: u32, + data_to_sign: [u8; DATA_TO_SIGN_MAX_LEN], + data_to_sign_len: u32, + pss_salt_len: u32, +) -> bool { + assert( + (SIG_BYTES == 768) + | (SIG_BYTES == 512) + | (SIG_BYTES == 384) + | (SIG_BYTES == 256) + | (SIG_BYTES == 128), + "Only modulus of bit size 1024, 2048, 3072, 4096 and 6144 are supported", + ); + + let pubkey = + utils::pack_be_bytes_into_u128s::(pubkey_bytes); + let redc_param = utils::pack_be_bytes_into_u128s::(redc_param_bytes); + let params = BigNumParams::new(false, pubkey, redc_param); + + let signature = RuntimeBigNum::from_be_bytes(params, sig_bytes); + + if (IS_PSS == 1) { + if (HASH_BYTE_SIZE == 20) { + let msg_hash = sha1_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha1_pss::<_, SIG_BYTES * 8>(msg_hash, signature, exponent, pss_salt_len) + } else if (HASH_BYTE_SIZE == 32) { + let msg_hash = sha256_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha256_pss::<_, SIG_BYTES * 8>(msg_hash, signature, exponent, pss_salt_len) + } else if (HASH_BYTE_SIZE == 48) { + let msg_hash = sha384_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha384_pss::<_, SIG_BYTES * 8>(msg_hash, signature, exponent, pss_salt_len) + } else if (HASH_BYTE_SIZE == 64) { + let msg_hash = sha512_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha512_pss::<_, SIG_BYTES * 8>(msg_hash, signature, exponent, pss_salt_len) + } else { + false + } + } else { + if (HASH_BYTE_SIZE == 20) { + let msg_hash = sha1_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha1_pkcs1v15::<_, SIG_BYTES * 8>(msg_hash, signature, exponent) + } else if (HASH_BYTE_SIZE == 32) { + let msg_hash = sha256_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha256_pkcs1v15::<_, SIG_BYTES * 8>(msg_hash, signature, exponent) + } else if (HASH_BYTE_SIZE == 48) { + let msg_hash = sha384_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha384_pkcs1v15::<_, SIG_BYTES * 8>(msg_hash, signature, exponent) + } else if (HASH_BYTE_SIZE == 64) { + let msg_hash = sha512_and_check_data_to_sign(data_to_sign, data_to_sign_len); + verify_sha512_pkcs1v15::<_, SIG_BYTES * 8>(msg_hash, signature, exponent) + } else { + false + } + } +} + diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/Nargo.toml b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/Nargo.toml new file mode 100644 index 000000000..9c13b1912 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/Nargo.toml @@ -0,0 +1,8 @@ +[package] +name = "utils" +type = "lib" +authors = ["Theo Madzou", "Michael Elliot"] +compiler_version = ">=1.0.0" + +[dependencies] +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/constants.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/constants.nr new file mode 100644 index 000000000..9732da4ac --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/constants.nr @@ -0,0 +1,5 @@ +// Nullifier types +pub global NON_SALTED_NULLIFIER: Field = 0; +pub global SALTED_NULLIFIER: Field = 1; +pub global NON_SALTED_MOCK_NULLIFIER: Field = 2; +pub global SALTED_MOCK_NULLIFIER: Field = 3; diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/lib.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/lib.nr new file mode 100644 index 000000000..ff87118e0 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/lib.nr @@ -0,0 +1,228 @@ +/** +* The standards for passports and any other travel documents, electronic or not, +* are defined in the ICAO (International Civil Aviation Organization) 9303 document available here: +* https://www.icao.int/publications/pages/publication.aspx?docnum=9303 +*/ +pub mod tests; +pub mod types; +pub mod constants; + +/** +* The structure of the MRZ is well defined and standardized by the ICAO +* so the index will always be the same for every passport +* c.f. ICAO 9303-4, Appendix B +*/ + +use types::{DG1Data, MRZData, MRZIssuingCountry}; + +// Index for the country of issuance of the passport +pub global PASSPORT_MRZ_COUNTRY_INDEX: u32 = 2; +// Length of the country code in the MRZ +pub global PASSPORT_MRZ_COUNTRY_LENGTH: u32 = 3; +// Index for the date of expiry (YYMMDD) +pub global PASSPORT_MRZ_EXPIRY_DATE_INDEX: u32 = 65; +// Index for the date of birth (YYMMDD) in TD1 (i.e. passport) MRZ +pub global PASSPORT_MRZ_BIRTHDATE_INDEX: u32 = 57; + +// Index for the date of expiry (YYMMDD) +pub global ID_CARD_MRZ_EXPIRY_DATE_INDEX: u32 = 38; +// Index for the date of birth (YYMMDD) in TD3 (i.e. ID cards) MRZ +pub global ID_CARD_MRZ_BIRTHDATE_INDEX: u32 = 30; + +// Proof type to identify the circuit used for a given parameter commitment +pub global PROOF_TYPE_AGE: u8 = 1; + +// D<< +global GERMANY_PASSPORT_CODE: [u8; 3] = [68, 60, 60]; +// DEU +global GERMANY_ISO_CODE: [u8; 3] = [68, 69, 85]; + +/// Offset of the MRZ in the DG1 +pub global DG1_TO_MRZ_OFFSET: u32 = 5; + +pub fn get_array_slice(arr: [u8; N], start: u32, end: u32) -> [u8; M] { + let mut slice = [0 as u8; M]; + for i in start..end { + slice[i - start] = arr[i]; + } + slice +} + +pub fn is_id_card(dg1: DG1Data) -> bool { + // For passport, the last two bytes are 0 + // since the real length is 93 for passports + // while it is 95 for ID cards + (dg1[93] != 0) & (dg1[94] != 0) +} + +pub fn pack_be_bytes_into_field( + x: [u8; NBytes], +) -> Field { + let mut result: Field = 0; + for i in 0..MAX_FIELD_SIZE { + result *= 256; + result += x[i] as Field; + } + std::as_witness(result); + result +} + +pub fn pack_be_bytes_into_u128s( + x: [u8; NBytes], +) -> [u128; N] { + let mut result = [0 as u128; N]; + + let mut limb: Field = 0; + let mut k = 0; + for _j in 0..(MAX_FIELD_SIZE - (N * MAX_FIELD_SIZE - NBytes)) { + limb *= 256; + limb += x[k] as Field; + k += 1; + } + std::as_witness(limb); + + result[N - 1] = limb as u128; + + for i in 1..N { + let mut limb: Field = 0; + for _j in 0..MAX_FIELD_SIZE { + limb *= 256; + limb += x[k] as Field; + k += 1; + } + std::as_witness(limb); + result[N - i - 1] = limb as u128; + } + + result +} + +pub fn pack_be_bytes_into_fields( + x: [u8; NBytes], +) -> [Field; N] { + let mut result = [0 as Field; N]; + + let mut limb: Field = 0; + let mut k = 0; + for _j in 0..(MAX_FIELD_SIZE - (N * MAX_FIELD_SIZE - NBytes)) { + limb *= 256; + limb += x[k] as Field; + k += 1; + } + std::as_witness(limb); + + result[N - 1] = limb; + + for i in 1..N { + let mut limb: Field = 0; + for _j in 0..MAX_FIELD_SIZE { + limb *= 256; + limb += x[k] as Field; + k += 1; + } + std::as_witness(limb); + result[N - i - 1] = limb; + } + + result +} + +pub fn get_mrz_from_dg1(dg1: DG1Data) -> MRZData { + let mut mrz: MRZData = [0 as u8; 90]; + for i in 0..90 { + mrz[i] = dg1[i + DG1_TO_MRZ_OFFSET]; + } + mrz +} + +pub fn check_zero_padding(padded_array: [T; N], len: u32) +where + T: Eq, + T: Default, +{ + assert(len <= N, "check_zero_padding: len exceeds array size"); + for i in 0..N { + if i >= len { + assert_eq(padded_array[i], T::default()); + } + } +} + +pub fn get_issuing_country_from_mrz(dg1: DG1Data) -> MRZIssuingCountry { + let mrz = get_mrz_from_dg1(dg1); + // No need to check if it's an ID card since the issuing country + // is always at the same index for both passports and ID cards + let mut country_bytes = get_array_slice( + mrz, + PASSPORT_MRZ_COUNTRY_INDEX, + PASSPORT_MRZ_COUNTRY_INDEX + PASSPORT_MRZ_COUNTRY_LENGTH, + ); + + // Handle the special case of Germany + if (country_bytes == GERMANY_PASSPORT_CODE) { + country_bytes = GERMANY_ISO_CODE; + } + + country_bytes +} + +/// Find the index of the first occurrence of the needle in the haystack +/// Returns the index of the first occurrence of the needle in the haystack +/// Returns HAYSTACK_SIZE if the needle is not found +pub fn find_subarray_index( + needle: [u8; NEEDLE_SIZE], + haystack: [u8; HAYSTACK_SIZE], +) -> u32 { + // Safety: This is safe because the offset is only used as a starting point + // to verify the substring exists + let offsetUnchecked = unsafe { find_subarray_index_unsafe(needle, haystack) }; + let mut offset = offsetUnchecked; + // Check if offset is valid before attempting verification + if (offsetUnchecked < HAYSTACK_SIZE) & (offsetUnchecked + NEEDLE_SIZE <= HAYSTACK_SIZE) { + for i in 0..NEEDLE_SIZE { + if haystack[i + offsetUnchecked] != needle[i] { + offset = HAYSTACK_SIZE; + } + } + } else { + // If offset is out of bounds, needle was not found + offset = HAYSTACK_SIZE; + } + offset +} + +pub fn is_subarray_in_array( + needle: [u8; NEEDLE_SIZE], + haystack: [u8; HAYSTACK_SIZE], +) -> bool { + find_subarray_index(needle, haystack) < HAYSTACK_SIZE +} + +/// Safety: This is safe because the offset is only used as a starting point +/// to verify the substring exists +pub unconstrained fn find_subarray_index_unsafe( + needle: [u8; NEEDLE_SIZE], + haystack: [u8; HAYSTACK_SIZE], +) -> u32 { + let mut result = HAYSTACK_SIZE; // Default to "not found" value + // Handle edge cases + if NEEDLE_SIZE == 0 { + result = 0; + } else if NEEDLE_SIZE <= HAYSTACK_SIZE { + // Search for the needle in the haystack + for i in 0..(HAYSTACK_SIZE - NEEDLE_SIZE + 1) { + let mut found = true; + for j in 0..NEEDLE_SIZE { + if haystack[i + j] != needle[j] { + found = false; + break; + } + } + if found { + result = i; + break; + } + } + } + result +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/tests.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/tests.nr new file mode 100644 index 000000000..ad2af3b25 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/tests.nr @@ -0,0 +1,213 @@ +use crate::{find_subarray_index, pack_be_bytes_into_fields, pack_be_bytes_into_u128s}; + +#[test] +fn test_pack_be_bytes_into_u128() { + let packed1 = pack_be_bytes_into_u128s::<512, _, 15>(TEST_BYTES); + assert( + packed1 + == [ + 0xa906a6bf52c2d3b6dcc3e53e8df2c2, + 0xa0a652bc1a96ef6fa85aaaac8a2793, + 0xd2aa634a40e786072d1a84a726ee35, + 0x20deee9d92dd32e9d1661cad3fd748, + 0x59c58bff771bcb1007ab5292034b01, + 0xb105cd7c3f8bdffffa8976a1d6712b, + 0x7f04e817f0861ba18ffdc4e9656bd2, + 0xca6ad55f4dc9e1437ae528bff4440b, + 0x0cdf23c048109f118dbc4f062526ec, + 0xc57749fc145d2a6f68c95a0bf1345a, + 0x1744b7ad88a820d428b0f1c79a6660, + 0x21a17ae68fddadbb6d54c97ecbe1e3, + 0x3596b41957a1a78af81fbe9f418d92, + 0x5398a2f749a773190f5d838013b898, + 0xef83111bf9b7819fd12b33ff682590, + 0x56989a6176dfd100ae89dd7936e9f0, + 0x4f3d7ab2e41ba2cb404c3d6cef8740, + 0xc81a370e672704f5f31450f9156d93, + 0x2c9ad440424450b81c303c51d405d3, + 0x5d3aaebc67b2ba64a2f9546349fb9e, + 0xdced3dbea6d67fe49c3f31562ffba7, + 0xa67a19f7fcecb81235e7706b20ecc4, + 0x2fb5c8f5d8ddac8df1c6917eb31bad, + 0xd9478e0dcd3f2ab125ccc6a68c4447, + 0x2ef19aff06bf67ab4226a331ffa737, + 0x5e9ea156076a09e78b919d8c5dee0f, + 0x0b427e9391893f58968fc2d96a2775, + 0x432d27b533c103f1509b4f4fc43ac7, + 0xe0e6d9598280b0aa0f2902b0aa3b3a, + 0xa04da3f98c5cfe8d4d8f9e1fb4e89c, + 0x7e463b5ebaf81c1485efeb44e634f9, + 0xae87ec4262fcfd075f5554475547a3, + 0xfb2297b7ffc0deeb3a1b27effc6b6c, + 0xd3b801cbc8e237620d8dd9adc29551, + 0x405d, + ], + ); +} + +#[test] +fn test_pack_be_bytes_into_fields() { + let packed1 = pack_be_bytes_into_fields::<512, _, 15>(TEST_BYTES); + assert( + packed1 + == [ + 0xa906a6bf52c2d3b6dcc3e53e8df2c2, + 0xa0a652bc1a96ef6fa85aaaac8a2793, + 0xd2aa634a40e786072d1a84a726ee35, + 0x20deee9d92dd32e9d1661cad3fd748, + 0x59c58bff771bcb1007ab5292034b01, + 0xb105cd7c3f8bdffffa8976a1d6712b, + 0x7f04e817f0861ba18ffdc4e9656bd2, + 0xca6ad55f4dc9e1437ae528bff4440b, + 0x0cdf23c048109f118dbc4f062526ec, + 0xc57749fc145d2a6f68c95a0bf1345a, + 0x1744b7ad88a820d428b0f1c79a6660, + 0x21a17ae68fddadbb6d54c97ecbe1e3, + 0x3596b41957a1a78af81fbe9f418d92, + 0x5398a2f749a773190f5d838013b898, + 0xef83111bf9b7819fd12b33ff682590, + 0x56989a6176dfd100ae89dd7936e9f0, + 0x4f3d7ab2e41ba2cb404c3d6cef8740, + 0xc81a370e672704f5f31450f9156d93, + 0x2c9ad440424450b81c303c51d405d3, + 0x5d3aaebc67b2ba64a2f9546349fb9e, + 0xdced3dbea6d67fe49c3f31562ffba7, + 0xa67a19f7fcecb81235e7706b20ecc4, + 0x2fb5c8f5d8ddac8df1c6917eb31bad, + 0xd9478e0dcd3f2ab125ccc6a68c4447, + 0x2ef19aff06bf67ab4226a331ffa737, + 0x5e9ea156076a09e78b919d8c5dee0f, + 0x0b427e9391893f58968fc2d96a2775, + 0x432d27b533c103f1509b4f4fc43ac7, + 0xe0e6d9598280b0aa0f2902b0aa3b3a, + 0xa04da3f98c5cfe8d4d8f9e1fb4e89c, + 0x7e463b5ebaf81c1485efeb44e634f9, + 0xae87ec4262fcfd075f5554475547a3, + 0xfb2297b7ffc0deeb3a1b27effc6b6c, + 0xd3b801cbc8e237620d8dd9adc29551, + 0x405d, + ], + ); + + let packed2 = pack_be_bytes_into_fields::<512, _, 31>(TEST_BYTES); + assert( + packed2 + == [ + 0x35a0a652bc1a96ef6fa85aaaac8a2793a906a6bf52c2d3b6dcc3e53e8df2c2, + 0x4b0120deee9d92dd32e9d1661cad3fd748d2aa634a40e786072d1a84a726ee, + 0x656bd2b105cd7c3f8bdffffa8976a1d6712b59c58bff771bcb1007ab529203, + 0x062526ecca6ad55f4dc9e1437ae528bff4440b7f04e817f0861ba18ffdc4e9, + 0xf1c79a6660c57749fc145d2a6f68c95a0bf1345a0cdf23c048109f118dbc4f, + 0x1fbe9f418d9221a17ae68fddadbb6d54c97ecbe1e31744b7ad88a820d428b0, + 0xd12b33ff6825905398a2f749a773190f5d838013b8983596b41957a1a78af8, + 0xcb404c3d6cef874056989a6176dfd100ae89dd7936e9f0ef83111bf9b7819f, + 0x50b81c303c51d405d3c81a370e672704f5f31450f9156d934f3d7ab2e41ba2, + 0xd67fe49c3f31562ffba75d3aaebc67b2ba64a2f9546349fb9e2c9ad4404244, + 0xd8ddac8df1c6917eb31bada67a19f7fcecb81235e7706b20ecc4dced3dbea6, + 0xff06bf67ab4226a331ffa737d9478e0dcd3f2ab125ccc6a68c44472fb5c8f5, + 0x7e9391893f58968fc2d96a27755e9ea156076a09e78b919d8c5dee0f2ef19a, + 0xe6d9598280b0aa0f2902b0aa3b3a432d27b533c103f1509b4f4fc43ac70b42, + 0x7e463b5ebaf81c1485efeb44e634f9a04da3f98c5cfe8d4d8f9e1fb4e89ce0, + 0x51fb2297b7ffc0deeb3a1b27effc6b6cae87ec4262fcfd075f5554475547a3, + 0x405dd3b801cbc8e237620d8dd9adc295, + ], + ); +} + +global TEST_BYTES: [u8; 512] = [ + 0x40, 0x5d, 0xd3, 0xb8, 0x01, 0xcb, 0xc8, 0xe2, 0x37, 0x62, 0x0d, 0x8d, 0xd9, 0xad, 0xc2, 0x95, + 0x51, 0xfb, 0x22, 0x97, 0xb7, 0xff, 0xc0, 0xde, 0xeb, 0x3a, 0x1b, 0x27, 0xef, 0xfc, 0x6b, 0x6c, + 0xae, 0x87, 0xec, 0x42, 0x62, 0xfc, 0xfd, 0x07, 0x5f, 0x55, 0x54, 0x47, 0x55, 0x47, 0xa3, 0x7e, + 0x46, 0x3b, 0x5e, 0xba, 0xf8, 0x1c, 0x14, 0x85, 0xef, 0xeb, 0x44, 0xe6, 0x34, 0xf9, 0xa0, 0x4d, + 0xa3, 0xf9, 0x8c, 0x5c, 0xfe, 0x8d, 0x4d, 0x8f, 0x9e, 0x1f, 0xb4, 0xe8, 0x9c, 0xe0, 0xe6, 0xd9, + 0x59, 0x82, 0x80, 0xb0, 0xaa, 0x0f, 0x29, 0x02, 0xb0, 0xaa, 0x3b, 0x3a, 0x43, 0x2d, 0x27, 0xb5, + 0x33, 0xc1, 0x03, 0xf1, 0x50, 0x9b, 0x4f, 0x4f, 0xc4, 0x3a, 0xc7, 0x0b, 0x42, 0x7e, 0x93, 0x91, + 0x89, 0x3f, 0x58, 0x96, 0x8f, 0xc2, 0xd9, 0x6a, 0x27, 0x75, 0x5e, 0x9e, 0xa1, 0x56, 0x07, 0x6a, + 0x09, 0xe7, 0x8b, 0x91, 0x9d, 0x8c, 0x5d, 0xee, 0x0f, 0x2e, 0xf1, 0x9a, 0xff, 0x06, 0xbf, 0x67, + 0xab, 0x42, 0x26, 0xa3, 0x31, 0xff, 0xa7, 0x37, 0xd9, 0x47, 0x8e, 0x0d, 0xcd, 0x3f, 0x2a, 0xb1, + 0x25, 0xcc, 0xc6, 0xa6, 0x8c, 0x44, 0x47, 0x2f, 0xb5, 0xc8, 0xf5, 0xd8, 0xdd, 0xac, 0x8d, 0xf1, + 0xc6, 0x91, 0x7e, 0xb3, 0x1b, 0xad, 0xa6, 0x7a, 0x19, 0xf7, 0xfc, 0xec, 0xb8, 0x12, 0x35, 0xe7, + 0x70, 0x6b, 0x20, 0xec, 0xc4, 0xdc, 0xed, 0x3d, 0xbe, 0xa6, 0xd6, 0x7f, 0xe4, 0x9c, 0x3f, 0x31, + 0x56, 0x2f, 0xfb, 0xa7, 0x5d, 0x3a, 0xae, 0xbc, 0x67, 0xb2, 0xba, 0x64, 0xa2, 0xf9, 0x54, 0x63, + 0x49, 0xfb, 0x9e, 0x2c, 0x9a, 0xd4, 0x40, 0x42, 0x44, 0x50, 0xb8, 0x1c, 0x30, 0x3c, 0x51, 0xd4, + 0x05, 0xd3, 0xc8, 0x1a, 0x37, 0x0e, 0x67, 0x27, 0x04, 0xf5, 0xf3, 0x14, 0x50, 0xf9, 0x15, 0x6d, + 0x93, 0x4f, 0x3d, 0x7a, 0xb2, 0xe4, 0x1b, 0xa2, 0xcb, 0x40, 0x4c, 0x3d, 0x6c, 0xef, 0x87, 0x40, + 0x56, 0x98, 0x9a, 0x61, 0x76, 0xdf, 0xd1, 0x00, 0xae, 0x89, 0xdd, 0x79, 0x36, 0xe9, 0xf0, 0xef, + 0x83, 0x11, 0x1b, 0xf9, 0xb7, 0x81, 0x9f, 0xd1, 0x2b, 0x33, 0xff, 0x68, 0x25, 0x90, 0x53, 0x98, + 0xa2, 0xf7, 0x49, 0xa7, 0x73, 0x19, 0x0f, 0x5d, 0x83, 0x80, 0x13, 0xb8, 0x98, 0x35, 0x96, 0xb4, + 0x19, 0x57, 0xa1, 0xa7, 0x8a, 0xf8, 0x1f, 0xbe, 0x9f, 0x41, 0x8d, 0x92, 0x21, 0xa1, 0x7a, 0xe6, + 0x8f, 0xdd, 0xad, 0xbb, 0x6d, 0x54, 0xc9, 0x7e, 0xcb, 0xe1, 0xe3, 0x17, 0x44, 0xb7, 0xad, 0x88, + 0xa8, 0x20, 0xd4, 0x28, 0xb0, 0xf1, 0xc7, 0x9a, 0x66, 0x60, 0xc5, 0x77, 0x49, 0xfc, 0x14, 0x5d, + 0x2a, 0x6f, 0x68, 0xc9, 0x5a, 0x0b, 0xf1, 0x34, 0x5a, 0x0c, 0xdf, 0x23, 0xc0, 0x48, 0x10, 0x9f, + 0x11, 0x8d, 0xbc, 0x4f, 0x06, 0x25, 0x26, 0xec, 0xca, 0x6a, 0xd5, 0x5f, 0x4d, 0xc9, 0xe1, 0x43, + 0x7a, 0xe5, 0x28, 0xbf, 0xf4, 0x44, 0x0b, 0x7f, 0x04, 0xe8, 0x17, 0xf0, 0x86, 0x1b, 0xa1, 0x8f, + 0xfd, 0xc4, 0xe9, 0x65, 0x6b, 0xd2, 0xb1, 0x05, 0xcd, 0x7c, 0x3f, 0x8b, 0xdf, 0xff, 0xfa, 0x89, + 0x76, 0xa1, 0xd6, 0x71, 0x2b, 0x59, 0xc5, 0x8b, 0xff, 0x77, 0x1b, 0xcb, 0x10, 0x07, 0xab, 0x52, + 0x92, 0x03, 0x4b, 0x01, 0x20, 0xde, 0xee, 0x9d, 0x92, 0xdd, 0x32, 0xe9, 0xd1, 0x66, 0x1c, 0xad, + 0x3f, 0xd7, 0x48, 0xd2, 0xaa, 0x63, 0x4a, 0x40, 0xe7, 0x86, 0x07, 0x2d, 0x1a, 0x84, 0xa7, 0x26, + 0xee, 0x35, 0xa0, 0xa6, 0x52, 0xbc, 0x1a, 0x96, 0xef, 0x6f, 0xa8, 0x5a, 0xaa, 0xac, 0x8a, 0x27, + 0x93, 0xa9, 0x06, 0xa6, 0xbf, 0x52, 0xc2, 0xd3, 0xb6, 0xdc, 0xc3, 0xe5, 0x3e, 0x8d, 0xf2, 0xc2, +]; + +#[test] +fn test_find_substring_index_various_cases() { + // Test case 1: Basic substring at index 3 + let needle1 = [0x04, 0x05, 0x06]; + let haystack1 = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a]; + let index1 = find_subarray_index(needle1, haystack1); + assert_eq(index1, 3); + + // Test case 2: Substring at the beginning + let needle2 = [0x01, 0x02]; + let haystack2 = [0x01, 0x02, 0x03, 0x04, 0x05]; + let index2 = find_subarray_index(needle2, haystack2); + assert_eq(index2, 0); + + // Test case 3: Substring at the end + let needle3 = [0x04, 0x05]; + let haystack3 = [0x01, 0x02, 0x03, 0x04, 0x05]; + let index3 = find_subarray_index(needle3, haystack3); + assert_eq(index3, 3); + + // Test case 4: Single byte needle + let needle4 = [0x03]; + let haystack4 = [0x01, 0x02, 0x03, 0x04, 0x05]; + let index4 = find_subarray_index(needle4, haystack4); + assert_eq(index4, 2); + + // Test case 5: Empty needle (should return 0) + let needle5: [u8; 0] = []; + let haystack5 = [0x01, 0x02, 0x03, 0x04, 0x05]; + let index5 = find_subarray_index(needle5, haystack5); + assert_eq(index5, 0); + + // Test case 6: Needle not found - completely different bytes + let needle6 = [0xff, 0xee, 0xdd]; + let haystack6 = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a]; + let index6 = find_subarray_index(needle6, haystack6); + assert_eq(index6, haystack6.len()); // Should equal haystack size + + // Test case 7: Needle larger than haystack + let needle7 = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]; + let haystack7 = [0x01, 0x02, 0x03]; + let index7 = find_subarray_index(needle7, haystack7); + assert_eq(index7, haystack7.len()); // Should equal haystack size + + // Test case 8: Partial match at the end but incomplete + let needle8 = [0x09, 0x0a, 0x0b]; + let haystack8 = [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a]; + let index8 = find_subarray_index(needle8, haystack8); + assert_eq(index8, haystack8.len()); // Should equal haystack size + + // Test case 9: Multiple false matches (partial matches) + let needle9 = [0x01, 0x01, 0x02]; + let haystack9 = [0x01, 0x03, 0x01, 0x04, 0x01, 0x01, 0x03, 0x05, 0x06, 0x07]; + let index9 = find_subarray_index(needle9, haystack9); + assert_eq(index9, haystack9.len()); // Should equal haystack size + + // Test case 10: Needle appears to match but fails verification + let needle10 = [0x02, 0x03, 0x04]; + let haystack10 = [0x01, 0x02, 0x03, 0x05, 0x06, 0x07, 0x08, 0x09]; + let index10 = find_subarray_index(needle10, haystack10); + assert_eq(index10, haystack10.len()); // Should equal haystack size +} diff --git a/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/types.nr b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/types.nr new file mode 100644 index 000000000..9181d49a5 --- /dev/null +++ b/noir-examples/noir-passport-monolithic/complete_age_check/vendor/utils/utils/src/types.nr @@ -0,0 +1,133 @@ +use poseidon::poseidon2::Poseidon2; +use crate::pack_be_bytes_into_fields; + +// DG1 types +pub type DG1Data = [u8; 95]; +pub type MRZData = [u8; 90]; + +// Dates +pub type YYMMDDDate = [u8; 6]; +pub type MRZExpiryDate = YYMMDDDate; + +// MRZ types +pub type MRZIssuingCountry = [u8; 3]; + +// Country code types +pub type Alpha3CountryCode = str<3>; + +// Hash digest types +pub type SHA256Digest = [u8; 32]; + +// eContent and SignedAttrs types +pub type EContentData = [u8; 200]; +pub type SignedAttrsData = [u8; 200]; + +/// This struct acts as a wrapper around a value, so it can be specified as either a clear value with +/// a provided salt for hashing or only as its salted hash if its clear value is not needed inside the circuit +pub struct SaltedValue { + pub salt: Field, + pub value: T, + pub hash: Field, +} + +impl Default for SaltedValue +where + T: Default, +{ + fn default() -> Self { + Self { salt: 0, value: T::default(), hash: 0 } + } +} + +impl SaltedValue +where + T: Default, + T: Eq, +{ + /// When the clear value is needed inside the circuit, use this method to create a salted value + pub fn from_value(salt: Field, value: T) -> Self { + assert(salt != 0, "Salt cannot be 0 when creating a salted value from a clear value"); + assert( + value != T::default(), + "Value cannot be the default value when creating a salted value from a clear value", + ); + Self { salt, value, hash: 0 } + } + + /// When the clear value is not needed and is better hidden, use this method to specify the hash only + pub fn from_hash(hash: Field) -> Self { + assert(hash != 0, "Hash cannot be 0 when creating a salted value from a hash"); + Self { salt: 0, value: T::default(), hash } + } +} + +impl SaltedValue { + /// Gets the salted hash of the value + /// If the hash is already specified, it will return the hash directly + /// Otherwise, it will compute the hash from the salt and value + pub fn get_hash(self) -> Field { + if self.hash != 0 { + assert_eq(self.salt, 0, "Salt must be 0 when hash is already specified"); + assert_eq(self.value, 0, "Value must be 0 when hash is already specified"); + self.hash + } else { + assert( + self.value != 0, + "Value must be non-zero when computing the hash from a clear value and its salt", + ); + assert( + self.salt != 0, + "Salt must be non-zero when computing the hash from a clear value and its salt", + ); + Poseidon2::hash([self.salt, self.value as Field], 2) + } + } +} + +impl SaltedValue { + /// Gets the salted hash of the value + /// If the hash is already specified, it will return the hash directly + /// Otherwise, it will compute the hash from the salt and value + pub fn get_hash(self) -> Field { + if self.hash != 0 { + assert_eq(self.salt, 0, "Salt must be 0 when hash is already specified"); + assert_eq(self.value, 0, "Value must be 0 when hash is already specified"); + self.hash + } else { + assert( + self.value != 0, + "Value must be non-zero when computing the hash from a clear value and its salt", + ); + assert( + self.salt != 0, + "Salt must be non-zero when computing the hash from a clear value and its salt", + ); + Poseidon2::hash([self.salt, self.value], 2) + } + } +} + +impl SaltedValue<[u8; N]> { + /// Gets the salted hash of the value + /// If the hash is already specified, it will return the hash directly + /// Otherwise, it will compute the hash from the salt and value + pub fn get_hash(self) -> Field { + if self.hash != 0 { + assert_eq(self.salt, 0, "Salt must be 0 when hash is already specified"); + assert_eq(self.value, [0; N], "Value must be zeroed when hash is already specified"); + self.hash + } else { + assert( + self.value != [0; N], + "Value must be non-zeroed when computing the hash from a clear value and its salt", + ); + assert( + self.salt != 0, + "Salt must be non-zero when computing the hash from a clear value and its salt", + ); + let packed_value: [Field; (N + 30) / 31] = + pack_be_bytes_into_fields::(self.value); + Poseidon2::hash([self.salt].concat(packed_value), (N + 30) / 31 + 1) + } + } +} diff --git a/noir-examples/noir-passport/utils/commitment/common/src/lib.nr b/noir-examples/noir-passport/utils/commitment/common/src/lib.nr index 6e6f7c9aa..6e6bde30d 100644 --- a/noir-examples/noir-passport/utils/commitment/common/src/lib.nr +++ b/noir-examples/noir-passport/utils/commitment/common/src/lib.nr @@ -175,7 +175,7 @@ pub fn calculate_param_commitment( // Returns the merkle root of the tree from the provided leaf, index and hash_path, using the Poseidon2 hash function // Arity is expected to be 2 and the the tree depth is equal to the hash_path array length pub fn compute_merkle_root(leaf: Field, index: Field, hash_path: [Field; N]) -> Field { - let index_bits: [u1; N] = index.to_le_bits(); + let index_bits: [bool; N] = index.to_le_bits(); let mut current = leaf; for i in 0..N { let path_bit = index_bits[i] == 1; diff --git a/noir-examples/oprf/Nargo.toml b/noir-examples/oprf/Nargo.toml index 64511b477..4756b4ec8 100644 --- a/noir-examples/oprf/Nargo.toml +++ b/noir-examples/oprf/Nargo.toml @@ -4,7 +4,6 @@ type = "bin" authors = [""] [dependencies] -poseidon2 = { tag="v0.5.0-beta.0" , git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } +poseidon2 = { tag="v0.6.1" , git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2" } babyjubjub = {path = "../babyjubjub"} eddsa_poseidon2 = {path ="../eddsa_poseidon2"} -binary_merkle_root = { git = "https://github.com/privacy-scaling-explorations/zk-kit.noir", tag = "binary-merkle-root-v0.0.1", directory = "packages/binary-merkle-root" } diff --git a/noir-examples/oprf/src/commitment.nr b/noir-examples/oprf/src/commitment.nr index 8cd25ee03..5b8c3d4ca 100644 --- a/noir-examples/oprf/src/commitment.nr +++ b/noir-examples/oprf/src/commitment.nr @@ -1,6 +1,6 @@ use super::{constants::{DS_C, DS_N, DS_Q}, types::{OprfNullifierOutputs, OprfQueryInputs}}; use babyjubjub::BabyJubJubPoint; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; pub fn generate_commitment( query: Field, @@ -14,12 +14,12 @@ pub fn generate_commitment( } fn generate_nullifier(query: Field, oprf_response: BabyJubJubPoint) -> Field { - let state = perm::x5_4([DS_N, query, oprf_response.x, oprf_response.y]); + let state = permutation::t4([DS_N, query, oprf_response.x, oprf_response.y]); state[1] } fn generate_id_commitment(mt_index: Field, commitment_r: Field) -> Field { - let state = perm::x5_3([DS_C, mt_index, commitment_r]); + let state = permutation::t3([DS_C, mt_index, commitment_r]); state[1] } @@ -28,6 +28,6 @@ pub fn generate_query( rp_id: Field, action: Field, ) -> Field { - let state = perm::x5_4([DS_Q, query.merkle_proof.mt_index, rp_id, action]); + let state = permutation::t4([DS_Q, query.merkle_proof.mt_index, rp_id, action]); state[1] } diff --git a/noir-examples/oprf/src/credential_signature.nr b/noir-examples/oprf/src/credential_signature.nr index 432224c0e..3fb8ed5dc 100644 --- a/noir-examples/oprf/src/credential_signature.nr +++ b/noir-examples/oprf/src/credential_signature.nr @@ -1,6 +1,6 @@ use super::constants::{CREDENTIAL_DS, DS_C_CS}; use eddsa_poseidon2::verify_eddsa_poseidon2; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; pub fn check_credential_signature( s: Field, @@ -21,7 +21,7 @@ pub fn check_credential_signature( // Check genesis issued at is valid assert(genesis_issued_at >= genesis_issued_at_min, "Credential issued_at too old"); - let blinded_user_id = perm::x5_3([DS_C_CS, user_id, user_id_r])[1]; + let blinded_user_id = permutation::t3([DS_C_CS, user_id, user_id_r])[1]; // Calculate message hash let hash_inputs = [ @@ -34,7 +34,7 @@ pub fn check_credential_signature( hashes[1], credential_id, ]; - let hash_state = perm::x5_8(hash_inputs); + let hash_state = permutation::t8(hash_inputs); let message = hash_state[1]; // Verify EdDSA signature and assert directly diff --git a/noir-examples/oprf/src/dlog.nr b/noir-examples/oprf/src/dlog.nr index 881f8b7d3..b6f18297c 100644 --- a/noir-examples/oprf/src/dlog.nr +++ b/noir-examples/oprf/src/dlog.nr @@ -1,6 +1,6 @@ use super::constants::DS_DLOG; use babyjubjub::BabyJubJubPoint; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; // Verify a Chaum-Pedersen dlog equality proof that shows that A=x*G and C=x*B share the same discrete log x, given A,B,C and proof e,s. // Point A is a public input in our use case (the OPRF public key and therefore we expect it to be checked to be in the prime order subgroup outside of this circuit) @@ -59,7 +59,7 @@ pub fn verify_dlog_equality( 0, ]; - let hash_state = perm::x5_16(hash_input); + let hash_state = permutation::t16(hash_input); let challenge = hash_state[1]; // Verify that the recomputed challenge matches e diff --git a/noir-examples/oprf/src/merkle_proof.nr b/noir-examples/oprf/src/merkle_proof.nr index ced7a0b6d..fd1439579 100644 --- a/noir-examples/oprf/src/merkle_proof.nr +++ b/noir-examples/oprf/src/merkle_proof.nr @@ -1,5 +1,5 @@ use super::{constants::MERKLE_LEAF_DS, types::PublicKey}; -use poseidon2::bn254::perm; +use poseidon2::bn254::permutation; pub fn merkle_leaf(pk: [PublicKey; NUM_KEYS]) -> Field { let mut inputs: [Field; 16] = [0; 16]; @@ -10,7 +10,7 @@ pub fn merkle_leaf(pk: [PublicKey; NUM_KEYS]) -> Field { inputs[i * 2 + 2] = pk[i].y; } - let hash_state = perm::x5_16(inputs); + let hash_state = permutation::t16(inputs); hash_state[1] } @@ -36,7 +36,7 @@ pub fn compute_merkle_root_poseidon2( let left = sibling + (diff * (1 - is_right_field)); let right = sibling + (diff * is_right_field); - let hash_state = perm::x5_2([left, right]); + let hash_state = permutation::t2([left, right]); current = hash_state[0] + left; idx >>= 1; diff --git a/noir-examples/oprf/src/query.nr b/noir-examples/oprf/src/query.nr index 2a0eb4786..df7807b78 100644 --- a/noir-examples/oprf/src/query.nr +++ b/noir-examples/oprf/src/query.nr @@ -11,7 +11,7 @@ pub fn oprf_query_inner( depth: Field, root: Field, inputs: OprfQueryInputs, - beta_bits: [u1; 251], + beta_bits: [bool; 251], ) -> BabyJubJubPoint { // 1. Verify sk/pk by verifying a signature to a known message let chosen_pk = inputs.user_pk[inputs.pk_index as u32]; @@ -47,7 +47,7 @@ pub fn oprf_query_inner( pub fn verify_unblinding( oprf_response: BabyJubJubPoint, oprf_response_blinded: BabyJubJubPoint, - beta_bits: [u1; 251], + beta_bits: [bool; 251], ) { // Check that oprf_response is on the curve and perform unblinding assert(oprf_response.is_on_curve(), "OPRF response must be on curve"); diff --git a/noir-examples/p256_bigcurve/Nargo.toml b/noir-examples/p256_bigcurve/Nargo.toml index c9df7a53a..8e0a026de 100644 --- a/noir-examples/p256_bigcurve/Nargo.toml +++ b/noir-examples/p256_bigcurve/Nargo.toml @@ -4,5 +4,5 @@ type = "bin" authors = [""] [dependencies] -bignum = { tag = "v0.9.2", git = "https://github.com/noir-lang/noir-bignum" } -bigcurve = { tag = "v0.13.2", git = "https://github.com/noir-lang/noir_bigcurve" } +bignum = { tag = "v0.10.0", git = "https://github.com/noir-lang/noir-bignum" } +bigcurve = { tag = "v0.14.0", git = "https://github.com/noir-lang/noir_bigcurve" } diff --git a/noir-examples/poseidon-rounds/src/main.nr b/noir-examples/poseidon-rounds/src/main.nr index cfb76de92..b155258aa 100644 --- a/noir-examples/poseidon-rounds/src/main.nr +++ b/noir-examples/poseidon-rounds/src/main.nr @@ -1,8 +1,8 @@ fn main(plains: [Field; 4]) -> pub [Field; 4] { - let mut hash = std::hash::poseidon2_permutation(plains, 4); + let mut hash = std::hash::poseidon2_permutation(plains); let rounds = 1000; for _ in 0..rounds { - hash = std::hash::poseidon2_permutation(hash, 4); + hash = std::hash::poseidon2_permutation(hash); } hash } diff --git a/noir-examples/poseidon2/Nargo.toml b/noir-examples/poseidon2/Nargo.toml index daf9e5f5b..7f7a539ea 100644 --- a/noir-examples/poseidon2/Nargo.toml +++ b/noir-examples/poseidon2/Nargo.toml @@ -4,5 +4,5 @@ type = "bin" compiler_version = ">=1.0.0" [dependencies] -poseidon2 = { tag = "v0.5.0-beta.0", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2"} -poseidon = { tag = "v0.1.1", git = "https://github.com/noir-lang/poseidon" } \ No newline at end of file +poseidon2 = { tag = "v0.6.1", git = "https://github.com/TaceoLabs/noir-poseidon", directory = "poseidon2"} +poseidon = { tag = "v0.3.0", git = "https://github.com/noir-lang/poseidon" } diff --git a/noir-examples/poseidon2/src/bb_poseidon2.nr b/noir-examples/poseidon2/src/bb_poseidon2.nr index be173c88f..477b0f872 100644 --- a/noir-examples/poseidon2/src/bb_poseidon2.nr +++ b/noir-examples/poseidon2/src/bb_poseidon2.nr @@ -4,7 +4,7 @@ pub mod bb { #[export] pub fn bb_perm4(state: [Field; 4]) -> [Field; 4] { - poseidon2_permutation(state, 4) + poseidon2_permutation(state) } } diff --git a/noir-examples/poseidon2/src/main.nr b/noir-examples/poseidon2/src/main.nr index 3a10d99da..5bc00733e 100644 --- a/noir-examples/poseidon2/src/main.nr +++ b/noir-examples/poseidon2/src/main.nr @@ -3,24 +3,24 @@ mod bb_poseidon2; mod ext { pub fn hash_2(xs: [Field; 2]) -> Field { - poseidon2::bn254::hash_2(xs) + poseidon2::bn254::permutation::t2(xs)[0] } pub fn hash_4(xs: [Field; 4]) -> Field { - poseidon2::bn254::hash_4(xs) + poseidon2::bn254::permutation::t4(xs)[0] } pub fn hash_8(xs: [Field; 8]) -> Field { - poseidon2::bn254::hash_8(xs) + poseidon2::bn254::permutation::t8(xs)[0] } pub fn hash_12(xs: [Field; 12]) -> Field { - poseidon2::bn254::hash_12(xs) + poseidon2::bn254::permutation::t12(xs)[0] } pub fn hash_16(xs: [Field; 16]) -> Field { - poseidon2::bn254::hash_16(xs) + poseidon2::bn254::permutation::t16(xs)[0] } } // Return the permuted state publicly fn main(st: pub [Field; 4]) -> pub [Field; 4] { - std::hash::poseidon2_permutation(st, 4) + std::hash::poseidon2_permutation(st) } // ----------------------- Tests ----------------------- diff --git a/provekit/common/src/mavros.rs b/provekit/common/src/mavros.rs index b1205ee2c..1299a5b91 100644 --- a/provekit/common/src/mavros.rs +++ b/provekit/common/src/mavros.rs @@ -14,8 +14,7 @@ pub struct MavrosProver { pub abi: Abi, pub num_public_inputs: usize, pub whir_for_witness: WhirR1CSScheme, - pub witgen_binary: Vec, - pub ad_binary: Vec, + pub binary: Vec, pub constraints_layout: ConstraintsLayout, pub witness_layout: WitnessLayout, pub hash_config: HashConfig, @@ -28,8 +27,7 @@ pub struct MavrosSchemeData { pub num_public_inputs: usize, pub r1cs: R1CS, pub whir_for_witness: WhirR1CSScheme, - pub witgen_binary: Vec, - pub ad_binary: Vec, + pub binary: Vec, pub constraints_layout: ConstraintsLayout, pub witness_layout: WitnessLayout, pub hash_config: HashConfig, diff --git a/provekit/common/src/prover.rs b/provekit/common/src/prover.rs index 654cf9c1c..ee7da9e89 100644 --- a/provekit/common/src/prover.rs +++ b/provekit/common/src/prover.rs @@ -51,8 +51,7 @@ impl Prover { abi: d.abi, num_public_inputs: d.num_public_inputs, whir_for_witness: d.whir_for_witness, - witgen_binary: d.witgen_binary, - ad_binary: d.ad_binary, + binary: d.binary, constraints_layout: d.constraints_layout, witness_layout: d.witness_layout, hash_config: d.hash_config, diff --git a/provekit/prover/src/lib.rs b/provekit/prover/src/lib.rs index 1f5474a9f..97285dda0 100644 --- a/provekit/prover/src/lib.rs +++ b/provekit/prover/src/lib.rs @@ -274,17 +274,17 @@ impl Prove for NoirProver { #[cfg(not(target_arch = "wasm32"))] impl Prove for MavrosProver { #[cfg(feature = "witness-generation")] - fn prove(mut self, input_map: InputMap) -> Result { + fn prove(self, input_map: InputMap) -> Result { provekit_common::register_ntt(); let params = crate::input_utils::ordered_params_from_btreemap(&self.abi, &input_map)?; let phase1 = mavros_interpreter::run_phase1( - &mut self.witgen_binary, + &self.binary, self.witness_layout, self.constraints_layout, ¶ms, - ); - drop(self.witgen_binary); + ) + .context("While running Mavros witness phase 1")?; let num_public_inputs = self.num_public_inputs; let public_inputs = if num_public_inputs == 0 { @@ -375,7 +375,7 @@ impl Prove for MavrosProver { &public_inputs, self.witness_layout, self.constraints_layout, - &self.ad_binary, + &self.binary, ) .context("While proving R1CS instance")?; diff --git a/provekit/prover/src/whir_r1cs.rs b/provekit/prover/src/whir_r1cs.rs index 3b1a5a97e..a5ad00864 100644 --- a/provekit/prover/src/whir_r1cs.rs +++ b/provekit/prover/src/whir_r1cs.rs @@ -1,6 +1,6 @@ use { ::tracing::instrument, - anyhow::{ensure, Result}, + anyhow::{ensure, Context as _, Result}, ark_ff::UniformRand, ark_std::{One, Zero}, provekit_common::{ @@ -73,7 +73,7 @@ pub trait WhirR1CSProver { public_inputs: &PublicInputs, witness_layout: WitnessLayout, constraints_layout: ConstraintsLayout, - ad_binary: &[u64], + binary: &[u64], ) -> Result; } @@ -196,7 +196,7 @@ impl WhirR1CSProver for WhirR1CSScheme { public_inputs: &PublicInputs, witness_layout: WitnessLayout, constraints_layout: ConstraintsLayout, - ad_binary: &[u64], + binary: &[u64], ) -> Result { ensure!(!commitments.is_empty(), "Need at least one commitment"); @@ -220,11 +220,12 @@ impl WhirR1CSProver for WhirR1CSScheme { let eq_alpha = calculate_evaluations_over_boolean_hypercube_for_eq(&alpha, 1 << alpha.len()); let (ad_a, ad_b, ad_c, _) = mavros_vm::interpreter::run_ad( - ad_binary, + binary, &eq_alpha[..constraints_layout.size()], witness_layout, constraints_layout, - ); + ) + .context("While running Mavros AD")?; let alphas = [ad_a, ad_b, ad_c]; let blinding_offset = blinding.offset; diff --git a/provekit/r1cs-compiler/src/noir_proof_scheme.rs b/provekit/r1cs-compiler/src/noir_proof_scheme.rs index 468107e40..396e838d3 100644 --- a/provekit/r1cs-compiler/src/noir_proof_scheme.rs +++ b/provekit/r1cs-compiler/src/noir_proof_scheme.rs @@ -123,9 +123,8 @@ impl NoirCompiler { #[derive(Deserialize)] struct BasicArtifacts { - abi: noirc_abi::Abi, - ad_binary: Vec, - witgen_binary: Vec, + abi: noirc_abi::Abi, + binary: Vec, } pub struct MavrosCompiler; @@ -188,8 +187,7 @@ impl MavrosCompiler { abi, num_public_inputs, whir_for_witness, - witgen_binary: basic.witgen_binary, - ad_binary: basic.ad_binary, + binary: basic.binary, r1cs, constraints_layout: mavros_r1cs.constraints_layout, witness_layout: mavros_r1cs.witness_layout, diff --git a/scripts/run_csp_benchmarks.sh b/scripts/run_csp_benchmarks.sh index 912b49019..6e90cdd4a 100755 --- a/scripts/run_csp_benchmarks.sh +++ b/scripts/run_csp_benchmarks.sh @@ -13,6 +13,8 @@ # BENCH_RUNS Iterations to average (default: 3) # TEST_FILTER Regex on circuit name # MAX_TESTS Cap on circuits (0 = unlimited) +# REQUIRED_NARGO_VERSION +# Nargo version string to require (default: 1.0.0-beta.20) # # Output: BENCH_DIR/results.csv with one row per circuit: # circuit,num_constraints,num_witnesses,prover_time_ms,prover_peak_rss_kb, @@ -31,6 +33,7 @@ BENCH_DIR="${BENCH_DIR:-${REPO_ROOT}/csp-bench-logs}" BENCH_RUNS="${BENCH_RUNS:-3}" TEST_FILTER="${TEST_FILTER:-}" MAX_TESTS="${MAX_TESTS:-0}" +REQUIRED_NARGO_VERSION="${REQUIRED_NARGO_VERSION:-1.0.0-beta.20}" if [[ "${BENCH_DIR}" != /* ]]; then BENCH_DIR="${REPO_ROOT}/${BENCH_DIR}" @@ -52,6 +55,14 @@ if ! command -v nargo >/dev/null 2>&1; then exit 1 fi +nargo_version="$(nargo --version)" +if [[ "${nargo_version}" != *"${REQUIRED_NARGO_VERSION}"* ]]; then + echo "ERROR: unsupported nargo version: ${nargo_version}" >&2 + echo "Expected version containing: ${REQUIRED_NARGO_VERSION}" >&2 + echo "Switch with: noirup --version v${REQUIRED_NARGO_VERSION}" >&2 + exit 1 +fi + if ! python3 -c "import tomllib" 2>/dev/null; then echo "ERROR: python3.11+ is required (tomllib not found)." >&2 echo "Current: $(python3 --version 2>&1)" >&2 @@ -62,7 +73,7 @@ fi # builtin so users may need `gtime` from `brew install gnu-time`. CI runs on # ubuntu-24.04-arm where /usr/bin/time is GNU. TIME_BIN="" -if [[ -x /usr/bin/time ]]; then +if [[ -x /usr/bin/time ]] && /usr/bin/time -f '%e %M' -o /dev/null true >/dev/null 2>&1; then TIME_BIN=/usr/bin/time elif command -v gtime >/dev/null 2>&1; then TIME_BIN="$(command -v gtime)" diff --git a/tooling/cli/src/cmd/prepare.rs b/tooling/cli/src/cmd/prepare.rs index bcfd34d91..8d6ded98f 100644 --- a/tooling/cli/src/cmd/prepare.rs +++ b/tooling/cli/src/cmd/prepare.rs @@ -178,6 +178,7 @@ impl Args { let artifacts = report_errors( collect_errors(program_results), &file_manager, + &parsed_files, options.deny_warnings, options.silence_warnings, )?; diff --git a/tooling/provekit-bench/benches/poseidon_rounds.json b/tooling/provekit-bench/benches/poseidon_rounds.json index 1c9a4f438..b9021cc0b 100644 --- a/tooling/provekit-bench/benches/poseidon_rounds.json +++ b/tooling/provekit-bench/benches/poseidon_rounds.json @@ -1 +1 @@ -{"noir_version":"1.0.0-beta.19+74d6be658e1ad252f87943292ba09bdd4da80bd4","hash":"8794065668680260977","abi":{"parameters":[{"name":"plains","type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"private"},{"name":"result","type":{"kind":"field"},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"},"error_types":{}},"bytecode":"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","debug_symbols":"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","file_map":{"19":{"source":"// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n // we use the unsafe version because the multi_scalar_mul will constrain the scalars.\n points[i] = from_field_unsafe(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n crate::assert_constant(separator);\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = from_field_unsafe(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\n#[field(bn254)]\n// Decompose the input 'bn254 scalar' into two 128 bits limbs.\n// It is called 'unsafe' because it does not assert the limbs are 128 bits\n// Assuming the limbs are 128 bits:\n// Assert the decomposition does not overflow the field size.\nfn from_field_unsafe(scalar: Field) -> EmbeddedCurveScalar {\n // Safety: xlo and xhi decomposition is checked below\n let (xlo, xhi) = unsafe { crate::field::bn254::decompose_hint(scalar) };\n // Check that the decomposition is correct\n assert_eq(scalar, xlo + crate::field::bn254::TWO_POW_128 * xhi);\n // Check that the decomposition does not overflow the field size\n let (a, b) = if xhi == crate::field::bn254::PHI {\n (xlo, crate::field::bn254::PLO)\n } else {\n (xhi, crate::field::bn254::PHI)\n };\n crate::field::bn254::assert_lt(a, b);\n\n EmbeddedCurveScalar { lo: xlo, hi: xhi }\n}\n\npub fn poseidon2_permutation(input: [Field; N], state_len: u32) -> [Field; N] {\n assert_eq(input.len(), state_len);\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal(input: [Field; N]) -> [Field; N] {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u1 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n is_infinite: false,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n is_infinite: false,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n is_infinite: false,\n },\n );\n}\n","path":"std/hash/mod.nr"},"51":{"source":"fn main(plains: [Field; 4], result: Field) -> pub [Field; 4] {\n let mut hash = std::hash::poseidon2_permutation(plains, 4);\n let rounds = 1000;\n for _ in 0..rounds {\n hash = std::hash::poseidon2_permutation(hash, 4);\n }\n hash\n}\n","path":"/Volumes/SenpaisSSD/zkVms/proveKit/cspbenchmarks/provekit/noir-examples/poseidon-rounds/src/main.nr"}}} \ No newline at end of file +{"noir_version":"1.0.0-beta.20+b4236c1957d0c26cb65d82adc9e5447b6ff1d629","hash":"17742403151851973025","abi":{"parameters":[{"name":"plains","type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"private"}],"return_type":{"abi_type":{"kind":"array","length":4,"type":{"kind":"field"}},"visibility":"public"},"error_types":{}},"bytecode":"H4sIAAAAAAAA/7XZXbi2Y1v2fef+dezfBx6EEEIIIYQQQgihixBCCOHGfRFCCCGEBiGEEEIIIYQQOlchhBBCCCGE8LxbM2OsU+/7vNuyPGPZJ/4TY2zr7DiWn73wgj+69rB9Dz4c45+/aj865bbND933139z8x8cu9XRh//6z+976KGn3LnjD354wMH7/+DwtXc84KjDjp6/7/yDf3D4hTOn/NmvHDz/8AN++MMFZmsyW2a27ExMuSjOxtlKs5Vnq8zU1kfF2Tpbbbb6bI0zCy608P9SnF1wthaarYVn63/NLLLoYj+iOLvIbC06W4vN1o/MLL7Ekj+qOLv4bC0xW0vO1o/OLLX0Mj+mOLvUbC09W8vM1o/NLLvc8j+uOLvsbC03W8vP1o/PrLDiSj+hOLvCbK04WyvN1k/MrLzKqj+pOLvybK0yW6vO1k/OrLb6Gj+lOLvabK0+W2vM1k/NrLnW2j+tOLvmbK01W2vP1k/PrLPuej+jOLvObK07W+vN1s/MrL/Bhj+rOLv+bG0wWxvO1s/ObLTxJj+nOLvRbG08W5vM1s/NbLrZ5j+vOLvpbG02W5vP1s/PbLHlVr+gOLvFbG05W1vN1i/MbL3Ntr+oOLv1bG0zW9vO1i/ObLf9Dr+kOLvdbG0/WzvM1i/N7LjTzr+sOLvjbO00WzvP1i/PzNtl119RnJ03W7vM1q6z9Sszu+2+x68qzu42W7vP1h6z9asze+61968pzu45W3vN1t6z9Wsz++y7368rzu4zW/vO1n6z9esz+x9w4G8ozu4/WwfM1oGz9RszBx18yG8qzh40WwfP1iGz9Zszhx52+A8UZw+drcNm6/DZ+sHMEUce9UPF2SNm68jZOmq2fjgz/+hjfktxdv5sHT1bx8zWb80ce9zxv604e+xsHTdbx8/Wb8+ccOJJv6M4e8JsnThbJ83W78xMT56eMj11+ruK09OT5/KUuTx1Ln93Znra9PTpGdPf05w/bS5Pn8sz5vL3ZqZnTs+anj39fc35M+fyrLk8ey5/f2Z6zvTc6XnTP9CcP2cuz53L8+byD2am508vmF44/UPN+fPn8oK5vHAu/3BmOjO9aHrx9I805ykvmsuL5/KPZqaXTC+dXjb9Y835S+by0rm8bC7/eGZ6+fSK6ZXTP9Gcv3wur5jLK+fyT2amV02vnl4z/VPN+avm8uq5vGYu/3Rmeu30uun10z/TnL92Lq+by+vn8s9mpjdMb5zeNP1zzfkb5vLGubxpLv98Znrz9JbprdO/0Jy/eS5vmctb5/IvZqa3TW+f3jH9S8352+by9rm8Yy7/cmZ65/Su6d3Tv9Kcv3Mu75rLu+fyr2am90zvnd43/WvN+Xvm8t65vG8u/3pmev/0gemD07/RnL9/Lh+Yywfn8m9mpg9NH54+Mv1bzfmH5vLhuXxkLv92Zvro9LHp49O/05x/dC4fm8vH5/LvZqZPTJ+cPjX9e835J+byybl8ai7/fmY6nWL69PQfNOenc4m5fHou/2Fm+sz02elz03/UnH9mLp+dy+fm8h9nps9PX5i+OP0nzfnn5/KFuXxxLv9pZvrS9OXpK9N/1px/aS5fnstX5vKfZ6avTl+bvj79F835V+fytbl8fS7/ZWb6xvTN6VvTf9Wcf2Mu35zLt+byX2emb0/fmb47/TfN+bfn8p25fHcu/21m+t70/ekH03/XnH9vLt+fyw/m8t9nph9OP5p+PP0PzfkP5/Kjufx4Lv9jZvrJ9NPpZ9P/1Jz/ZC4/ncvP5vI/Z6afT7+Yfjn9L835z+fyi7n8ci7/a2b61fTr6TfT/9ac/2ouv57Lb+byv2em306/m34//d+a89/O5Xdz+f1c/u8ZTBbAZIKJwcQqJuTPqSfUhtrKjMPEYxIwGVQzjtpTB+pBZiImCZOMSVHNROpEnamLzFRMGiYdk1E1U6kbdaceZWZBTBbCZGFM/pdqZkHqhagXpv5fMrMIJotishgmP6KaWYR6UerFqH9EZhbHZAlMlsTkR1Uzi1MvQb0k9Y/KzFKYLI3JMpj8mGpmKeqlqZeh/jGZWRaT5TBZHpMfV80sS70c9fLUPy4zK2CyIiYrYfITqpkVqFekXon6J2RmZUxWwWRVTH5SNbMy9SrUq1L/pMyshsnqmKyByU+pZlajXp16Deqfkpk1MVkLk7Ux+WnVzJrUa1GvTf3TMrMOJutish4mP6OaWYd6Xer1qH9GZtbHZANMNsTkZ1Uz61NvQL0h9c/KzEaYbIzJJpj8nGpmI+qNqTeh/jmZ2RSTzTDZHJOfV81sSr0Z9ebUPy8zW2CyJSZbYfILqpktqLek3or6F2Rma0y2wWRbTH5RNbM19TbU21L/osxsh8n2mOyAyS+pZraj3p56B+pfkpkdMdkJk50x+WXVzI7UO1HvTP3LMjMPk10w2RWTX1HNzKPehXpX6l+Rmd0w2R2TPTD5VdXMbtS7U+9B/asysycme2GyNya/pprZk3ov6r2pf01m9sFkX0z2w+TXVTP7UO9LvR/1r8vM/pgcgMmBmPyGamZ/6gOoD6T+DZk5CJODMTkEk99UzRxEfTD1IdS/KTOHYnIYJodj8gPVzKHUh1EfTv0DmTkCkyMxOQqTH6pmjqA+kvoo6h/KzHxMjsbkGEx+SzUzn/po6mOof0tmjsXkOEyOx+S3VTPHUh9HfTz1b8vMCZiciMlJmPyOauYE6hOpT6L+HZk5GZNTMDkVk99VzZxMfQr1qdS/KzOnYXI6Jmdg8nuqmdOoT6c+g/r3ZOZMTM7C5GxMfl81cyb1WdRnU/++zJyDybmYnIfJH6hmzqE+l/o86j+QmfMxuQCTCzH5Q9XM+dQXUF9I/YcyI+8iTC7G5I9UM9wXUV9M/UeycQkml2JyGSZ/rJq5hPpS6suo/1hmLsfkCkyuxORPVDOXU19BfSX1n8jMVZhcjck1mPypauYq6qupr6H+U5m5FpPrMLkekz9TzVxLfR319dR/JjM3YHIjJjdh8ueqmRuob6S+ifrPZeZmTG7B5FZM/kI1czP1LdS3Uv+FzNyGye2Y3IHJX6pmbqO+nfoO6r+UmTsxuQuTuzH5K9XMndR3Ud9N/Vcycw8m92JyHyZ/rZq5h/pe6vuo/1pm7sfkAUwexORvVDP3Uz9A/SD138jMQ5g8jMkjmPytauYh6oepH6H+W5l5FJPHMHkck79TzTxK/Rj149R/JzNPYPIkJk9h8veqmSeon6R+ivrvZWaKCTB5GpN/UM1MqUH9NPU/yMwzmDyLyXOY/KNq5hnqZ6mfo/5HmXkekxcweRGTf1LNPE/9AvWL1P8kMy9h8jImr2Dyz6qZl6hfpn6F+p9l5lVMXsPkdUz+RTXzKvVr1K9T/4vMvIHJm5i8hcm/qmbeoH6T+i3qf5WZtzF5B5N3Mfk31czb1O9Qv0v9bzLzHibvY/IBJv+umnmP+n3qD6j/XWY+xOQjTD7G5D9UMx9Sf0T9MfV/yMwnmHyKyWeY/Kdq5hPqT6k/o/5Pmfkcky8w+RKT/1LNfE79BfWX1P8lM19h8jUm32Dy36qZr6i/pv6G+r9l5ltMvsPke0z+t2rmW+rvqL+nFr8xC8BMYAyMym8M+Y0hvzHkN0b8xjgYDxNgVH5jyG8M+Y0hvzHiNybCJJgMo/IbQ35jyG8M+Y0RvzEVpsF0GJXfGPIbQ35jyG+M+I1ZEGYhmIVhVH5jyG8M+Y0hvzHiN2YRmEVhFoNR+Y1ZhJr8xpDfGPEbszjMEjBLwqj8xpDfGPIbQ35jxG/MUjBLwywDo/IbQ35jyG8M+Y0RvzHLwiwHszyMym8M+Y0hvzHkN0b8xqwAsyLMSjAqvzHkN4b8xpDfGPEbszLMKjCrwqj8xpDfGPIbQ35jxG/MajCrw6wBo/IbQ35jyG8M+Y0RvzFrwqwFszaMym8M+Y0hvzHkN0b8xqwDsy7MejAqvzHrUJPfGPIbI35j1ofZAGZDGJXfGPIbQ35jyG+M+I3ZCGZjmE1gVH5jyG8M+Y0hvzHiN2ZTmM1gNodR+Y0hvzHkN4b8xojfmC1gtoTZCkblN4b8xpDfGPIbI35jtobZBmZbGJXfGPIbQ35jyG+M+I3ZDmZ7mB1gVH5jyG8M+Y0hvzHiN2ZHmJ1gdoZR+Y0hvzHkN4b8xojfmHkwu8DsCqPyGzOPmvzGkN8Y8RuzG8zuMHvAqPzGkN8Y8htDfmPEb8yeMHvB7A2j8htDfmPIbwz5jRG/MfvA7AuzH4zKbwz5jSG/MeQ3RvzG7A9zAMyBMCq/MeQ3hvzGkN8Y8RtzEMzBMIfAqPzGkN8Y8htDfmPEb8yhMIfBHA6j8htDfmPIbwz5jRG/MUfAHAlzFIzKbwz5jSG/MeQ3RvzGzIc5GuYYGJXfmPnU5DeG/MaI35hjYY6DOR5G5TeG/MaQ3xjyGyN+Y06AORHmJBiV3xjyG0N+Y8hvjPiNORnmFJhTYVR+Y8hvDPmNIb8x4jfmNJjTYc6AUfmNIb8x5DeG/MaI35gzYc6CORtG5TeG/MaQ3xjyGyN+Y86BORfmPBiV3xjyG0N+Y8hvjPiNOR/mApgLYVR+Y8hvDPmNIb8x4jdG3kUwF8Oo/MZwk98Y8hsjfmMugbkU5jIYld8Y8htDfmPIb4z4jbkc5gqYK2FUfmPIbwz5jSG/MeI35iqYq2GugVH5jSG/MeQ3hvzGiN+Ya2Gug7keRuU3hvzGkN8Y8hsjfmNugLkR5iYYld8Y8htDfmPIb4z4jbkZ5haYW2FUfmPIbwz5jSG/MeI35jaY22HugFH5jSG/MeQ3hvzGiN+YO2HugrkbRuU35k5q8htDfmPEb8w9MPfC3Aej8htDfmPIbwz5jRG/MffDPADzIIzKbwz5jSG/MeQ3RvzGPATzMMwjMCq/MeQ3hvzGkN8Y8RvzKMxjMI/DqPzGkN8Y8htDfmPEb8wTME/CPAWj8htDfmPIbwz5jRG/MVMYwDwNo/IbQ35jyG8M+Y0RvzHPwDwL8xyMym8M+Y0hvzHkN0b8xjwP8wLMizAqvzHPU5PfGPIbI35jXoJ5GeYVGJXfGPIbQ35jyG+M+I15FeY1mNdhVH5jyG8M+Y0hvzHiN+YNmDdh3oJR+Y0hvzHkN4b8xojfmLdh3oF5F0blN4b8xpDfGPIbI35j3oN5H+YDGJXfGPIbQ35jyG+M+I35EOYjmI9hVH5jyG8M+Y0hvzHiN+YTmE9hPoNR+Y0hvzHkN4b8xojfmM9hvoD5EkblN+ZzavIbQ35jxG/MVzBfw3wDo/IbQ35jyG8M+Y0RvzHfwnwH8z2Mym8M+Y0hvzHkN0b8xi4AO4E1sCq/seQ3lvzGkt9Y8RvrYD1sgFX5jSW/seQ3lvzGit/YCJtgM6zKbyz5jSW/seQ3VvzGVtgG22FVfmPJbyz5jSW/seI3dkHYhWAXhlX5jSW/seQ3lvzGit/YRWAXhV0MVuU3dhFq8htLfmPFb+zisEvALgmr8htLfmPJbyz5jRW/sUvBLg27DKzKbyz5jSW/seQ3VvzGLgu7HOzysCq/seQ3lvzGkt9Y8Ru7AuyKsCvBqvzGkt9Y8htLfmPFb+zKsKvArgqr8htLfmPJbyz5jRW/savBrg67BqzKbyz5jSW/seQ3VvzGrgm7FuzasCq/seQ3lvzGkt9Y8Ru7Duy6sOvBqvzGrkNNfmPJb6z4jV0fdgPYDWFVfmPJbyz5jSW/seI3diPYjWE3gVX5jSW/seQ3lvzGit/YTWE3g90cVuU3lvzGkt9Y8hsrfmO3gN0SditYld9Y8htLfmPJb6z4jd0adhvYbWFVfmPJbyz5jSW/seI3djvY7WF3gFX5jSW/seQ3lvzGit/YHWF3gt0ZVuU3lvzGkt9Y8hsrfmPnwe4Cuyusym/sPGryG0t+Y8Vv7G6wu8PuAavyG0t+Y8lvLPmNFb+xe8LuBbs3rMpvLPmNJb+x5DdW/MbuA7sv7H6wKr+x5DeW/MaS31jxG7s/7AGwB8Kq/MaS31jyG0t+Y8Vv7EGwB8MeAqvyG0t+Y8lvLPmNFb+xh8IeBns4rMpvLPmNJb+x5DdW/MYeAXsk7FGwKr+x5DeW/MaS31jxGzsf9mjYY2BVfmPnU5PfWPIbK35jj4U9DvZ4WJXfWPIbS35jyW+s+I09AfZE2JNgVX5jyW8s+Y0lv7HiN/Zk2FNgT4VV+Y0lv7HkN5b8xorf2NNgT4c9A1blN5b8xpLfWPIbK35jz4Q9C/ZsWJXfWPIbS35jyW+s+I09B/Zc2PNgVX5jyW8s+Y0lv7HiN/Z82AtgL4RV+Y0lv7HkN5b8xorf/M/n50WwF8Oq/MZyk99Y8hsrfmMvgb0U9jJYld9Y8htLfmPJb6z4jb0c9grYK2FVfmPJbyz5jSW/seI39irYq2GvgVX5jSW/seQ3lvzGit/Ya2Gvg70eVuU3lvzGkt9Y8hsrfmNvgL0R9iZYld9Y8htLfmPJb6z4jb0Z9hbYW2FVfmPJbyz5jSW/seI39jbY22HvgFX5jSW/seQ3lvzGit/YO2Hvgr0bVuU39k5q8htLfmPFb+w9sPfC3ger8htLfmPJbyz5jRW/sffDPgD7IKzKbyz5jSW/seQ3VvzGPgT7MOwjsCq/seQ3lvzGkt9Y8Rv7KOxjsI/DqvzGkt9Y8htLfmPFb+wTsE/CPgWr8htLfmPJbyz5jRW/sVNYwD4Nq/IbS35jyW8s+Y0Vv7HPwD4L+xysym8s+Y0lv7HkN1b8xj4P+wLsi7Aqv7HPU5PfWPIbK35jX4J9GfYVWJXfWPIbS35jyW+s+I19FfY12NdhVX5jyW8s+Y0lv7HiN/YN2Ddh34JV+Y0lv7HkN5b8xorf2Ldh34F9F1blN5b8xpLfWPIbK35j34N9H/YDWJXfWPIbS35jyW+s+I39EPYj2I9hVX5jyW8s+Y0lv7HiN/YT2E9hP4NV+Y0lv7HkN5b8xorf2M9hv4D9ElblN/ZzavIbS35jxW/sV7Bfw34Dq/IbS35jyW8s+Y0Vv7Hfwn4H+z2sym8s+Y0lv7HkN1b8xi0AN4EzcCq/ceQ3jvzGkd84+QfaOTgPF+BUfuPIbxz5jSO/ceI3LsIluAyn8htHfuPIbxz5jRO/cRWuwXU4ld848htHfuPIb5z4jVsQbiG4heFUfuPIbxz5jSO/ceI3bhG4ReEWg1P5jVuEmvzGkd848Ru3ONwScEvCqfzGkd848htHfuPEb9xScEvDLQOn8htHfuPIbxz5jRO/ccvCLQe3PJzKbxz5jSO/ceQ3TvzGrQC3ItxKcCq/ceQ3jvzGkd848Ru3MtwqcKvCqfzGkd848htHfuPEb9xqcKvDrQGn8htHfuPIbxz5jRO/cWvCrQW3NpzKbxz5jSO/ceQ3TvzGrQO3Ltx6cCq/cetQk9848hsnfuPWh9sAbkM4ld848htHfuPIb5z4jdsIbmO4TeBUfuPIbxz5jSO/ceI3blO4zeA2h1P5jSO/ceQ3jvzGid+4LeC2hNsKTuU3jvzGkd848hsnfuO2htsGbls4ld848htHfuPIb5z4jdsObnu4HeBUfuPIbxz5jSO/ceI3bke4neB2hlP5jSO/ceQ3jvzGid+4eXC7wO0Kp/IbN4+a/MaR3zjxG7cb3O5we8Cp/MaR3zjyG0d+48Rv3J5we8HtDafyG0d+48hvHPmNE79x+8DtC7cfnMpvHPmNI79x5DdO/MbtD3cA3IFwKr9x5DeO/MaR3zjxG3cQ3MFwh8Cp/MaR3zjyG0d+48Rv3KFwh8EdDqfyG0d+48hvHPmNE79xR8AdCXcUnMpvHPmNI79x5DdO/MbNhzsa7hg4ld+4+dTkN478xonfuGPhjoM7Hk7lN478xpHfOPIbJ37jToA7Ee4kOJXfOPIbR37jyG+c+I07Ge4UuFPhVH7jyG8c+Y0jv3HiN+40uNPhzoBT+Y0jv3HkN478xonfuDPhzoI7G07lN478xpHfOPIbJ37jzoE7F+48OJXfOPIbR37jyG+c+I07H+4CuAvhVH7jyG8c+Y0jv3HiN07eRXAXw6n8xnGT3zjyGyd+4y6BuxTuMjiV3zjyG0d+48hvnPiNuxzuCrgr4VR+48hvHPmNI79x4jfuKrir4a6BU/mNI79x5DeO/MaJ37hr4a6Dux5O5TeO/MaR3zjyGyd+426AuxHuJjiV3zjyG0d+48hvnPiNuxnuFrhb4VR+48hvHPmNI79x4jfuNrjb4e6AU/mNI79x5DeO/MaJ37g74e6CuxtO5TfuTmryG0d+48Rv3D1w98LdB6fyG0d+48hvHPmNE79x98M9APcgnMpvHPmNI79x5DdO/MY9BPcw3CNwKr9x5DeO/MaR3zjxG/co3GNwj8Op/MaR3zjyG0d+48Rv3BNwT8I9BafyG0d+48hvHPmNE79xUzjAPQ2n8htHfuPIbxz5jRO/cc/APQv3HJzKbxz5jSO/ceQ3TvzGPQ/3AtyLcCq/cc9Tk9848hsnfuNegnsZ7hU4ld848htHfuPIb5z4jXsV7jW41+FUfuPIbxz5jSO/ceI37g24N+HeglP5jSO/ceQ3jvzGid+4t+HegXsXTuU3jvzGkd848hsnfuPeg3sf7gM4ld848htHfuPIb5z4jfsQ7iO4j+FUfuPIbxz5jSO/ceI37hO4T+E+g1P5jSO/ceQ3jvzGid+4z+G+gPsSTuU37nNq8htHfuPEb9xXcF/DfQOn8htHfuPIbxz5jRO/cd/CfQf3PZzKbxz5jSO/ceQ3TvzGLwA/gTfwKr/x5Dee/MaT33jxG+/gPXyAV/mNJ7/x5Dee/MaL3/gIn+AzvMpvPPmNJ7/x5Dde/MZX+Abf4VV+48lvPPmNJ7/x4jd+QfiF4BeGV/mNJ7/x5Dee/MaL3/hF4BeFXwxe5Td+EWryG09+48Vv/OLwS8AvCa/yG09+48lvPPmNF7/xS8EvDb8MvMpvPPmNJ7/x5Dde/MYvC78c/PLwKr/x5Dee/MaT33jxG78C/IrwK8Gr/MaT33jyG09+48Vv/Mrwq8CvCq/yG09+48lvPPmNF7/xq8GvDr8GvMpvPPmNJ7/x5Dde/MavCb8W/NrwKr/x5Dee/MaT33jxG78O/Lrw68Gr/MavQ01+48lvvPiNXx9+A/gN4VV+48lvPPmNJ7/x4jd+I/iN4TeBV/mNJ7/x5Dee/MaL3/hN4TeD3xxe5Tee/MaT33jyGy9+47eA3xJ+K3iV33jyG09+48lvvPiN3xp+G/ht4VV+48lvPPmNJ7/x4jd+O/jt4XeAV/mNJ7/x5Dee/MaL3/gd4XeC3xle5Tee/MaT33jyGy9+4+fB7wK/K7zKb/w8avIbT37jxW/8bvC7w+8Br/IbT37jyW88+Y0Xv/F7wu8Fvze8ym88+Y0nv/HkN178xu8Dvy/8fvAqv/HkN578xpPfePEbvz/8AfAHwqv8xpPfePIbT37jxW/8QfAHwx8Cr/IbT37jyW88+Y0Xv/GHwh8Gfzi8ym88+Y0nv/HkN178xh8BfyT8UfAqv/HkN578xpPfePEbPx/+aPhj4FV+4+dTk9948hsvfuOPhT8O/nh4ld948htPfuPJb7z4jT8B/kT4k+BVfuPJbzz5jSe/8eI3/mT4U+BPhVf5jSe/8eQ3nvzGi9/40+BPhz8DXuU3nvzGk9948hsvfuPPhD8L/mx4ld948htPfuPJb7z4jT8H/lz48+BVfuPJbzz5jSe/8eI3/nz4C+AvhFf5jSe/8eQ3nvzGi994eRfBXwyv8hvPTX7jyW+8+I2/BP5S+MvgVX7jyW88+Y0nv/HiN/5y+Cvgr4RX+Y0nv/HkN578xovf+Kvgr4a/Bl7lN578xpPfePIbL37jr4W/Dv56eJXfePIbT37jyW+8+I2/Af5G+JvgVX7jyW88+Y0nv/HiN/5m+Fvgb4VX+Y0nv/HkN578xovf+Nvgb4e/A17lN578xpPfePIbL37j74S/C/5ueJXf+DupyW88+Y0Xv/H3wN8Lfx+8ym88+Y0nv/HkN178xt8P/wD8g/Aqv/HkN578xpPfePEb/xD8w/CPwKv8xpPfePIbT37jxW/8o/CPwT8Or/IbT37jyW88+Y0Xv/FPwD8J/xS8ym88+Y0nv/HkN178xk/hAf80vMpvPPmNJ7/x5Dde/MY/A/8s/HPwKr/x5Dee/MaT33jxG/88/AvwL8Kr/MY/T01+48lvvPiNfwn+ZfhX4FV+48lvPPmNJ7/x4jf+VfjX4F+HV/mNJ7/x5Dee/MaL3/g34N+Efwte5Tee/MaT33jyGy9+49+Gfwf+XXiV33jyG09+48lvvPiNfw/+ffgP4FV+48lvPPmNJ7/x4jf+Q/iP4D+GV/mNJ7/x5Dee/MaL3/hP4D+F/wxe5Tee/MaT33jyGy9+4z+H/wL+S3iV3/jPqclvPPmNF7/xX8F/Df8NvMpvPPmNJ7/x5Dde/MZ/C/8d/PfwKr/x5Dee/MaT33jxm7AAwgTBIKj8JpDfBPKbQH4TxG+CQ/AIAUHlN4H8JpDfBPKbIH4TIkJCyAgqvwnkN4H8JpDfBPGbUBEaQkdQ+U0gvwnkN4H8JojfhAURFkJYGEHlN4H8JpDfBPKbIH4TFkFYFGExBJXfhEWoyW8C+U0QvwmLIyyBsCSCym8C+U0gvwnkN0H8JiyFsDTCMggqvwnkN4H8JpDfBPGbsCzCcgjLI6j8JpDfBPKbQH4TxG/CCggrIqyEoPKbQH4TyG8C+U0QvwkrI6yCsCqCym8C+U0gvwnkN0H8JqyGsDrCGggqvwnkN4H8JpDfBPGbsCbCWghrI6j8JpDfBPKbQH4TxG/COgjrIqyHoPKbsA41+U0gvwniN2F9hA0QNkRQ+U0gvwnkN4H8JojfhI0QNkbYBEHlN4H8JpDfBPKbIH4TNkXYDGFzBJXfBPKbQH4TyG+C+E3YAmFLhK0QVH4TyG8C+U0gvwniN2FrhG0QtkVQ+U0gvwnkN4H8JojfhO0QtkfYAUHlN4H8JpDfBPKbIH4TdkTYCWFnBJXfBPKbQH4TyG+C+E2Yh7ALwq4IKr8J86jJbwL5TRC/Cbsh7I6wB4LKbwL5TSC/CeQ3Qfwm7ImwF8LeCCq/CeQ3gfwmkN8E8ZuwD8K+CPshqPwmkN8E8ptAfhPEb8L+CAcgHIig8ptAfhPIbwL5TRC/CQchHIxwCILKbwL5TSC/CeQ3QfwmHIpwGMLhCCq/CeQ3gfwmkN8E8ZtwBMKRCEchqPwmkN8E8ptAfhPEb8J8hKMRjkFQ+U2YT01+E8hvgvhNOBbhOITjEVR+E8hvAvlNIL8J4jfhBIQTEU5CUPlNIL8J5DeB/CaI34STEU5BOBVB5TeB/CaQ3wTymyB+E05DOB3hDASV3wTym0B+E8hvgvhNOBPhLISzEVR+E8hvAvlNIL8J4jfhHIRzEc5DUPlNIL8J5DeB/CaI34TzES5AuBBB5TeB/CaQ3wTymyB+E+RdhHAxgspvAjf5TSC/CeI34RKESxEuQ1D5TSC/CeQ3gfwmiN+EyxGuQLgSQeU3gfwmkN8E8psgfhOuQrga4RoEld8E8ptAfhPIb4L4TbgW4TqE6xFUfhPIbwL5TSC/CeI34QaEGxFuQlD5TSC/CeQ3gfwmiN+EmxFuQbgVQeU3gfwmkN8E8psgfhNuQ7gd4Q4Eld8E8ptAfhPIb4L4TbgT4S6EuxFUfhPupCa/CeQ3Qfwm3INwL8J9CCq/CeQ3gfwmkN8E8ZtwP8IDCA8iqPwmkN8E8ptAfhPEb8JDCA8jPIKg8ptAfhPIbwL5TRC/CY8iPIbwOILKbwL5TSC/CeQ3QfwmPIHwJMJTCCq/CeQ3gfwmkN8E8ZswRQDC0wgqvwnkN4H8JpDfBPGb8AzCswjPIaj8JpDfBPKbQH4TxG/C8wgvILyIoPKb8Dw1+U0gvwniN+ElhJcRXkFQ+U0gvwnkN4H8JojfhFcRXkN4HUHlN4H8JpDfBPKbIH4T3kB4E+EtBJXfBPKbQH4TyG+C+E14G+EdhHcRVH4TyG8C+U0gvwniN+E9hPcRPkBQ+U0gvwnkN4H8JojfhA8RPkL4GEHlN4H8JpDfBPKbIH4TPkH4FOEzBJXfBPKbQH4TyG+C+E34HOELhC8RVH4TPqcmvwnkN0H8JnyF8DXCNwgqvwnkN4H8JpDfBPGb8C3CdwjfI6j8JpDfBPKbQH4TxG+GBTBMMBgMKr8ZyG8G8puB/GYQvxkcBo8hYFD5zUB+M5DfDOQ3g/jNEDEkDBmDym8G8puB/GYgvxnEb4aKoWHoGFR+M5DfDOQ3A/nNIH4zLIhhIQwLY1D5zUB+M5DfDOQ3g/jNsAiGRTEshkHlN8Mi1OQ3A/nNIH4zLI5hCQxLYlD5zUB+M5DfDOQ3g/jNsBSGpTEsg0HlNwP5zUB+M5DfDOI3w7IYlsOwPAaV3wzkNwP5zUB+M4jfDCtgWBHDShhUfjOQ3wzkNwP5zSB+M6yMYRUMq2JQ+c1AfjOQ3wzkN4P4zbAahtUxrIFB5TcD+c1AfjOQ3wziN8OaGNbCsDYGld8M5DcD+c1AfjOI3wzrYFgXw3oYVH4zrENNfjOQ3wziN8P6GDbAsCEGld8M5DcD+c1AfjOI3wwbYdgYwyYYVH4zkN8M5DcD+c0gfjNsimEzDJtjUPnNQH4zkN8M5DeD+M2wBYYtMWyFQeU3A/nNQH4zkN8M4jfD1hi2wbAtBpXfDOQ3A/nNQH4ziN8M22HYHsMOGFR+M5DfDOQ3A/nNIH4z7IhhJww7Y1D5zUB+M5DfDOQ3g/jNMA/DLhh2xaDym2EeNfnNQH4ziN8Mu2HYHcMeGFR+M5DfDOQ3A/nNIH4z7IlhLwx7Y1D5zUB+M5DfDOQ3g/jNsA+GfTHsh0HlNwP5zUB+M5DfDOI3w/4YDsBwIAaV3wzkNwP5zUB+M4jfDAdhOBjDIRhUfjOQ3wzkNwP5zSB+MxyK4TAMh2NQ+c1AfjOQ3wzkN4P4zXAEhiMxHIVB5TcD+c1AfjOQ3wziN8N8DEdjOAaDym+G+dTkNwP5zSB+MxyL4TgMx2NQ+c1AfjOQ3wzkN4P4zXAChhMxnIRB5TcD+c1AfjOQ3wziN8PJGE7BcCoGld8M5DcD+c1AfjOI3wynYTgdwxkYVH4zkN8M5DcD+c0gfjOcieEsDGdjUPnNQH4zkN8M5DeD+M1wDoZzMZyHQeU3A/nNQH4zkN8M4jfD+RguwHAhBpXfDOQ3A/nNQH4ziN/8z3fhRRguxqDym4Gb/GYgvxnEb4ZLMFyK4TIMKr8ZyG8G8puB/GYQvxkux3AFhisxqPxmIL8ZyG8G8ptB/Ga4CsPVGK7BoPKbgfxmIL8ZyG8G8ZvhWgzXYbgeg8pvBvKbgfxmIL8ZxG+GGzDciOEmDCq/GchvBvKbgfxmEL8ZbsZwC4ZbMaj8ZiC/GchvBvKbQfxmuA3D7RjuwKDym4H8ZiC/GchvBvGb4U4Md2G4G4PKb4Y7qclvBvKbQfxmuAfDvRjuw6Dym4H8ZiC/GchvBvGb4X4MD2B4EIPKbwbym4H8ZiC/GcRvhocwPIzhEQwqvxnIbwbym4H8ZhC/GR7F8BiGxzGo/GYgvxnIbwbym0H8ZngCw5MYnsKg8puB/GYgvxnIbwbxm2GKARiexqDym4H8ZiC/GchvBvGb4RkMz2J4DoPKbwbym4H8ZiC/GcRvhucxvIDhRQwqvxmepya/GchvBvGb4SUML2N4BYPKbwbym4H8ZiC/GcRvhlcxvIbhdQwqvxnIbwbym4H8ZhC/Gd7A8CaGtzCo/GYgvxnIbwbym0H8ZngbwzsY3sWg8puB/GYgvxnIbwbxm+E9DO9j+ACDym8G8puB/GYgvxnEb4YPMXyE4WMMKr8ZyG8G8puB/GYQvxk+wfAphs8wqPxmIL8ZyG8G8ptB/Gb4HMMXGL7EoPKb4XNq8puB/GYQvxm+wvA1hm8wqPxmIL8ZyG8G8ptB/Gb4FsN3GL7HoPKbgfxmIL8ZyG8G8Zu4AOIE0SCq/CaS30Tym0h+E8VvokP0iAFR5TeR/CaS30Tymyj/p8eImBAzospvIvlNJL+J5DdR/CZWxIbYEVV+E8lvIvlNJL+J4jdxQcSFEBdGVPlNJL+J5DeR/CaK38RFEBdFXAxR5TdxEWrym0h+E8Vv4uKISyAuiajym0h+E8lvIvlNFL+JSyEujbgMospvIvlNJL+J5DdR/CYui7gc4vKIKr+J5DeR/CaS30Txm7gC4oqIKyGq/CaS30Tym0h+E8Vv4sqIqyCuiqjym0h+E8lvIvlNFL+JqyGujrgGospvIvlNJL+J5DdR/CauibgW4tqIKr+J5DeR/CaS30Txm7gO4rqI6yGq/CauQ01+E8lvovhNXB9xA8QNEVV+E8lvIvlNJL+J4jdxI8SNETdBVPlNJL+J5DeR/CaK38RNETdD3BxR5TeR/CaS30Tymyh+E7dA3BJxK0SV30Tym0h+E8lvovhN3BpxG8RtEVV+E8lvIvlNJL+J4jdxO8TtEXdAVPlNJL+J5DeR/CaK38QdEXdC3BlR5TeR/CaS30Tymyh+E+ch7oK4K6LKb+I8avKbSH4TxW/iboi7I+6BqPKbSH4TyW8i+U0Uv4l7Iu6FuDeiym8i+U0kv4nkN1H8Ju6DuC/ifogqv4nkN5H8JpLfRPGbuD/iAYgHIqr8JpLfRPKbSH4TxW/iQYgHIx6CqPKbSH4TyW8i+U0Uv4mHIh6GeDiiym8i+U0kv4nkN1H8Jh6BeCTiUYgqv4nkN5H8JpLfRPGbOB/xaMRjEFV+E+dTk99E8psofhOPRTwO8XhEld9E8ptIfhPJb6L4TTwB8UTEkxBVfhPJbyL5TSS/ieI38WTEUxBPRVT5TSS/ieQ3kfwmit/E0xBPRzwDUeU3kfwmkt9E8psofhPPRDwL8WxEld9E8ptIfhPJb6L4TTwH8VzE8xBVfhPJbyL5TSS/ieI38XzECxAvRFT5TSS/ieQ3kfwmit9EeRchXoyo8pvITX4TyW+i+E28BPFSxMsQVX4TyW8i+U0kv4niN/FyxCsQr0RU+U0kv4nkN5H8JorfxKsQr0a8BlHlN5H8JpLfRPKbKH4Tr0W8DvF6RJXfRPKbSH4TyW+i+E28AfFGxJsQVX4TyW8i+U0kv4niN/FmxFsQb0VU+U0kv4nkN5H8JorfxNsQb0e8A1HlN5H8JpLfRPKbKH4T70S8C/FuRJXfxDupyW8i+U0Uv4n3IN6LeB+iym8i+U0kv4nkN1H8Jt6P+ADig4gqv4nkN5H8JpLfRPGb+BDiw4iPIKr8JpLfRPKbSH4TxW/io4iPIT6OqPKbSH4TyW8i+U0Uv4lPID6J+BSiym8i+U0kv4nkN1H8Jk4Rgfg0ospvIvlNJL+J5DdR/CY+g/gs4nOIKr+J5DeR/CaS30Txm/g84guILyKq/CY+T01+E8lvovhNfAnxZcRXEFV+E8lvIvlNJL+J4jfxVcTXEF9HVPlNJL+J5DeR/CaK38Q3EN9EfAtR5TeR/CaS30Tymyh+E99GfAfxXUSV30Tym0h+E8lvovhNfA/xfcQPEFV+E8lvIvlNJL+J4jfxQ8SPED9GVPlNJL+J5DeR/CaK38RPED9F/AxR5TeR/CaS30Tymyh+Ez9H/ALxS0SV38TPqclvIvlNFL+JXyF+jfgNospvIvlNJL+J5DdR/CZ+i/gd4veIKr+J5DeR/CaS30Txm7QA0gTJIKn8JpHfJPKbRH6TxG+SQ/JIAUnlN4n8JpHfJPKbJH6TIlJCykgqv0nkN4n8JpHfJPGbVJEaUkdS+U0iv0nkN4n8JonfpAWRFkJaGEnlN4n8JpHfJPKbJH6TFkFaFGkxJJXfpEWoyW8S+U0Sv0mLIy2BtCSSym8S+U0iv0nkN0n8Ji2FtDTSMkgqv0nkN4n8JpHfJPGbtCzSckjLI6n8JpHfJPKbRH6TxG/SCkgrIq2EpPKbRH6TyG8S+U0Sv0krI62CtCqSym8S+U0iv0nkN0n8Jq2GtDrSGkgqv0nkN4n8JpHfJPGbtCbSWkhrI6n8JpHfJPKbRH6TxG/SOkjrIq2HpPKbtA41+U0iv0niN2l9pA2QNkRS+U0iv0nkN4n8JonfpI2QNkbaBEnlN4n8JpHfJPKbJH6TNkXaDGlzJJXfJPKbRH6TyG+S+E3aAmlLpK2QVH6TyG8S+U0iv0niN2lrpG2QtkVS+U0iv0nkN4n8JonfpO2QtkfaAUnlN4n8JpHfJPKbJH6TdkTaCWlnJJXfJPKbRH6TyG+S+E2ah7QL0q5IKr9J86jJbxL5TRK/Sbsh7Y60B5LKbxL5TSK/SeQ3Sfwm7Ym0F9LeSCq/SeQ3ifwmkd8k8Zu0D9K+SPshqfwmkd8k8ptEfpPEb9L+SAcgHYik8ptEfpPIbxL5TRK/SQchHYx0CJLKbxL5TSK/SeQ3SfwmHYp0GNLhSCq/SeQ3ifwmkd8k8Zt0BNKRSEchqfwmkd8k8ptEfpPEb9J8pKORjkFS+U2aT01+k8hvkvhNOhbpOKTjkVR+k8hvEvlNIr9J4jfpBKQTkU5CUvlNIr9J5DeJ/CaJ36STkU5BOhVJ5TeJ/CaR3yTymyR+k05DOh3pDCSV3yTym0R+k8hvkvhNOhPpLKSzkVR+k8hvEvlNIr9J4jfpHKRzkc5DUvlNIr9J5DeJ/CaJ36TzkS5AuhBJ5TeJ/CaR3yTymyR+k+RdhHQxkspvEjf5TSK/SeI36RKkS5EuQ1L5TSK/SeQ3ifwmid+ky5GuQLoSSeU3ifwmkd8k8pskfpOuQroa6Rokld8k8ptEfpPIb5L4TboW6Tqk65FUfpPIbxL5TSK/SeI36QakG5FuQlL5TSK/SeQ3ifwmid+km5FuQboVSeU3ifwmkd8k8pskfpNuQ7od6Q4kld8k8ptEfpPIb5L4TboT6S6ku5FUfpPupCa/SeQ3Sfwm3YN0L9J9SCq/SeQ3ifwmkd8k8Zt0P9IDSA8iqfwmkd8k8ptEfpPEb9JDSA8jPYKk8ptEfpPIbxL5TRK/SY8iPYb0OJLKbxL5TSK/SeQ3SfwmPYH0JNJTSCq/SeQ3ifwmkd8k8Zs0RQLS00gqv0nkN4n8JpHfJPGb9AzSs0jPIan8JpHfJPKbRH6TxG/S80gvIL2IpPKb9Dw1+U0iv0niN+klpJeRXkFS+U0iv0nkN4n8JonfpFeRXkN6HUnlN4n8JpHfJPKbJH6T3kB6E+ktJJXfJPKbRH6TyG+S+E16G+kdpHeRVH6TyG8S+U0iv0niN+k9pPeRPkBS+U0iv0nkN4n8JonfpA+RPkL6GEnlN4n8JpHfJPKbJH6TPkH6FOkzJJXfJPKbRH6TyG+S+E36HOkLpC+RVH6TPqcmv0nkN0n8Jn2F9DXSN0gqv0nkN4n8JpHfJPGb9C3Sd0jfI6n8JpHfJPKbRH6TxG/yAsgTZIOs8ptMfpPJbzL5TRa/yQ7ZIwdkld9k8ptMfpPJb7L4TY7ICTkjq/wmk99k8ptMfpPFb3JFbsgdWeU3mfwmk99k8pssfpMXRF4IeWFkld9k8ptMfpPJb7L4TV4EeVHkxZBVfpMXoSa/yeQ3WfwmL468BPKSyCq/yeQ3mfwmk99k8Zu8FPLSyMsgq/wmk99k8ptMfpPFb/KyyMshL4+s8ptMfpPJbzL5TRa/ySsgr4i8ErLKbzL5TSa/yeQ3Wfwmr4y8CvKqyCq/yeQ3mfwmk99k8Zu8GvLqyGsgq/wmk99k8ptMfpPFb/KayGshr42s8ptMfpPJbzL5TRa/yesgr4u8HrLKb/I61OQ3mfwmi9/k9ZE3QN4QWeU3mfwmk99k8pssfpM3Qt4YeRNkld9k8ptMfpPJb7L4Td4UeTPkzZFVfpPJbzL5TSa/yeI3eQvkLZG3Qlb5TSa/yeQ3mfwmi9/krZG3Qd4WWeU3mfwmk99k8pssfpO3Q94eeQdkld9k8ptMfpPJb7L4Td4ReSfknZFVfpPJbzL5TSa/yeI3eR7yLsi7Iqv8Js+jJr/J5DdZ/Cbvhrw78h7IKr/J5DeZ/CaT32Txm7wn8l7IeyOr/CaT32Tym0x+k8Vv8j7I+yLvh6zym0x+k8lvMvlNFr/J+yMfgHwgsspvMvlNJr/J5DdZ/CYfhHww8iHIKr/J5DeZ/CaT32Txm3wo8mHIhyOr/CaT32Tym0x+k8Vv8hHIRyIfhazym0x+k8lvMvlNFr/J85GPRj4GWeU3eT41+U0mv8niN/lY5OOQj0dW+U0mv8nkN5n8Jovf5BOQT0Q+CVnlN5n8JpPfZPKbLH6TT0Y+BflUZJXfZPKbTH6TyW+y+E0+Dfl05DOQVX6TyW8y+U0mv8niN/lM5LOQz0ZW+U0mv8nkN5n8Jovf5HOQz0U+D1nlN5n8JpPfZPKbLH6Tz0e+APlCZJXfZPKbTH6TyW+y+E2WdxHyxcgqv8nc5DeZ/CaL3+RLkC9FvgxZ5TeZ/CaT32Tymyx+ky9HvgL5SmSV32Tym0x+k8lvsvhNvgr5auRrkFV+k8lvMvlNJr/J4jf5WuTrkK9HVvlNJr/J5DeZ/CaL3+QbkG9EvglZ5TeZ/CaT32Tymyx+k29GvgX5VmSV32Tym0x+k8lvsvhNvg35duQ7kFV+k8lvMvlNJr/J4jf5TuS7kO9GVvlNvpOa/CaT32Txm3wP8r3I9yGr/CaT32Tym0x+k8Vv8v3IDyA/iKzym0x+k8lvMvlNFr/JDyE/jPwIsspvMvlNJr/J5DdZ/CY/ivwY8uPIKr/J5DeZ/CaT32Txm/wE8pPITyGr/CaT32Tym0x+k8Vv8hQZyE8jq/wmk99k8ptMfpPFb/IzyM8iP4es8ptMfpPJbzL5TRa/yc8jv4D8IrLKb/Lz1OQ3mfwmi9/kl5BfRn4FWeU3mfwmk99k8pssfpNfRX4N+XVkld9k8ptMfpPJb7L4TX4D+U3kt5BVfpPJbzL5TSa/yeI3+W3kd5DfRVb5TSa/yeQ3mfwmi9/k95DfR/4AWeU3mfwmk99k8pssfpM/RP4I+WNkld9k8ptMfpPJb7L4Tf4E+VPkz5BVfpPJbzL5TSa/yeI3+XPkL5C/RFb5Tf6cmvwmk99k8Zv8FfLXyN8gq/wmk99k8ptMfpPFb/K3yN8hf4+s8ptMfpPJbzL5TRa/KQugTFAMispvCvlNIb8p5DdF/KY4FI8SUFR+U8hvCvlNIb8p4jcloiSUjKLym0J+U8hvCvlNEb8pFaWhdBSV3xTym0J+U8hvivhNWRBlIZSFUVR+U8hvCvlNIb8p4jdlEZRFURZDUflNWYSa/KaQ3xTxm7I4yhIoS6Ko/KaQ3xTym0J+U8RvylIoS6Msg6Lym0J+U8hvCvlNEb8py6Ish7I8ispvCvlNIb8p5DdF/KasgLIiykooKr8p5DeF/KaQ3xTxm7Iyyiooq6Ko/KaQ3xTym0J+U8Rvymooq6OsgaLym0J+U8hvCvlNEb8pa6KshbI2ispvCvlNIb8p5DdF/Kasg7IuynooKr8p61CT3xTymyJ+U9ZH2QBlQxSV3xTym0J+U8hvivhN2QhlY5RNUFR+U8hvCvlNIb8p4jdlU5TNUDZHUflNIb8p5DeF/KaI35QtULZE2QpF5TeF/KaQ3xTymyJ+U7ZG2QZlWxSV3xTym0J+U8hvivhN2Q5le5QdUFR+U8hvCvlNIb8p4jdlR5SdUHZGUflNIb8p5DeF/KaI35R5KLug7Iqi8psyj5r8ppDfFPGbshvK7ih7oKj8ppDfFPKbQn5TxG/Knih7oeyNovKbQn5TyG8K+U0Rvyn7oOyLsh+Kym8K+U0hvynkN0X8puyPcgDKgSgqvynkN4X8ppDfFPGbchDKwSiHoKj8ppDfFPKbQn5TxG/KoSiHoRyOovKbQn5TyG8K+U0RvylHoByJchSKym8K+U0hvynkN0X8psxHORrlGBSV35T51OQ3hfymiN+UY1GOQzkeReU3hfymkN8U8psiflNOQDkR5SQUld8U8ptCflPIb4r4TTkZ5RSUU1FUflPIbwr5TSG/KeI35TSU01HOQFH5TSG/KeQ3hfymiN+UM1HOQjkbReU3hfymkN8U8psiflPOQTkX5TwUld8U8ptCflPIb4r4TTkf5QKUC1FUflPIbwr5TSG/KeI3//PBdhHKxSgqvync5DeF/KaI35RLUC5FuQxF5TeF/KaQ3xTymyJ+Uy5HuQLlShSV3xTym0J+U8hvivhNuQrlapRrUFR+U8hvCvlNIb8p4jflWpTrUK5HUflNIb8p5DeF/KaI35QbUG5EuQlF5TeF/KaQ3xTymyJ+U25GuQXlVhSV3xTym0J+U8hvivhNuQ3ldpQ7UFR+U8hvCvlNIb8p4jflTpS7UO5GUflNuZOa/KaQ3xTxm3IPyr0o96Go/KaQ3xTym0J+U8Rvyv0oD6A8iKLym0J+U8hvCvlNEb8pD6E8jPIIispvCvlNIb8p5DdF/KY8ivIYyuMoKr8p5DeF/KaQ3xTxm/IEypMoT6Go/KaQ3xTym0J+U8RvyhQFKE+jqPymkN8U8ptCflPEb8ozKM+iPIei8ptCflPIbwr5TRG/Kc+jvIDyIorKb8rz1OQ3hfymiN+Ul1BeRnkFReU3hfymkN8U8psiflNeRXkN5XUUld8U8ptCflPIb4r4TXkD5U2Ut1BUflPIbwr5TSG/KeI35W2Ud1DeRVH5TSG/KeQ3hfymiN+U91DeR/kAReU3hfymkN8U8psiflM+RPkI5WMUld8U8ptCflPIb4r4TfkE5VOUz1BUflPIbwr5TSG/KeI35XOUL1C+RFH5TfmcmvymkN8U8ZvyFcrXKN+gqPymkN8U8ptCflPEb8q3KN+hfI+i8ptCflPIbwr5TRG/qQugTlANqspvKvlNJb+p5DdV/KY6VI8aUFV+U8lvKvlNJb+p4jc1oibUjKrym0p+U8lvKvlNlc+BWlEbakdV+U0lv6nkN5X8porf1AVRF0JdGFXlN5X8ppLfVPKbKn5TF0FdFHUxVJXf1EWoyW8q+U0Vv6mLoy6BuiSqym8q+U0lv6nkN1X8pi6FujTqMqgqv6nkN5X8ppLfVPGbuizqcqjLo6r8ppLfVPKbSn5TxW/qCqgroq6EqvKbSn5TyW8q+U0Vv6kro66Cuiqqym8q+U0lv6nkN1X8pq6GujrqGqgqv6nkN5X8ppLfVPGbuibqWqhro6r8ppLfVPKbSn5TxW/qOqjroq6HqvKbug41+U0lv6niN3V91A1QN0RV+U0lv6nkN5X8porf1I1QN0bdBFXlN5X8ppLfVPKbKn5TN0XdDHVzVJXfVPKbSn5TyW+q+E3dAnVL1K1QVX5TyW8q+U0lv6niN3Vr1G1Qt0VV+U0lv6nkN5X8porf1O1Qt0fdAVXlN5X8ppLfVPKbKn5Td0TdCXVnVJXfVPKbSn5TyW+q+E2dh7oL6q6oKr+p86jJbyr5TRW/qbuh7o66B6rKbyr5TSW/qeQ3Vfym7om6F+reqCq/qeQ3lfymkt9U8Zu6D+q+qPuhqvymkt9U8ptKflPFb+r+qAegHoiq8ptKflPJbyr5TRW/qQehHox6CKrKbyr5TSW/qeQ3VfymHop6GOrhqCq/qeQ3lfymkt9U8Zt6BOqRqEehqvymkt9U8ptKflPFb+p81KNRj0FV+U2dT01+U8lvqvhNPRb1ONTjUVV+U8lvKvlNJb+p4jf1BNQTUU9CVflNJb+p5DeV/KaK39STUU9BPRVV5TeV/KaS31Tymyp+U09DPR31DFSV31Tym0p+U8lvqvhNPRP1LNSzUVV+U8lvKvlNJb+p4jf1HNRzUc9DVflNJb+p5DeV/KaK39TzUS9AvRBV5TeV/KaS31Tymyp+U+VdhHoxqspvKjf5TSW/qeI39RLUS1EvQ1X5TSW/qeQ3lfymit/Uy1GvQL0SVeU3lfymkt9U8psqflOvQr0a9RpUld9U8ptKflPJb6r4Tb0W9TrU61FVflPJbyr5TSW/qeI39QbUG1FvQlX5TSW/qeQ3lfymit/Um1FvQb0VVeU3lfymkt9U8psqflNvQ70d9Q5Uld9U8ptKflPJb6r4Tb0T9S7Uu1FVflPvpCa/qeQ3Vfym3oN6L+p9qCq/qeQ3lfymkt9U8Zt6P+oDqA+iqvymkt9U8ptKflPFb+pDqA+jPoKq8ptKflPJbyr5TRW/qY+iPob6OKrKbyr5TSW/qeQ3VfymPoH6JOpTqCq/qeQ3lfymkt9U8Zs6RQXq06gqv6nkN5X8ppLfVPGb+gzqs6jPoar8ppLfVPKbSn5TxW/q86gvoL6IqvKb+jw1+U0lv6niN/Ul1JdRX0FV+U0lv6nkN5X8porf1FdRX0N9HVXlN5X8ppLfVPKbKn5T30B9E/UtVJXfVPKbSn5TyW+q+E19G/Ud1HdRVX5TyW8q+U0lv6niN/U91PdRP0BV+U0lv6nkN5X8porf1A9RP0L9GFXlN5X8ppLfVPKbKn5TP0H9FPUzVJXfVPKbSn5TyW+q+E39HPUL1C9RVX5TP6cmv6nkN1X8pn6F+jXqN6gqv6nkN5X8ppLfVPGb+i3qd6jfo6r8ppLfVPKbSn5TxW/aAmgTNIOm8ptGftPIbxr5TRO/aQ7NowU0ld808ptGftPIb5r4TYtoCS2jqfymkd808ptGftPEb1pFa2gdTeU3jfymkd808psmftMWRFsIbWE0ld808ptGftPIb5r4TVsEbVG0xdBUftMWoSa/aeQ3TfymLY62BNqSaCq/aeQ3jfymkd808Zu2FNrSaMugqfymkd808ptGftPEb9qyaMuhLY+m8ptGftPIbxr5TRO/aSugrYi2EprKbxr5TSO/aeQ3TfymrYy2CtqqaCq/aeQ3jfymkd808Zu2GtrqaGugqfymkd808ptGftPEb9qaaGuhrY2m8ptGftPIbxr5TRO/aeugrYu2HprKb9o61OQ3jfymid+09dE2QNsQTeU3jfymkd808psmftM2QtsYbRM0ld808ptGftPIb5r4TdsUbTO0zdFUftPIbxr5TSO/aeI3bQu0LdG2QlP5TSO/aeQ3jfymid+0rdG2QdsWTeU3jfymkd808psmftO2Q9sebQc0ld808ptGftPIb5r4TdsRbSe0ndFUftPIbxr5TSO/aeI3bR7aLmi7oqn8ps2jJr9p5DdN/KbthrY72h5oKr9p5DeN/KaR3zTxm7Yn2l5oe6Op/KaR3zTym0Z+08Rv2j5o+6Lth6bym0Z+08hvGvlNE79p+6MdgHYgmspvGvlNI79p5DdN/KYdhHYw2iFoKr9p5DeN/KaR3zTxm3Yo2mFoh6Op/KaR3zTym0Z+08Rv2hFoR6Idhabym0Z+08hvGvlNE79p89GORjsGTeU3bT41+U0jv2niN+1YtOPQjkdT+U0jv2nkN438ponftBPQTkQ7CU3lN438ppHfNPKbJn7TTkY7Be1UNJXfNPKbRn7TyG+a+E07De10tDPQVH7TyG8a+U0jv2niN+1MtLPQzkZT+U0jv2nkN438ponftHPQzkU7D03lN438ppHfNPKbJn7Tzke7AO1CNJXfNPKbRn7TyG+a+E2TdxHaxWgqv2nc5DeN/KaJ37RL0C5FuwxN5TeN/KaR3zTymyZ+0y5HuwLtSjSV3zTym0Z+08hvmvhNuwrtarRr0FR+08hvGvlNI79p4jftWrTr0K5HU/lNI79p5DeN/KaJ37Qb0G5EuwlN5TeN/KaR3zTymyZ+025GuwXtVjSV3zTym0Z+08hvmvhNuw3tdrQ70FR+08hvGvlNI79p4jftTrS70O5GU/lNu5Oa/KaR3zTxm3YP2r1o96Gp/KaR3zTym0Z+08Rv2v1oD6A9iKbym0Z+08hvGvlNE79pD6E9jPYImspvGvlNI79p5DdN/KY9ivYY2uNoKr9p5DeN/KaR3zTxm/YE2pNoT6Gp/KaR3zTym0Z+08Rv2hQNaE+jqfymkd808ptGftPEb9ozaM+iPYem8ptGftPIbxr5TRO/ac+jvYD2IprKb9rz1OQ3jfymid+0l9BeRnsFTeU3jfymkd808psmftNeRXsN7XU0ld808ptGftPIb5r4TXsD7U20t9BUftPIbxr5TSO/aeI37W20d9DeRVP5TSO/aeQ3jfymid+099DeR/sATeU3jfymkd808psmftM+RPsI7WM0ld808ptGftPIb5r4TfsE7VO0z9BUftPIbxr5TSO/aeI37XO0L9C+RFP5Tfucmvymkd808Zv2FdrXaN+gqfymkd808ptGftPEb9q3aN+hfY+m8ptGftPIbxr5TRO/6QugT9ANuspvOvlNJ7/p5Ddd/KY7dI8e0FV+08lvOvlNJ7/p4jc9oif0jK7ym05+08lvOvlNF7/pFb2hd3SV33Tym05+08lvuvhNXxB9IfSF0VV+08lvOvlNJ7/p4jd9EfRF0RdDV/lNX4Sa/KaT33Txm744+hLoS6Kr/KaT33Tym05+08Vv+lLoS6Mvg67ym05+08lvOvlNF7/py6Ivh748uspvOvlNJ7/p5Ddd/KavgL4i+kroKr/p5Ded/KaT33Txm74y+iroq6Kr/KaT33Tym05+08Vv+mroq6Ovga7ym05+08lvOvlNF7/pa6Kvhb42uspvOvlNJ7/p5Ddd/Kavg74u+nroKr/p61CT33Tymy5+09dH3wB9Q3SV33Tym05+08lvuvhN3wh9Y/RN0FV+08lvOvlNJ7/p4jd9U/TN0DdHV/lNJ7/p5Ded/KaL3/Qt0LdE3wpd5Ted/KaT33Tymy5+07dG3wZ9W3SV33Tym05+08lvuvhN3w59e/Qd0FV+08lvOvlNJ7/p4jd9R/Sd0HdGV/lNJ7/p5Ded/KaL3/R56Lug74qu8ps+j5r8ppPfdPGbvhv67uh7oKv8ppPfdPKbTn7TxW/6nuh7oe+NrvKbTn7TyW86+U0Xv+n7oO+Lvh+6ym86+U0nv+nkN138pu+PfgD6gegqv+nkN538ppPfdPGbfhD6weiHoKv8ppPfdPKbTn7TxW/6oeiHoR+OrvKbTn7TyW86+U0Xv+lHoB+JfhS6ym86+U0nv+nkN138ps9HPxr9GHSV3/T51OQ3nfymi9/0Y9GPQz8eXeU3nfymk9908psuftNPQD8R/SR0ld908ptOftPJb7r4TT8Z/RT0U9FVftPJbzr5TSe/6eI3/TT009HPQFf5TSe/6eQ3nfymi9/0M9HPQj8bXeU3nfymk9908psuftPPQT8X/Tx0ld908ptOftPJb7r4TT8f/QL0C9FVftPJbzr5TSe/6eI3Xd5F6Bejq/ymc5PfdPKbLn7TL0G/FP0ydJXfdPKbTn7TyW+6+E2/HP0K9CvRVX7TyW86+U0nv+niN/0q9KvRr0FX+U0nv+nkN538povf9GvRr0O/Hl3lN538ppPfdPKbLn7Tb0C/Ef0mdJXfdPKbTn7TyW+6+E2/Gf0W9FvRVX7TyW86+U0nv+niN/029NvR70BX+U0nv+nkN538povf9DvR70K/G13lN/1OavKbTn7TxW/6Pej3ot+HrvKbTn7TyW86+U0Xv+n3oz+A/iC6ym86+U0nv+nkN138pj+E/jD6I+gqv+nkN538ppPfdPGb/ij6Y+iPo6v8ppPfdPKbTn7TxW/6E+hPoj+FrvKbTn7TyW86+U0Xv+lTdKA/ja7ym05+08lvOvlNF7/pz6A/i/4cuspvOvlNJ7/p5Ddd/KY/j/4C+ovoKr/pz1OT33Tymy5+019Cfxn9FXSV33Tym05+08lvuvhNfxX9NfTX0VV+08lvOvlNJ7/p4jf9DfQ30d9CV/lNJ7/p5Ded/KaL3/S30d9Bfxdd5Ted/KaT33Tymy5+099Dfx/9A3SV33Tym05+08lvuvhN/xD9I/SP0VV+08lvOvlNJ7/p4jf9E/RP0T9DV/lNJ7/p5Ded/KaL3/TP0b9A/xJd5Tf9c2rym05+08Vv+lfoX6N/g67ym05+08lvOvlNF7/p36J/h/49uspvOvlNJ7/p5Ddd/GZcAOMEo8Go8puR/GYkvxnJb0bxm9Fh9BgDRpXfjOQ3I/nNSH4zit+MEWPCmDGq/GYkvxnJb0bym1H8ZqwYG8aOUeU3I/nNSH4zkt+M4jfjghgXwrgwRpXfjOQ3I/nNSH4zit+Mi2BcFONiGFV+My5CTX4zkt+M4jfj4hiXwLgkRpXfjOQ3I/nNSH4zit+MS2FcGuMyGFV+M5LfjOQ3I/nNKH4zLotxOYzLY1T5zUh+M5LfjOQ3o/jNuALGFTGuhFHlNyP5zUh+M5LfjOI348oYV8G4KkaV34zkNyP5zUh+M4rfjKthXB3jGhhVfjOS34zkNyP5zSh+M66JcS2Ma2NU+c1IfjOS34zkN6P4zbgOxnUxrodR5TfjOtTkNyP5zSh+M66PcQOMG2JU+c1IfjOS34zkN6P4zbgRxo0xboJR5Tcj+c1IfjOS34ziN+OmGDfDuDlGld+M5Dcj+c1IfjOK34xbYNwS41YYVX4zkt+M5Dcj+c0ofjNujXEbjNtiVPnNSH4zkt+M5Dej+M24HcbtMe6AUeU3I/nNSH4zkt+M4jfjjhh3wrgzRpXfjOQ3I/nNSH4zit+M8zDugnFXjCq/GedRk9+M5Dej+M24G8bdMe6BUeU3I/nNSH4zkt+M4jfjnhj3wrg3RpXfjOQ3I/nNSH4zit+M+2DcF+N+GFV+M5LfjOQ3I/nNKH4z7o/xAIwHYlT5zUh+M5LfjOQ3o/jNeBDGgzEeglHlNyP5zUh+M5LfjOI346EYD8N4OEaV34zkNyP5zUh+M4rfjEdgPBLjURhVfjOS34zkNyP5zSh+M87HeDTGYzCq/GacT01+M5LfjOI347EYj8N4PEaV34zkNyP5zUh+M4rfjCdgPBHjSRhVfjOS34zkNyP5zSh+M56M8RSMp2JU+c1IfjOS34zkN6P4zXgaxtMxnoFR5Tcj+c1IfjOS34ziN+OZGM/CeDZGld+M5Dcj+c1IfjOK34znYDwX43kYVX4zkt+M5Dcj+c0ofjOej/ECjBdiVPnNSH4zkt+M5Dej+M3/fEldhPFijCq/GbnJb0bym1H8ZrwE46UYL8Oo8puR/GYkvxnJb0bxm/FyjFdgvBKjym9G8puR/GYkvxnFb8arMF6N8RqMKr8ZyW9G8puR/GYUvxmvxXgdxusxqvxmJL8ZyW9G8ptR/Ga8AeONGG/C+Oen3LTZD394wFHz9zjgqB/84fkXXvjosgv8v/9MnPzOmvvvcNSba121yj07bnn3KafsttfKP/3e1sfde8QFP//mF3/4ifySLPx/Hlrg//+0/z+avvH/xnT4P5q+6f/G9PB/NP3n/9/TMwtMjD1/xvkwnH/+/wPf3UqM35EBAA==","debug_symbols":"ndrNblRJEgbQd/Hai8rfyOxXGY1aBkzLkmWQgZFGiHcfU3mihl4gjWZzjV2+nws7TlZmRH2/+/D47ttffz69fPz05e6Pf3y/e/f69Pz89Nefz5/eP3x9+vTy9tXvP+7v8tM/v74+Pr596e6Xx9/u+vzw+vjy9e6Pl2/Pz/d3/3p4/nb9pi+fH16uH78+vL49erm/e3z58PbxLfDj0/Pjz3/9uP/v3Zff3zrDveUSt7vH328vv7+9l8gf3usvCWX9r0+gRBVQy+V3z6D9f8/gn2+fPbx/ev3bL/3u8vaj7u/K2/ff39XrtV2v/Xod1+u8XuN6Xdfrvl7L5Xw4d5dzezn3lxNQTkI5EeVklBNSTko9KdVzOCn1pNSTUk9KPSn1pNSTUk9KOyntpDT/lZPSTko7Ke2ktJPSTko7Kf2k9JPST0r3Gzkp/aT0k9JPSj8p/aSMkzJOyjgp46QMv9iTMk7KOCnjpIyTMk/KPCnzpMyTMk/K9Pc5KfOkzJMyT0qclDgpcVLipMRJiZMS/swnJU5KnJR1UtZJWSdlnZR1UtZJWSdlqZaTsk7KPin7pOyTsk/KPin7pOyTsk/KVnRZdcruou4uCu+i8i5K76L2Lorvovouyu8i71bG8rKQs5KzlLOWs5izmrOc1XNR0KWmC3lquijqoqqLsi7quijsorKL0i5qu7SEJk95F/VdFHhR4UWJFzVeFHlR5UWZl55y5an0otSLWi+Kvaj2otyLei8Kvqj4MnIpkKfoi6ovyr6o+6Lwi8ovSr+o/aL4y8y1RZ76LwAUAgoChYECQaGgYFA4KJGLlTwUCgsFhkJDwaHwUIAoRBQkysrVTx4VBYvCRQGjkFHQKGwUOAodZedymuupBZWPykflo/JR+ah8VD4qH5WPWnKBlsdH5aPyUfmofFQ+Kh811/tc8G8rvrxc83PRz1U/l/1c93Ph56PyUfmoLV9C5PFR+ah8VD4qH5WPykflo/JRe74myeOj8lH5qHxUPioflY/KR+WjjnyRk8dH5aPyUfmofFQ+Kh+Vj8pHnfmqKY+Pykflo/JR+ah8VD4qH5WPGvkyLI+Pykflo/JR+ah8VD4qH5WPuvJ1XR4flY/KR+Wj8lH5qHxUPiofdedGIXcKtgp8ND4aH42Pxkfjo/HR+Gh8tJJbD3l8ND4aH42Pxkfjo/HR+Gh8tJp7GXl8ND4aH42Pxkfjo+XOKLdGuTe6bY7k5fYo90e5QcodUm6R+Gh8ND4aH63nbkseH42Pxkfjo/HR+Gh8ND4aH23k9k0eH42Pxkfjo/HR+Gh8ND4aH23mflAeH42Pxkfjo/HR+Gh8ND4aHy1ygymPj8ZH46Px0fhofDQ+Gh+Nj7ZyxyqPj8ZH46Px0fhofDQ+Gh+Nj7ZzC5x7YJtgPjofnY/OR+ej89H56Hx0PnrJTbU8PjofnY/OR+ej89H56Hx0PnrNXbo8PjofnY/OR+ej89H56Hx0PnrLbb88PjofnY/OR+ej5xkiDxF5ishjxO0cIS9PEnmUyLNEHib46Hx0PjofnY8+8mAij4/OR+ej89H56Hx0PjofnY8+86Qjj4/OR+ej89H56Hx0PjofnY8eeXSSx0fno/PR+eh8dD46H52PzkdfeRaTx0fno/PR+eh8dD46H52PzkffebjL053jHR+Dj8HH4GPwMfgYfAw+Bh+j5HFRHh+Dj8HH4GPwMfgYfAw+Bh+j5vlTHh+Dj8HH4GPwMfgYfAw+Bh+j5YFWHh+Dj8HH4GPwMfgYfAw+Bh+j5wlZHh+Dj8HH4GPkaTuP23nezgN3nrhvR255eejOU3ceu/kYfAw+Bh+Dj8HHmHmGl8fH4GPwMfgYfAw+Bh+Dj8HHiGwKyONj8DH4GHwMPgYfg4/Bx+BjrOwyyONj8DH4GHwMPgYfg4/Bx+Bj7GxbZN9C44KPycfkY/Ix+Zh8TD4mH5OPWbIRIo+PycfkY/Ix+Zh8TD4mH5OPWbOzIo+PycfkY/Ix+Zh8TD4mH5OP2bJVI4+PycfkY/Ix+Zh8TD4mH5OP2bP3I4+PycfkY/Ix+Zh8TD4mH5OPObKZJI+PycfkY2ZfKhtT2ZnK1lT2prI5detOycv+VDao+Jh8TD4mH5OPycfkY0a2u+TxMfmYfEw+Jh+Tj8nH5GPyMVf2z+TxMfmYfEw+Jh+Tj8nH5GPyMXc25LIjpyXHR/ARfAQfwUfwEXwEH8FHlGzxyeMj+Ag+go/gI/gIPoKP4CNq9gzl8RF8BB/BR/ARfAQfwUfwES2bkPL4CD6Cj+Aj+Ag+go/gI/iInl1NeXwEH8FH8BF8BB/BR/ARfMTINqk8PoKP4CP4CD6Cj+Aj+Ag+YmbfVR4fwUdkBzdbuNnDzSZudnGzjZt93FsjV162cvkIPoKP4CP4CD6Cj+AjVnaG5fERfAQfwUfwEXwEH8FH8BE7W83Za9Zs5mPxsfhYfCw+Fh+Lj8XH4mOVbF7L42PxsfhYfCw+Fh+Lj8XH4mPV7IbL42PxsfhYfCw+Fh+Lj8XH4mO1bK/L42PxsfhYfCw+Fh+Lj8XH4mP17NfL42PxsfhYfCw+Fh+Lj8XH4mONHADI42PxsfhYfCw+Fh+Lj8XH4mPNnCjI42PxsfhYfCw+Fh+Lj8XH4mNFjijk8bFy1pHDjpx25Lgj5x058MiJR448bjMPeXwsPhYfi4/Fx+Jj8bH4WHysnUOUnKIYo/Cx+dh8bD42H5uPzcfmY/OxS45l5PGx+dh8bD42H5uPzcfmY/Oxa8555PGx+dh8bD42H5uPzcfmY/OxWw6O5PGx+dh8bD42H5uPzcfmY/Oxe06i5PGx+dh8bD42H5uPzcfmY/OxR4625PGx+dh8bD42H5uPzcfmY/OxZ87K5PGx+dh8bD42H5uPzcfmY/OxI4dv8vjYfGw+Nh+bj83H5mPzsfnYK6d58nIqmGPBnAvmYDAngzkazNlgDgdzOngbD97mgz8Df/yckr8+Pbx7fvxy3l3w8dvL+1/ebPD135/zkXw7wufXT+8fP3x7ffw5I78+9jY1/w8=","file_map":{"18":{"source":"// Exposed only for usage in `std::meta`\npub(crate) mod poseidon2;\n\nuse crate::default::Default;\nuse crate::embedded_curve_ops::{\n EmbeddedCurvePoint, EmbeddedCurveScalar, multi_scalar_mul, multi_scalar_mul_array_return,\n};\nuse crate::meta::derive_via;\nuse crate::static_assert;\n\n/// The size of the state accepted by the backend in `poseidon2_permutation`.\nglobal POSEIDON2_CONFIG_STATE_SIZE: u32 = poseidon2_config_state_size();\n\n#[foreign(sha256_compression)]\n// docs:start:sha256_compression\npub fn sha256_compression(input: [u32; 16], state: [u32; 8]) -> [u32; 8] {}\n// docs:end:sha256_compression\n\n#[foreign(keccakf1600)]\n// docs:start:keccakf1600\npub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {}\n// docs:end:keccakf1600\n\npub mod keccak {\n #[deprecated(\"This function has been moved to std::hash::keccakf1600\")]\n pub fn keccakf1600(input: [u64; 25]) -> [u64; 25] {\n super::keccakf1600(input)\n }\n}\n\n#[foreign(blake2s)]\n// docs:start:blake2s\npub fn blake2s(input: [u8; N]) -> [u8; 32]\n// docs:end:blake2s\n{}\n\n// docs:start:blake3\npub fn blake3(input: [u8; N]) -> [u8; 32]\n// docs:end:blake3\n{\n if crate::runtime::is_unconstrained() {\n // Temporary measure while Barretenberg is main proving system.\n // Please open an issue if you're working on another proving system and running into problems due to this.\n crate::static_assert(\n N <= 1024,\n \"Barretenberg cannot prove blake3 hashes with inputs larger than 1024 bytes\",\n );\n }\n __blake3(input)\n}\n\n#[foreign(blake3)]\nfn __blake3(input: [u8; N]) -> [u8; 32] {}\n\n// docs:start:pedersen_commitment\npub fn pedersen_commitment(input: [Field; N]) -> EmbeddedCurvePoint {\n // docs:end:pedersen_commitment\n pedersen_commitment_with_separator(input, 0)\n}\n\n#[inline_always]\npub fn pedersen_commitment_with_separator(\n input: [Field; N],\n separator: u32,\n) -> EmbeddedCurvePoint {\n let mut points = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N];\n for i in 0..N {\n points[i] = EmbeddedCurveScalar::from_field(input[i]);\n }\n let generators = derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n multi_scalar_mul(generators, points)\n}\n\n// docs:start:pedersen_hash\npub fn pedersen_hash(input: [Field; N]) -> Field\n// docs:end:pedersen_hash\n{\n pedersen_hash_with_separator(input, 0)\n}\n\n#[no_predicates]\npub fn pedersen_hash_with_separator(input: [Field; N], separator: u32) -> Field {\n let mut scalars: [EmbeddedCurveScalar; N + 1] = [EmbeddedCurveScalar { lo: 0, hi: 0 }; N + 1];\n let mut generators: [EmbeddedCurvePoint; N + 1] =\n [EmbeddedCurvePoint::point_at_infinity(); N + 1];\n crate::assert_constant(separator);\n let domain_generators: [EmbeddedCurvePoint; N] =\n derive_generators(\"DEFAULT_DOMAIN_SEPARATOR\".as_bytes(), separator);\n\n for i in 0..N {\n scalars[i] = EmbeddedCurveScalar::from_field(input[i]);\n generators[i] = domain_generators[i];\n }\n scalars[N] = EmbeddedCurveScalar { lo: N as Field, hi: 0 as Field };\n\n let length_generator: [EmbeddedCurvePoint; 1] =\n derive_generators(\"pedersen_hash_length\".as_bytes(), 0);\n generators[N] = length_generator[0];\n multi_scalar_mul_array_return(generators, scalars, true)[0].x\n}\n\n#[field(bn254)]\n#[inline_always]\npub fn derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {\n crate::assert_constant(domain_separator_bytes);\n crate::assert_constant(starting_index);\n __derive_generators(domain_separator_bytes, starting_index)\n}\n\n#[builtin(derive_pedersen_generators)]\n#[field(bn254)]\nfn __derive_generators(\n domain_separator_bytes: [u8; M],\n starting_index: u32,\n) -> [EmbeddedCurvePoint; N] {}\n\npub fn poseidon2_permutation(input: [Field; N]) -> [Field; N] {\n static_assert(\n N == POSEIDON2_CONFIG_STATE_SIZE,\n f\"the input length must equal the state size in the Poseidon2 config; expected {POSEIDON2_CONFIG_STATE_SIZE}, got {N}\",\n );\n poseidon2_permutation_internal(input)\n}\n\n#[foreign(poseidon2_permutation)]\nfn poseidon2_permutation_internal(input: [Field; N]) -> [Field; N] {}\n\n#[foreign(poseidon2_config_state_size)]\ncomptime fn poseidon2_config_state_size() -> u32 {}\n\n// Generic hashing support.\n// Partially ported and impacted by rust.\n\n// Hash trait shall be implemented per type.\n#[derive_via(derive_hash)]\npub trait Hash {\n fn hash(self, state: &mut H)\n where\n H: Hasher;\n}\n\n// docs:start:derive_hash\ncomptime fn derive_hash(s: TypeDefinition) -> Quoted {\n let name = quote { $crate::hash::Hash };\n let signature = quote { fn hash(_self: Self, _state: &mut H) where H: $crate::hash::Hasher };\n let for_each_field = |name| quote { _self.$name.hash(_state); };\n crate::meta::make_trait_impl(\n s,\n name,\n signature,\n for_each_field,\n quote {},\n |fields| fields,\n )\n}\n// docs:end:derive_hash\n\n// Hasher trait shall be implemented by algorithms to provide hash-agnostic means.\n// TODO: consider making the types generic here ([u8], [Field], etc.)\npub trait Hasher {\n fn finish(self) -> Field;\n\n /// Returns the hash value without consuming the hasher.\n /// Override this for more efficient implementations that avoid copying.\n /// TODO: deprecate finish() and replace it\n fn finish_ref(&self) -> Field {\n (*self).finish()\n }\n\n fn write(&mut self, input: Field);\n}\n\n// BuildHasher is a factory trait, responsible for production of specific Hasher.\npub trait BuildHasher {\n type H: Hasher;\n\n fn build_hasher(self) -> H;\n}\n\npub struct BuildHasherDefault;\n\nimpl BuildHasher for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n type H = H;\n\n fn build_hasher(_self: Self) -> H {\n H::default()\n }\n}\n\nimpl Default for BuildHasherDefault\nwhere\n H: Hasher + Default,\n{\n fn default() -> Self {\n BuildHasherDefault {}\n }\n}\n\nimpl Hash for Field {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self);\n }\n}\n\nimpl Hash for u8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for u128 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for i8 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u8 as Field);\n }\n}\n\nimpl Hash for i16 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u16 as Field);\n }\n}\n\nimpl Hash for i32 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u32 as Field);\n }\n}\n\nimpl Hash for i64 {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as u64 as Field);\n }\n}\n\nimpl Hash for bool {\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n H::write(state, self as Field);\n }\n}\n\nimpl Hash for () {\n fn hash(_self: Self, _state: &mut H)\n where\n H: Hasher,\n {}\n}\n\nimpl Hash for [T; N]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for [T]\nwhere\n T: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.len().hash(state);\n for elem in self {\n elem.hash(state);\n }\n }\n}\n\nimpl Hash for (A, B)\nwhere\n A: Hash,\n B: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n }\n}\n\nimpl Hash for (A, B, C)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n }\n}\n\nimpl Hash for (A, B, C, D, E)\nwhere\n A: Hash,\n B: Hash,\n C: Hash,\n D: Hash,\n E: Hash,\n{\n fn hash(self, state: &mut H)\n where\n H: Hasher,\n {\n self.0.hash(state);\n self.1.hash(state);\n self.2.hash(state);\n self.3.hash(state);\n self.4.hash(state);\n }\n}\n\n// Some test vectors for Pedersen hash and Pedersen Commitment.\n// They have been generated using the same functions so the tests are for now useless\n// but they will be useful when we switch to Noir implementation.\n#[test]\nfn assert_pedersen() {\n assert_eq(\n pedersen_hash_with_separator([1], 1),\n 0x1b3f4b1a83092a13d8d1a59f7acb62aba15e7002f4440f2275edb99ebbc2305f,\n );\n assert_eq(\n pedersen_commitment_with_separator([1], 1),\n EmbeddedCurvePoint {\n x: 0x054aa86a73cb8a34525e5bbed6e43ba1198e860f5f3950268f71df4591bde402,\n y: 0x209dcfbf2cfb57f9f6046f44d71ac6faf87254afc7407c04eb621a6287cac126,\n },\n );\n\n assert_eq(\n pedersen_hash_with_separator([1, 2], 2),\n 0x26691c129448e9ace0c66d11f0a16d9014a9e8498ee78f4d69f0083168188255,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2], 2),\n EmbeddedCurvePoint {\n x: 0x2e2b3b191e49541fe468ec6877721d445dcaffe41728df0a0eafeb15e87b0753,\n y: 0x2ff4482400ad3a6228be17a2af33e2bcdf41be04795f9782bd96efe7e24f8778,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3], 3),\n 0x0bc694b7a1f8d10d2d8987d07433f26bd616a2d351bc79a3c540d85b6206dbe4,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3], 3),\n EmbeddedCurvePoint {\n x: 0x1fee4e8cf8d2f527caa2684236b07c4b1bad7342c01b0f75e9a877a71827dc85,\n y: 0x2f9fedb9a090697ab69bf04c8bc15f7385b3e4b68c849c1536e5ae15ff138fd1,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4], 4),\n 0xdae10fb32a8408521803905981a2b300d6a35e40e798743e9322b223a5eddc,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4], 4),\n EmbeddedCurvePoint {\n x: 0x07ae3e202811e1fca39c2d81eabe6f79183978e6f12be0d3b8eda095b79bdbc9,\n y: 0x0afc6f892593db6fbba60f2da558517e279e0ae04f95758587760ba193145014,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5], 5),\n 0xfc375b062c4f4f0150f7100dfb8d9b72a6d28582dd9512390b0497cdad9c22,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5], 5),\n EmbeddedCurvePoint {\n x: 0x1754b12bd475a6984a1094b5109eeca9838f4f81ac89c5f0a41dbce53189bb29,\n y: 0x2da030e3cfcdc7ddad80eaf2599df6692cae0717d4e9f7bfbee8d073d5d278f7,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6], 6),\n 0x1696ed13dc2730062a98ac9d8f9de0661bb98829c7582f699d0273b18c86a572,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6], 6),\n EmbeddedCurvePoint {\n x: 0x190f6c0e97ad83e1e28da22a98aae156da083c5a4100e929b77e750d3106a697,\n y: 0x1f4b60f34ef91221a0b49756fa0705da93311a61af73d37a0c458877706616fb,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n 0x128c0ff144fc66b6cb60eeac8a38e23da52992fc427b92397a7dffd71c45ede3,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7], 7),\n EmbeddedCurvePoint {\n x: 0x015441e9d29491b06563fac16fc76abf7a9534c715421d0de85d20dbe2965939,\n y: 0x1d2575b0276f4e9087e6e07c2cb75aa1baafad127af4be5918ef8a2ef2fea8fc,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n 0x2f960e117482044dfc99d12fece2ef6862fba9242be4846c7c9a3e854325a55c,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8], 8),\n EmbeddedCurvePoint {\n x: 0x1657737676968887fceb6dd516382ea13b3a2c557f509811cd86d5d1199bc443,\n y: 0x1f39f0cb569040105fa1e2f156521e8b8e08261e635a2b210bdc94e8d6d65f77,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n 0x0c96db0790602dcb166cc4699e2d306c479a76926b81c2cb2aaa92d249ec7be7,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9], 9),\n EmbeddedCurvePoint {\n x: 0x0a3ceae42d14914a432aa60ec7fded4af7dad7dd4acdbf2908452675ec67e06d,\n y: 0xfc19761eaaf621ad4aec9a8b2e84a4eceffdba78f60f8b9391b0bd9345a2f2,\n },\n );\n assert_eq(\n pedersen_hash_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n 0x2cd37505871bc460a62ea1e63c7fe51149df5d0801302cf1cbc48beb8dff7e94,\n );\n assert_eq(\n pedersen_commitment_with_separator([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 10),\n EmbeddedCurvePoint {\n x: 0x2fb3f8b3d41ddde007c8c3c62550f9a9380ee546fcc639ffbb3fd30c8d8de30c,\n y: 0x300783be23c446b11a4c0fabf6c91af148937cea15fcf5fb054abf7f752ee245,\n },\n );\n}\n","path":"std/hash/mod.nr","function_locations":[{"start":572,"name":"sha256_compression"},{"start":707,"name":"keccakf1600"},{"start":882,"name":"keccak::keccakf1600"},{"start":1044,"name":"blake2s"},{"start":1142,"name":"blake3"},{"start":1629,"name":"__blake3"},{"start":1747,"name":"pedersen_commitment"},{"start":1976,"name":"pedersen_commitment_with_separator"},{"start":2380,"name":"pedersen_hash"},{"start":2537,"name":"pedersen_hash_with_separator"},{"start":3531,"name":"derive_generators"},{"start":3890,"name":"__derive_generators"},{"start":3968,"name":"poseidon2_permutation"},{"start":4324,"name":"poseidon2_permutation_internal"},{"start":4417,"name":"poseidon2_config_state_size"},{"start":4728,"name":"derive_hash"},{"start":5953,"name":">::build_hasher"},{"start":6085,"name":">::default"},{"start":6217,"name":"::hash"},{"start":6347,"name":"::hash"},{"start":6487,"name":"::hash"},{"start":6627,"name":"::hash"},{"start":6767,"name":"::hash"},{"start":6908,"name":"::hash"},{"start":7047,"name":"::hash"},{"start":7193,"name":"::hash"},{"start":7340,"name":"::hash"},{"start":7487,"name":"::hash"},{"start":7635,"name":"::hash"},{"start":7782,"name":"::hash"},{"start":7914,"name":"::hash"},{"start":8103,"name":"::hash"},{"start":8343,"name":"::hash"},{"start":8559,"name":"::hash"},{"start":8822,"name":"::hash"},{"start":9132,"name":"::hash"},{"start":9528,"name":"assert_pedersen"}]},"50":{"source":"fn main(plains: [Field; 4]) -> pub [Field; 4] {\n let mut hash = std::hash::poseidon2_permutation(plains);\n let rounds = 1000;\n for _ in 0..rounds {\n hash = std::hash::poseidon2_permutation(hash);\n }\n hash\n}\n","path":"/Users/veljkovranic/reilabs/ProveKit/noir-examples/poseidon-rounds/src/main.nr","function_locations":[{"start":46,"name":"main"}]}}} \ No newline at end of file