diff --git a/.github/workflows/rust_checks.yml b/.github/workflows/rust_checks.yml index 6dd89c2..4df7d9c 100644 --- a/.github/workflows/rust_checks.yml +++ b/.github/workflows/rust_checks.yml @@ -1,61 +1,15 @@ name: 'Rust Checks: rustfml, clippy & test' -'on': +on: pull_request: null workflow_dispatch: null push: branches: - main jobs: - rustfmt: + check-all: runs-on: ubuntu-latest steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - components: rustfmt - - name: Run rustfmt - run: cargo fmt --all -- --check - clippy: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: stable - components: clippy - - name: Run clippy - run: cargo clippy --workspace --all-targets --all-features -- -D warnings - test: - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v2 - - name: Install Rust - uses: actions-rs/toolchain@v1 - with: - profile: minimal - toolchain: nightly - components: cargo - - name: Run tests - run: | - cargo +nightly test --workspace --all-targets --all-features -- -Z unstable-options --format json --report-time | tee results.json - - name: Prepare junit report - id: cargo_reporter - uses: innoq/action-cargo-test-report@v1 - with: - cargo-test-report-json: results.json - - name: Publish Test Report - uses: mikepenz/action-junit-report@v4.3.1 - if: always() - with: - check_name: Test Report - fail_on_failure: true - require_tests: true - summary: '${{ steps.cargo_reporter.outputs.summary }}' + - uses: actions/checkout@v4 + - uses: UbiqueInnovation/action-systems-rust-clippy@v1.0.0 + - uses: UbiqueInnovation/action-systems-rust-format@v1.0.0 + - uses: UbiqueInnovation/action-systems-rust-test@v1.0.0 \ No newline at end of file diff --git a/.gitignore b/.gitignore index e040625..e666629 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ /.vscode /target + +.DS_STORE \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index a854986..5ad67d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,13 +2,32 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "abnf" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "087113bd50d9adce24850eed5d0476c7d199d532fce8fab5173650331e09033a" +dependencies = [ + "abnf-core", + "nom", +] + +[[package]] +name = "abnf-core" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c44e09c43ae1c368fb91a03a566472d0087c26cf7e1b9e8e289c14ede681dd7d" +dependencies = [ + "nom", +] + [[package]] name = "addr2line" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ - "gimli", + "gimli 0.31.0", ] [[package]] @@ -38,6 +57,17 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "ahash" version = "0.8.11" @@ -59,6 +89,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.89" @@ -77,6 +122,25 @@ dependencies = [ "ark-std", ] +[[package]] +name = "ark-crypto-primitives" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3a13b34da09176a8baba701233fdffbaa7c1b1192ce031a3da4e55ce1f1a56" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "blake2", + "derivative", + "digest", + "rayon", + "sha2", +] + [[package]] name = "ark-ec" version = "0.4.2" @@ -139,6 +203,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-groth16" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20ceafa83848c3e390f1cbf124bc3193b3e639b3f02009e0e290809a501b95fc" +dependencies = [ + "ark-crypto-primitives", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-std", + "rayon", +] + [[package]] name = "ark-poly" version = "0.4.2" @@ -153,6 +233,35 @@ dependencies = [ "rayon", ] +[[package]] +name = "ark-r1cs-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de1d1472e5cb020cb3405ce2567c91c8d43f21b674aef37b0202f5c3304761db" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-relations", + "ark-std", + "derivative", + "num-bigint", + "num-integer", + "num-traits", + "tracing", +] + +[[package]] +name = "ark-relations" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00796b6efc05a3f48225e59cb6a2cda78881e7c390872d5786aaf112f31fb4f0" +dependencies = [ + "ark-ff", + "ark-std", + "tracing", + "tracing-subscriber 0.2.25", +] + [[package]] name = "ark-serialize" version = "0.4.2" @@ -176,6 +285,18 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-snark" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d3cc6833a335bb8a600241889ead68ee89a3cf8448081fb7694c0fe503da63" +dependencies = [ + "ark-ff", + "ark-relations", + "ark-serialize", + "ark-std", +] + [[package]] name = "ark-std" version = "0.4.0" @@ -187,6 +308,12 @@ dependencies = [ "rayon", ] +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + [[package]] name = "async-stream" version = "0.3.5" @@ -206,7 +333,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -217,7 +344,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -235,6 +362,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.3.0" @@ -256,6 +389,18 @@ dependencies = [ "windows-targets 0.52.6", ] +[[package]] +name = "base-x" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbbc9d0964165b47557570cce6c952866c2678457aca742aafc9fb771d30270" + +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.22.1" @@ -280,7 +425,7 @@ dependencies = [ "schnorr_pok", "secret_sharing_and_dkg", "serde", - "serde_with", + "serde_with 1.14.0", "sha3", "zeroize", ] @@ -291,12 +436,39 @@ version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" +[[package]] +name = "bitmaps" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" +dependencies = [ + "typenum", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "blake2" version = "0.10.6" @@ -315,6 +487,77 @@ dependencies = [ "generic-array", ] +[[package]] +name = "btree-range-map" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1be5c9672446d3800bcbcaabaeba121fe22f1fb25700c4562b22faf76d377c33" +dependencies = [ + "btree-slab", + "cc-traits", + "range-traits", + "serde", + "slab", +] + +[[package]] +name = "btree-slab" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2b56d3029f075c4fa892428a098425b86cef5c89ae54073137ece416aef13c" +dependencies = [ + "cc-traits", + "slab", + "smallvec", +] + +[[package]] +name = "bulletproofs_plus_plus" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72efdc2e468364bf7b9f86fdc5690c4cd4d6ef62534215fe30331337908e0c88" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "rayon", + "serde", + "serde_with 1.14.0", + "zeroize", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" version = "1.18.0" @@ -343,111 +586,413 @@ dependencies = [ ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cc-traits" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "060303ef31ef4a522737e1b1ab68c67916f2a787bb2f4f54f383279adba962b5" +dependencies = [ + "slab", +] [[package]] -name = "cipher" -version = "0.4.4" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cookie" -version = "0.18.1" +name = "chacha20" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ - "percent-encoding", - "time", - "version_check", + "cfg-if", + "cipher", + "cpufeatures", ] [[package]] -name = "cpufeatures" -version = "0.2.14" +name = "chacha20poly1305" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" dependencies = [ - "libc", + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", ] [[package]] -name = "crossbeam-deque" -version = "0.8.5" +name = "chrono" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-targets 0.52.6", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "ciborium" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ - "crossbeam-utils", + "ciborium-io", + "ciborium-ll", + "serde", ] [[package]] -name = "crossbeam-utils" -version = "0.8.20" +name = "ciborium-io" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] -name = "crypto-common" -version = "0.1.6" +name = "ciborium-ll" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ - "generic-array", - "typenum", + "ciborium-io", + "half", ] [[package]] -name = "darling" -version = "0.13.4" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "darling_core", - "darling_macro", + "crypto-common", + "inout", + "zeroize", ] [[package]] -name = "darling_core" -version = "0.13.4" +name = "coconut-crypto" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +checksum = "3d5b98c93d9d14e68d50808ef36fc2751e5f71c5666f006d0fedd3c81d87b5c0" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 1.0.109", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "itertools 0.12.1", + "rayon", + "schnorr_pok", + "secret_sharing_and_dkg", + "serde", + "serde_with 1.14.0", + "zeroize", ] [[package]] -name = "darling_macro" -version = "0.13.4" +name = "contextual" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05ca71f324d19e85a2e976be04b5ecbb193253794a75adfe2e5044c8bef03f6a" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "corosensei" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80128832c58ea9cbd041d2a759ec449224487b2c1e400453d99d244eead87a8e" +dependencies = [ + "autocfg", + "cfg-if", + "libc", + "scopeguard", + "windows-sys 0.33.0", +] + +[[package]] +name = "cpufeatures" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +dependencies = [ + "libc", +] + +[[package]] +name = "cranelift-bforest" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a2ab4512dfd3a6f4be184403a195f76e81a8a9f9e6c898e19d2dc3ce20e0115" +dependencies = [ + "cranelift-entity", +] + +[[package]] +name = "cranelift-codegen" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98b022ed2a5913a38839dfbafe6cf135342661293b08049843362df4301261dc" +dependencies = [ + "arrayvec", + "bumpalo", + "cranelift-bforest", + "cranelift-codegen-meta", + "cranelift-codegen-shared", + "cranelift-egraph", + "cranelift-entity", + "cranelift-isle", + "gimli 0.26.2", + "log", + "regalloc2", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-codegen-meta" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "639307b45434ad112a98f8300c0f0ab085cbefcd767efcdef9ef19d4c0756e74" +dependencies = [ + "cranelift-codegen-shared", +] + +[[package]] +name = "cranelift-codegen-shared" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278e52e29c53fcf32431ef08406c295699a70306d05a0715c5b1bf50e33a9ab7" + +[[package]] +name = "cranelift-egraph" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624b54323b06e675293939311943ba82d323bb340468ce1889be5da7932c8d73" +dependencies = [ + "cranelift-entity", + "fxhash", + "hashbrown 0.12.3", + "indexmap 1.9.3", + "log", + "smallvec", +] + +[[package]] +name = "cranelift-entity" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a59bcbca89c3f1b70b93ab3cbba5e5e0cbf3e63dadb23c7525cb142e21a9d4c" + +[[package]] +name = "cranelift-frontend" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d70abacb8cfef3dc8ff7e8836e9c1d70f7967dfdac824a4cd5e30223415aca6" +dependencies = [ + "cranelift-codegen", + "log", + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cranelift-isle" +version = "0.91.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "393bc73c451830ff8dbb3a07f61843d6cb41a084f9996319917c0b291ed785bb" + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core 0.13.4", + "darling_macro 0.13.4", +] + +[[package]] +name = "darling" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +dependencies = [ + "darling_core 0.20.10", + "darling_macro 0.20.10", +] + +[[package]] +name = "darling_core" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.10.0", + "syn 1.0.109", +] + +[[package]] +name = "darling_core" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim 0.11.1", + "syn 2.0.87", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ - "darling_core", + "darling_core 0.13.4", "quote", "syn 1.0.109", ] +[[package]] +name = "darling_macro" +version = "0.20.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" +dependencies = [ + "darling_core 0.20.10", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" + +[[package]] +name = "data-encoding-macro" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1559b6cba622276d6d63706db152618eeb15b89b3e4041446b05876e352e639" +dependencies = [ + "data-encoding", + "data-encoding-macro-internal", +] + +[[package]] +name = "data-encoding-macro-internal" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "332d754c0af53bc87c108fed664d121ecf59207ec4196041f04d6ab9002ad33f" +dependencies = [ + "data-encoding", + "syn 1.0.109", +] + +[[package]] +name = "decoded-char" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5440d1dc8ea7cae44cda3c64568db29bfa2434aba51ae66a50c00488841a65a3" + [[package]] name = "deranged" version = "0.3.11" @@ -455,6 +1000,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", + "serde", ] [[package]] @@ -494,11 +1040,11 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7" dependencies = [ - "bitflags", + "bitflags 2.6.0", "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -531,7 +1077,7 @@ dependencies = [ "num", "rayon", "serde", - "serde_with", + "serde_with 1.14.0", "sha2", "zeroize", ] @@ -551,6 +1097,30 @@ dependencies = [ "zeroize", ] +[[package]] +name = "educe" +version = "0.4.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +dependencies = [ + "enum-ordinalize 3.1.15", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "educe" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4bd92664bf78c4d3dba9b7cdafce6fa15b13ed3ed16175218196942e99168a8" +dependencies = [ + "enum-ordinalize 4.3.0", + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "either" version = "1.13.0" @@ -567,58 +1137,153 @@ dependencies = [ ] [[package]] -name = "equivalent" -version = "1.0.1" +name = "enum-iterator" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "4eeac5c5edb79e4e39fe8439ef35207780a11f69c52cbe424ce3dfad4cb78de6" +dependencies = [ + "enum-iterator-derive", +] [[package]] -name = "errno" -version = "0.3.9" +name = "enum-iterator-derive" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "c134c37760b27a871ba422106eedbb8247da973a09e82558bf26d619c882b159" dependencies = [ - "libc", - "windows-sys 0.52.0", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "fastrand" -version = "2.1.1" +name = "enum-ordinalize" +version = "3.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.87", +] [[package]] -name = "figment" -version = "0.10.19" +name = "enum-ordinalize" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" dependencies = [ - "atomic 0.6.0", - "pear", - "serde", - "toml", - "uncased", - "version_check", + "enum-ordinalize-derive", ] [[package]] -name = "fips204" -version = "0.2.2" +name = "enum-ordinalize-derive" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea2461567040f75a882162ffe38f6dc35bf5a193e995ca3f8c1f5d3c101be1d" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ - "rand_core", - "sha3", - "zeroize", + "proc-macro2", + "quote", + "syn 2.0.87", ] [[package]] -name = "fnv" -version = "1.0.7" +name = "enumset" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - +checksum = "d07a4b049558765cef5f0c1a273c3fc57084d768b44d2f98127aef4cceb17293" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59c3b24c345d8c314966bdc1832f6c2635bfcce8e7cf363bd115987bba2ee242" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fallible-iterator" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" + +[[package]] +name = "fastrand" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" + +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic 0.6.0", + "pear", + "serde", + "toml", + "uncased", + "version_check", +] + +[[package]] +name = "fips204" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea2461567040f75a882162ffe38f6dc35bf5a193e995ca3f8c1f5d3c101be1d" +dependencies = [ + "rand_core", + "sha3", + "zeroize", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -628,6 +1293,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.30" @@ -636,6 +1307,7 @@ checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", + "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -658,12 +1330,34 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + [[package]] name = "futures-io" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "futures-sink" version = "0.3.30" @@ -685,6 +1379,7 @@ dependencies = [ "futures-channel", "futures-core", "futures-io", + "futures-macro", "futures-sink", "futures-task", "memchr", @@ -693,6 +1388,15 @@ dependencies = [ "slab", ] +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + [[package]] name = "generator" version = "0.7.5" @@ -723,8 +1427,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi", + "wasm-bindgen", +] + +[[package]] +name = "gimli" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22030e2c5a68ec659fde1e949a745124b48e6fa8b045b7ed5bd1fe4ccc5c4e5d" +dependencies = [ + "fallible-iterator", + "indexmap 1.9.3", + "stable_deref_trait", ] [[package]] @@ -751,20 +1468,58 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap", + "indexmap 2.5.0", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "h2" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http 1.1.0", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + [[package]] name = "hashbrown" version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.11", ] [[package]] @@ -785,6 +1540,18 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex_fmt" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" + [[package]] name = "hkdf" version = "0.12.4" @@ -836,6 +1603,29 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.1.0", +] + +[[package]] +name = "http-body-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" +dependencies = [ + "bytes", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "pin-project-lite", +] + [[package]] name = "httparse" version = "1.9.4" @@ -858,9 +1648,9 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2", + "h2 0.3.26", "http 0.2.12", - "http-body", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -873,1274 +1663,3328 @@ dependencies = [ ] [[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "indexmap" -version = "2.5.0" +name = "hyper" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ - "equivalent", - "hashbrown 0.14.5", - "serde", + "bytes", + "futures-channel", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", ] [[package]] -name = "inlinable_string" -version = "0.1.15" +name = "hyper-rustls" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" +dependencies = [ + "futures-util", + "http 1.1.0", + "hyper 1.5.0", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", +] [[package]] -name = "inout" -version = "0.1.3" +name = "hyper-tls" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "generic-array", + "bytes", + "http-body-util", + "hyper 1.5.0", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", ] [[package]] -name = "is-terminal" -version = "0.4.13" +name = "hyper-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ - "hermit-abi 0.4.0", - "libc", - "windows-sys 0.52.0", + "bytes", + "futures-channel", + "futures-util", + "http 1.1.0", + "http-body 1.0.1", + "hyper 1.5.0", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "itertools" -version = "0.10.5" +name = "iana-time-zone" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ - "either", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "itertools" -version = "0.12.1" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "either", + "cc", ] [[package]] -name = "itoa" -version = "1.0.11" +name = "ident_case" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] -name = "keccak" -version = "0.1.5" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "cpufeatures", + "unicode-bidi", + "unicode-normalization", ] [[package]] -name = "lazy_static" -version = "1.5.0" +name = "im" +version = "15.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" +dependencies = [ + "bitmaps", + "rand_core", + "rand_xoshiro", + "sized-chunks", + "typenum", + "version_check", +] [[package]] -name = "libc" -version = "0.2.158" +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] [[package]] -name = "lock_api" -version = "0.4.12" +name = "indexmap" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ - "autocfg", - "scopeguard", + "equivalent", + "hashbrown 0.14.5", + "serde", ] [[package]] -name = "log" -version = "0.4.22" +name = "indoc" +version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" [[package]] -name = "loom" -version = "0.5.6" +name = "inlinable_string" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "serde", - "serde_json", - "tracing", - "tracing-subscriber", -] +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" [[package]] -name = "matchers" -version = "0.1.0" +name = "inout" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" dependencies = [ - "regex-automata 0.1.10", + "generic-array", ] [[package]] -name = "memchr" -version = "2.7.4" +name = "ipnet" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] -name = "mime" -version = "0.3.17" +name = "iref" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +checksum = "374372d9ca7331cec26f307b12552554849143e6b2077be3553576aa9aa8258c" +dependencies = [ + "iref-core", +] [[package]] -name = "miniz_oxide" -version = "0.8.0" +name = "iref-core" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" +checksum = "b10559a0d518effd4f2cee107f40f83acf8583dcd3e6760b9b60293b0d2c2a70" dependencies = [ - "adler2", + "pct-str", + "smallvec", + "static-regular-grammar", + "thiserror", ] [[package]] -name = "mio" -version = "1.0.2" +name = "is-terminal" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "261f68e344040fbd0edea105bef17c66edf46f984ddb1115b775ce31be948f4b" dependencies = [ - "hermit-abi 0.3.9", + "hermit-abi 0.4.0", "libc", - "wasi", "windows-sys 0.52.0", ] [[package]] -name = "multer" -version = "3.1.0" +name = "itertools" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" dependencies = [ - "bytes", - "encoding_rs", - "futures-util", - "http 1.1.0", - "httparse", - "memchr", - "mime", - "spin", - "tokio", - "tokio-util", - "version_check", + "either", ] [[package]] -name = "next-gen-signatures" -version = "0.0.4" +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ - "anyhow", - "ark-bls12-381", - "ark-ec", - "ark-serialize", - "ark-std", - "base64", - "bbs_plus", - "blake2", - "dock_crypto_utils", - "fips204", - "num-bigint", - "paste", - "rand", - "rocket", - "schnorr_pok", + "either", ] [[package]] -name = "next-gen-signing-service" -version = "0.0.4" +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ - "next-gen-signatures", - "paste", - "rocket", - "rocket-errors", - "serde_urlencoded", + "either", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "js-sys" +version = "0.3.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ - "overload", - "winapi", + "wasm-bindgen", ] [[package]] -name = "num" -version = "0.4.3" +name = "json-event-parser" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +checksum = "32f12e624eaeb74accb9bb48f01cb071427f68115aaafa5689acb372d7e22977" + +[[package]] +name = "json-ld" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a5e03a47a0118ce03ca3a843d1cc1d6d89c91c0b035dab53ed57ad07068b4a3" dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", + "contextual", + "futures", + "iref", + "json-ld-compaction", + "json-ld-context-processing", + "json-ld-core", + "json-ld-expansion", + "json-ld-serialization", + "json-ld-syntax", + "json-syntax", + "locspan", + "rdf-types", + "thiserror", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "json-ld-compaction" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "5fec236664e058a0a43e46ad28bbf00858a7cede40ad17ffdced395a9628a928" dependencies = [ - "num-integer", - "num-traits", + "contextual", + "educe 0.4.23", + "futures", + "indexmap 2.5.0", + "iref", + "json-ld-context-processing", + "json-ld-core", + "json-ld-expansion", + "json-ld-syntax", + "json-syntax", + "langtag", + "mown", + "rdf-types", + "thiserror", ] [[package]] -name = "num-complex" -version = "0.4.6" +name = "json-ld-context-processing" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +checksum = "6aaf38d5a714ed573340f921a67c212935335e055ff2bb785337d38f6be282a4" dependencies = [ - "num-traits", + "contextual", + "futures", + "iref", + "json-ld-core", + "json-ld-syntax", + "mown", + "owning_ref", + "rdf-types", + "thiserror", ] [[package]] -name = "num-conv" -version = "0.1.0" +name = "json-ld-core" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +checksum = "2a82b473e2951a3cc3fed5061eb62dfbe3f984bdfb9e918214ad571674f09c8b" +dependencies = [ + "bytes", + "contextual", + "educe 0.4.23", + "futures", + "hashbrown 0.13.2", + "indexmap 2.5.0", + "iref", + "json-ld-syntax", + "json-syntax", + "langtag", + "linked-data", + "log", + "mime", + "once_cell", + "permutohedron", + "pretty_dtoa", + "rdf-types", + "reqwest", + "reqwest-middleware", + "ryu-js", + "smallvec", + "static-iref", + "thiserror", + "utf8-decode", +] [[package]] -name = "num-integer" -version = "0.1.46" +name = "json-ld-expansion" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "f05cf1f43e51f7360a889f83b2ccb075d21b8229d325f3c80764fb0bce49f1ce" dependencies = [ - "num-traits", + "contextual", + "educe 0.4.23", + "futures", + "indexmap 2.5.0", + "iref", + "json-ld-context-processing", + "json-ld-core", + "json-ld-syntax", + "json-syntax", + "langtag", + "mown", + "rdf-types", + "thiserror", ] [[package]] -name = "num-iter" -version = "0.1.45" +name = "json-ld-serialization" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +checksum = "9fe6e8a89c6aff8c955a6b9128be4da54f1d64b9564bcd647995610c657e2a4e" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "indexmap 2.5.0", + "iref", + "json-ld-core", + "json-syntax", + "linked-data", + "rdf-types", + "thiserror", + "xsd-types", ] [[package]] -name = "num-rational" -version = "0.4.2" +name = "json-ld-syntax" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "8a52919be632986e14dd1dbcfe12ce4573db02bf7044a09e7ec882a1ec2af7e6" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "contextual", + "decoded-char", + "educe 0.4.23", + "hashbrown 0.13.2", + "indexmap 2.5.0", + "iref", + "json-syntax", + "langtag", + "locspan", + "rdf-types", + "smallvec", + "thiserror", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "json-number" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "4c54d19ae7e6fc83aafa649707655a9a0ac956a0f62793bde4cfd193b0693fdf" dependencies = [ - "autocfg", + "lexical", + "ryu-js", + "smallvec", ] [[package]] -name = "num_cpus" -version = "1.16.0" +name = "json-syntax" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +checksum = "044a68aba3f96d712f492b72be25e10f96201eaaca3207a7d6e68d6d5105fda9" dependencies = [ - "hermit-abi 0.3.9", - "libc", + "contextual", + "decoded-char", + "hashbrown 0.12.3", + "indexmap 1.9.3", + "json-number", + "locspan", + "locspan-derive", + "ryu-js", + "smallstr", + "smallvec", + "utf8-decode", ] [[package]] -name = "object" -version = "0.36.4" +name = "keccak" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ - "memchr", + "cpufeatures", ] [[package]] -name = "oblivious_transfer_protocols" -version = "0.9.0" +name = "kvac" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330a05f454419f17296f011a136db6399d8900a6cf90a8191b0f208a66c00048" +checksum = "1e674e9ab3e6423f0387f7670238ff10885ec3e25c456cfe7904aed1283d404f" dependencies = [ - "aes", "ark-ec", "ark-ff", "ark-serialize", "ark-std", - "byteorder", - "cc", - "cipher", "digest", "dock_crypto_utils", "itertools 0.12.1", "rayon", "schnorr_pok", "serde", - "serde_with", - "sha3", + "serde_with 1.14.0", "zeroize", ] [[package]] -name = "once_cell" -version = "1.19.0" +name = "langtag" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "9ecb4c689a30e48ebeaa14237f34037e300dd072e6ad21a9ec72e810ff3c6600" +dependencies = [ + "static-regular-grammar", + "thiserror", +] [[package]] -name = "overload" -version = "0.1.1" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "parking_lot" -version = "0.12.3" +name = "leb128" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67" + +[[package]] +name = "legogroth16" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d2de1a0a97357f35fcf344fa94d71dbc180bc6318ec8e89c462aa5d166e2a3f" dependencies = [ - "lock_api", - "parking_lot_core", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-poly", + "ark-relations", + "ark-serialize", + "ark-snark", + "ark-std", + "dock_crypto_utils", + "fnv", + "log", + "num-bigint", + "rayon", + "wasmer", ] [[package]] -name = "parking_lot_core" -version = "0.9.10" +name = "lexical" +version = "6.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "c7aefb36fd43fef7003334742cbf77b243fcd36418a1d1bdd480d613a67968f6" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.52.6", + "lexical-core", ] [[package]] -name = "paste" -version = "1.0.15" +name = "lexical-core" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "2cde5de06e8d4c2faabc400238f9ae1c74d5412d03a7bd067645ccbc47070e46" +dependencies = [ + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", +] [[package]] -name = "pear" -version = "0.2.9" +name = "lexical-parse-float" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +checksum = "683b3a5ebd0130b8fb52ba0bdc718cc56815b6a097e28ae5a6997d0ad17dc05f" dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", + "lexical-parse-integer", + "lexical-util", + "static_assertions", ] [[package]] -name = "pear_codegen" -version = "0.2.9" +name = "lexical-parse-integer" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +checksum = "6d0994485ed0c312f6d965766754ea177d07f9c00c9b82a5ee62ed5b47945ee9" dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.77", + "lexical-util", + "static_assertions", ] [[package]] -name = "percent-encoding" -version = "2.3.1" +name = "lexical-util" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "5255b9ff16ff898710eb9eb63cb39248ea8a5bb036bea8085b1a767ff6c4e3fc" +dependencies = [ + "static_assertions", +] [[package]] -name = "pin-project-lite" -version = "0.2.14" +name = "lexical-write-float" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "accabaa1c4581f05a3923d1b4cfd124c329352288b7b9da09e766b0668116862" +dependencies = [ + "lexical-util", + "lexical-write-integer", + "static_assertions", +] [[package]] -name = "pin-utils" -version = "0.1.0" +name = "lexical-write-integer" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "e1b6f3d1f4422866b68192d62f77bc5c700bee84f3069f2469d7bc8c77852446" +dependencies = [ + "lexical-util", + "static_assertions", +] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "libc" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] -name = "ppv-lite86" -version = "0.2.20" +name = "linked-data" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +checksum = "04fd672ff31f4a6007acbdd33e1b65e1144081ec09b4189b3d20da3997603e90" dependencies = [ - "zerocopy", + "educe 0.4.23", + "im", + "iref", + "json-syntax", + "linked-data-derive", + "rdf-types", + "serde", + "static-iref", + "thiserror", + "xsd-types", ] [[package]] -name = "proc-macro2" -version = "1.0.86" +name = "linked-data-derive" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "887a1903665b47c2dcff59682d8de1be46813819ae0337d8eaa885035762fbee" dependencies = [ - "unicode-ident", + "iref", + "proc-macro-error", + "proc-macro2", + "quote", + "static-iref", + "syn 2.0.87", + "thiserror", ] [[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" +name = "linux-raw-sys" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", - "version_check", - "yansi", + "autocfg", + "scopeguard", ] [[package]] -name = "quote" -version = "1.0.37" +name = "locspan" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +checksum = "33890449fcfac88e94352092944bf321f55e5deb4e289a6f51c87c55731200a0" + +[[package]] +name = "locspan-derive" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88991223b049a3d29ca1f60c05639581336a0f3ee4bf8a659dddecc11c4961a" dependencies = [ + "proc-macro-error", "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "rand" -version = "0.8.5" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "loom" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ - "ppv-lite86", - "rand_core", + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber 0.3.18", ] [[package]] -name = "rand_core" -version = "0.6.4" +name = "mach" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa" dependencies = [ - "getrandom", + "libc", ] [[package]] -name = "rayon" -version = "1.10.0" +name = "mach2" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ - "either", - "rayon-core", + "libc", ] [[package]] -name = "rayon-core" -version = "1.12.1" +name = "matchers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "regex-automata 0.1.10", ] [[package]] -name = "redox_syscall" -version = "0.5.4" +name = "md-5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "bitflags", + "cfg-if", + "digest", ] [[package]] -name = "ref-cast" -version = "1.0.23" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" -dependencies = [ - "ref-cast-impl", -] +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "ref-cast-impl" -version = "1.0.23" +name = "memmap2" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "libc", ] [[package]] -name = "regex" -version = "1.10.6" +name = "memoffset" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "autocfg", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "regex-syntax 0.6.29", + "adler2", ] [[package]] -name = "regex-automata" -version = "0.4.7" +name = "mio" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.4", + "hermit-abi 0.3.9", + "libc", + "wasi", + "windows-sys 0.52.0", ] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "more-asserts" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389" [[package]] -name = "regex-syntax" -version = "0.8.4" +name = "mown" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "e7627d8bbeb17edbf1c3f74b21488e4af680040da89713b4217d0010e9cbd97e" [[package]] -name = "rocket" -version = "0.5.1" +name = "multer" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f" +checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b" dependencies = [ - "async-stream", - "async-trait", - "atomic 0.5.3", - "binascii", "bytes", - "either", - "figment", - "futures", - "indexmap", - "log", + "encoding_rs", + "futures-util", + "http 1.1.0", + "httparse", "memchr", - "multer", - "num_cpus", - "parking_lot", - "pin-project-lite", - "rand", - "ref-cast", - "rocket_codegen", - "rocket_http", - "serde", - "serde_json", - "state", - "tempfile", - "time", + "mime", + "spin", "tokio", - "tokio-stream", "tokio-util", - "ubyte", "version_check", - "yansi", -] - -[[package]] -name = "rocket-errors" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5ac1222b4578d545cc19d71a01cad41b43b383dc00c52737c2629c9c1affc0f" -dependencies = [ - "anyhow", - "rocket", ] [[package]] -name = "rocket_codegen" -version = "0.5.1" +name = "multibase" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" +checksum = "9b3539ec3c1f04ac9748a260728e855f261b4977f5c3406612c884564f329404" dependencies = [ - "devise", - "glob", - "indexmap", - "proc-macro2", - "quote", - "rocket_http", - "syn 2.0.77", - "unicode-xid", - "version_check", + "base-x", + "data-encoding", + "data-encoding-macro", ] [[package]] -name = "rocket_http" -version = "0.5.1" +name = "native-tls" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9" +checksum = "a8614eb2c83d59d1c8cc974dd3f920198647674a0a035e1af1fa58707e317466" dependencies = [ - "cookie", - "either", - "futures", - "http 0.2.12", - "hyper", - "indexmap", + "libc", "log", - "memchr", - "pear", - "percent-encoding", - "pin-project-lite", - "ref-cast", - "serde", - "smallvec", - "stable-pattern", - "state", - "time", - "tokio", - "uncased", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", ] [[package]] -name = "rustc-demangle" -version = "0.1.24" +name = "next-gen-signatures" +version = "0.1.0" +dependencies = [ + "anyhow", + "ark-bls12-381", + "ark-ec", + "ark-serialize", + "ark-std", + "base64", + "bbs_plus", + "blake2", + "chrono", + "dock_crypto_utils", + "fips204", + "iref", + "itertools 0.13.0", + "json-ld", + "legogroth16", + "multibase", + "num-bigint", + "openssl", + "oxigraph", + "oxrdf 0.2.1", + "oxttl", + "paste", + "proof_system", + "rand", + "rdf-canon", + "rdf-proofs", + "rdf-types", + "regex", + "rocket", + "schnorr_pok", + "serde", + "serde_json", + "static-iref", + "tokio", +] + +[[package]] +name = "next-gen-signing-service" +version = "0.1.0" +dependencies = [ + "next-gen-signatures", + "paste", + "rand", + "rocket", + "rocket-errors", + "serde_json", + "serde_urlencoded", +] + +[[package]] +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] [[package]] -name = "rustc_version" -version = "0.4.1" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "semver", + "overload", + "winapi", ] [[package]] -name = "rustix" -version = "0.38.37" +name = "num" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", ] [[package]] -name = "rustversion" -version = "1.0.17" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] [[package]] -name = "ryu" -version = "1.0.18" +name = "num-complex" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] [[package]] -name = "schnorr_pok" -version = "0.20.0" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a166f138517fe7359112179cb075ec04fb845267dfefb1c7f71258c5a817af49" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "ark-ec", - "ark-ff", - "ark-serialize", - "ark-std", - "digest", - "dock_crypto_utils", - "rayon", - "serde", - "serde_with", - "zeroize", + "num-traits", ] [[package]] -name = "scoped-tls" -version = "1.0.1" +name = "num-iter" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] [[package]] -name = "scopeguard" -version = "1.2.0" +name = "num-rational" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] [[package]] -name = "secret_sharing_and_dkg" -version = "0.13.0" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b40ba413c8cbba3aa7dd76ffaef86af19d7bc4e93f9bccf5fc929c89b18b021d" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.9", + "libc", +] + +[[package]] +name = "object" +version = "0.36.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +dependencies = [ + "memchr", +] + +[[package]] +name = "oblivious_transfer_protocols" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a05f454419f17296f011a136db6399d8900a6cf90a8191b0f208a66c00048" dependencies = [ + "aes", "ark-ec", "ark-ff", - "ark-poly", "ark-serialize", "ark-std", + "byteorder", + "cc", + "cipher", "digest", "dock_crypto_utils", + "itertools 0.12.1", "rayon", "schnorr_pok", "serde", - "serde_with", + "serde_with 1.14.0", + "sha3", "zeroize", ] [[package]] -name = "semver" -version = "1.0.23" +name = "once_cell" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] -name = "serde" -version = "1.0.210" +name = "opaque-debug" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" + +[[package]] +name = "openssl" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ - "serde_derive", + "bitflags 2.6.0", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-src" +version = "300.4.0+3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a709e02f2b4aca747929cca5ed248880847c650233cf8b8cdc48f40aaf4898a6" +dependencies = [ + "cc", +] + +[[package]] +name = "openssl-sys" +version = "0.9.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +dependencies = [ + "cc", + "libc", + "openssl-src", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "owning_ref" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ff55baddef9e4ad00f88b6c743a2a8062d4c6ade126c2a528644b8e444d52ce" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "oxigraph" +version = "0.3.22" +source = "git+https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git#c402c7d57743241cb6ece84dd6d1afc056a4e064" +dependencies = [ + "digest", + "getrandom", + "hex", + "js-sys", + "json-event-parser", + "lazy_static", + "libc", + "md-5", + "oxilangtag", + "oxiri", + "oxrdf 0.1.7", + "oxsdatatypes 0.1.3", + "rand", + "regex", + "rio_api", + "rio_turtle", + "rio_xml", + "sha-1", + "sha2", + "siphasher", + "sparesults", + "spargebra", +] + +[[package]] +name = "oxilangtag" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23f3f87617a86af77fa3691e6350483e7154c2ead9f1261b75130e21ca0f8acb" +dependencies = [ + "serde", +] + +[[package]] +name = "oxiri" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1584efc0f222d0fc8f31e6c229b8fd93f69280aab398828f0dbce3957178a1ac" + +[[package]] +name = "oxrdf" +version = "0.1.7" +source = "git+https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git#c402c7d57743241cb6ece84dd6d1afc056a4e064" +dependencies = [ + "oxilangtag", + "oxiri", + "oxsdatatypes 0.1.3", + "rand", +] + +[[package]] +name = "oxrdf" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b2115dc40840037ba86c494ffa2925ab435ec0c383dcf73d49600c9142db081" +dependencies = [ + "oxilangtag", + "oxiri", + "rand", + "thiserror", +] + +[[package]] +name = "oxsdatatypes" +version = "0.1.3" +source = "git+https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git#c402c7d57743241cb6ece84dd6d1afc056a4e064" +dependencies = [ + "js-sys", +] + +[[package]] +name = "oxsdatatypes" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aded4e13b58cbac3d7541ddd42b2b583323d2fcf4f9b2250394c6a07a39d51f" +dependencies = [ + "thiserror", +] + +[[package]] +name = "oxttl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5ff45d05226b72a41cb43bb5818149be337231c2db7c3501f0f3b1e29977748" +dependencies = [ + "memchr", + "oxilangtag", + "oxiri", + "oxrdf 0.2.1", + "thiserror", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pct-str" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf1bdcc492c285a50bed60860dfa00b50baf1f60c73c7d6b435b01a2a11fd6ff" +dependencies = [ + "thiserror", + "utf8-decode", +] + +[[package]] +name = "pear" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "peg" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "295283b02df346d1ef66052a757869b2876ac29a6bb0ac3f5f7cd44aebe40e8f" +dependencies = [ + "peg-macros", + "peg-runtime", +] + +[[package]] +name = "peg-macros" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdad6a1d9cf116a059582ce415d5f5566aabcd4008646779dab7fdc2a9a9d426" +dependencies = [ + "peg-runtime", + "proc-macro2", + "quote", +] + +[[package]] +name = "peg-runtime" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3aeb8f54c078314c2065ee649a7241f46b9d8e418e1a9581ba0546657d7aa3a" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "permutohedron" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b687ff7b5da449d39e418ad391e5e08da53ec334903ddbb921db208908fc372c" + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "pretty_dtoa" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a239bcdfda2c685fda1add3b4695c06225f50075e3cfb5b954e91545587edff2" +dependencies = [ + "ryu_floating_decimal", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", + "version_check", + "yansi", +] + +[[package]] +name = "proof_system" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2f8d0c8e7ddd54bbf16bd2f9d7b9219b10f7b673b20336119a881782e16cd7a" +dependencies = [ + "aead", + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-r1cs-std", + "ark-relations", + "ark-serialize", + "ark-std", + "bbs_plus", + "bulletproofs_plus_plus", + "chacha20poly1305", + "coconut-crypto", + "digest", + "dock_crypto_utils", + "dock_merlin", + "itertools 0.12.1", + "kvac", + "legogroth16", + "rayon", + "saver", + "schnorr_pok", + "serde", + "serde_with 1.14.0", + "short_group_sig", + "smc_range_proof", + "vb_accumulator", + "zeroize", +] + +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "quick-xml" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xoshiro" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" +dependencies = [ + "rand_core", +] + +[[package]] +name = "range-traits" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20581732dd76fa913c7dff1a2412b714afe3573e94d41c34719de73337cc8ab" + +[[package]] +name = "raw-btree" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a9a77e61cd9f37af08f952c1c072081563e129c0949ac4ede30f9e8b6b4b74f" + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rdf-canon" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1887472923223a7e4d2b35471ffbf46225dcbefc344fdbea80dbbb19b6b708" +dependencies = [ + "base16ct", + "digest", + "itertools 0.13.0", + "oxrdf 0.2.1", + "sha2", + "thiserror", + "tracing", +] + +[[package]] +name = "rdf-proofs" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db75b99df781bce856b8433148c08be7c5fc70b3e7b6d756da6881a7f6722dd" +dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "bbs_plus", + "blake2", + "chrono", + "ciborium", + "dock_crypto_utils", + "legogroth16", + "multibase", + "oxiri", + "oxrdf 0.2.1", + "oxsdatatypes 0.2.0", + "oxttl", + "proof_system", + "rdf-canon", + "regex", + "serde", + "serde_with 3.11.0", + "sha2", + "unsigned-varint", +] + +[[package]] +name = "rdf-types" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8d685353ee1b343c708b6be7751d98a7df8e1d0caaeee67c754318854c01d5" +dependencies = [ + "contextual", + "educe 0.5.11", + "indexmap 2.5.0", + "iref", + "langtag", + "raw-btree", + "replace_with", + "slab", + "static-iref", + "thiserror", +] + +[[package]] +name = "redox_syscall" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "ref-cast" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "regalloc2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300d4fbfb40c1c66a78ba3ddd41c1110247cf52f97b87d0f2fc9209bd49b030c" +dependencies = [ + "fxhash", + "log", + "slice-group-by", + "smallvec", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "region" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b6ebd13bc009aef9cd476c1310d49ac354d36e240cf1bd753290f3dc7199a7" +dependencies = [ + "bitflags 1.3.2", + "libc", + "mach2", + "windows-sys 0.52.0", +] + +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "replace_with" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a8614ee435691de62bcffcf4a66d91b3594bf1428a5722e79103249a095690" + +[[package]] +name = "reqwest" +version = "0.12.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f4955649ef5c38cc7f9e8aa41761d48fb9677197daea9984dc54f56aad5e63" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2 0.4.6", + "http 1.1.0", + "http-body 1.0.1", + "http-body-util", + "hyper 1.5.0", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-registry", +] + +[[package]] +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +dependencies = [ + "anyhow", + "async-trait", + "http 1.1.0", + "reqwest", + "serde", + "thiserror", + "tower-service", +] + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rio_api" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61d0c76ddf8b00cbb4d2c5932d067d49245c2f1f651809bde3cf265033ddb1af" + +[[package]] +name = "rio_turtle" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f351b77353c7c896f0cd5ced2a25a7e95b5360cb68d1d7c16682ee096d7f40" +dependencies = [ + "oxilangtag", + "oxiri", + "rio_api", +] + +[[package]] +name = "rio_xml" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd3384ae785ed3b0159607adc08adef580a28e277fbfa375c42d162e9da93b1" +dependencies = [ + "oxilangtag", + "oxiri", + "quick-xml 0.36.2", + "rio_api", +] + +[[package]] +name = "rkyv" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "indexmap 1.9.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "rocket" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f" +dependencies = [ + "async-stream", + "async-trait", + "atomic 0.5.3", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap 2.5.0", + "log", + "memchr", + "multer", + "num_cpus", + "parking_lot", + "pin-project-lite", + "rand", + "ref-cast", + "rocket_codegen", + "rocket_http", + "serde", + "serde_json", + "state", + "tempfile", + "time", + "tokio", + "tokio-stream", + "tokio-util", + "ubyte", + "version_check", + "yansi", +] + +[[package]] +name = "rocket-errors" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5ac1222b4578d545cc19d71a01cad41b43b383dc00c52737c2629c9c1affc0f" +dependencies = [ + "anyhow", + "rocket", +] + +[[package]] +name = "rocket_codegen" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46" +dependencies = [ + "devise", + "glob", + "indexmap 2.5.0", + "proc-macro2", + "quote", + "rocket_http", + "syn 2.0.87", + "unicode-xid", + "version_check", +] + +[[package]] +name = "rocket_http" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9" +dependencies = [ + "cookie", + "either", + "futures", + "http 0.2.12", + "hyper 0.14.30", + "indexmap 2.5.0", + "log", + "memchr", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state", + "time", + "tokio", + "uncased", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.23.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pemfile" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +dependencies = [ + "base64", + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "ryu-js" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6518fc26bced4d53678a22d6e423e9d8716377def84545fe328236e3af070e7f" + +[[package]] +name = "ryu_floating_decimal" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "700de91d5fd6091442d00fdd9ee790af6d4f0f480562b0f5a1e8f59e90aafe73" + +[[package]] +name = "saver" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256ae60411b80d857ad5ff09aefb06003ab978fba47a2ba648a6a2c2889911e5" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-groth16", + "ark-r1cs-std", + "ark-relations", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "dock_merlin", + "legogroth16", + "rayon", + "serde", + "serde_with 1.14.0", + "zeroize", +] + +[[package]] +name = "schannel" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "schnorr_pok" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a166f138517fe7359112179cb075ec04fb845267dfefb1c7f71258c5a817af49" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "rayon", + "serde", + "serde_with 1.14.0", + "zeroize", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "secret_sharing_and_dkg" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b40ba413c8cbba3aa7dd76ffaef86af19d7bc4e93f9bccf5fc929c89b18b021d" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "rayon", + "schnorr_pok", + "serde", + "serde_with 1.14.0", + "zeroize", +] + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55c3193aca71c12ad7890f1785d2b73e1b9f63a0bbc353c08ef26fe03fc56b5" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde-wasm-bindgen" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3b4c031cd0d9014307d82b8abf653c0290fbdaeb4c02d00c63cf52f728628bf" +dependencies = [ + "js-sys", + "serde", + "wasm-bindgen", +] + +[[package]] +name = "serde_derive" +version = "1.0.214" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de523f781f095e28fa605cdce0f8307e451cc0fd14e2eb4cd2e98a355b147766" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "serde_json" +version = "1.0.132" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_with" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +dependencies = [ + "serde", + "serde_with_macros 1.5.2", +] + +[[package]] +name = "serde_with" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e28bdad6db2b8340e449f7108f020b3b092e8583a9e3fb82713e1d4e71fe817" +dependencies = [ + "base64", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.5.0", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros 3.11.0", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling 0.13.4", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "serde_with_macros" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d846214a9854ef724f3da161b426242d8de7c1fc7de2f89bb1efcb154dca79d" +dependencies = [ + "darling 0.20.10", + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "sha-1" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5058ada175748e33390e40e872bd0fe59a19f265d0158daa551c5a88a76009c" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "short_group_sig" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601e96ef28b48820f50155fe97639a68d5c6c6f0be71eaa0c8a7598e50a0bef2" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "rayon", + "schnorr_pok", + "serde", + "serde_with 1.14.0", + "zeroize", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "sized-chunks" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" +dependencies = [ + "bitmaps", + "typenum", +] + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slice-group-by" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7" + +[[package]] +name = "smallstr" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b1aefdf380735ff8ded0b15f31aab05daf1f70216c01c02a12926badd1df9d" +dependencies = [ + "smallvec", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "smc_range_proof" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2752d05d96e4bf44928d5819b3d2d6cca75bdd918bd0f9c8c1f9ecece7db38d9" +dependencies = [ + "ark-ec", + "ark-ff", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "rayon", + "schnorr_pok", + "short_group_sig", + "zeroize", +] + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "sparesults" +version = "0.1.8" +source = "git+https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git#c402c7d57743241cb6ece84dd6d1afc056a4e064" +dependencies = [ + "json-event-parser", + "oxrdf 0.1.7", + "quick-xml 0.28.2", +] + +[[package]] +name = "spargebra" +version = "0.2.8" +source = "git+https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git#c402c7d57743241cb6ece84dd6d1afc056a4e064" +dependencies = [ + "oxilangtag", + "oxiri", + "oxrdf 0.1.7", + "peg", + "rand", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" +dependencies = [ + "loom", +] + +[[package]] +name = "static-iref" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cc4068497ae43896d41174586dcdc2153a1af2c82856fb308bfaaddc28e5549" +dependencies = [ + "iref", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "static-regular-grammar" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4a6c40247579acfbb138c3cd7de3dab113ab4ac6227f1b7de7d626ee667957" +dependencies = [ + "abnf", + "btree-range-map", + "ciborium", + "hex_fmt", + "indoc", + "proc-macro-error", + "proc-macro2", + "quote", + "serde", + "sha2", + "syn 2.0.87", + "thiserror", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.87" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +dependencies = [ + "futures-core", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +dependencies = [ + "cfg-if", + "fastrand", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +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.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145f3413504347a2be84393cc8a7d2fb4d863b375909ea59f2158261aa258bbb" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" +dependencies = [ + "rustls", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", ] [[package]] -name = "serde_derive" -version = "1.0.210" +name = "tokio-util" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] -name = "serde_json" -version = "1.0.128" +name = "toml" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" dependencies = [ - "itoa", - "memchr", - "ryu", "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", ] [[package]] -name = "serde_spanned" -version = "0.6.7" +name = "toml_datetime" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] [[package]] -name = "serde_urlencoded" -version = "0.7.1" +name = "toml_edit" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ - "form_urlencoded", - "itoa", - "ryu", + "indexmap 2.5.0", "serde", + "serde_spanned", + "toml_datetime", + "winnow", ] [[package]] -name = "serde_with" -version = "1.14.0" +name = "tower-service" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "serde", - "serde_with_macros", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "serde_with_macros" -version = "1.5.2" +name = "tracing-attributes" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ - "darling", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.87", ] [[package]] -name = "sha2" -version = "0.10.8" +name = "tracing-core" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ - "cfg-if", - "cpufeatures", - "digest", + "once_cell", + "valuable", ] [[package]] -name = "sha3" -version = "0.10.8" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "digest", - "keccak", + "log", + "once_cell", + "tracing-core", ] [[package]] -name = "sharded-slab" -version = "0.1.7" +name = "tracing-subscriber" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" dependencies = [ - "lazy_static", + "tracing-core", ] [[package]] -name = "shlex" -version = "1.3.0" +name = "tracing-subscriber" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] [[package]] -name = "signal-hook-registry" -version = "1.4.2" +name = "try-lock" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "ubyte" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" dependencies = [ - "libc", + "serde", ] [[package]] -name = "slab" -version = "0.4.9" +name = "uncased" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" dependencies = [ - "autocfg", + "serde", + "version_check", ] [[package]] -name = "smallvec" -version = "1.13.2" +name = "unicode-bidi" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] -name = "socket2" -version = "0.5.7" +name = "unicode-ident" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "unicode-normalization" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" dependencies = [ - "libc", - "windows-sys 0.52.0", + "tinyvec", ] [[package]] -name = "spin" -version = "0.9.8" +name = "unicode-width" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" [[package]] -name = "stable-pattern" -version = "0.1.0" +name = "unicode-xid" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" -dependencies = [ - "memchr", -] +checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] -name = "state" -version = "0.6.0" +name = "universal-hash" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "loom", + "crypto-common", + "subtle", ] [[package]] -name = "strsim" -version = "0.10.0" +name = "unsigned-varint" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "eb066959b24b5196ae73cb057f45598450d2c5f71460e98c49b738086eff9c06" [[package]] -name = "subtle" -version = "2.6.1" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] -name = "syn" -version = "1.0.109" +name = "url" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "form_urlencoded", + "idna", + "percent-encoding", ] [[package]] -name = "syn" -version = "2.0.77" +name = "utf8-decode" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] +checksum = "ca61eb27fa339aa08826a29f03e87b99b4d8f0fc2255306fd266bb1b6a9de498" [[package]] -name = "tempfile" -version = "3.12.0" +name = "uuid" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" -dependencies = [ - "cfg-if", - "fastrand", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] +checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314" [[package]] -name = "thread_local" -version = "1.1.8" +name = "valuable" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] -name = "time" -version = "0.3.36" +name = "vb_accumulator" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "cb38526c42d26848760a47cd39af3228bd2c20d9ddb673895c43914caa521d48" dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", + "ark-ec", + "ark-ff", + "ark-poly", + "ark-serialize", + "ark-std", + "digest", + "dock_crypto_utils", + "kvac", + "oblivious_transfer_protocols", + "rayon", + "schnorr_pok", + "secret_sharing_and_dkg", "serde", - "time-core", - "time-macros", + "serde_with 1.14.0", + "short_group_sig", + "zeroize", ] [[package]] -name = "time-core" -version = "0.1.2" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] [[package]] -name = "time-macros" -version = "0.2.18" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "tokio" -version = "1.40.0" +name = "wasm-bindgen" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.52.0", + "cfg-if", + "once_cell", + "wasm-bindgen-macro", ] [[package]] -name = "tokio-macros" -version = "2.4.0" +name = "wasm-bindgen-backend" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ + "bumpalo", + "log", + "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", + "wasm-bindgen-shared", ] [[package]] -name = "tokio-stream" -version = "0.1.16" +name = "wasm-bindgen-downcast" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "5dac026d43bcca6e7ce1c0956ba68f59edf6403e8e930a5d891be72c31a44340" dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", + "js-sys", + "once_cell", + "wasm-bindgen", + "wasm-bindgen-downcast-macros", ] [[package]] -name = "tokio-util" -version = "0.7.12" +name = "wasm-bindgen-downcast-macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "c5020cfa87c7cecefef118055d44e3c1fc122c7ec25701d528ee458a0b45f38f" dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "toml" -version = "0.8.19" +name = "wasm-bindgen-futures" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", ] [[package]] -name = "toml_datetime" -version = "0.6.8" +name = "wasm-bindgen-macro" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ - "serde", + "quote", + "wasm-bindgen-macro-support", ] [[package]] -name = "toml_edit" -version = "0.22.21" +name = "wasm-bindgen-macro-support" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", + "proc-macro2", + "quote", + "syn 2.0.87", + "wasm-bindgen-backend", + "wasm-bindgen-shared", ] [[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.40" +name = "wasm-bindgen-shared" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] -name = "tracing-attributes" -version = "0.1.27" +name = "wasm-encoder" +version = "0.218.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "22b896fa8ceb71091ace9bcb81e853f54043183a1c9667cf93422c40252ffa0a" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.77", + "leb128", ] [[package]] -name = "tracing-core" -version = "0.1.32" +name = "wasmer" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "78caedecd8cb71ed47ccca03b68d69414a3d278bb031e6f93f15759344efdd52" dependencies = [ - "once_cell", - "valuable", + "bytes", + "cfg-if", + "derivative", + "indexmap 1.9.3", + "js-sys", + "more-asserts", + "rustc-demangle", + "serde", + "serde-wasm-bindgen", + "target-lexicon", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-downcast", + "wasmer-compiler", + "wasmer-compiler-cranelift", + "wasmer-derive", + "wasmer-types", + "wasmer-vm", + "wat", + "winapi", ] [[package]] -name = "tracing-log" -version = "0.2.0" +name = "wasmer-compiler" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +checksum = "726a8450541af4a57c34af7b6973fdbfc79f896cc7e733429577dfd1d1687180" dependencies = [ - "log", - "once_cell", - "tracing-core", + "backtrace", + "cfg-if", + "enum-iterator", + "enumset", + "lazy_static", + "leb128", + "memmap2", + "more-asserts", + "region", + "smallvec", + "thiserror", + "wasmer-types", + "wasmer-vm", + "wasmparser", + "winapi", ] [[package]] -name = "tracing-subscriber" -version = "0.3.18" +name = "wasmer-compiler-cranelift" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "a1e5633f90f372563ebbdf3f9799c7b29ba11c90e56cf9b54017112d2e656c95" dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex", - "sharded-slab", + "cranelift-codegen", + "cranelift-entity", + "cranelift-frontend", + "gimli 0.26.2", + "more-asserts", + "rayon", "smallvec", - "thread_local", + "target-lexicon", "tracing", - "tracing-core", - "tracing-log", + "wasmer-compiler", + "wasmer-types", ] [[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[package]] -name = "ubyte" -version = "0.10.4" +name = "wasmer-derive" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea" +checksum = "97901fdbaae383dbb90ea162cc3a76a9fa58ac39aec7948b4c0b9bbef9307738" dependencies = [ - "serde", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] -name = "uncased" -version = "0.9.10" +name = "wasmer-types" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +checksum = "67f1f2839f4f61509550e4ddcd0e658e19f3af862b51c79fda15549d735d659b" dependencies = [ - "serde", - "version_check", + "bytecheck", + "enum-iterator", + "enumset", + "indexmap 1.9.3", + "more-asserts", + "rkyv", + "target-lexicon", + "thiserror", ] [[package]] -name = "unicode-ident" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" - -[[package]] -name = "unicode-xid" -version = "0.2.5" +name = "wasmer-vm" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" +checksum = "043118ec4f16d1714fed3aab758b502b864bd865e1d5188626c9ad290100563f" +dependencies = [ + "backtrace", + "cc", + "cfg-if", + "corosensei", + "dashmap", + "derivative", + "enum-iterator", + "fnv", + "indexmap 1.9.3", + "lazy_static", + "libc", + "mach", + "memoffset", + "more-asserts", + "region", + "scopeguard", + "thiserror", + "wasmer-types", + "winapi", +] [[package]] -name = "valuable" -version = "0.1.0" +name = "wasmparser" +version = "0.95.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "f2ea896273ea99b15132414be1da01ab0d8836415083298ecaffbe308eaac87a" +dependencies = [ + "indexmap 1.9.3", + "url", +] [[package]] -name = "version_check" -version = "0.9.5" +name = "wast" +version = "218.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "8a53cd1f0fa505df97557e36a58bddb8296e2fcdcd089529545ebfdb18a1b9d7" +dependencies = [ + "bumpalo", + "leb128", + "memchr", + "unicode-width", + "wasm-encoder", +] [[package]] -name = "want" -version = "0.3.1" +name = "wat" +version = "1.218.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "4f87f8e14e776762e07927c27c2054d2cf678aab9aae2d431a79b3e31e4dd391" dependencies = [ - "try-lock", + "wast", ] [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "web-sys" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "winapi" @@ -2173,6 +5017,58 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e400001bb720a623c1c69032f8e3e4cf09984deec740f007dd2b03ec864804b0" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1043d8214f791817bab27572aaa8af63732e11bf84aa21a45a78d6c317ae0e" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-strings" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd9b125c486025df0eabcb585e62173c6c9eddcec5d117d3b6e8c30e2ee4d10" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43dbb096663629518eb1dfa72d80243ca5a6aca764cae62a2df70af760a9be75" +dependencies = [ + "windows_aarch64_msvc 0.33.0", + "windows_i686_gnu 0.33.0", + "windows_i686_msvc 0.33.0", + "windows_x86_64_gnu 0.33.0", + "windows_x86_64_msvc 0.33.0", +] + [[package]] name = "windows-sys" version = "0.52.0" @@ -2234,6 +5130,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd761fd3eb9ab8cc1ed81e56e567f02dd82c4c837e48ac3b2181b9ffc5060807" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -2246,6 +5148,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_i686_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cab0cf703a96bab2dc0c02c0fa748491294bf9b7feb27e1f4f96340f208ada0e" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -2264,6 +5172,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfdbe89cc9ad7ce618ba34abc34bbb6c36d99e96cae2245b7943cd75ee773d0" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -2276,6 +5190,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_x86_64_gnu" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4dd9b0c0e9ece7bb22e84d70d01b71c6d6248b81a3c60d11869451b4cb24784" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -2300,6 +5220,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_msvc" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1e4aa646495048ec7f3ffddc411e1d829c026a2ec62b39da15c1055e406eaa" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -2321,6 +5247,35 @@ dependencies = [ "memchr", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "xsd-types" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5bf1ac247150da9bff673820d7dcc22bca6ab621b4ee4f76650b581aff47580" +dependencies = [ + "chrono", + "iref", + "lazy_static", + "num-bigint", + "num-rational", + "num-traits", + "once_cell", + "ordered-float", + "pretty_dtoa", + "static-iref", + "static-regular-grammar", + "thiserror", +] + [[package]] name = "yansi" version = "1.0.1" @@ -2348,7 +5303,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] [[package]] @@ -2368,5 +5323,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.87", ] diff --git a/Justfile b/Justfile new file mode 100644 index 0000000..4c68a1a --- /dev/null +++ b/Justfile @@ -0,0 +1,8 @@ +clippy: + cargo clippy --workspace --all-targets --all-features + +test-all: + cargo test --workspace --all-targets --all-features -- --nocapture + +test TEST: + cargo test --all-targets --all-features -- {{TEST}} --exact --nocapture \ No newline at end of file diff --git a/next-gen-signatures/Cargo.toml b/next-gen-signatures/Cargo.toml index b0e1d96..9627299 100644 --- a/next-gen-signatures/Cargo.toml +++ b/next-gen-signatures/Cargo.toml @@ -1,9 +1,10 @@ [package] name = "next-gen-signatures" -version = "0.0.4" +version = "0.1.0" edition = "2021" [features] +rocket = ["dep:rocket"] all-algos = ["fips204", "bbs"] fips204 = ["dep:fips204"] bbs = [ @@ -17,13 +18,32 @@ bbs = [ "dep:num-bigint", "dep:rand", "dep:schnorr_pok", + "dep:proof_system", + "dep:json-ld", + "dep:rdf-types", + "dep:static-iref", + "dep:iref", + "dep:oxigraph", + "dep:oxrdf", + "dep:oxttl", + "dep:rdf-proofs", + "dep:legogroth16", + "dep:multibase", + "dep:serde_json", + "dep:serde", + "dep:itertools", + + "dep:regex", + "dep:tokio", + "dep:rdf-canon", + "dep:chrono", ] [dependencies] anyhow = "1.0.89" base64 = "0.22.1" paste = "1.0.15" -rocket = "0.5.1" +rocket = { version = "0.5.1", optional = true } # FIPS204 fips204 = { version = "0.2.2", optional = true } @@ -39,3 +59,25 @@ dock_crypto_utils = { version = "0.20.0", optional = true } num-bigint = { version = "0.4.6", optional = true } rand = { version = "0.8.5", optional = true } schnorr_pok = { version = "0.20.0", optional = true } +proof_system = { version = "0.31.0", optional = true } +json-ld = { version = "0.21.1", features = ["reqwest"], optional = true } +rdf-types = { version = "0.22.4", optional = true } +static-iref = { version = "3.0.0", optional = true } +iref = { version = "3.2.2", optional = true } +oxigraph = { git = "https://github.com/UbiqueInnovation/oxigraph-v0.3.22-patch.git", optional = true } +oxrdf = { version = "0.2.1", optional = true } +oxttl = { version = "0.1.1", optional = true } +rdf-proofs = { version = "0.10.0", optional = true } +legogroth16 = { version = "0.15.0", optional = true } +multibase = { version = "0.9.1", optional = true } +serde_json = { version = "1.0.132", optional = true } +serde = { version = "1.0.214", features = ["derive"], optional = true } +# BBS+ tests +regex = { version = "1.11.0", optional = true } +tokio = { version = "1.40.0", optional = true } +rdf-canon = { version = "0.15.0", optional = true } +chrono = { version = "0.4.38", optional = true } +itertools = { version = "0.13.0", optional = true } + +[target.'cfg(any(target_os = "android"))'.dependencies] +openssl = { version = "0.10", features = ["vendored"] } diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.r1cs new file mode 100644 index 0000000..3af20bd Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.wasm b/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.wasm new file mode 100644 index 0000000..fd1fcd2 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_prv_prv_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.r1cs new file mode 100644 index 0000000..515d9c1 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.wasm b/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.wasm new file mode 100644 index 0000000..89c3b19 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_prv_pub_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.r1cs new file mode 100644 index 0000000..3b4d28a Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.wasm b/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.wasm new file mode 100644 index 0000000..fd1fcd2 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_eq_pub_prv_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.r1cs new file mode 100644 index 0000000..f999469 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.wasm b/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.wasm new file mode 100644 index 0000000..db41e9a Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_prv_prv_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.r1cs new file mode 100644 index 0000000..8b5f4ab Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.wasm b/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.wasm new file mode 100644 index 0000000..75b0cc1 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_prv_pub_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.r1cs new file mode 100644 index 0000000..8a7d2ae Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.wasm b/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.wasm new file mode 100644 index 0000000..db41e9a Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_pub_prv_64.wasm differ diff --git a/next-gen-signatures/circom/bls12381/less_than_public_64.r1cs b/next-gen-signatures/circom/bls12381/less_than_public_64.r1cs new file mode 100644 index 0000000..4ec4c25 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_public_64.r1cs differ diff --git a/next-gen-signatures/circom/bls12381/less_than_public_64.wasm b/next-gen-signatures/circom/bls12381/less_than_public_64.wasm new file mode 100644 index 0000000..7e6e191 Binary files /dev/null and b/next-gen-signatures/circom/bls12381/less_than_public_64.wasm differ diff --git a/next-gen-signatures/circom/circuits/comparators.circom b/next-gen-signatures/circom/circuits/comparators.circom new file mode 100644 index 0000000..6215c3a --- /dev/null +++ b/next-gen-signatures/circom/circuits/comparators.circom @@ -0,0 +1,121 @@ +/* + Copyright 2018 0KIMS association. + + This file is part of circom (Zero Knowledge Circuit Compiler). + + circom is a free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + circom is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with circom. If not, see . +*/ +pragma circom 2.0.0; + +// `out` signal will contain the bits of input `in` with LSB in the beginning and MSB in end. `in` is expected to be +// of `n` bits at most. +template Num2Bits(n) { + signal input in; + signal output out[n]; + var lc1=0; + + var e2=1; + for (var i = 0; i> i) & 1; + out[i] * (out[i] -1 ) === 0; + lc1 += out[i] * e2; + e2 = e2+e2; + } + + lc1 === in; +} + +// `out` signal will be set to 1 if `a < b` else 0. +template LessThan(n) { + assert(n <= 252); + signal input a; + signal input b; + signal output out; + + component n2b = Num2Bits(n+1); + + // 1< b, a-b > 0, even the largest a-b will be less than (1< out; +} + +// N is the number of bits the input have. +// The MSF is the sign bit. +template GreaterThan(n) { + signal input a; + signal input b; + signal output out; + + component lt = LessThan(n); + + lt.a <== b; + lt.b <== a; + lt.out ==> out; +} + +// N is the number of bits the input have. +// The MSF is the sign bit. +template GreaterEqThan(n) { + signal input a; + signal input b; + signal output out; + + component lt = LessThan(n); + + lt.a <== b; + lt.b <== a+1; + lt.out ==> out; +} + +// `out` signal will be set to 1 if `in == 0` else 0. +template IsZero() { + signal input in; + signal output out; + + signal inv; + + inv <-- in!=0 ? 1/in : 0; + + out <== -in*inv +1; + in*out === 0; +} + +// `out` signal will be set to 1 if `a == b` else 0. +template IsEqual() { + signal input a; + signal input b; + signal output out; + + component isz = IsZero(); + + b - a ==> isz.in; + + isz.out ==> out; +} \ No newline at end of file diff --git a/next-gen-signatures/circom/circuits/less_than_public_64.circom b/next-gen-signatures/circom/circuits/less_than_public_64.circom new file mode 100644 index 0000000..2ff6fb3 --- /dev/null +++ b/next-gen-signatures/circom/circuits/less_than_public_64.circom @@ -0,0 +1,7 @@ +pragma circom 2.0.0; + +include "comparators.circom"; + +/* Checks that the private input signal is less than the public input signal and both signals are expected to be of 64 bits */ + +component main {public [b]} = LessThan(64); \ No newline at end of file diff --git a/next-gen-signatures/examples/sample.jsonld b/next-gen-signatures/examples/sample.jsonld new file mode 100644 index 0000000..9fff44f --- /dev/null +++ b/next-gen-signatures/examples/sample.jsonld @@ -0,0 +1,7 @@ +{ + "@context": { + "name": "http://xmlns.com/foaf/0.1/name" + }, + "@id": "https://example.org/timothee-haudebourg", + "name": "Timothée Haudebourg" +} \ No newline at end of file diff --git a/next-gen-signatures/src/common.rs b/next-gen-signatures/src/common.rs index 3ea520b..ecfc76c 100644 --- a/next-gen-signatures/src/common.rs +++ b/next-gen-signatures/src/common.rs @@ -1,15 +1,24 @@ use std::fmt::Display; use anyhow::Result; -use rocket::form::{self, DataField, FromForm, ValueField}; pub type ByteArray = Vec; pub trait CryptoProvider { + #[cfg(feature = "rocket")] type GenParams: for<'a> FromForm<'a> + TestDefault; + #[cfg(feature = "rocket")] type SignParams: for<'a> FromForm<'a> + TestDefault; + #[cfg(feature = "rocket")] type VerifyParams: for<'a> FromForm<'a> + TestDefault; + #[cfg(not(feature = "rocket"))] + type GenParams: TestDefault; + #[cfg(not(feature = "rocket"))] + type SignParams: TestDefault; + #[cfg(not(feature = "rocket"))] + type VerifyParams: TestDefault; + type PublicKey; type SecretKey; @@ -34,6 +43,10 @@ impl Display for NoArguments { } } +#[cfg(feature = "rocket")] +use rocket::form::{self, DataField, FromForm, ValueField}; + +#[cfg(feature = "rocket")] #[rocket::async_trait] impl<'r> FromForm<'r> for NoArguments { type Context = (); diff --git a/next-gen-signatures/src/crypto/bbs.rs b/next-gen-signatures/src/crypto/bbs.rs index 25f0d8f..d840aff 100644 --- a/next-gen-signatures/src/crypto/bbs.rs +++ b/next-gen-signatures/src/crypto/bbs.rs @@ -16,7 +16,6 @@ use blake2::Blake2b512; use dock_crypto_utils::signature::MessageOrBlinding; use num_bigint::BigUint; use rand::RngCore; -use rocket::FromForm; use schnorr_pok::compute_random_oracle_challenge; pub type Digest = Blake2b512; @@ -25,16 +24,33 @@ fn get_rng() -> impl RngCore { rand::rngs::OsRng } +#[cfg(feature = "rocket")] +use rocket::FromForm; + +#[cfg(feature = "rocket")] #[derive(FromForm)] pub struct GenParams { - nonce: String, - message_count: u32, + pub nonce: String, + pub message_count: u32, +} + +#[cfg(not(feature = "rocket"))] +pub struct GenParams { + pub nonce: String, + pub message_count: u32, } +#[cfg(feature = "rocket")] #[derive(FromForm)] pub struct SignParams { - nonce: String, - messages: Vec, + pub nonce: String, + pub messages: Vec, +} + +#[cfg(not(feature = "rocket"))] +pub struct SignParams { + pub nonce: String, + pub messages: Vec, } pub type VerifyParams = SignParams; @@ -353,3 +369,306 @@ pub mod tests { // NOTE: Why only G1 see above (pok-notes) test_pok_of_sig!(G1); } + +pub mod test { + use std::{collections::HashMap, io::Cursor}; + + use ark_bls12_381::Bls12_381; + use legogroth16::circom::{r1cs::R1CSFile, CircomCircuit, R1CS as R1CSOrig}; + use multibase::Base; + use oxrdf::GraphName; + use rand::{prelude::StdRng, SeedableRng}; + use rdf_proofs::{ + ark_to_base64url, CircuitString, KeyGraph, KeyPairBase58Btc, VcPairString, + VerifiableCredential, + }; + + use crate::rdf::RdfQuery; + + pub type R1CS = R1CSOrig; + pub fn test_get_rng() -> StdRng { + StdRng::seed_from_u64(1337) + } + + pub fn test_get_keypair() -> KeyPairBase58Btc { + let mut rng = test_get_rng(); + KeyPairBase58Btc::new(&mut rng).unwrap() + } + + pub fn test_get_snark() -> (String, String) { + let mut rng = test_get_rng(); + + let circuit_r1cs = test_get_r1cs(); + let commit_witness_count = 1; + let snark_proving_key = CircomCircuit::setup(circuit_r1cs.clone()) + .generate_proving_key(commit_witness_count, &mut rng) + .unwrap(); + + // serialize to multibase + let snark_proving_key_string = ark_to_base64url(&snark_proving_key).unwrap(); + let snark_verifying_key_string = ark_to_base64url(&snark_proving_key.vk).unwrap(); + + (snark_proving_key_string, snark_verifying_key_string) + } + + pub fn test_get_r1cs() -> R1CS { + let bytes = include_bytes!("../../circom/bls12381/less_than_public_64.r1cs"); + R1CSFile::new(Cursor::new(bytes)).unwrap().into() + } + + const ISSUER_SECRET: &str = r#" + . + . + . + "z489BikWV616m6F5ayUNDnLxWpHVmw3tG6hSgCVE9ZxDEXz3"^^ . + "zUC77roR12AzeB1bjwU6eK86NBBpJf5Rxvyqh8QcaEK6BxRTDoQucp2DSARoAABMWchDk4zxXmwfpHUeaWBg7T4q3Pne9YfnZBhStoGBmCzQcdj8pY3joRbr37w4TMcU1Pipqdp"^^ . +"#; + + const ISSUER_PUBLIC: &str = r#" + . + . + . + "zUC77roR12AzeB1bjwU6eK86NBBpJf5Rxvyqh8QcaEK6BxRTDoQucp2DSARoAABMWchDk4zxXmwfpHUeaWBg7T4q3Pne9YfnZBhStoGBmCzQcdj8pY3joRbr37w4TMcU1Pipqdp"^^ . +"#; + + const VC: &str = r#" + . + . + "2024-01-01T00:00:00Z"^^ . + "2028-01-01T00:00:00Z"^^ . + . + . + "1337"^^ . + "John Doe"^^ . +"#; + + const VC_HIDDEN: &str = r#" + . + . + "2024-01-01T00:00:00Z"^^ . + "2028-01-01T00:00:00Z"^^ . + _:e0 . +_:e0 . +_:e0 _:e1 . +_:e0 "John Doe"^^ . +"#; + + const VC_PROOF_CFG: &str = r#" +_:b0 . +_:b0 "2024-01-01T12:00:00.000Z"^^ . +_:b0 "bbs-termwise-signature-2023" . +_:b0 . +_:b0 . +"#; + + pub async fn test_get_issuer() -> String { + let issuer = test_get_keypair(); + let issuer_sk = issuer.secret_key; + let issuer_pk = issuer.public_key; + + let issuer = RdfQuery::from_jsonld( + &format!( + r#" + {{ + "@context": [ + "https://www.w3.org/ns/controller/v1", + "https://w3id.org/security/data-integrity/v2" + ], + "id": "did:example:issuer0", + "type": "Controller", + "verificationMethod": {{ + "id": "did:example:issuer0#bls12_381-g2-pub001", + "type": "Multikey", + "controller": "did:example:issuer0", + "secretKeyMultibase": "{issuer_sk}", + "publicKeyMultibase": "{issuer_pk}" + }} + }}"# + ), + Some("b".to_string()), + ) + .await + .unwrap(); + issuer.to_rdf_string() + } + + pub fn test_issue() -> (String, String) { + let mut rng = test_get_rng(); + + let kg: KeyGraph = RdfQuery::new(ISSUER_SECRET) + .unwrap() + .as_graph(GraphName::DefaultGraph) + .into(); + + let mut vc = VerifiableCredential::new( + RdfQuery::new(VC).unwrap().as_graph(GraphName::DefaultGraph), + RdfQuery::new(VC_PROOF_CFG) + .unwrap() + .as_graph(GraphName::DefaultGraph), + ); + rdf_proofs::sign(&mut rng, &mut vc, &kg).unwrap(); + + (vc.document.to_string(), vc.proof.to_string()) + } + + pub fn test_present() -> String { + let mut rng = test_get_rng(); + + let vc_signed = r#" + "John Doe"^^ . + . + "1337"^^ . + "2024-01-01T00:00:00Z"^^ . + . + "2028-01-01T00:00:00Z"^^ . + . + . +"#; + let vc_proof_signed = r#" +_:b0 "bbs-termwise-signature-2023" . +_:b0 . +_:b0 "2024-01-01T12:00:00.000Z"^^ . +_:b0 . +_:b0 . +_:b0 "urmwROr8i6uMDe_2JSAKzV0oHFMUCob2lKfPG_zN3hYMuc84cfhyZaANSr85vl_B4nVbAf9v5-4CnD8HmtLIXh6R58ypeXPvhP0WuTe_Kf0n4hBOSPwmOXikaDEOzKGDcikDBg6sipzCdov-bUxsCTA"^^ . +"#; + + let deanon_map = HashMap::from([ + ("_:e0".to_string(), "".to_string()), + ( + "_:e1".to_string(), + "\"1337\"^^".to_string(), + ), + ]); + + let vc_pairs = vec![VcPairString::new( + vc_signed, + vc_proof_signed, + VC_HIDDEN, + VC_PROOF_CFG, + )]; + + // define circuit + let circuit_r1cs = test_get_r1cs(); + let circuit_wasm = include_bytes!("../../circom/bls12381/less_than_public_64.wasm"); + + // serialize to multibase + let circuit_r1cs = ark_to_base64url(&circuit_r1cs).unwrap(); + let circuit_wasm = multibase::encode(Base::Base64Url, circuit_wasm); + + let (snark_proving_key_string, _) = test_get_snark(); + + let predicates = vec![ +r#" +_:b0 . +_:b0 . +_:b0 _:b1 . +_:b1 _:b2 . +_:b2 . +_:b2 "a" . +_:b2 _:e1 . +_:b1 . +_:b0 _:b3 . +_:b3 _:b4 . +_:b4 . +_:b4 "b" . +_:b4 "9999"^^ . +_:b3 . +"#.to_string(), + ]; + + let circuits = HashMap::from([( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + CircuitString { + circuit_r1cs, + circuit_wasm, + snark_proving_key: snark_proving_key_string, + }, + )]); + + rdf_proofs::derive_proof_string( + &mut rng, + &vc_pairs, + &deanon_map, + ISSUER_PUBLIC, + None, + None, + None, + None, + None, + Some(&predicates), + Some(&circuits), + ) + .unwrap() + } + + pub fn test_verify() { + let mut rng = test_get_rng(); + + let proof = r#" + _:c14n10 . + _:c14n9 _:c14n10 . + _:c14n5 _:c14n10 . + "2028-01-01T00:00:00Z"^^ _:c14n10 . + "2024-01-01T00:00:00Z"^^ _:c14n10 . + _:c14n10 . +_:c14n0 "2024-11-07T10:36:33.912496Z"^^ _:c14n11 . +_:c14n0 _:c14n11 . +_:c14n0 "bbs-termwise-proof-2023" _:c14n11 . +_:c14n0 _:c14n11 . +_:c14n0 "uomFhWQN-AgAAAAAAAAAArKUTk0kCQOLNQw9nAPyeyxJAppgPXiJF7Xr7z9cCZ8EFL1ydqMmKlW358DDJ1_FOpUD5q0trrI3dNFgHxBoIDdi6aA5gnp9DRUltq8FkJsADriwz9fSKnjYvBZGwCjYPgLfYzOqY2vm1DS9tcZ8QoQuCucMkRRI-dwUuj3TLnuH39GVYxgB76lyJCfVumaQ9ruHBGkMW2L6F7dASV2QDzwhFPVG0yZHTI9XWiHV0VWr5V9DFF7Dq7GrW6A-XXcrUX6nbqIw5EFoPiB-kezPQP-z8vYiuD-VIio1ZtdRMsyhnR7pX-UDw-hk0F-3aAnWqQWkQ6HPYlmTOT2zK72cnWbCLUGwGpgaSbJs0XYkGx7w_3mkTRrcQhGoNXm-I_ZgWAlszH2l6vzqmdo720sIA7QABBQAAAAAAAAAAAAAAAAAAAMpVr-TyDpOTFWzxOwCGBVnmtGi5oU6fRjUlcwK0CJNIAQAAAAAAAACAfPYg9ap9Td-qcmSw0yRdrdaqflKYfnCWiZs_ZdiPUAUAAAAAAAAAUHSWZ2sXhJO0-he2HuaNHwYChPhPdx-ryMVzMk5FnGMKAAAAAAAAAFF9M3WpcD14lwLuFJ5tN-I7PSM7-dItCc_SgJdR5oUtCwAAAAAAAAAvbUf_pMmHjgrl3IM342r9bt6lD5qEFywjaAbjx4PNIQwAAAAAAAAABo8hdBPUj4mL_h4sc6Tamjgww81eXERlytfE1DucFQNAcSjAQTC9GOGe_5I-g5RE-rIbgGmMm_6nBiLYqT3UuDfMCZYVVwerq0hkGGrMhMpTt8-D15aAv_nMt5q5SXaLpxIIl3GLNH73bXLKmI6x24Mf9Gz5zi5_hDxhCdE9K-aVJWejOLQXZxLSzfzm_p6o-bUdiE5zs835KibotBv8Cr5dxFwL44mlmM2W6gNLJN5Fq6Q5Yqj3mwju7iEoQ60vKLDsSoXl7eBYa0w9x92pDTlfZOp_c5uD_zexAmis8OU3qQMcmVCgwnHKL3NDTOVxJJeHINvI6mDOXIYZAx_hKPaLAcMJBFJDIiYmWsr0T2Nv0T_NJ4I8dBI4SdSmAj40CwIAAAAAAAAAgHz2IPWqfU3fqnJksNMkXa3Wqn5SmH5wlombP2XYj1DFV05WtxG837tt_aDUqTX5hpj1Suqr8Za6CROmBfDwCwAAYWKBpGFhiAMEBQYHAAECYWIIYWOFAAECAwRhZAU"^^ _:c14n11 . +_:c14n1 . +_:c14n1 _:c14n11 . +_:c14n1 _:c14n10 . +_:c14n1 _:c14n13 . +_:c14n12 _:c14n2 _:c14n13 . +_:c14n12 _:c14n13 . +_:c14n2 _:c14n13 . +_:c14n2 "9999"^^ _:c14n13 . +_:c14n2 "b" _:c14n13 . +_:c14n3 _:c14n13 . +_:c14n3 _:c14n8 _:c14n13 . +_:c14n3 "a" _:c14n13 . +_:c14n4 _:c14n3 _:c14n13 . +_:c14n4 _:c14n13 . +_:c14n5 _:c14n8 _:c14n10 . +_:c14n5 "John Doe"^^ _:c14n10 . +_:c14n5 _:c14n10 . +_:c14n6 _:c14n13 . +_:c14n6 _:c14n13 . +_:c14n6 _:c14n4 _:c14n13 . +_:c14n6 _:c14n12 _:c14n13 . +_:c14n7 "2024-01-01T12:00:00.000Z"^^ _:c14n9 . +_:c14n7 _:c14n9 . +_:c14n7 "bbs-termwise-signature-2023" _:c14n9 . +_:c14n7 _:c14n9 . +_:c14n7 _:c14n9 . +"#; + + let (_, snark_verifying_key_string) = test_get_snark(); + + let snark_verifying_keys = HashMap::from([( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + snark_verifying_key_string, + )]); + + rdf_proofs::verify_proof_string( + &mut rng, + proof, + ISSUER_PUBLIC, + None, + None, + Some(snark_verifying_keys), + ) + .unwrap(); + } + + #[tokio::test] + pub async fn test_1() { + test_issue(); + + test_present(); + + test_verify(); + } +} diff --git a/next-gen-signatures/src/crypto/common.rs b/next-gen-signatures/src/crypto/common.rs new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/next-gen-signatures/src/crypto/common.rs @@ -0,0 +1 @@ + diff --git a/next-gen-signatures/src/crypto/fips204.rs b/next-gen-signatures/src/crypto/fips204.rs index 32d310d..ae277b5 100644 --- a/next-gen-signatures/src/crypto/fips204.rs +++ b/next-gen-signatures/src/crypto/fips204.rs @@ -1,14 +1,22 @@ use base64::Engine; use fips204::traits::{SerDes, Signer, Verifier}; + +#[cfg(feature = "rocket")] use rocket::FromForm; use crate::common::{CryptoProvider, NoArguments, TestDefault}; +#[cfg(feature = "rocket")] #[derive(FromForm)] pub struct SignParams { message: String, } +#[cfg(not(feature = "rocket"))] +pub struct SignParams { + message: String, +} + impl TestDefault for SignParams { fn default_for_test() -> Self { Self { diff --git a/next-gen-signatures/src/crypto/mod.rs b/next-gen-signatures/src/crypto/mod.rs index 834c7ad..2f2c4fe 100644 --- a/next-gen-signatures/src/crypto/mod.rs +++ b/next-gen-signatures/src/crypto/mod.rs @@ -9,3 +9,8 @@ pub use bbs::{BbsPlusG1Provider, BbsPlusG2Provider}; #[cfg(feature = "bbs")] pub mod bbs; + +#[cfg(feature = "bbs")] +pub mod zkp; + +pub mod common; diff --git a/next-gen-signatures/src/crypto/zkp/circuits.rs b/next-gen-signatures/src/crypto/zkp/circuits.rs new file mode 100644 index 0000000..ba56f92 --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/circuits.rs @@ -0,0 +1,79 @@ +use ark_bls12_381::Bls12_381; +use legogroth16::circom::{r1cs::R1CSFile, CircomCircuit, R1CS as R1CSOrig}; +use multibase::Base; +use rand::RngCore; +use rdf_proofs::{ark_to_base64url, CircuitString}; +use std::{collections::HashMap, io::Cursor}; + +use super::{Circuits, ProofRequirement}; + +type R1CS = R1CSOrig; + +pub const LESS_THAN_PUBLIC_ID: &str = "https://zkp-ld.org/circuit/ubique/lessThanPublic"; +const LESS_THAN_PUBLIC_R1CS: &[u8] = + include_bytes!("../../../circom/bls12381/less_than_public_64.r1cs"); +const LESS_THAN_PUBLIC_WASM: &[u8] = + include_bytes!("../../../circom/bls12381/less_than_public_64.wasm"); + +pub fn get_circuit_defs() -> HashMap { + HashMap::from([( + LESS_THAN_PUBLIC_ID.to_string(), + (LESS_THAN_PUBLIC_R1CS, LESS_THAN_PUBLIC_WASM), + )]) +} + +pub fn generate_circuits(rng: &mut R, reqs: &Vec) -> Circuits { + let lookup = get_circuit_defs(); + + let mut verifying_keys = HashMap::::new(); + let mut proving_keys = HashMap::::new(); + + for req in reqs { + if let ProofRequirement::Circuit { id, .. } = req { + let (r1cs, _) = lookup.get(id).unwrap(); + let r1cs: R1CS = R1CSFile::new(Cursor::new(r1cs)).unwrap().into(); + + let commit_witness_count = 1; + let snark_proving_key = CircomCircuit::setup(r1cs) + .generate_proving_key(commit_witness_count, rng) + .unwrap(); + + // serialize to multibase + let snark_proving_key_string = ark_to_base64url(&snark_proving_key).unwrap(); + let snark_verifying_key_string = ark_to_base64url(&snark_proving_key.vk).unwrap(); + + verifying_keys.insert(id.clone(), snark_verifying_key_string); + proving_keys.insert(id.clone(), snark_proving_key_string); + } + } + + Circuits { + verifying_keys, + proving_keys, + } +} + +pub fn load_circuits(keys: &HashMap) -> HashMap { + type R1CS = R1CSOrig; + + let lookup = get_circuit_defs(); + let mut circuits = HashMap::::new(); + + for (id, key) in keys { + let (r1cs, wasm) = lookup.get(id).unwrap(); + let r1cs: R1CS = R1CSFile::new(Cursor::new(r1cs)).unwrap().into(); + + let wasm = multibase::encode(Base::Base64Url, wasm); + let r1cs = ark_to_base64url(&r1cs).unwrap(); + + let circuit = CircuitString { + circuit_r1cs: r1cs, + circuit_wasm: wasm, + snark_proving_key: key.clone(), + }; + + circuits.insert(id.clone(), circuit); + } + + circuits +} diff --git a/next-gen-signatures/src/crypto/zkp/common.rs b/next-gen-signatures/src/crypto/zkp/common.rs new file mode 100644 index 0000000..fd1d938 --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/common.rs @@ -0,0 +1,26 @@ +use std::time::SystemTime; + +use chrono::{DateTime, Utc}; +use rand::RngCore; +use rdf_proofs::KeyPairBase58Btc; +use serde_json::{json, Value as JsonValue}; + +pub(super) fn get_proof_cfg(issuer_key_id: &str) -> JsonValue { + let now: DateTime = SystemTime::now().into(); + let now = now.format("%Y-%m-%dT%H:%M:%SZ").to_string(); + json!( + { + "@context": "https://www.w3.org/ns/data-integrity/v1", + "type": "DataIntegrityProof", + "created": now, + "cryptosuite": "bbs-termwise-signature-2023", + "proofPurpose": "assertionMethod", + "verificationMethod": issuer_key_id + } + ) +} + +pub fn generate_keypair(rng: &mut R) -> (String, String) { + let kp = KeyPairBase58Btc::new(rng).unwrap(); + (kp.public_key, kp.secret_key) +} diff --git a/next-gen-signatures/src/crypto/zkp/issuance.rs b/next-gen-signatures/src/crypto/zkp/issuance.rs new file mode 100644 index 0000000..16f3e08 --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/issuance.rs @@ -0,0 +1,96 @@ +use std::time::SystemTime; + +use chrono::{DateTime, Months, Utc}; +use oxrdf::GraphName; +use rand::RngCore; +use rdf_proofs::VerifiableCredential; +use serde_json::{json, Value as JsonValue}; + +use crate::rdf::RdfQuery; + +use super::{common::get_proof_cfg, Credential}; + +pub async fn issue( + rng: &mut R, + data: JsonValue, + issuer_pk: String, + issuer_sk: String, + issuer_id: &str, + issuer_key_id: &str, + exp_months: u32, +) -> Credential { + let issuer = RdfQuery::from_jsonld( + &json!( + { + "@context": [ + "https://www.w3.org/ns/controller/v1", + "https://w3id.org/security/data-integrity/v2" + ], + "id": issuer_id, + "type": "Controller", + "verificationMethod": { + "id": issuer_key_id, + "type": "Multikey", + "controller": issuer_id, + "secretKeyMultibase": issuer_sk, + "publicKeyMultibase": issuer_pk + } + } + ) + .to_string(), + Some("b".to_string()), + ) + .await + .unwrap(); + + let now: DateTime = SystemTime::now().into(); + let exp = now + .checked_add_months(Months::new(exp_months)) + .expect("Failed to get expiration date"); + let now = now.format("%Y-%m-%dT%H:%M:%SZ").to_string(); + let exp = exp.format("%Y-%m-%dT%H:%M:%SZ").to_string(); + + let credential_id = "http://example.org/credentials/person/0"; + + let data = RdfQuery::from_jsonld( + &json!({ + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://www.w3.org/ns/data-integrity/v1" + ], + "id": credential_id, + "type": "VerifiableCredential", + "issuer": issuer_id, + "issuanceDate": now, + "expirationDate": exp, + "credentialSubject": data + }) + .to_string(), + Some("b".to_string()), + ) + .await + .unwrap(); + + let proof_cfg = RdfQuery::from_jsonld( + &get_proof_cfg(issuer_key_id).to_string(), + Some("b".to_string()), + ) + .await + .unwrap(); + + let mut vc = VerifiableCredential::new( + data.as_graph(GraphName::DefaultGraph), + proof_cfg.as_graph(GraphName::DefaultGraph), + ); + rdf_proofs::sign( + rng, + &mut vc, + &issuer.as_graph(GraphName::DefaultGraph).into(), + ) + .expect("Failed to sign vc!"); + + let doc = multibase::encode(multibase::Base::Base64Url, vc.document.to_string()); + let proof = multibase::encode(multibase::Base::Base64Url, vc.proof.to_string()); + + Credential::new(&doc, &proof) +} diff --git a/next-gen-signatures/src/crypto/zkp/mod.rs b/next-gen-signatures/src/crypto/zkp/mod.rs new file mode 100644 index 0000000..0c49008 --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/mod.rs @@ -0,0 +1,13 @@ +use circuits::*; +pub use common::generate_keypair; +pub use issuance::issue; +pub use presentation::present; +pub use types::*; +pub use verification::verify; + +pub mod circuits; +mod common; +mod issuance; +mod presentation; +mod types; +mod verification; diff --git a/next-gen-signatures/src/crypto/zkp/presentation.rs b/next-gen-signatures/src/crypto/zkp/presentation.rs new file mode 100644 index 0000000..ccadd1d --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/presentation.rs @@ -0,0 +1,166 @@ +use std::collections::HashMap; + +use oxrdf::{GraphName, NamedNode}; +use rand::RngCore; +use rdf_proofs::VcPairString; +use rdf_types::generator; +use serde_json::{json, Value as JsonValue}; + +use crate::rdf::RdfQuery; + +use super::{load_circuits, Credential, Presentation, ProofRequirement}; + +pub async fn present( + rng: &mut R, + vc: Credential, + reqs: &Vec, + proving_keys: &HashMap, + issuer_pk: String, + issuer_id: &str, + issuer_key_id: &str, +) -> Presentation { + let circuits = load_circuits(proving_keys); + + let json = vc.as_json(); + + let mut subject = HashMap::::new(); + let mut deanon_map = HashMap::::new(); + let mut predicates = Vec::::new(); + + let issuer = RdfQuery::from_jsonld( + &json!( + { + "@context": [ + "https://www.w3.org/ns/controller/v1", + "https://w3id.org/security/data-integrity/v2" + ], + "id": issuer_id, + "type": "Controller", + "verificationMethod": { + "id": issuer_key_id, + "type": "Multikey", + "controller": issuer_id, + "publicKeyMultibase": issuer_pk + } + } + ) + .to_string(), + Some("b".to_string()), + ) + .await + .unwrap() + .to_rdf_string(); + + let body = json["https://www.w3.org/2018/credentials#credentialSubject"] + .as_object() + .unwrap(); + + let rdf_body = vc + .graph + .get_value( + NamedNode::new_unchecked("https://www.w3.org/2018/credentials#credentialSubject"), + Some(&vc.graph.get_graph_by_name(GraphName::DefaultGraph)), + ) + .unwrap() + .as_graph() + .unwrap(); + + let mut gen = generator::Blank::new_with_prefix("e".to_string()); + + for req in reqs { + let (key, value) = body.iter().find(|(key, _)| req.get_key() == *key).unwrap(); + + match req { + ProofRequirement::Required { .. } => { + subject.insert(key.clone(), value.clone()); + } + ProofRequirement::Circuit { + id, + private_var, + public_var, + public_val, + .. + } => { + let value = rdf_body + .get_value(NamedNode::new_unchecked(key), None) + .unwrap() + .as_value() + .unwrap(); + + let public_val = serde_json::to_value(public_val).unwrap(); + + let blank = deanon_map + .iter() + .find_map(|(k, v)| (v == &value).then_some(k.clone())) + .unwrap_or_else(|| gen.next_blank_id().to_string()); + + deanon_map.insert(blank.clone(), value); + + let predicate = json!({ + "@type": "https://zkp-ld.org/security#Predicate", + "https://zkp-ld.org/security#circuit": { "@id": id }, + "https://zkp-ld.org/security#private": { + "http://www.w3.org/1999/02/22-rdf-syntax-ns#first": { + "@type": "https://zkp-ld.org/security#PrivateVariable", + "https://zkp-ld.org/security#val": { "@id": "to:be:verified" }, + "https://zkp-ld.org/security#var": private_var + }, + "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": { + "@id": "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil" + } + }, + "https://zkp-ld.org/security#public": { + "http://www.w3.org/1999/02/22-rdf-syntax-ns#first": { + "@type": "https://zkp-ld.org/security#PublicVariable", + "https://zkp-ld.org/security#val": public_val, + "https://zkp-ld.org/security#var": public_var + }, + "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest": { + "@id": "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil" + } + } + }); + + let predicate = + RdfQuery::from_jsonld(&predicate.to_string(), Some("b".to_string())) + .await + .unwrap() + .to_rdf_string() + .replace("", &blank); + + predicates.push(predicate); + + subject.insert(key.clone(), json!({ "@id": blank })); + } + } + } + + let disc_vc = { + let mut disc_vc = json.clone(); + + disc_vc["https://www.w3.org/2018/credentials#credentialSubject"] = json!(subject); + RdfQuery::from_jsonld(&disc_vc.to_string(), Some("e".to_string())) + .await + .unwrap() + .to_rdf_string() + }; + + let vc_pair = VcPairString::new(&vc.rdf_doc, &vc.rdf_proof, &disc_vc, &vc.rdf_proof); + + let proof = rdf_proofs::derive_proof_string( + rng, + &vec![vc_pair], + &deanon_map, + &issuer, + None, + None, + None, + None, + None, + Some(&predicates), + Some(&circuits), + ) + .unwrap(); + + Presentation::new(&proof) +} diff --git a/next-gen-signatures/src/crypto/zkp/types.rs b/next-gen-signatures/src/crypto/zkp/types.rs new file mode 100644 index 0000000..04c7a2e --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/types.rs @@ -0,0 +1,149 @@ +use std::collections::HashMap; + +use multibase::Base; +use oxrdf::{GraphName, NamedNode, Term}; +use serde::{Deserialize, Serialize}; +use serde_json::{json, Value as JsonValue}; + +use crate::rdf::RdfQuery; + +#[derive(Debug)] +pub struct Credential { + pub(super) graph: RdfQuery, + pub(super) rdf_doc: String, + pub(super) rdf_proof: String, +} + +#[derive(Debug)] +pub struct Presentation { + pub(super) graph: RdfQuery, +} + +impl Presentation { + pub fn new(proof: &str) -> Self { + let graph = RdfQuery::new(proof).unwrap(); + + Self { graph } + } + + pub fn serialize(&self) -> String { + let str = self.graph.to_rdf_string(); + multibase::encode(Base::Base64Url, str) + } + + pub fn deserialize(str: &str) -> Self { + let (_, quads) = multibase::decode(str).unwrap(); + let quads = String::from_utf8(quads).unwrap(); + Self::new(&quads) + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct Circuits { + pub verifying_keys: HashMap, + pub proving_keys: HashMap, +} + +impl Credential { + pub fn new(doc: &str, proof: &str) -> Self { + let (_, doc) = multibase::decode(doc).unwrap(); + let doc = String::from_utf8(doc).unwrap(); + + let (_, proof) = multibase::decode(proof).unwrap(); + let proof = String::from_utf8(proof).unwrap(); + + Self { + graph: RdfQuery::new(&doc).unwrap(), + rdf_doc: doc, + rdf_proof: proof, + } + } + + pub fn as_json(&self) -> JsonValue { + self.graph.to_json( + Some(GraphName::DefaultGraph), + Some(vec![ + Term::NamedNode(NamedNode::new_unchecked( + "https://www.w3.org/2018/credentials#VerifiableCredential", + )), + /* + Term::NamedNode(NamedNode::new_unchecked( + "https://w3id.org/security#DataIntegrityProof", + )), + */ + ]), + None, + ) + } + + pub fn serialize(&self) -> JsonValue { + let json = self.as_json(); + let encoded = multibase::encode( + Base::Base64Url, + json!({ + "rdf_doc": self.rdf_doc, + "rdf_proof": self.rdf_proof + }) + .to_string(), + ); + + json!({ + "humanReadable": json, + "encoded": encoded, + }) + } + + pub fn deserialize_encoded(encoded: &str) -> Self { + let (_, decoded) = multibase::decode(encoded).unwrap(); + + let decoded = String::from_utf8(decoded).unwrap(); + + println!("{decoded}"); + + let json = serde_json::from_str::(&decoded).unwrap(); + + println!("{json}"); + + let rdf_doc = json["rdf_doc"].as_str().unwrap(); + let rdf_doc = multibase::encode(Base::Base64, rdf_doc); + + let rdf_proof = json["rdf_proof"].as_str().unwrap(); + let rdf_proof = multibase::encode(Base::Base64, rdf_proof); + + Self::new(&rdf_doc, &rdf_proof) + } +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct PublicValue { + #[serde(rename = "@type")] + pub r#type: String, + #[serde(rename = "@value")] + pub value: String, +} + +#[derive(Debug, Serialize, Deserialize)] +#[serde(tag = "type")] +pub enum ProofRequirement { + Required { + key: String, + }, + Circuit { + id: String, + + private_var: String, + private_key: String, + + public_var: String, + public_val: PublicValue, + }, +} + +impl ProofRequirement { + pub fn get_key(&self) -> &str { + match self { + ProofRequirement::Required { key } => key, + ProofRequirement::Circuit { private_key, .. } => private_key, + } + } +} diff --git a/next-gen-signatures/src/crypto/zkp/verification.rs b/next-gen-signatures/src/crypto/zkp/verification.rs new file mode 100644 index 0000000..d92bd89 --- /dev/null +++ b/next-gen-signatures/src/crypto/zkp/verification.rs @@ -0,0 +1,155 @@ +use std::collections::HashMap; + +use crate::rdf::RdfQuery; + +use super::{Presentation, ProofRequirement}; + +use itertools::Itertools; +use oxrdf::{GraphName, NamedNode, Term}; +use rand::RngCore; +use serde_json::{json, Value as JsonValue}; + +pub async fn verify( + rng: &mut R, + pres: Presentation, + issuer_pk: String, + verifying_keys: HashMap, + reqs: &Vec, + issuer_id: &str, + issuer_key_id: &str, +) -> JsonValue { + let issuer = RdfQuery::from_jsonld( + &json!( + { + "@context": [ + "https://www.w3.org/ns/controller/v1", + "https://w3id.org/security/data-integrity/v2" + ], + "id": issuer_id, + "type": "Controller", + "verificationMethod": { + "id": issuer_key_id, + "type": "Multikey", + "controller": issuer_id, + "publicKeyMultibase": issuer_pk + } + } + ) + .to_string(), + Some("b".to_string()), + ) + .await + .unwrap() + .to_rdf_string(); + + let success = rdf_proofs::verify_proof_string( + rng, + &pres.graph.to_rdf_string(), + &issuer, + None, + None, + Some(verifying_keys), + ); + + assert!(success.is_ok(), "{success:#?}"); + + let json = pres.graph.to_json(None, None, None) + ["https://www.w3.org/2018/credentials#verifiableCredential"] + .clone(); + + let subject = json["https://www.w3.org/2018/credentials#credentialSubject"].clone(); + + for req in reqs { + match req { + ProofRequirement::Required { key } => { + assert!(subject.get(key).is_some()); + } + ProofRequirement::Circuit { + id, + private_key, + private_var, + public_val, + public_var, + } => { + let blank_id = subject + .get(private_key) + .unwrap() + .get("@id") + .unwrap() + .as_str() + .unwrap(); + + let predicate = NamedNode::new_unchecked("https://zkp-ld.org/security#predicate"); + + let graphs = pres + .graph + .quads + .iter() + .filter_map(|q| (q.predicate == predicate).then_some(q.object.clone())) + .dedup() + .filter_map(|s| match s { + Term::Literal(_) => None, + Term::BlankNode(node) => Some( + pres.graph + .get_graph_by_name(GraphName::BlankNode(node)) + .to_json(None, None, None), + ), + Term::NamedNode(node) => Some( + pres.graph + .get_graph_by_name(GraphName::NamedNode(node)) + .to_json(None, None, None), + ), + }) + .find(|json| { + let x = || { + let public = json + .get("https://zkp-ld.org/security#public")? + .get("http://www.w3.org/1999/02/22-rdf-syntax-ns#first")?; + let pub_val = public + .get("https://zkp-ld.org/security#val")? + .get("@value")?; + let pub_type = public + .get("https://zkp-ld.org/security#val")? + .get("@type")?; + let pub_var = public + .get("https://zkp-ld.org/security#var")? + .get("@value")?; + + let priv_var = json + .get("https://zkp-ld.org/security#private")? + .get("http://www.w3.org/1999/02/22-rdf-syntax-ns#first")? + .get("https://zkp-ld.org/security#var")? + .get("@value")?; + + let circuit_id = json + .get("https://zkp-ld.org/security#circuit")? + .get("@id")?; + + Some( + pub_val == &public_val.value + && pub_type == &public_val.r#type + && pub_var == public_var + && priv_var == private_var + && circuit_id == id, + ) + }; + + x().unwrap_or(false) + }) + .unwrap(); + + assert!( + graphs + .get("https://zkp-ld.org/security#private") + .and_then(|j| j.get("http://www.w3.org/1999/02/22-rdf-syntax-ns#first")) + .and_then(|j| j.get("https://zkp-ld.org/security#val")) + .and_then(|j| j.get("@id")) + .unwrap() + == blank_id + ); + } + } + } + + subject +} diff --git a/next-gen-signatures/src/lib.rs b/next-gen-signatures/src/lib.rs index 90567c1..bc996c0 100644 --- a/next-gen-signatures/src/lib.rs +++ b/next-gen-signatures/src/lib.rs @@ -2,4 +2,7 @@ pub mod common; pub mod crypto; pub mod macros; +#[cfg(feature = "bbs")] +pub mod rdf; + pub use base64::prelude::{Engine, BASE64_URL_SAFE_NO_PAD}; diff --git a/next-gen-signatures/src/rdf/mod.rs b/next-gen-signatures/src/rdf/mod.rs new file mode 100644 index 0000000..84310e3 --- /dev/null +++ b/next-gen-signatures/src/rdf/mod.rs @@ -0,0 +1,314 @@ +use std::{ + collections::{HashMap, HashSet}, + fmt::Write, +}; + +use json_ld::{syntax::Parse as _, JsonLdProcessor as _, RemoteDocument, ReqwestLoader}; +use oxrdf::{Graph, GraphName, NamedNode, Quad, Subject, Term, Triple}; +use oxttl::NQuadsParser; +use rdf_types::generator; +use serde_json::{json, Value as JsonValue}; + +const TYPE: &str = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"; + +#[derive(Debug, Clone)] +pub struct RdfQuery { + pub quads: Vec, +} + +#[derive(Debug, Clone)] +pub enum RdfValue { + Graph(RdfQuery), + Value(String), +} + +impl RdfValue { + pub fn as_graph(self) -> Result { + match self { + RdfValue::Graph(graph) => Ok(graph), + _ => Err(self), + } + } + + pub fn as_value(self) -> Result { + match self { + RdfValue::Value(value) => Ok(value), + _ => Err(self), + } + } +} + +impl RdfQuery { + pub fn new(source: &str) -> anyhow::Result { + let quads = NQuadsParser::new() + .for_reader(source.as_bytes()) + .collect::, _>>()?; + + Ok(Self { quads }) + } + + pub async fn from_jsonld(data: &str, prefix: Option) -> anyhow::Result { + let doc = RemoteDocument::new(None, None, json_ld::syntax::Value::parse_str(data)?.0); + + let loader = ReqwestLoader::new(); + + let mut generator = if let Some(prefix) = prefix { + generator::Blank::new_with_prefix(prefix) + } else { + generator::Blank::new() + }; + + let mut rdf = doc.to_rdf(&mut generator, &loader).await?; + + let rdf = rdf.cloned_quads().fold(String::new(), |mut output, q| { + let _ = writeln!(output, "{q} ."); + output + }); + + Self::new(&rdf) + } + + pub fn is_empty(&self) -> bool { + self.quads.is_empty() + } + + pub fn ids(&self) -> Vec { + self.quads + .iter() + .filter_map(|q| match &q.subject { + Subject::NamedNode(n) => Some(n.clone().into_string()), + _ => None, + }) + .collect::>() + .into_iter() + .collect::>() + } + + pub fn get(&self, subject: Option, predicate: NamedNode) -> Option { + self.quads + .iter() + .find(|q| { + subject.as_ref().map(|s| &q.subject == s).unwrap_or(true) + && q.predicate == predicate + }) + .map(|t| t.object.clone()) + } + + pub fn entries(&self) -> HashMap { + fn resolve_key(key: NamedNode) -> String { + let mut key = key.into_string(); + if key == TYPE { + key = "type".to_string(); + } + key + } + + self.quads + .iter() + .map(|q| (resolve_key(q.predicate.clone()), q.object.clone())) + .collect::>() + } + + pub fn get_graph_by_name(&self, name: GraphName) -> Self { + let quads = self + .quads + .iter() + .filter(|quad| quad.graph_name == name) + .cloned() + .collect::>(); + + Self { quads } + } + + pub fn get_graph_by_subjects(&self, subjects: Vec) -> Self { + let quads = self + .quads + .iter() + .filter(|q| subjects.contains(&q.subject)) + .cloned() + .collect::>(); + + Self { quads } + } + + pub fn get_value(&self, predicate: NamedNode, root: Option<&RdfQuery>) -> Option { + let root = root.unwrap_or(self); + + let object = root + .quads + .iter() + .find_map(|q| (q.predicate == predicate).then_some(q.object.clone()))?; + + Some(match object { + Term::Literal(lit) => { + RdfValue::Value(format!("\"{}\"^^{}", lit.value(), lit.datatype())) + } + Term::BlankNode(node) => { + let graph = self.get_graph_by_subjects(vec![Subject::BlankNode(node.clone())]); + if graph.is_empty() { + RdfValue::Value(node.to_string()) + } else { + RdfValue::Graph(graph) + } + } + Term::NamedNode(node) => { + let graph = self.get_graph_by_subjects(vec![Subject::NamedNode(node.clone())]); + if graph.is_empty() { + RdfValue::Value(node.to_string()) + } else { + RdfValue::Graph(graph) + } + } + }) + } + + pub fn get_graph_by_types(&self, types: Vec) -> Self { + let subjects = self + .quads + .iter() + .filter_map(|q| { + (q.predicate.clone().into_string() == TYPE && types.contains(&q.object)) + .then_some(q.subject.clone()) + }) + .collect::>(); + self.get_graph_by_subjects(subjects) + } + + pub fn to_rdf_string(&self) -> String { + self.quads.iter().fold(String::new(), |mut output, q| { + writeln!(output, "{q} .").unwrap(); + output + }) + } + + fn to_json_impl(&self, lookup: &RdfQuery, context: &Option>) -> JsonValue { + let resolve_ctx = |key: String| -> String { + if let Some(context) = context.as_ref() { + if let Some(context) = context + .iter() + .find(|ctx| key.starts_with(&format!("{ctx}#"))) + { + key.clone().split_off(context.len() + 1) + } else { + key + } + } else { + key + } + }; + + let mut entries = self + .entries() + .into_iter() + .map(|(k, v)| { + if k == "type" { + return ( + "@type".to_string(), + JsonValue::String(resolve_ctx(match v { + Term::Literal(lit) => lit.value().to_string(), + Term::NamedNode(node) => node.into_string(), + Term::BlankNode(node) => node.to_string(), + })), + ); + } + + let k = resolve_ctx(k); + + match v { + Term::Literal(val) => ( + k, + json!({ + "@type": val.datatype().as_str(), + "@value": val.value().to_string() + }), + ), + Term::BlankNode(node) => { + let mut graph = + lookup.get_graph_by_name(GraphName::BlankNode(node.clone())); + if graph.is_empty() { + graph = lookup + .get_graph_by_subjects(vec![Subject::BlankNode(node.clone())]); + } + + if graph.is_empty() { + ( + k, + json!({ + "@id": node.to_string(), + }), + ) + } else { + (k, graph.to_json_impl(lookup, context)) + } + } + Term::NamedNode(node) => { + let mut graph = + lookup.get_graph_by_name(GraphName::NamedNode(node.clone())); + if graph.is_empty() { + graph = lookup + .get_graph_by_subjects(vec![Subject::NamedNode(node.clone())]); + } + + if graph.is_empty() { + ( + k, + json!({ + "@id": node.into_string(), + }), + ) + } else { + (k, graph.to_json_impl(lookup, context)) + } + } + } + }) + .collect::>(); + + let ids = self.ids(); + if let Some(id) = ids.first() { + if ids.len() < 2 { + entries.insert("@id".to_string(), json!(id)); + } + } + + json!(entries) + } + + pub fn to_json( + &self, + graph_name: Option, + types: Option>, + context: Option>, + ) -> JsonValue { + let mut lookup = self.clone(); + if let Some(graph_name) = graph_name { + lookup = lookup.get_graph_by_name(graph_name); + } + if let Some(types) = types { + lookup = lookup.get_graph_by_types(types); + } + + let mut json = lookup.to_json_impl(self, &context); + + if let Some(context) = context { + json["@context"] = JsonValue::Array( + context + .into_iter() + .map(|k| JsonValue::String(k.to_string())) + .collect::>(), + ); + } + + json + } + + pub fn as_graph(&self, graph_name: GraphName) -> Graph { + Graph::from_iter(self.quads.iter().filter_map(|q| { + (q.graph_name == graph_name).then_some(Triple::new( + q.subject.clone(), + q.predicate.clone(), + q.object.clone(), + )) + })) + } +} diff --git a/next-gen-signatures/tests/jsonld-sample.rs b/next-gen-signatures/tests/jsonld-sample.rs new file mode 100644 index 0000000..b46b282 --- /dev/null +++ b/next-gen-signatures/tests/jsonld-sample.rs @@ -0,0 +1,125 @@ +use iref::IriBuf; +use json_ld::{ + syntax::Print, warning, JsonLdProcessor, Options, RemoteContextReference, + RemoteDocumentReference, ReqwestLoader, +}; +use json_ld::{ + syntax::{Parse, Value}, + RemoteDocument, +}; +use next_gen_signatures::rdf::RdfQuery; +use rdf_types::vocabulary::{IndexVocabulary, IriVocabularyMut}; +use static_iref::iri; + +#[tokio::test] +async fn test_json_ld_to_rdf() { + let data = r#" + { + "@context": "http://schema.org/", + "@type": "Person", + "name": "John Doe" + }"#; + + let graph = RdfQuery::from_jsonld(data, Some("b".to_string())) + .await + .unwrap(); + + println!("{}", graph.to_rdf_string()) +} + +#[tokio::test] +async fn jsonld_sample() { + let doc = RemoteDocument::::new( + None, + None, + Value::parse_str( + r#" +{ + "@context": "http://schema.org/", + "@type": "Person", + "name": "Jane Doe", + "jobTitle": "Professor", + "telephone": "(425) 123-4567", + "url": "http://www.janedoe.com", + "stuff": { + "asdf": "hehe" + } +} + "#, + ) + .unwrap() + .0, + ); + + let loader = ReqwestLoader::new(); + + let mut generator = rdf_types::generator::Blank::new_with_prefix("b".to_string()); + + let nodes = doc + .flatten_using( + &mut generator, + &loader, + Options { + ordered: true, + ..Default::default() + }, + ) + .await + .unwrap(); + + println!("{}", nodes.pretty_print()); + + let input = RemoteDocument::::new(None, None, nodes); + + let context = RemoteContextReference::iri(iri!("http://schema.org/").to_owned()); + + let mut compact = input + .compact_using( + context, + &loader, + Options { + ..Default::default() + }, + ) + .await + .expect("compaction failed"); + + *compact + .as_object_mut() + .unwrap() + .get_mut_or_insert_with("@context", || Value::Null) = + Value::String("http://schema.org/".into()); + + println!("output: {}", compact.pretty_print()); +} + +#[tokio::test] +async fn jsonld_test() { + // Creates the vocabulary that will map each `rdf_types::vocabulary::Index` + // to an actual `IriBuf`. + let mut vocabulary: IndexVocabulary = IndexVocabulary::new(); + + let iri_index = vocabulary.insert(iri!("https://example.com/sample.jsonld")); + let input = RemoteDocumentReference::iri(iri_index); + + // Use `FsLoader` to redirect any URL starting with `https://example.com/` to + // the local `example` directory. No HTTP query. + let mut loader = json_ld::FsLoader::default(); + loader.mount(iri!("https://example.com/").to_owned(), "examples"); + + let mut generator = rdf_types::generator::Blank::new(); + + let nodes = input + .flatten_full( + &mut vocabulary, + &mut generator, + None, + &loader, + Options::default(), + warning::PrintWith, + ) + .await + .expect("flattening failed"); + + println!("{}", nodes.pretty_print()); +} diff --git a/next-gen-signatures/tests/jsonld-zkp-using-crate.rs b/next-gen-signatures/tests/jsonld-zkp-using-crate.rs new file mode 100644 index 0000000..26e39cb --- /dev/null +++ b/next-gen-signatures/tests/jsonld-zkp-using-crate.rs @@ -0,0 +1,154 @@ +use std::io::Cursor; + +use json_ld::{ + syntax::{Parse, Value}, + JsonLdProcessor, RemoteDocument, ReqwestLoader, +}; +use oxrdf::{Dataset, Graph}; +use oxttl::{NQuadsParser, NTriplesParser}; +use rand::{prelude::StdRng, SeedableRng}; +use rdf_proofs::{KeyGraph, VerifiableCredential}; +use rdf_types::{ + generator, + vocabulary::{IndexVocabulary, IriVocabularyMut}, +}; +use static_iref::iri; + +const KEY_GRAPH: &str = r#" +# issuer0 + . + . + . + "z4893E1L7AeYfqaduUdLYgcxefWAah8gJB8RhPi7JHQkdRbe" . + "zUC77BjGcGDVWfBdgzqwzp3uuWkoWuRMe8pnx4dkncia5t9LKHVt96BPGBizeSU7BKiV35h1tsuVwHUVt4arZuckxGCb2tTsB3fsY66mQNs5Bwoac2w2iyYFe8uenBUYdAiveEr" . +# issuer1 + . + . + . + "z488yTRFj1e7W6s6MVN6iYm6taiNByQwSCg2XwgEJvAcXr15" . + "zUC7HaSjNELSGG8QnYdMvNurgfWfdGNo1Znqds6CoYQ24qKKWogiLtKWPoCLJapEYdKAMN9r6bdF9MeNrfV3fhUzkKwrfUewD5yVhwSVpM4tjv87YVgWGRTUuesxf7scabbPAnD" . +# issuer2 + . + . + . + "z489AEiC5VbeLmVZxokiJYkXNZrMza9eCiPZ51ekgcV9mNvG" . + "zUC7DKvfSfydgg48FpP53HgsLfWrVHfrmUXbwvw8AnSgW1JiA5741mwe3hpMNNRMYh3BgR9ebxvGAxPxFhr8F3jQHZANqb3if2MycjQN3ZBSWP3aGoRyat294icdVMDhTqoKXeJ" . +# issuer3 + . + . + . + "z488w754KqucDkNxCWCoi5DkH6pvEt6aNZNYYYoKmDDx8m5G" . + "zUC74KLKQtdApVyY3EbAZfiW6A7HdwSZVLsBF2vs5512YwNWs5PRYiqavzWLoiAq6UcKLv6RAnUM9Y117Pg4LayaBMa9euz23C2TDtBq8QuhpbDRDqsjUxLS5S9ruWRk71SEo69" . +"#; + +const VC_PROOF_WITHOUT_PROOFVALUE_AND_DATETIME_1: &str = r#" +_:b0 . +_:b0 . +_:b0 . +"#; + +pub fn get_graph_from_ntriples(ntriples: &str) -> Graph { + let iter = NTriplesParser::new() + .for_reader(ntriples.as_bytes()) + .collect::, _>>() + .unwrap(); + Graph::from_iter(iter) +} + +pub async fn canonicalize_jsonld(data: &str) -> Graph { + let doc = RemoteDocument::new(None, None, Value::parse_str(data).unwrap().0); + + let mut vocabulary: IndexVocabulary = IndexVocabulary::new(); + vocabulary.insert(iri!("https://example.com/")); + + let loader = ReqwestLoader::new(); + + let mut generator = generator::Blank::new_with_prefix("b".to_string()); + + let mut rdf = doc.to_rdf(&mut generator, &loader).await.unwrap(); + + let nquads = rdf + .cloned_quads() + .map(|q| format!("{} .", q)) + .collect::>() + .join("\n"); + + let input_quads = NQuadsParser::new() + .for_reader(Cursor::new(nquads)) + .map(|x| x.unwrap()); + + let input_dataset = Dataset::from_iter(input_quads); + let canonicalized = rdf_canon::canonicalize(&input_dataset).unwrap(); + + get_graph_from_ntriples(&canonicalized) +} + +async fn issue(data: &str, _sk: ()) -> VerifiableCredential { + // 1. Turn data into canonical form + let canonicalized = canonicalize_jsonld(data).await; + + // 2. Sign data + let keygraph: KeyGraph = get_graph_from_ntriples(KEY_GRAPH).into(); + let proof = get_graph_from_ntriples(VC_PROOF_WITHOUT_PROOFVALUE_AND_DATETIME_1); + let mut vc = VerifiableCredential::new(canonicalized, proof); + let mut rng = StdRng::seed_from_u64(0u64); + + rdf_proofs::sign(&mut rng, &mut vc, &keygraph).unwrap(); + + vc +} + +fn derive(vc: VerifiableCredential, _pres: &str) -> VerifiableCredential { + // 1. Turn data into canonical form + + // 2. Create presentation + + vc +} + +fn verify(_pk: (), vp: VerifiableCredential) -> bool { + // 1. Turn data into canonical form + + // 2. Verify presentation + let keygraph: KeyGraph = get_graph_from_ntriples(KEY_GRAPH).into(); + rdf_proofs::verify(&vp, &keygraph).is_ok() +} + +#[tokio::test] +async fn jsonld_zkp_using_crate() { + // In theory we have some data that we want to issue / present / verify + let data = r#" +{ + "@context": "http://schema.org", + "type": "Person", + "name": "John Smith", + "worksFor": { + "type": "Organization", + "name": "ABC inc." + } +} + "#; + + // There is a known issuer + let (issuer_pk, issuer_sk) = ((), ()); + + // 1. The issuer issues a credential + let vc = issue(data, issuer_sk).await; + println!("{vc}"); + + // Now we want / need to present some data + let pres_def = r#" + { + "givenName": {} + "familyName": {} + } + "#; + + // 2. Create presentation + let vp = derive(vc, pres_def); + + // 3. Now the issuer can verify the presentation + assert!(verify(issuer_pk, vp)); + + println!("Done!") +} diff --git a/next-gen-signatures/tests/jsonld-zkp.rs b/next-gen-signatures/tests/jsonld-zkp.rs new file mode 100644 index 0000000..7c96e5b --- /dev/null +++ b/next-gen-signatures/tests/jsonld-zkp.rs @@ -0,0 +1,334 @@ +use std::collections::HashMap; + +use ark_bls12_381::Bls12_381; +use legogroth16::circom::{CircomCircuit, R1CS as R1CSOrig}; +use multibase::Base; +use next_gen_signatures::rdf::RdfQuery; +use oxrdf::GraphName; +use rand::{prelude::StdRng, SeedableRng}; +use rdf_proofs::{ + ark_to_base64url, CircuitString, KeyGraph, KeyPairBase58Btc, VcPairString, VerifiableCredential, +}; +use rdf_types::generator; + +pub type R1CS = R1CSOrig; + +#[tokio::test] +async fn jsonld_zkp() { + let mut rng = StdRng::seed_from_u64(1337); + let issuer_kp = KeyPairBase58Btc::new(&mut rng).unwrap(); + let issuer_pk = issuer_kp.public_key; + let issuer_sk = issuer_kp.secret_key; + + let issuer = RdfQuery::from_jsonld( + &format!( + r#" + {{ + "@context": [ + "https://www.w3.org/ns/controller/v1", + "https://w3id.org/security/data-integrity/v2" + ], + "id": "did:example:issuer0", + "type": "Controller", + "verificationMethod": {{ + "id": "did:example:issuer0#bls12_381-g2-pub001", + "type": "Multikey", + "controller": "did:example:issuer0", + "secretKeyMultibase": "{issuer_sk}", + "publicKeyMultibase": "{issuer_pk}" + }} + }}"# + ), + Some("b".to_string()), + ) + .await + .unwrap(); + println!("{}", issuer.to_rdf_string()); + + let data = RdfQuery::from_jsonld( + r#" + { + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://www.w3.org/ns/data-integrity/v1", + "https://schema.org/", + { + "CoolStuff": { + "@id": "http://example.org/CoolStuff", + "@type": "@id" + }, + "coolNumber": { + "@id": "http://example.org/coolNumber", + "@type": "@id" + }, + "coolString": { + "@id": "http://example.org/coolString", + "@type": "@id" + }, + "coolDate": { + "@id": "http://example.org/coolDate", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + } + } + ], + "id": "http://example.org/credentials/person/0", + "type": "VerifiableCredential", + "issuer": "did:example:issuer0", + "issuanceDate": "2024-01-01T00:00:00Z", + "expirationDate": "2028-01-01T00:00:00Z", + "credentialSubject": { + "id": "did:example:coolstuff", + "type": "CoolStuff", + "coolNumber": 1337, + "coolString": { + "type": "coolString", + "@value": "John Doe" + }, + "coolDate": { + "type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2024-01-01T00:00:00Z" + }, + "coolTel": "(425) 123-4567" + } + }"#, + Some("b".to_string()), + ) + .await + .unwrap(); + println!("{}", data.to_rdf_string()); + + let proof_config = RdfQuery::from_jsonld( + r#" + { + "@context": "https://www.w3.org/ns/data-integrity/v1", + "type": "DataIntegrityProof", + "created": "2024-01-01T12:00:00.000Z", + "cryptosuite": "bbs-termwise-signature-2023", + "proofPurpose": "assertionMethod", + "verificationMethod": "did:example:issuer0#bls12_381-g2-pub001" + }"#, + Some("b".to_string()), + ) + .await + .unwrap(); + println!("{}", proof_config.to_rdf_string()); + + let key_graph: KeyGraph = issuer.as_graph(GraphName::DefaultGraph).into(); + + let mut gen = generator::Blank::new_with_prefix("e".to_string()); + // let blank1 = gen.next_blank_id(); + let blank2 = gen.next_blank_id(); + let blank3 = gen.next_blank_id(); + // let blank4 = gen.next_blank_id(); + + let disc_data = RdfQuery::from_jsonld( + &format!( + r#" + {{ + "@context": [ + "https://www.w3.org/2018/credentials/v1", + "https://www.w3.org/ns/data-integrity/v1", + "https://schema.org/", + {{ + "CoolStuff": {{ + "@id": "http://example.org/CoolStuff", + "@type": "@id" + }}, + "coolNumber": {{ + "@id": "http://example.org/coolNumber", + "@type": "@id" + }}, + "coolString": {{ + "@id": "http://example.org/coolString", + "@type": "@id" + }}, + "coolDate": {{ + "@id": "http://example.org/coolDate", + "@type": "@id" + }} + }} + ], + "id": "http://example.org/credentials/person/0", + "type": "VerifiableCredential", + "issuer": "did:example:issuer0", + "issuanceDate": "2024-01-01T00:00:00Z", + "expirationDate": "2028-01-01T00:00:00Z", + "credentialSubject": {{ + "id": "did:example:coolstuff", + "type": "CoolStuff", + "coolNumber": {{ + "@id": "{blank2}" + }}, + "coolString": {{ + "type": "coolString", + "@value": "John Doe" + }}, + "coolDate": {{ + "@id": "{blank3}" + }}, + "coolTel": "(425) 123-4567" + }} + }}"#, + ), + Some("e".to_string()), + ) + .await + .unwrap(); + println!("{}", disc_data.to_rdf_string()); + + let mut vc = VerifiableCredential::new( + data.as_graph(GraphName::DefaultGraph), + proof_config.as_graph(GraphName::DefaultGraph), + ); + rdf_proofs::sign(&mut rng, &mut vc, &key_graph).unwrap(); + let disc_vc = VerifiableCredential::new( + disc_data.as_graph(GraphName::DefaultGraph), + vc.proof.clone(), + ); + println!("{disc_vc}"); + + let deanon_map = HashMap::from([ + ( + blank2.to_string(), + "\"1337\"^^".to_string(), + ), + ( + blank3.to_string(), + "\"2024-01-01T00:00:00Z\"^^".to_string(), + ), + /* + ( + blank4.to_string(), + "\"(425) 123-4567\"^^".to_string(), + ), + */ + ]); + println!("{deanon_map:#?}"); + + let vc_pairs = vec![VcPairString::new( + &vc.document.clone().to_string(), + &vc.proof.clone().to_string(), + &disc_vc.document.clone().to_string(), + &disc_vc.proof.clone().to_string(), + )]; + + // define circuit + let circuit_r1cs = R1CS::from_file("circom/bls12381/less_than_public_64.r1cs").unwrap(); + let circuit_wasm = std::fs::read("circom/bls12381/less_than_public_64.wasm").unwrap(); + let commit_witness_count = 1; + let snark_proving_key = CircomCircuit::setup(circuit_r1cs.clone()) + .generate_proving_key(commit_witness_count, &mut rng) + .unwrap(); + + // serialize to multibase + let circuit_r1cs = ark_to_base64url(&circuit_r1cs).unwrap(); + let circuit_wasm = multibase::encode(Base::Base64Url, circuit_wasm); + let snark_proving_key_string = ark_to_base64url(&snark_proving_key).unwrap(); + let snark_verifying_key_string = ark_to_base64url(&snark_proving_key.vk).unwrap(); + + let predicates = vec![RdfQuery::from_jsonld( + r#" + { + "@context": { + "circuit": "https://zkp-ld.org/security#circuit", + "private": "https://zkp-ld.org/security#private", + "public": "https://zkp-ld.org/security#public", + "first": "http://www.w3.org/1999/02/22-rdf-syntax-ns#first", + "rest": "http://www.w3.org/1999/02/22-rdf-syntax-ns#rest", + "var": "https://zkp-ld.org/security#var", + "val": "https://zkp-ld.org/security#val" + }, + "@type": "https://zkp-ld.org/security#Predicate", + "circuit": { + "@id": "https://zkp-ld.org/circuit/alexey/lessThanPublic" + }, + "private": { + "first": { + "@type": "https://zkp-ld.org/security#PrivateVariable", + "var": "a", + "val": { + "@id": "to:be:verified" + } + }, + "rest": { + "@id": "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil" + } + }, + "public": { + "first": { + "@type": "https://zkp-ld.org/security#PublicVariable", + "var": "b", + "val": { + "@value": "2025-01-01T00:00:00Z", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + } + }, + "rest": { + "@id": "http://www.w3.org/1999/02/22-rdf-syntax-ns#nil" + } + } + }"#, + Some("b".to_string()), + ) + .await + .unwrap() + .to_rdf_string() + // NOTE: this is a hack + .replace("", blank3.as_ref())]; + + println!("{}", predicates[0]); + + let circuits = HashMap::from([( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + CircuitString { + circuit_r1cs, + circuit_wasm, + snark_proving_key: snark_proving_key_string, + }, + )]); + + let snark_verifying_keys = HashMap::from([( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + snark_verifying_key_string, + )]); + + let proof = rdf_proofs::derive_proof_string( + &mut rng, + &vc_pairs, + &deanon_map, + &issuer.to_rdf_string(), + None, + None, + None, + None, + None, + Some(&predicates), + Some(&circuits), + ) + .unwrap(); + + println!("{proof}"); + + let proof = RdfQuery::new(&proof).unwrap(); + + let proof_json = proof.to_json(Some(GraphName::DefaultGraph), None, None); + assert_eq!( + proof_json["https://www.w3.org/2018/credentials#verifiableCredential"] + ["https://www.w3.org/2018/credentials#credentialSubject"] + ["http://example.org/coolString"]["@value"], + "John Doe" + ); + + println!("{:#}", proof_json); + + let success = rdf_proofs::verify_proof_string( + &mut rng, + &proof.to_rdf_string(), + &issuer.to_rdf_string(), + None, + None, + Some(snark_verifying_keys), + ); + + assert!(success.is_ok(), "{success:#?}"); +} diff --git a/next-gen-signatures/tests/jsonld_zkp_flow.rs b/next-gen-signatures/tests/jsonld_zkp_flow.rs new file mode 100644 index 0000000..53f9253 --- /dev/null +++ b/next-gen-signatures/tests/jsonld_zkp_flow.rs @@ -0,0 +1,110 @@ +use next_gen_signatures::crypto::zkp::{ + self, circuits::LESS_THAN_PUBLIC_ID, ProofRequirement, PublicValue, +}; +use rand::{prelude::StdRng, RngCore, SeedableRng}; +use rdf_proofs::KeyPairBase58Btc; + +use serde_json::{json, Value as JsonValue}; + +const ISSUER_ID: &str = "did:example:issuer0"; +const ISSUER_KEY_ID: &str = "did:example:issuer0#bls12_381-g2-pub001"; + +const VC_VALIDITY_MONTHS: u32 = 36; + +pub fn get_sample_data() -> JsonValue { + json!({ + "@type": "http://schema.org/Person", + "@id": "did:example:johndoe", + "http://schema.org/name": "John Doe", + "http://schema.org/birthDate": { + "@value": "1990-01-01T00:00:00Z", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "http://schema.org/telephone": "(425) 123-4567", + }) +} + +pub fn get_issuer(rng: &mut R) -> (String, String) { + let kp = KeyPairBase58Btc::new(rng).unwrap(); + (kp.public_key, kp.secret_key) +} + +#[tokio::test] +pub async fn jsonld_zkp_flow() { + let mut rng = StdRng::seed_from_u64(1337); + + let (issuer_pk, issuer_sk) = get_issuer(&mut rng); + + let vc = zkp::issue( + &mut rng, + get_sample_data(), + issuer_pk.clone(), + issuer_sk, + ISSUER_ID, + ISSUER_KEY_ID, + VC_VALIDITY_MONTHS, + ) + .await; + + let reqs = vec![ + ProofRequirement::Required { + key: "@id".to_string(), + }, + ProofRequirement::Required { + key: "@type".to_string(), + }, + ProofRequirement::Required { + key: "http://schema.org/name".to_string(), + }, + ProofRequirement::Circuit { + id: LESS_THAN_PUBLIC_ID.to_string(), + private_var: "a".to_string(), + private_key: "http://schema.org/birthDate".to_string(), + + public_var: "b".to_string(), + public_val: PublicValue { + r#type: "http://www.w3.org/2001/XMLSchema#dateTime".to_string(), + value: "2000-01-01T00:00:00Z".to_string(), + }, + }, + ProofRequirement::Circuit { + id: LESS_THAN_PUBLIC_ID.to_string(), + private_var: "a".to_string(), + private_key: "http://schema.org/birthDate".to_string(), + + public_var: "b".to_string(), + public_val: PublicValue { + r#type: "http://www.w3.org/2001/XMLSchema#dateTime".to_string(), + value: "2001-01-01T00:00:00Z".to_string(), + }, + }, + ]; + + let circuits = zkp::circuits::generate_circuits(&mut rng, &reqs); + + let pres = zkp::present( + &mut rng, + vc, + &reqs, + &circuits.proving_keys, + issuer_pk.clone(), + ISSUER_ID, + ISSUER_KEY_ID, + ) + .await; + + let json = zkp::verify( + &mut rng, + pres, + issuer_pk, + circuits.verifying_keys, + &reqs, + ISSUER_ID, + ISSUER_KEY_ID, + ) + .await; + + println!("Success!"); + + println!("{json:#}"); +} diff --git a/next-gen-signatures/tests/rdf-query.rs b/next-gen-signatures/tests/rdf-query.rs new file mode 100644 index 0000000..a7c027f --- /dev/null +++ b/next-gen-signatures/tests/rdf-query.rs @@ -0,0 +1,34 @@ +use next_gen_signatures::rdf::RdfQuery; +use oxrdf::{GraphName, NamedNode, Term}; + +#[test] +fn test_rdf_query() { + const RDF: &str = r#" +_:c14n0 . +_:c14n0 "16"^^ . +_:c14n0 "Note icon" . +_:c14n0 . +_:c14n0 "16"^^ . +_:c14n1 . +_:c14n1 _:c14n3 . +_:c14n1 _:c14n2 . +_:c14n1 "2015-01-25T12:34:56Z"^^ . +_:c14n2 . +_:c14n2 "This is a simple note" . +_:c14n3 . +_:c14n3 _:c14n0 . +_:c14n3 "Sally" . + "#; + + let graph = RdfQuery::new(RDF).expect("Failed to parse rdf quads!"); + + let json = graph.to_json( + Some(GraphName::DefaultGraph), + Some(vec![Term::NamedNode( + NamedNode::new("https://www.w3.org/ns/activitystreams#Create").unwrap(), + )]), + Some(vec!["https://www.w3.org/ns/activitystreams".to_string()]), + ); + + println!("{json:#}"); +} diff --git a/next-gen-signatures/tests/rdf-selective-disclosure.rs b/next-gen-signatures/tests/rdf-selective-disclosure.rs new file mode 100644 index 0000000..e4e0910 --- /dev/null +++ b/next-gen-signatures/tests/rdf-selective-disclosure.rs @@ -0,0 +1,217 @@ +use std::collections::HashMap; + +use oxrdf::{BlankNode, Graph, Literal, NamedNode, NamedOrBlankNode, Term}; +use oxttl::NTriplesParser; +use rand::{prelude::StdRng, SeedableRng}; +use rdf_proofs::{error::RDFProofsError, KeyGraph, VcPair, VerifiableCredential}; +use regex::Regex; + +const KEY_GRAPH: &str = r#" +# issuer0 + . + . + . + "z4893E1L7AeYfqaduUdLYgcxefWAah8gJB8RhPi7JHQkdRbe" . + "zUC77BjGcGDVWfBdgzqwzp3uuWkoWuRMe8pnx4dkncia5t9LKHVt96BPGBizeSU7BKiV35h1tsuVwHUVt4arZuckxGCb2tTsB3fsY66mQNs5Bwoac2w2iyYFe8uenBUYdAiveEr" . +# issuer1 + . + . + . + "z488yTRFj1e7W6s6MVN6iYm6taiNByQwSCg2XwgEJvAcXr15" . + "zUC7HaSjNELSGG8QnYdMvNurgfWfdGNo1Znqds6CoYQ24qKKWogiLtKWPoCLJapEYdKAMN9r6bdF9MeNrfV3fhUzkKwrfUewD5yVhwSVpM4tjv87YVgWGRTUuesxf7scabbPAnD" . +# issuer2 + . + . + . + "z489AEiC5VbeLmVZxokiJYkXNZrMza9eCiPZ51ekgcV9mNvG" . + "zUC7DKvfSfydgg48FpP53HgsLfWrVHfrmUXbwvw8AnSgW1JiA5741mwe3hpMNNRMYh3BgR9ebxvGAxPxFhr8F3jQHZANqb3if2MycjQN3ZBSWP3aGoRyat294icdVMDhTqoKXeJ" . +# issuer3 + . + . + . + "z488w754KqucDkNxCWCoi5DkH6pvEt6aNZNYYYoKmDDx8m5G" . + "zUC74KLKQtdApVyY3EbAZfiW6A7HdwSZVLsBF2vs5512YwNWs5PRYiqavzWLoiAq6UcKLv6RAnUM9Y117Pg4LayaBMa9euz23C2TDtBq8QuhpbDRDqsjUxLS5S9ruWRk71SEo69" . +"#; + +const VC_1: &str = r#" + . + "John Smith" . + _:b0 . + _:b1 . +_:b0 . +_:b0 "0000001" . +_:b0 "2022-01-01T00:00:00Z"^^ . +_:b0 . +_:b0 . +_:b1 . +_:b1 "ABC inc." . + . + . + . + "2022-01-01T00:00:00Z"^^ . + "2025-01-01T00:00:00Z"^^ . +"#; + +const VC_PROOF_1: &str = r#" +_:b0 . +_:b0 "bbs-termwise-signature-2023" . +_:b0 "2023-02-09T09:35:07Z"^^ . +_:b0 . +_:b0 . +"#; + +const DISCLOSED_VC_1_WITH_HIDDEN_LITERALS: &str = r#" +_:e0 . +_:e0 "John Smith" . +_:e0 _:b0 . +_:e0 _:b1 . +_:b0 . +_:b0 _:e1 . +_:b0 _:e5 . +_:b1 . +_:e2 . +_:e2 _:e0 . +_:e2 . +_:e2 "2022-01-01T00:00:00Z"^^ . +_:e2 "2025-01-01T00:00:00Z"^^ . +"#; + +const DISCLOSED_VC_PROOF_1: &str = r#" +_:b0 . +_:b0 "bbs-termwise-signature-2023" . +_:b0 "2023-02-09T09:35:07Z"^^ . +_:b0 . +_:b0 . +"#; + +const DEANON_MAP: [(&str, &str); 4] = [ + ("_:e0", ""), + ("_:e1", ""), + ("_:e2", ""), + ("_:e3", ""), +]; + +fn get_example_deanon_map_string() -> HashMap { + DEANON_MAP + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect() +} + +pub(crate) fn get_term_from_string(term_string: &str) -> Result { + let re_iri = Regex::new(r"^<([^>]+)>$")?; + let re_blank_node = Regex::new(r"^_:(.+)$")?; + let re_simple_literal = Regex::new(r#"^"([^"]+)"$"#)?; + let re_typed_literal = Regex::new(r#"^"([^"]+)"\^\^<([^>]+)>$"#)?; + let re_literal_with_langtag = Regex::new(r#"^"([^"]+)"@(.+)$"#)?; + + if let Some(caps) = re_iri.captures(term_string) { + Ok(NamedNode::new_unchecked(&caps[1]).into()) + } else if let Some(caps) = re_blank_node.captures(term_string) { + Ok(BlankNode::new_unchecked(&caps[1]).into()) + } else if let Some(caps) = re_simple_literal.captures(term_string) { + Ok(Literal::new_simple_literal(&caps[1]).into()) + } else if let Some(caps) = re_typed_literal.captures(term_string) { + Ok(Literal::new_typed_literal(&caps[1], NamedNode::new_unchecked(&caps[2])).into()) + } else if let Some(caps) = re_literal_with_langtag.captures(term_string) { + Ok(Literal::new_language_tagged_literal(&caps[1], &caps[2])?.into()) + } else { + Err(RDFProofsError::TtlTermParse(term_string.to_string())) + } +} + +fn get_deanon_map_from_string( + deanon_map_string: &HashMap, +) -> Result, RDFProofsError> { + deanon_map_string + .iter() + .map(|(k, v)| { + let key: NamedOrBlankNode = match get_term_from_string(k)? { + Term::NamedNode(n) => Ok(n.into()), + Term::BlankNode(n) => Ok(n.into()), + Term::Literal(_) => Err(RDFProofsError::InvalidDeanonMapFormat(k.to_string())), + }?; + let value = get_term_from_string(v)?; + Ok((key, value)) + }) + .collect() +} + +fn get_example_deanon_map() -> HashMap { + get_deanon_map_from_string(&get_example_deanon_map_string()).unwrap() +} + +pub fn get_graph_from_ntriples(ntriples: &str) -> Result { + let iter = NTriplesParser::new() + .for_reader(ntriples.as_bytes()) + .collect::, _>>()?; + Ok(Graph::from_iter(iter)) +} + +const DEANON_MAP_WITH_HIDDEN_LITERAL: [(&str, &str); 2] = [ + ("_:e4", "\"John Smith\""), + ( + "_:e5", + "\"2022-01-01T00:00:00Z\"^^", + ), +]; +fn get_example_deanon_map_string_with_hidden_literal() -> HashMap { + DEANON_MAP_WITH_HIDDEN_LITERAL + .into_iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect() +} +fn get_example_deanon_map_with_hidden_literal() -> HashMap { + get_deanon_map_from_string(&get_example_deanon_map_string_with_hidden_literal()).unwrap() +} + +#[test] +fn derive_and_verify_proof_with_hidden_literals() { + let mut rng = StdRng::seed_from_u64(0u64); + let key_graph: KeyGraph = get_graph_from_ntriples(KEY_GRAPH).unwrap().into(); + + let mut deanon_map = get_example_deanon_map(); + deanon_map.extend(get_example_deanon_map_with_hidden_literal()); + + let vc_doc = get_graph_from_ntriples(VC_1).unwrap(); + let vc_proof_config = get_graph_from_ntriples(VC_PROOF_1).unwrap(); + let mut vc = VerifiableCredential::new(vc_doc, vc_proof_config); + rdf_proofs::sign(&mut rng, &mut vc, &key_graph).unwrap(); + + let disclosed_vc_doc = get_graph_from_ntriples(DISCLOSED_VC_1_WITH_HIDDEN_LITERALS).unwrap(); + let disclosed_vc_proof_config = get_graph_from_ntriples(DISCLOSED_VC_PROOF_1).unwrap(); + let disclosed_vc = VerifiableCredential::new(disclosed_vc_doc, disclosed_vc_proof_config); + + let vc_with_disclosed = VcPair::new(vc, disclosed_vc); + let vcs = vec![vc_with_disclosed]; + + let challenge = "abcde"; + + let derived_proof = rdf_proofs::derive_proof( + &mut rng, + &vcs, + &deanon_map, + &key_graph, + Some(challenge), + None, + None, + None, + None, + vec![], + HashMap::new(), + ) + .unwrap(); + + let verified = rdf_proofs::verify_proof( + &mut rng, + &derived_proof, + &key_graph, + Some(challenge), + None, + HashMap::new(), + ); + + assert!(verified.is_ok(), "{:?}", verified); + + println!("derived_proof: {}", rdf_canon::serialize(&derived_proof)); +} diff --git a/next-gen-signatures/tests/rdf-zkp.rs b/next-gen-signatures/tests/rdf-zkp.rs new file mode 100644 index 0000000..7f93644 --- /dev/null +++ b/next-gen-signatures/tests/rdf-zkp.rs @@ -0,0 +1,275 @@ +use std::collections::HashMap; + +use ark_bls12_381::Bls12_381; +use legogroth16::circom::CircomCircuit; +use legogroth16::circom::R1CS as R1CSOrig; +use multibase::Base; +use oxrdf::Graph; +use oxttl::NTriplesParser; +use rand::{prelude::StdRng, SeedableRng}; +use rdf_proofs::{ + ark_to_base64url, derive_proof_string, error::RDFProofsError, verify_proof_string, + CircuitString, KeyGraph, VcPairString, VerifiableCredential, +}; + +pub type R1CS = R1CSOrig; + +const KEY_GRAPH: &str = r#" +# issuer0 + . + . + . + "z4893E1L7AeYfqaduUdLYgcxefWAah8gJB8RhPi7JHQkdRbe" . + "zUC77BjGcGDVWfBdgzqwzp3uuWkoWuRMe8pnx4dkncia5t9LKHVt96BPGBizeSU7BKiV35h1tsuVwHUVt4arZuckxGCb2tTsB3fsY66mQNs5Bwoac2w2iyYFe8uenBUYdAiveEr" . +# issuer1 + . + . + . + "z488yTRFj1e7W6s6MVN6iYm6taiNByQwSCg2XwgEJvAcXr15" . + "zUC7HaSjNELSGG8QnYdMvNurgfWfdGNo1Znqds6CoYQ24qKKWogiLtKWPoCLJapEYdKAMN9r6bdF9MeNrfV3fhUzkKwrfUewD5yVhwSVpM4tjv87YVgWGRTUuesxf7scabbPAnD" . +# issuer2 + . + . + . + "z489AEiC5VbeLmVZxokiJYkXNZrMza9eCiPZ51ekgcV9mNvG" . + "zUC7DKvfSfydgg48FpP53HgsLfWrVHfrmUXbwvw8AnSgW1JiA5741mwe3hpMNNRMYh3BgR9ebxvGAxPxFhr8F3jQHZANqb3if2MycjQN3ZBSWP3aGoRyat294icdVMDhTqoKXeJ" . +# issuer3 + . + . + . + "z488w754KqucDkNxCWCoi5DkH6pvEt6aNZNYYYoKmDDx8m5G" . + "zUC74KLKQtdApVyY3EbAZfiW6A7HdwSZVLsBF2vs5512YwNWs5PRYiqavzWLoiAq6UcKLv6RAnUM9Y117Pg4LayaBMa9euz23C2TDtBq8QuhpbDRDqsjUxLS5S9ruWRk71SEo69" . +"#; + +const VC: &str = r#" + . + "John Smith" . + _:b0 . + _:b1 . + _:b2 . +_:b0 . +_:b0 "0000001" . +_:b0 "2022-01-01T00:00:00Z"^^ . +_:b0 . +_:b0 . +_:b1 . +_:b1 "ABC inc." . +_:b2 . +_:b2 "1337"^^ . + . + . + . + "2022-01-01T00:00:00Z"^^ . + "2025-01-01T00:00:00Z"^^ . +"#; + +const VC_PROOF: &str = r#" +_:b0 . +_:b0 "bbs-termwise-signature-2023" . +_:b0 "2023-02-09T09:35:07Z"^^ . +_:b0 . +_:b0 . +"#; + +const DISCLOSED_VC_WITH_HIDDEN_LITERALS: &str = r#" +_:e0 . +_:e0 _:e4 . +_:e0 _:b0 . +_:e0 _:b1 . +_:e0 _:b2 . +_:b0 . +_:b0 _:e1 . +_:b0 _:e5 . +_:b1 . +_:b2 . +_:b2 _:e6 . +_:e2 . +_:e2 _:e0 . +_:e2 . +_:e2 "2022-01-01T00:00:00Z"^^ . +_:e2 "2025-01-01T00:00:00Z"^^ . +"#; + +const DISCLOSED_VC_PROOF_CONFIG: &str = r#" +_:b0 . +_:b0 "bbs-termwise-signature-2023" . +_:b0 "2023-02-09T09:35:07Z"^^ . +_:b0 . +_:b0 . +"#; + +const DEANON_MAP: [(&str, &str); 4] = [ + ("_:e0", ""), + ("_:e1", ""), + ("_:e2", ""), + ("_:e3", ""), +]; + +const DEANON_MAP_WITH_HIDDEN_LITERAL: [(&str, &str); 3] = [ + ("_:e4", "\"John Smith\""), + ( + "_:e5", + "\"2022-01-01T00:00:00Z\"^^", + ), + ( + "_:e6", + "\"1337\"^^", + ), +]; + +fn get_deanon_map_string(map: &[(&str, &str)]) -> HashMap { + map.iter() + .map(|(k, v)| (k.to_string(), v.to_string())) + .collect() +} + +pub fn get_graph_from_ntriples(ntriples: &str) -> Result { + let iter = NTriplesParser::new() + .for_reader(ntriples.as_bytes()) + .collect::, _>>()?; + Ok(Graph::from_iter(iter)) +} + +#[test] +fn rdf_zkp() { + let mut rng = StdRng::seed_from_u64(0u64); + + let vc_doc = get_graph_from_ntriples(VC).unwrap(); + let vc_proof_config = get_graph_from_ntriples(VC_PROOF).unwrap(); + let key_graph: KeyGraph = get_graph_from_ntriples(KEY_GRAPH).unwrap().into(); + + let mut vc = VerifiableCredential::new(vc_doc, vc_proof_config); + rdf_proofs::sign(&mut rng, &mut vc, &key_graph).unwrap(); + + let vc_pairs = vec![VcPairString::new( + &vc.document.to_string(), + &vc.proof.to_string(), + DISCLOSED_VC_WITH_HIDDEN_LITERALS, + DISCLOSED_VC_PROOF_CONFIG, + )]; + + let mut deanon_map = get_deanon_map_string(&DEANON_MAP); + deanon_map.extend(get_deanon_map_string(&DEANON_MAP_WITH_HIDDEN_LITERAL)); + + // define predicates + let predicates = vec![ + r#" + _:b0 . + _:b0 . + _:b0 _:b1 . + _:b0 _:b3 . + _:b1 _:b2 . + _:b1 . + _:b2 . + _:b2 "greater" . + _:b2 _:e5 . + _:b3 _:b4 . + _:b3 . + _:b4 . + _:b4 "lesser" . + _:b4 "2000-12-31T00:00:00Z"^^ . + "#.to_string(), + r#" + _:b0 . + _:b0 . + _:b0 _:b1 . + _:b0 _:b3 . + _:b1 _:b2 . + _:b1 . + _:b2 . + _:b2 "a" . + _:b2 _:e6 . + _:b3 _:b4 . + _:b3 . + _:b4 . + _:b4 "b" . + _:b4 "9999"^^ . + "#.to_string(), + ]; + + // define circuit + let circuit_r1cs_1 = R1CS::from_file("circom/bls12381/less_than_pub_prv_64.r1cs").unwrap(); + let circuit_wasm_1 = std::fs::read("circom/bls12381/less_than_pub_prv_64.wasm").unwrap(); + let commit_witness_count_1 = 1; + let snark_proving_key_1 = CircomCircuit::setup(circuit_r1cs_1.clone()) + .generate_proving_key(commit_witness_count_1, &mut rng) + .unwrap(); + + // serialize to multibase + let circuit_r1cs_1 = ark_to_base64url(&circuit_r1cs_1).unwrap(); + let circuit_wasm_1 = multibase::encode(Base::Base64Url, circuit_wasm_1); + let snark_proving_key_string_1 = ark_to_base64url(&snark_proving_key_1).unwrap(); + let snark_verifying_key_string_1 = ark_to_base64url(&snark_proving_key_1.vk).unwrap(); + + // define circuit + let circuit_r1cs_2 = R1CS::from_file("circom/bls12381/less_than_public_64.r1cs").unwrap(); + let circuit_wasm_2 = std::fs::read("circom/bls12381/less_than_public_64.wasm").unwrap(); + let commit_witness_count_2 = 1; + let snark_proving_key_2 = CircomCircuit::setup(circuit_r1cs_2.clone()) + .generate_proving_key(commit_witness_count_2, &mut rng) + .unwrap(); + + // serialize to multibase + let circuit_r1cs_2 = ark_to_base64url(&circuit_r1cs_2).unwrap(); + let circuit_wasm_2 = multibase::encode(Base::Base64Url, circuit_wasm_2); + let snark_proving_key_string_2 = ark_to_base64url(&snark_proving_key_2).unwrap(); + let snark_verifying_key_string_2 = ark_to_base64url(&snark_proving_key_2.vk).unwrap(); + + // generate SNARK proving key (by Verifier) + let circuit = HashMap::from([ + ( + "https://zkp-ld.org/circuit/lessThanPubPrv".to_string(), + CircuitString { + circuit_r1cs: circuit_r1cs_1.clone(), + circuit_wasm: circuit_wasm_1.clone(), + snark_proving_key: snark_proving_key_string_1.clone(), + }, + ), + ( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + CircuitString { + circuit_r1cs: circuit_r1cs_2.clone(), + circuit_wasm: circuit_wasm_2.clone(), + snark_proving_key: snark_proving_key_string_2.clone(), + }, + ), + ]); + + let derived_proof = derive_proof_string( + &mut rng, + &vc_pairs, + &deanon_map, + KEY_GRAPH, + None, + None, + None, + None, + None, + Some(&predicates), + Some(&circuit), + ) + .unwrap(); + + let snark_verifying_keys = HashMap::from([ + ( + "https://zkp-ld.org/circuit/lessThanPubPrv".to_string(), + snark_verifying_key_string_1.clone(), + ), + ( + "https://zkp-ld.org/circuit/alexey/lessThanPublic".to_string(), + snark_verifying_key_string_2.clone(), + ), + ]); + + let verified = verify_proof_string( + &mut rng, + &derived_proof, + KEY_GRAPH, + None, + None, + Some(snark_verifying_keys.clone()), + ); + assert!(verified.is_ok(), "{:?}", verified); + + println!("derive_proof: {}", derived_proof); +} diff --git a/next-gen-signatures/tests/sample-test.rs b/next-gen-signatures/tests/sample-test.rs index 8b13789..2076d9e 100644 --- a/next-gen-signatures/tests/sample-test.rs +++ b/next-gen-signatures/tests/sample-test.rs @@ -1 +1,321 @@ +use std::{ + collections::{BTreeMap, BTreeSet}, + io::Cursor, +}; +use anyhow::{ensure, Context}; +use ark_bls12_381::{Bls12_381, Fr}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use base64::Engine; +use bbs_plus::prelude::{SignatureG1, SignatureParamsG1}; +use blake2::Blake2b512; +use next_gen_signatures::{ + common::{ByteArray, CryptoProvider}, + crypto::{ + bbs::{GenParams, SignParams}, + BbsPlusG1Provider as Provider, + }, + BASE64_URL_SAFE_NO_PAD, +}; +use num_bigint::BigUint; +use proof_system::prelude::{ + bbs_plus::{PoKBBSSignatureG1Prover, PoKBBSSignatureG1Verifier}, + bound_check_legogroth16::{BoundCheckLegoGroth16Prover, BoundCheckLegoGroth16Verifier}, + generate_snark_srs_bound_check, + r1cs_legogroth16::{ProvingKey, VerifyingKey}, + EqualWitnesses, MetaStatements, PoKBBSSignatureG1, Proof, ProofSpec, Statements, Witness, + Witnesses, +}; +use rand::{prelude::StdRng, RngCore, SeedableRng}; + +#[allow(clippy::too_many_arguments)] +fn create_bounds_proof( + rng: &mut R, + signature: ByteArray, + nonce: String, + proving_key: ProvingKey, + messages: Vec, + message_index: usize, + min: u64, + max: u64, + reveal_indexes: BTreeSet, + proof_nonce: Option, +) -> anyhow::Result> { + type Signature = SignatureG1; + type SignatureParams = SignatureParamsG1; + type StatementProver = PoKBBSSignatureG1Prover; + type BoundsStatementProver = BoundCheckLegoGroth16Prover; + + let signature = Signature::deserialize_compressed(Cursor::new(signature))?; + + let nonce = BASE64_URL_SAFE_NO_PAD.decode(nonce)?; + let proof_nonce: Option> = match proof_nonce { + None => None, + Some(nonce) => Some(BASE64_URL_SAFE_NO_PAD.decode(nonce)?), + }; + + let message_count = messages.len() as u32; + + let message = Fr::from(BigUint::from_bytes_le( + &BASE64_URL_SAFE_NO_PAD.decode( + messages + .get(message_index) + .context("message_index out of bounds!")?, + )?, + )); + + let messages = messages + .into_iter() + .map(|m| BASE64_URL_SAFE_NO_PAD.decode(m)) + .collect::, _>>()? + .into_iter() + .map(|b| BigUint::from_bytes_le(&b).into()) + .collect::>(); + + let revealed_messages = messages + .clone() + .into_iter() + .enumerate() + // ugly ↓ + .filter(|(idx, _)| reveal_indexes.contains(&(*idx as u32))) + .collect::>(); + + let params = SignatureParams::new::(&nonce, message_count); + + ensure!(min < max, "min < max not satisfied!"); + + ensure!( + (reveal_indexes.len() as u32) < message_count, + "|revealed| < |messages| not satisfied!" + ); + + reveal_indexes.iter().try_for_each(|idx| { + if *idx == message_index as u32 { + Err(anyhow::anyhow!("Can't reveal message_index")) + } else if *idx >= message_count { + Err(anyhow::anyhow!("revealed index out of bounds: {idx}")) + } else { + Ok(()) + } + })?; + + let proof_spec = { + let mut statements = Statements::::new(); + statements.add(StatementProver::new_statement_from_params( + params, + revealed_messages.clone(), + )); + statements.add( + BoundsStatementProver::new_statement_from_params(min, max, proving_key) + .map_err(|err| anyhow::anyhow!("BoundsProver error: {err:?}"))?, + ); + + let mut meta_statements = MetaStatements::new(); + meta_statements + .add_witness_equality(EqualWitnesses(BTreeSet::from([(0, message_index), (1, 0)]))); + + let proof_spec = ProofSpec::new(statements, meta_statements, vec![], None); + proof_spec + .validate() + .map_err(|err| anyhow::anyhow!("ProofSpec validation error: {err:?}"))?; + + proof_spec + }; + + let witnesses = { + let mut witnesses = Witnesses::new(); + + // Witness for the signature + witnesses.add(PoKBBSSignatureG1::new_as_witness( + signature, + messages + .into_iter() + .enumerate() + // ugly ↓ + .filter(|(idx, _)| !reveal_indexes.contains(&(*idx as u32))) + .collect(), + )); + // Witness for the bounds check + witnesses.add(Witness::BoundCheckLegoGroth16(message)); + + witnesses + }; + + let (proof, _) = + Proof::new::(rng, proof_spec, witnesses, proof_nonce, Default::default()) + .map_err(|err| anyhow::anyhow!("Failed to create proof: {err:?}"))?; + + Ok(proof) +} + +#[allow(clippy::too_many_arguments)] +fn verify_proof( + rng: &mut StdRng, + proof: Proof, + nonce: ByteArray, + issuer_pk: ByteArray, + verifying_key: VerifyingKey, + message_count: u32, + message_index: usize, + min: u64, + max: u64, + revealed_messages: BTreeMap, + proof_nonce: Option, +) -> anyhow::Result { + let issuer_pk = Provider::pk_from_bytes(issuer_pk)?; + + let proof_nonce: Option> = match proof_nonce { + None => None, + Some(nonce) => Some(BASE64_URL_SAFE_NO_PAD.decode(nonce)?), + }; + + let mut statements = Statements::::new(); + // Statement that the signature is correct + statements.add( + PoKBBSSignatureG1Verifier::::new_statement_from_params( + SignatureParamsG1::new::(&nonce, message_count), + issuer_pk, + revealed_messages, + ), + ); + // Statement that the age is within bounds + statements.add( + BoundCheckLegoGroth16Verifier::new_statement_from_params(min, max, verifying_key) + .map_err(|err| anyhow::anyhow!("{err:?}"))?, + ); + + let mut meta_statements = MetaStatements::new(); + // Meta-Statement that the witness is equal for both of the statements above + // meaning that the above statements are "in the same context". + meta_statements.add_witness_equality(EqualWitnesses(BTreeSet::from([ + // Witness of Statement 0 (valid sign) with message 0 (age) + (0, message_index), + // Witness of Statement 1 (wihthin bounds) with message 0 + (1, 0), + ]))); + + let proof_spec = ProofSpec::new(statements, meta_statements, vec![], None); + proof_spec.validate().unwrap(); + + proof + .verify::(rng, proof_spec, proof_nonce, Default::default()) + .map_err(|err| anyhow::anyhow!("Failed to verify proof: {err:?}"))?; + + Ok(true) +} + +#[test] +pub fn bbs_plus_bounds_check() -> anyhow::Result<()> { + let mut rng = StdRng::seed_from_u64(1337); + // USE-CASE: We have 1 claim (message), that is our age + // We want to create a ZKP that our age is >= 18, without + // revealing our age. + + // Holder has an age + let age = 21u64; + + let message_index = 1; + + // Verifier wants to know if holder min <= age < max + let (min, max) = (18u64, 100u64); + + // Nonce, is publicy known + let nonce_bytes = b"nonce"; + + let proof_nonce = None; + + // ISSUANCE + + let revealed_indexes = BTreeSet::from([0, 2]); + let revealed_messages = BTreeMap::from([ + (0, Fr::from(BigUint::from_bytes_le(b"message 1"))), + (2, Fr::from(BigUint::from_bytes_le(b"message 2"))), + ]); + + let (issuer_pk, signature, messages, message_count) = { + let nonce = BASE64_URL_SAFE_NO_PAD.encode(nonce_bytes); + + let messages = vec![ + Fr::from(BigUint::from_bytes_le(b"message 1")), + Fr::from(age), + Fr::from(BigUint::from_bytes_le(b"message 2")), + ]; + + let message_count = messages.len() as u32; + + // issuer_sk is private, issuer_pk is publicly known + let (issuer_pk, issuer_sk) = Provider::gen_keypair(GenParams { + nonce: nonce.clone(), + message_count, + })?; + + // Created by Issuer + let signature = { + let messages = messages + .iter() + .map(|m| { + let b: BigUint = (*m).into(); + BASE64_URL_SAFE_NO_PAD.encode(b.to_bytes_le()) + }) + .collect::>(); + let sign_bytes = Provider::sign( + &issuer_sk, + SignParams { + nonce: nonce.clone(), + messages: messages.clone(), + }, + )?; + + SignatureG1::::deserialize_compressed(Cursor::new(sign_bytes))? + }; + + (issuer_pk, signature, messages, message_count) + }; + + let verifier_pk = generate_snark_srs_bound_check::(&mut rng) + .map_err(|err| anyhow::anyhow!("{err:?}"))?; + + let proof = { + let mut signature_bytes = vec![]; + signature.serialize_compressed(&mut signature_bytes)?; + + let messages = messages + .into_iter() + .map(|m| { + let b: BigUint = m.into(); + BASE64_URL_SAFE_NO_PAD.encode(b.to_bytes_le()) + }) + .collect::>(); + + create_bounds_proof( + &mut rng, + signature_bytes, + BASE64_URL_SAFE_NO_PAD.encode(nonce_bytes), + verifier_pk.clone(), + messages, + message_index, + min, + max, + revealed_indexes, + proof_nonce.clone(), + )? + }; + + let success = verify_proof( + &mut rng, + proof, + nonce_bytes.to_vec(), + Provider::pk_into_bytes(issuer_pk.clone())?, + verifier_pk.vk.clone(), + message_count, + message_index, + min, + max, + revealed_messages, + proof_nonce, + )?; + + assert!(success); + + Ok(()) +} diff --git a/next-gen-signatures/tests/w3-vc-di-bbs.rs b/next-gen-signatures/tests/w3-vc-di-bbs.rs new file mode 100644 index 0000000..4e7e959 --- /dev/null +++ b/next-gen-signatures/tests/w3-vc-di-bbs.rs @@ -0,0 +1,48 @@ +#![allow(unused)] + +/// https://www.w3.org/TR/vc-di-bbs/#create-base-proof-bbs-2023 + +pub type RDFGraph = oxrdf::Graph; +pub type JsonLDValue = json_ld::syntax::Value; + +pub enum FeatureOption { + /// Note that "baseline" is used to denote the case of no optional features. + Baseline, + AnonymousHolderBinding { + commitment_with_proof: Option>, + }, + PseudonymIssuerPid, + PseudonymHiddenPid { + commitment_with_proof: Option>, + }, +} + +/// The following algorithm specifies how to generate a proof configuration from a set of proof options that is +/// used as input to the base proof hashing algorithm. +/// +/// The required inputs to this algorithm are proof options (options). The proof options MUST contain a type +/// identifier for the cryptographic suite (type) and MUST contain a cryptosuite identifier (cryptosuite). +/// +/// A proof configuration object is produced as output. +pub fn base_proof_configuration(options: JsonLDValue) -> JsonLDValue { + todo!() +} + +/// The following algorithm specifies how to create a data integrity proof given an unsecured data document. +/// +/// Required inputs are an unsecured data document (map unsecuredDocument), a set of proof options (map options), +/// an array of mandatory JSON pointers (mandatoryPointers), a featureOption indicator parameter, and, depending +/// on the featureOption, a commitment_with_proof byte array. +/// +/// A data integrity proof (map), or an error, is produced as output. +pub fn create_base_proof( + unsecured_document: RDFGraph, + options: JsonLDValue, + mandatory_pointers: Vec, + feature_option: FeatureOption, +) -> JsonLDValue { + // 1) Let proof be a clone of the proof options, options. + let proof = options.clone(); + + todo!("Implement create_base_proof") +} diff --git a/next-gen-signatures/tests/zkp-sample.rs b/next-gen-signatures/tests/zkp-sample.rs new file mode 100644 index 0000000..8585a73 --- /dev/null +++ b/next-gen-signatures/tests/zkp-sample.rs @@ -0,0 +1,338 @@ +use std::collections::BTreeMap; + +use std::{collections::BTreeSet, io::Cursor}; + +use ark_bls12_381::{Bls12_381, Fr}; +use ark_serialize::{CanonicalDeserialize, CanonicalSerialize}; +use base64::Engine; +use bbs_plus::prelude::{SignatureG1, SignatureParamsG1}; +use blake2::Blake2b512; +use next_gen_signatures::{ + common::{ByteArray, CryptoProvider}, + crypto::{ + bbs::{GenParams, SignParams}, + BbsPlusG1Provider as Provider, + }, + BASE64_URL_SAFE_NO_PAD, +}; +use num_bigint::BigUint; +use proof_system::prelude::{ + bbs_plus::{PoKBBSSignatureG1Prover, PoKBBSSignatureG1Verifier}, + bound_check_legogroth16::{BoundCheckLegoGroth16Prover, BoundCheckLegoGroth16Verifier}, + generate_snark_srs_bound_check, + r1cs_legogroth16::{ProvingKey, VerifyingKey}, + EqualWitnesses, MetaStatements, PoKBBSSignatureG1, Proof, ProofSpec, Statements, Witness, + Witnesses, +}; +use rand::{prelude::StdRng, RngCore, SeedableRng}; + +#[derive(Debug, Clone)] +pub enum ZkpProvable { + BoundsCheck { + signature_index: usize, + message_index: usize, + min: u64, + max: u64, + }, +} + +pub type ScalarField = Fr; +pub type Signature = SignatureG1; +pub type SignatureParams = SignatureParamsG1; +pub type StatementProver = PoKBBSSignatureG1Prover; +pub type BoundsStatementProver = BoundCheckLegoGroth16Prover; + +#[allow(clippy::too_many_arguments)] +fn create_proof( + rng: &mut R, + signatures: Vec, + params: Vec, + proving_key: ProvingKey, + messages: Vec, + provables: Vec, + reveal_indexes: BTreeSet, + proof_nonce: Option, +) -> anyhow::Result> { + let proof_nonce: Option> = match proof_nonce { + None => None, + Some(nonce) => Some(BASE64_URL_SAFE_NO_PAD.decode(nonce)?), + }; + + // TODO: some input sanity validation. + + let messages = messages + .into_iter() + .map(|m| BASE64_URL_SAFE_NO_PAD.decode(m)) + .collect::, _>>()? + .into_iter() + .map(|b| BigUint::from_bytes_le(&b).into()) + .collect::>(); + + let revealed_messages = messages + .clone() + .into_iter() + .enumerate() + // ugly ↓ + .filter(|(idx, _)| reveal_indexes.contains(&(*idx as u32))) + .collect::>(); + + let unrevealed_messages = messages + .clone() + .into_iter() + .enumerate() + // ugly ↓ + .filter(|(idx, _)| !reveal_indexes.contains(&(*idx as u32))) + .collect::>(); + + let proof_spec = { + let mut statements = Statements::::new(); + + let mut meta_statements = MetaStatements::new(); + + for (idx, provable) in provables.clone().into_iter().enumerate() { + match provable { + ZkpProvable::BoundsCheck { + signature_index, + message_index, + min, + max, + } => { + statements.add(StatementProver::new_statement_from_params( + params.get(signature_index).unwrap().clone(), + revealed_messages.clone(), + )); + statements.add( + BoundsStatementProver::new_statement_from_params( + min, + max, + proving_key.clone(), + ) + .map_err(|err| anyhow::anyhow!("BoundsProver error: {err:?}"))?, + ); + + meta_statements.add_witness_equality(EqualWitnesses(BTreeSet::from([ + (idx * 2, message_index), + (1, 0), + ]))); + } + } + } + + let proof_spec = ProofSpec::new(statements, meta_statements, vec![], None); + proof_spec + .validate() + .map_err(|err| anyhow::anyhow!("ProofSpec validation error: {err:?}"))?; + + proof_spec + }; + + let witnesses = { + let mut witnesses = Witnesses::new(); + + for provable in provables.clone().into_iter() { + match provable { + ZkpProvable::BoundsCheck { + signature_index, + message_index, + .. + } => { + witnesses.add(PoKBBSSignatureG1::new_as_witness( + signatures.get(signature_index).unwrap().clone(), + unrevealed_messages.clone(), + )); + + witnesses.add(Witness::BoundCheckLegoGroth16( + *messages.get(message_index).unwrap(), + )); + } + } + } + + witnesses + }; + + let (proof, _) = + Proof::new::(rng, proof_spec, witnesses, proof_nonce, Default::default()) + .map_err(|err| anyhow::anyhow!("Failed to create proof: {err:?}"))?; + + Ok(proof) +} + +#[allow(clippy::too_many_arguments)] +fn verify_proof( + rng: &mut StdRng, + proof: Proof, + nonce: ByteArray, + issuer_pk: ByteArray, + verifying_key: VerifyingKey, + message_count: u32, + message_index: usize, + min: u64, + max: u64, + revealed_messages: BTreeMap, + proof_nonce: Option, +) -> anyhow::Result { + let issuer_pk = Provider::pk_from_bytes(issuer_pk)?; + + let proof_nonce: Option> = match proof_nonce { + None => None, + Some(nonce) => Some(BASE64_URL_SAFE_NO_PAD.decode(nonce)?), + }; + + let mut statements = Statements::::new(); + // Statement that the signature is correct + statements.add( + PoKBBSSignatureG1Verifier::::new_statement_from_params( + SignatureParamsG1::new::(&nonce, message_count), + issuer_pk, + revealed_messages, + ), + ); + // Statement that the age is within bounds + statements.add( + BoundCheckLegoGroth16Verifier::new_statement_from_params(min, max, verifying_key) + .map_err(|err| anyhow::anyhow!("{err:?}"))?, + ); + + let mut meta_statements = MetaStatements::new(); + // Meta-Statement that the witness is equal for both of the statements above + // meaning that the above statements are "in the same context". + meta_statements.add_witness_equality(EqualWitnesses(BTreeSet::from([ + // Witness of Statement 0 (valid sign) with message 0 (age) + (0, message_index), + // Witness of Statement 1 (wihthin bounds) with message 0 + (1, 0), + ]))); + + let proof_spec = ProofSpec::new(statements, meta_statements, vec![], None); + proof_spec.validate().unwrap(); + + proof + .verify::(rng, proof_spec, proof_nonce, Default::default()) + .map_err(|err| anyhow::anyhow!("Failed to verify proof: {err:?}"))?; + + Ok(true) +} + +#[test] +pub fn zkp_sample() -> anyhow::Result<()> { + let mut rng = StdRng::seed_from_u64(1337); + // USE-CASE: We have 1 claim (message), that is our age + // We want to create a ZKP that our age is >= 18, without + // revealing our age. + + // Holder has an age + let age = 21u64; + + let message_index = 1; + + // Verifier wants to know if holder min <= age < max + let (min, max) = (18u64, 100u64); + + // Nonce, is publicy known + let nonce_bytes = b"nonce"; + + let proof_nonce = None; + + // ISSUANCE + + let revealed_indexes = BTreeSet::from([0, 2]); + let revealed_messages = BTreeMap::from([ + (0, Fr::from(BigUint::from_bytes_le(b"message 1"))), + (2, Fr::from(BigUint::from_bytes_le(b"message 2"))), + ]); + + let (issuer_pk, signature, messages, message_count) = { + let nonce = BASE64_URL_SAFE_NO_PAD.encode(nonce_bytes); + + let messages = vec![ + Fr::from(BigUint::from_bytes_le(b"message 1")), + Fr::from(age), + Fr::from(BigUint::from_bytes_le(b"message 2")), + Fr::from(age), + ]; + + let message_count = messages.len() as u32; + + // issuer_sk is private, issuer_pk is publicly known + let (issuer_pk, issuer_sk) = Provider::gen_keypair(GenParams { + nonce: nonce.clone(), + message_count, + })?; + + // Created by Issuer + let signature = { + let messages = messages + .iter() + .map(|m| { + let b: BigUint = (*m).into(); + BASE64_URL_SAFE_NO_PAD.encode(b.to_bytes_le()) + }) + .collect::>(); + let sign_bytes = Provider::sign( + &issuer_sk, + SignParams { + nonce: nonce.clone(), + messages: messages.clone(), + }, + )?; + + SignatureG1::::deserialize_compressed(Cursor::new(sign_bytes))? + }; + + (issuer_pk, signature, messages, message_count) + }; + + let verifier_pk = generate_snark_srs_bound_check::(&mut rng) + .map_err(|err| anyhow::anyhow!("{err:?}"))?; + + let proof = { + let mut signature_bytes = vec![]; + signature.serialize_compressed(&mut signature_bytes)?; + + let messages = messages + .into_iter() + .map(|m| { + let b: BigUint = m.into(); + BASE64_URL_SAFE_NO_PAD.encode(b.to_bytes_le()) + }) + .collect::>(); + + create_proof( + &mut rng, + vec![signature], + vec![SignatureParams::new::( + nonce_bytes, + message_count, + )], + verifier_pk.clone(), + messages, + vec![ZkpProvable::BoundsCheck { + signature_index: 0, + message_index, + min, + max, + }], + revealed_indexes, + proof_nonce.clone(), + )? + }; + + let success = verify_proof( + &mut rng, + proof, + nonce_bytes.to_vec(), + Provider::pk_into_bytes(issuer_pk.clone())?, + verifier_pk.vk.clone(), + message_count, + message_index, + min, + max, + revealed_messages, + proof_nonce, + )?; + + assert!(success); + + Ok(()) +} diff --git a/next-gen-signing-service/Cargo.toml b/next-gen-signing-service/Cargo.toml index cfd9f90..8d99d58 100644 --- a/next-gen-signing-service/Cargo.toml +++ b/next-gen-signing-service/Cargo.toml @@ -1,13 +1,16 @@ [package] name = "next-gen-signing-service" -version = "0.0.4" +version = "0.1.0" edition = "2021" [dependencies] next-gen-signatures = { path = "../next-gen-signatures", features = [ "all-algos", + "rocket", ] } paste = "1.0.15" +rand = "0.8.5" rocket = { version = "0.5.1", features = ["json"] } rocket-errors = "0.1.0" +serde_json = "1.0.132" serde_urlencoded = "0.7.1" diff --git a/next-gen-signing-service/examples/zkp/flow.http b/next-gen-signing-service/examples/zkp/flow.http new file mode 100644 index 0000000..de5fd1a --- /dev/null +++ b/next-gen-signing-service/examples/zkp/flow.http @@ -0,0 +1,92 @@ +{{ + function base64url_encode(str) { + const buffer = new TextEncoder().encode(str); + return btoa(Array.from(new Uint8Array(buffer), b => String.fromCharCode(b)).join('')) + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/, ''); + } + + exports.base64url_encode = base64url_encode + + exports.data = base64url_encode(JSON.stringify({ + "@type": "http://schema.org/Person", + "@id": "did:example:johndoe", + "http://schema.org/name": "John Doe", + "http://schema.org/birthDate": { + "@value": "1990-01-01T00:00:00Z", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "http://schema.org/telephone": "(425) 123-4567", + })) + + exports.definition = base64url_encode(JSON.stringify([ + { "key": "@id", "type": "Required" }, + { "key": "@type", "type": "Required" }, + { "key": "http://schema.org/name", "type": "Required" }, + { + "id": "https://zkp-ld.org/circuit/ubique/lessThanPublic", + "private_key": "http://schema.org/birthDate", + "private_var": "a", + "public_val": { + "@type": "http://www.w3.org/2001/XMLSchema#dateTime", + "@value": "2000-01-01T00:00:00Z" + }, + "public_var": "b", + "type": "Circuit" + } + ])) + + exports.issuer_id = "did:example:issuer0" + exports.issuer_key_id = "did:example:issuer0#bls12_381-g2-pub001" +}} +### +GET http://localhost:8000/zkp/keypair + +{{ + exports.issuer_pk = response.parsedBody.public_key + exports.issuer_sk = response.parsedBody.secret_key +}} + +GET http://localhost:8000/zkp/issue + ?data={{data}} + &issuer_pk={{issuer_pk}} + &issuer_sk={{issuer_sk}} + &issuer_id={{issuer_id}} + &issuer_key_id={{issuer_key_id}} + +{{ + exports.credential = response.parsedBody.encoded; +}} + +GET http://localhost:8000/zkp/proving-keys + ?definition={{definition}} + +{{ + exports.verifying_keys = base64url_encode(JSON.stringify( + response.parsedBody.verifying_keys + )) + exports.proving_keys = base64url_encode(JSON.stringify( + response.parsedBody.proving_keys + )) +}} + +GET http://localhost:8000/zkp/present + ?credential={{credential}} + &definition={{definition}} + &proving_keys={{proving_keys}} + &issuer_pk={{issuer_pk}} + &issuer_id={{issuer_id}} + &issuer_key_id={{issuer_key_id}} + +{{ + exports.proof = response.parsedBody.proof +}} + +GET http://localhost:8000/zkp/verify + ?proof={{proof}} + &issuer_pk={{issuer_pk}} + &verifying_keys={{verifying_keys}} + &definition={{definition}} + &issuer_id={{issuer_id}} + &issuer_key_id={{issuer_key_id}} \ No newline at end of file diff --git a/next-gen-signing-service/src/main.rs b/next-gen-signing-service/src/main.rs index a5983db..1295c70 100644 --- a/next-gen-signing-service/src/main.rs +++ b/next-gen-signing-service/src/main.rs @@ -74,6 +74,162 @@ mod bbs_plus_routes { } } +mod zkp_routes { + use std::collections::HashMap; + + use next_gen_signatures::{ + crypto::zkp::{self, Circuits, ProofRequirement}, + Engine, BASE64_URL_SAFE_NO_PAD, + }; + use rand::rngs::OsRng; + use rocket::{get, serde::json::Json}; + use serde_json::{json, Value}; + + use crate::KeyPair; + + #[get("/keypair")] + pub fn gen_keypair() -> Json { + let mut rng = OsRng; + + let (pk, sk) = zkp::generate_keypair(&mut rng); + let key_pair = KeyPair { + public_key: pk, + secret_key: sk, + }; + + Json(key_pair) + } + + #[get("/issue?&&&&&")] + pub async fn issue( + data: String, + issuer_pk: String, + issuer_sk: String, + issuer_id: String, + issuer_key_id: String, + expiry_months: Option, + ) -> Json { + let mut rng = OsRng; + + let data = BASE64_URL_SAFE_NO_PAD.decode(&data).unwrap(); + let data = String::from_utf8(data).unwrap(); + let data = serde_json::from_str::(&data).unwrap(); + + let expiry_months = expiry_months.unwrap_or(36); + + let credential = zkp::issue( + &mut rng, + data, + issuer_pk, + issuer_sk, + &issuer_id, + &issuer_key_id, + expiry_months, + ) + .await; + + Json(credential.serialize()) + } + + #[get("/proving-keys?")] + pub fn gen_proving_keys(definition: String) -> Json { + let mut rng = OsRng; + + let reqs = { + let bytes = BASE64_URL_SAFE_NO_PAD.decode(definition).unwrap(); + let str = String::from_utf8(bytes).unwrap(); + serde_json::from_str::>(&str).unwrap() + }; + + let circuits = zkp::circuits::generate_circuits(&mut rng, &reqs); + + Json(circuits) + } + + #[get( + "/present?&&&&&" + )] + pub async fn present( + credential: String, + definition: String, + proving_keys: String, + issuer_pk: String, + issuer_id: String, + issuer_key_id: String, + ) -> Json { + let mut rng = OsRng; + + println!("{credential}"); + let credential = zkp::Credential::deserialize_encoded(&credential); + + let reqs = { + let bytes = BASE64_URL_SAFE_NO_PAD.decode(definition).unwrap(); + let str = String::from_utf8(bytes).unwrap(); + serde_json::from_str::>(&str).unwrap() + }; + + let proving_keys = { + let bytes = BASE64_URL_SAFE_NO_PAD.decode(proving_keys).unwrap(); + let str = String::from_utf8(bytes).unwrap(); + serde_json::from_str::>(&str).unwrap() + }; + + let pres = zkp::present( + &mut rng, + credential, + &reqs, + &proving_keys, + issuer_pk, + &issuer_id, + &issuer_key_id, + ) + .await; + + Json(json!({ + "proof": pres.serialize(), + })) + } + + #[get("/verify?&&&&&")] + pub async fn verify( + proof: String, + issuer_pk: String, + verifying_keys: String, + definition: String, + issuer_id: String, + issuer_key_id: String, + ) -> Json { + let mut rng = OsRng; + + let pres = zkp::Presentation::deserialize(&proof); + + let verifying_keys = { + let bytes = BASE64_URL_SAFE_NO_PAD.decode(verifying_keys).unwrap(); + let str = String::from_utf8(bytes).unwrap(); + serde_json::from_str::>(&str).unwrap() + }; + + let reqs = { + let bytes = BASE64_URL_SAFE_NO_PAD.decode(definition).unwrap(); + let str = String::from_utf8(bytes).unwrap(); + serde_json::from_str::>(&str).unwrap() + }; + + let json = zkp::verify( + &mut rng, + pres, + issuer_pk, + verifying_keys, + &reqs, + &issuer_id, + &issuer_key_id, + ) + .await; + + Json(json) + } +} + #[get("/")] fn index() -> String { format!("SPRIND Signing Service v{VERSION}") @@ -125,6 +281,16 @@ fn rocket() -> _ { bbs_plus_routes::BbsPlusG2Provider_verify, ], ) + .mount( + "/zkp/", + routes![ + zkp_routes::gen_keypair, + zkp_routes::issue, + zkp_routes::gen_proving_keys, + zkp_routes::present, + zkp_routes::verify + ], + ) } #[cfg(test)] diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 292fe49..fcc85b9 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "stable" +channel = "1.77"