diff --git a/Cargo.lock b/Cargo.lock index 89d6f85c..392f089a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,12 +24,6 @@ dependencies = [ "zerocopy", ] -[[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" @@ -41,9 +35,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "ark-bls12-381" @@ -187,6 +181,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "bincode" version = "1.3.3" @@ -198,9 +198,9 @@ dependencies = [ [[package]] name = "bitflags" -version = "2.9.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "block-buffer" @@ -225,18 +225,19 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "cc" -version = "1.2.32" +version = "1.2.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2352e5597e9c544d5e6d9c95190d5d27738ade584fa8db0a16e130e5c2b5296e" +checksum = "37521ac7aabe3d13122dc382493e20c9416f299d2ccd5b3a5340a2570cdeb0f3" dependencies = [ + "find-msvc-tools", "shlex", ] [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "chacha20" @@ -264,11 +265,10 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", @@ -364,7 +364,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] @@ -412,7 +412,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] @@ -434,7 +434,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] @@ -449,12 +449,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -476,7 +476,7 @@ checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] @@ -560,7 +560,7 @@ dependencies = [ "subproductdomain-nucypher", "thiserror", "wasm-bindgen", - "wasm-bindgen-derive", + "wasm-bindgen-derive 0.2.1", "zeroize", ] @@ -624,6 +624,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "fnv" version = "1.0.7" @@ -717,9 +723,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -785,9 +791,9 @@ dependencies = [ [[package]] name = "inventory" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab08d7cd2c5897f2c949e5383ea7c7db03fb19130ffcfbf7eda795137ae3cb83" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" dependencies = [ "rustversion", ] @@ -809,9 +815,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65" dependencies = [ "once_cell", "wasm-bindgen", @@ -840,25 +846,24 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.175" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "measure_time" @@ -872,9 +877,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "memoffset" @@ -915,7 +920,9 @@ dependencies = [ "rand_chacha 0.3.1", "rand_core 0.6.4", "rmp-serde", + "secrecy", "serde", + "serde-encoded-bytes", "serde_with 1.14.0", "sha2", "sha3", @@ -932,7 +939,7 @@ dependencies = [ "ferveo-nucypher", "nucypher-core", "pyo3", - "pyo3-build-config", + "pyo3-build-config 0.27.1", "umbral-pre", ] @@ -949,7 +956,7 @@ dependencies = [ "nucypher-core", "umbral-pre", "wasm-bindgen", - "wasm-bindgen-derive", + "wasm-bindgen-derive 0.3.0", "wasm-bindgen-test", "x25519-dalek", ] @@ -1002,9 +1009,9 @@ checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -1012,15 +1019,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets", + "windows-link", ] [[package]] @@ -1057,9 +1064,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.97" +version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" dependencies = [ "unicode-ident", ] @@ -1076,7 +1083,7 @@ dependencies = [ "libc", "memoffset", "parking_lot", - "pyo3-build-config", + "pyo3-build-config 0.18.3", "pyo3-ffi", "pyo3-macros", "unindent", @@ -1089,7 +1096,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9cb946f5ac61bb61a5014924910d936ebd2b23b705f7a4a3c40b05c720b079a3" dependencies = [ "once_cell", - "target-lexicon", + "target-lexicon 0.12.16", +] + +[[package]] +name = "pyo3-build-config" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f77d387774f6f6eec64a004eac0ed525aab7fa1966d94b42f743797b3e395afb" +dependencies = [ + "target-lexicon 0.13.3", ] [[package]] @@ -1099,7 +1115,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd4d7c5337821916ea2a1d21d1092e8443cf34879e53a0ac653fbb98f44ff65c" dependencies = [ "libc", - "pyo3-build-config", + "pyo3-build-config 0.18.3", ] [[package]] @@ -1127,9 +1143,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -1207,9 +1223,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ "bitflags", ] @@ -1295,51 +1311,83 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secrecy" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e891af845473308773346dc847b2c23ee78fe442e0472ac50e22a18a93d3ae5a" +dependencies = [ + "zeroize", +] + [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] +[[package]] +name = "serde-encoded-bytes" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "988156b15813ab36ef7527430ed5d055d826f0d5fae2d17514a943360db27200" +dependencies = [ + "base64 0.22.1", + "hex", + "serde", +] + [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] @@ -1389,7 +1437,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] @@ -1479,9 +1527,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.105" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bc3fcb250e53458e712715cf74285c1f889686520d79294a9ef3bd7aa1fc619" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -1494,6 +1542,12 @@ version = "0.12.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" +[[package]] +name = "target-lexicon" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df7f62577c25e07834649fc3b39fafdc597c0a3527dc1c60129201ccfcbaa50c" + [[package]] name = "thiserror" version = "1.0.69" @@ -1511,14 +1565,14 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -1531,15 +1585,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -1547,9 +1601,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "umbral-pre" @@ -1573,15 +1627,15 @@ dependencies = [ "sha2", "subtle", "wasm-bindgen", - "wasm-bindgen-derive", + "wasm-bindgen-derive 0.2.1", "zeroize", ] [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" [[package]] name = "unindent" @@ -1629,39 +1683,37 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-backend" -version = "0.2.100" +name = "wasm-bindgen-derive" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "c1ab6c8bffb3f89584781211283fb57337d6902faab6eaee38f336977bdf177d" dependencies = [ - "bumpalo", - "log", - "proc-macro2", - "quote", - "syn 2.0.105", - "wasm-bindgen-shared", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-derive-macro 0.2.1", ] [[package]] name = "wasm-bindgen-derive" -version = "0.2.1" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ab6c8bffb3f89584781211283fb57337d6902faab6eaee38f336977bdf177d" +checksum = "8ab8fdb87408dab27d43267c311c89135b35d13f8b3081e88451ddeff742c93a" dependencies = [ "js-sys", "wasm-bindgen", - "wasm-bindgen-derive-macro", + "wasm-bindgen-derive-macro 0.3.0", ] [[package]] @@ -1675,11 +1727,22 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "wasm-bindgen-derive-macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2fbc080f15cb38f447d52bbae64630c2d4925a9ecb5d140d56c0910b69b4cc7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0" dependencies = [ "cfg-if", "js-sys", @@ -1690,9 +1753,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1700,31 +1763,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc" dependencies = [ + "bumpalo", "proc-macro2", "quote", - "syn 2.0.105", - "wasm-bindgen-backend", + "syn 2.0.108", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76" dependencies = [ "unicode-ident", ] [[package]] name = "wasm-bindgen-test" -version = "0.3.50" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c8d5e33ca3b6d9fa3b4676d774c5778031d27a578c2b007f905acf816152c3" +checksum = "bfc379bfb624eb59050b509c13e77b4eb53150c350db69628141abce842f2373" dependencies = [ "js-sys", "minicov", @@ -1735,20 +1798,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.50" +version = "0.3.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17d5042cc5fa009658f9a7333ef24291b1291a25b6382dd68862a7f3b969f69b" +checksum = "085b2df989e1e6f9620c1311df6c996e83fe16f57792b272ce1e024ac16a90f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1" dependencies = [ "js-sys", "wasm-bindgen", @@ -1756,18 +1819,18 @@ dependencies = [ [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ "windows-sys", ] [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", @@ -1778,123 +1841,59 @@ dependencies = [ [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "windows-link" -version = "0.1.3" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-result" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ "windows-link", ] [[package]] name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows-link", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" - -[[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" - [[package]] name = "x25519-dalek" version = "2.0.1" @@ -1909,29 +1908,29 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -1944,5 +1943,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.105", + "syn 2.0.108", ] diff --git a/Cargo.toml b/Cargo.toml index d96b77dd..ebcf97a3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,6 +4,7 @@ members = [ "nucypher-core-python", "nucypher-core-wasm", ] +resolver = "2" # Prevents `local exceed maximum` error # See: https://github.com/rustwasm/wasm-pack/issues/981 diff --git a/nucypher-core-wasm/Cargo.toml b/nucypher-core-wasm/Cargo.toml index 2c9d5173..1145e59d 100644 --- a/nucypher-core-wasm/Cargo.toml +++ b/nucypher-core-wasm/Cargo.toml @@ -27,7 +27,7 @@ wasm-bindgen = "0.2.100" js-sys = "0.3.63" console_error_panic_hook = { version = "0.1", optional = true } derive_more = { version = "0.99", default-features = false, features = ["from", "as_ref"] } -wasm-bindgen-derive = "0.2.1" +wasm-bindgen-derive = "0.3" x25519-dalek = "2.0.0-rc.2" [dev-dependencies] diff --git a/nucypher-core-wasm/src/lib.rs b/nucypher-core-wasm/src/lib.rs index 3d5f937d..79540c25 100644 --- a/nucypher-core-wasm/src/lib.rs +++ b/nucypher-core-wasm/src/lib.rs @@ -23,7 +23,7 @@ use umbral_pre::bindings_wasm::{ }; use wasm_bindgen::prelude::{wasm_bindgen, JsValue}; use wasm_bindgen::JsCast; -use wasm_bindgen_derive::TryFromJsValue; +use wasm_bindgen_derive::{into_js_array, try_from_js_array, try_from_js_option, TryFromJsValue}; use nucypher_core::ProtocolObject; @@ -54,60 +54,6 @@ where U::from_bytes(data).map(T::from).map_err(map_js_err) } -/// Tries to convert an optional value (either `null` or a `#[wasm_bindgen]` marked structure) -/// from `JsValue` to the Rust type. -// TODO (rust-umbral#25): This is necessary since wasm-bindgen does not support -// having a parameter of `Option<&T>`, and using `Option` consumes the argument -// (see https://github.com/rustwasm/wasm-bindgen/issues/2370). -fn try_from_js_option(value: impl AsRef) -> Result, Error> -where - for<'a> T: TryFrom<&'a JsValue> + 'static, - for<'a> >::Error: core::fmt::Display, -{ - let js_value = value.as_ref(); - - let typed_value = if js_value.is_null() { - None - } else { - Some(T::try_from(js_value).map_err(map_js_err)?) - }; - Ok(typed_value) -} - -/// Tries to convert a JS array from `JsValue` to a vector of Rust type elements. -// TODO (rust-umbral#23): This is necessary since wasm-bindgen does not support -// having a parameter of `Vec<&T>` -// (see https://github.com/rustwasm/wasm-bindgen/issues/111). -fn try_from_js_array(value: impl AsRef) -> Result, Error> -where - for<'a> T: TryFrom<&'a JsValue>, - for<'a> >::Error: core::fmt::Display, -{ - let array: &js_sys::Array = value - .as_ref() - .dyn_ref() - .ok_or_else(|| Error::new("Got a non-array argument where an array was expected"))?; - let length: usize = array.length().try_into().map_err(map_js_err)?; - let mut result = Vec::::with_capacity(length); - for js in array.iter() { - let typed_elem = T::try_from(&js).map_err(map_js_err)?; - result.push(typed_elem); - } - Ok(result) -} - -fn into_js_array(value: impl IntoIterator) -> T -where - JsValue: From, - T: JsCast, -{ - value - .into_iter() - .map(JsValue::from) - .collect::() - .unchecked_into::() -} - macro_rules! generate_from_bytes { ($struct_name:ident) => { #[wasm_bindgen] @@ -305,7 +251,7 @@ impl MessageKit { plaintext: &[u8], conditions: &OptionConditions, ) -> Result { - let typed_conditions = try_from_js_option::(conditions)?; + let typed_conditions = try_from_js_option::(conditions).map_err(map_js_err)?; Ok(MessageKit(nucypher_core::MessageKit::new( policy_encrypting_key.as_ref(), @@ -335,7 +281,8 @@ impl MessageKit { policy_encrypting_key: &PublicKey, vcfrags: &VerifiedCapsuleFragArray, ) -> Result, Error> { - let typed_vcfrags = try_from_js_array::(vcfrags)?; + let typed_vcfrags = + try_from_js_array::(vcfrags).map_err(map_js_err)?; self.0 .decrypt_reencrypted( sk.as_ref(), @@ -819,7 +766,7 @@ impl ThresholdDecryptionRequest { acp: &AccessControlPolicy, context: &OptionContext, ) -> Result { - let typed_context = try_from_js_option::(context)?; + let typed_context = try_from_js_option::(context).map_err(map_js_err)?; Ok(Self(nucypher_core::ThresholdDecryptionRequest::new( ritual_id, @@ -991,9 +938,9 @@ impl ReencryptionRequest { conditions: &OptionConditions, context: &OptionContext, ) -> Result { - let typed_conditions = try_from_js_option::(conditions)?; - let typed_context = try_from_js_option::(context)?; - let typed_capsules = try_from_js_array::(capsules)?; + let typed_conditions = try_from_js_option::(conditions).map_err(map_js_err)?; + let typed_context = try_from_js_option::(context).map_err(map_js_err)?; + let typed_capsules = try_from_js_array::(capsules).map_err(map_js_err)?; let backend_capules = typed_capsules .into_iter() .map(umbral_pre::Capsule::from) @@ -1114,7 +1061,7 @@ impl ReencryptionResponse { policy_encrypting_key: &PublicKey, bob_encrypting_key: &PublicKey, ) -> Result { - let typed_capsules = try_from_js_array::(capsules)?; + let typed_capsules = try_from_js_array::(capsules).map_err(map_js_err)?; let backend_capsules = typed_capsules .into_iter() .map(|capsule| capsule.as_ref().clone()) @@ -1160,8 +1107,9 @@ impl RetrievalKit { queried_addresses: &AddressArray, conditions: &OptionConditions, ) -> Result { - let typed_conditions = try_from_js_option::(conditions)?; - let typed_addresses = try_from_js_array::
(queried_addresses)?; + let typed_conditions = try_from_js_option::(conditions).map_err(map_js_err)?; + let typed_addresses = + try_from_js_array::
(queried_addresses).map_err(map_js_err)?; let backend_addresses = typed_addresses .into_iter() .map(|address| address.0) @@ -1392,8 +1340,8 @@ impl FleetStateChecksum { other_nodes: &NodeMetadataArray, this_node: &OptionNodeMetadata, ) -> Result { - let typed_this_node = try_from_js_option::(this_node)?; - let typed_nodes = try_from_js_array::(other_nodes)?; + let typed_this_node = try_from_js_option::(this_node).map_err(map_js_err)?; + let typed_nodes = try_from_js_array::(other_nodes).map_err(map_js_err)?; let backend_nodes = typed_nodes .into_iter() .map(|node| node.0) @@ -1427,7 +1375,7 @@ impl MetadataRequest { fleet_state_checksum: &FleetStateChecksum, announce_nodes: &NodeMetadataArray, ) -> Result { - let typed_nodes = try_from_js_array::(announce_nodes)?; + let typed_nodes = try_from_js_array::(announce_nodes).map_err(map_js_err)?; let backend_nodes = typed_nodes .into_iter() .map(|node| node.0) @@ -1468,7 +1416,7 @@ impl MetadataResponsePayload { timestamp_epoch: u32, announce_nodes: &NodeMetadataArray, ) -> Result { - let typed_nodes = try_from_js_array::(announce_nodes)?; + let typed_nodes = try_from_js_array::(announce_nodes).map_err(map_js_err)?; let backend_nodes = typed_nodes .into_iter() .map(|node| node.0) diff --git a/nucypher-core-wasm/tests/wasm.rs b/nucypher-core-wasm/tests/wasm.rs index e6a1205f..4661bc17 100644 --- a/nucypher-core-wasm/tests/wasm.rs +++ b/nucypher-core-wasm/tests/wasm.rs @@ -7,48 +7,10 @@ use umbral_pre::bindings_wasm::{ }; use wasm_bindgen::prelude::*; use wasm_bindgen::JsCast; +use wasm_bindgen_derive::{into_js_array, into_js_option, try_from_js_array}; use wasm_bindgen_test::*; use nucypher_core_wasm::*; -// -// Test utilities -// - -fn into_js_option(val: Option) -> T -where - JsValue: From, - T: JsCast, -{ - let js_val = match val { - None => JsValue::NULL, - Some(val) => val.into(), - }; - js_val.unchecked_into::() -} - -fn try_from_js_array(val: impl Into) -> Vec -where - for<'a> T: TryFrom<&'a JsValue>, - for<'a> >::Error: core::fmt::Debug, -{ - let js_array: js_sys::Array = val.into().dyn_into().unwrap(); - js_array - .iter() - .map(|js| T::try_from(&js).unwrap()) - .collect::>() -} - -fn into_js_array(value: impl IntoIterator) -> T -where - JsValue: From, - T: JsCast, -{ - value - .into_iter() - .map(JsValue::from) - .collect::() - .unchecked_into::() -} /// Generate a random DKG public key. fn random_dkg_pubkey() -> DkgPublicKey { @@ -79,7 +41,7 @@ fn make_kfrags(delegating_sk: &SecretKey, receiving_sk: &SecretKey) -> Vec(js_kfrags) + try_from_js_array::(js_kfrags).unwrap() } fn make_fleet_state_checksum() -> FleetStateChecksum { @@ -174,7 +136,7 @@ fn message_kit_decrypt_reencrypted() { ); // Simulate reencryption on the JS side - let vkfrags = try_from_js_array::(vkfrags_js); + let vkfrags = try_from_js_array::(vkfrags_js).unwrap(); let vcfrags = vkfrags .into_iter() .map(|vkfrag| reencrypt(&message_kit.capsule(), &vkfrag)); @@ -336,7 +298,7 @@ fn treasure_map_destinations() { let receiving_sk = SecretKey::random(); let treasure_map = make_treasure_map(&publisher_sk, &receiving_sk); - let destinations_pairs = try_from_js_array::(treasure_map.destinations()); + let destinations_pairs = try_from_js_array::(treasure_map.destinations()).unwrap(); // Need to unpack the tuples further let mut destinations = Vec::new(); @@ -482,7 +444,7 @@ fn reencryption_response_verify() { ) .unwrap(); - let verified = try_from_js_array::(verified_array); + let verified = try_from_js_array::(verified_array).unwrap(); assert_eq!(vcfrags, verified, "Capsule fragments do not match"); let as_bytes = reencryption_response.to_bytes(); @@ -512,7 +474,7 @@ fn retrieval_kit() { let retrieval_kit_from_mk = RetrievalKit::from_message_kit(&message_kit); let addresses_from_rkit = - try_from_js_array::
(retrieval_kit_from_mk.queried_addresses()); + try_from_js_array::
(retrieval_kit_from_mk.queried_addresses()).unwrap(); assert_eq!( addresses_from_rkit.len(), 0, @@ -532,7 +494,8 @@ fn retrieval_kit() { &conditions_js, ) .unwrap(); - let addresses_from_rkit = try_from_js_array::
(retrieval_kit.queried_addresses()); + let addresses_from_rkit = + try_from_js_array::
(retrieval_kit.queried_addresses()).unwrap(); assert_eq!( addresses_from_rkit.len(), queried_addresses.len(), @@ -620,7 +583,7 @@ fn fleet_state_checksum_to_bytes() { let fleet_state_checksum = make_fleet_state_checksum(); assert!( - fleet_state_checksum.to_bytes().len() > 0, + !fleet_state_checksum.to_bytes().is_empty(), "FleetStateChecksum does not serialize to bytes" ); } @@ -636,7 +599,7 @@ fn metadata_request() { let announce_nodes_js = into_js_array(announce_nodes.iter().cloned()); let metadata_request = MetadataRequest::new(&fleet_state_checksum, &announce_nodes_js).unwrap(); - let nodes = try_from_js_array::(metadata_request.announce_nodes()); + let nodes = try_from_js_array::(metadata_request.announce_nodes()).unwrap(); assert_eq!(nodes, announce_nodes); let as_bytes = metadata_request.to_bytes(); @@ -654,7 +617,8 @@ fn metadata_request() { #[wasm_bindgen_test] fn metadata_response_payload() { let (metadata_response_payload, announce_nodes) = make_metadata_response_payload(); - let nodes = try_from_js_array::(metadata_response_payload.announce_nodes()); + let nodes = + try_from_js_array::(metadata_response_payload.announce_nodes()).unwrap(); assert_eq!(nodes, announce_nodes, "Announce nodes does not match"); } diff --git a/nucypher-core/Cargo.toml b/nucypher-core/Cargo.toml index 79405951..06ac2a57 100644 --- a/nucypher-core/Cargo.toml +++ b/nucypher-core/Cargo.toml @@ -14,7 +14,10 @@ umbral-pre = { version = "0.11.0", features = ["serde"] } ferveo = { package = "ferveo-nucypher", version = "0.4.0" } ark-std = "0.4" serde = { version = "1", default-features = false, features = ["derive"] } -generic-array = { version = "0.14", features = ["zeroize"] } +# generic-array added deprecation warnings to its whole API in 0.14.8, +# but many of our RustCrypto dependencies are still stuck on generic-array=0.14.x, +# so it's warnings galore. +generic-array = { version = "=0.14.7", features = ["zeroize"] } sha3 = "0.10" rmp-serde = "1" serde_with = "1.14" @@ -27,3 +30,5 @@ zeroize = { version = "1.6.0", features = ["derive"] } rand_core = "0.6.4" rand_chacha = "0.3.1" rand = "0.8.5" +secrecy = "0.10" +serde-encoded-bytes = { version = "0.2", features = ["hex", "base64"] } diff --git a/nucypher-core/src/access_control.rs b/nucypher-core/src/access_control.rs index ec6e0692..84ef2709 100644 --- a/nucypher-core/src/access_control.rs +++ b/nucypher-core/src/access_control.rs @@ -4,7 +4,7 @@ use alloc::string::String; use ferveo::api::{encrypt, Ciphertext, DkgPublicKey, SecretBox}; use ferveo::Error; use serde::{Deserialize, Serialize}; -use umbral_pre::serde_bytes; +use serde_encoded_bytes::{Base64, SliceLike}; use crate::conditions::Conditions; use crate::versioning::{ @@ -89,7 +89,7 @@ pub struct AccessControlPolicy { pub auth_data: AuthenticatedData, /// The authorization data for the authenticated data - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] pub authorization: Box<[u8]>, } diff --git a/nucypher-core/src/address.rs b/nucypher-core/src/address.rs index eadb4e1c..e4a0ec27 100644 --- a/nucypher-core/src/address.rs +++ b/nucypher-core/src/address.rs @@ -4,8 +4,9 @@ use generic_array::{ GenericArray, }; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{ArrayLike, Hex}; use sha3::{digest::Update, Digest, Keccak256}; -use umbral_pre::{serde_bytes, PublicKey}; +use umbral_pre::PublicKey; // We could use the third-party `ethereum_types::Address` here, // but it has an inefficient `serde` implementation (serializes as hex instead of bytes). @@ -14,7 +15,7 @@ use umbral_pre::{serde_bytes, PublicKey}; /// Represents an Ethereum address (20 bytes). #[derive(PartialEq, Debug, Serialize, Deserialize, Copy, Clone, PartialOrd, Eq, Ord)] -pub struct Address(#[serde(with = "serde_bytes::as_hex")] [u8; Address::SIZE]); +pub struct Address(#[serde(with = "ArrayLike::")] [u8; Address::SIZE]); impl Address { /// Size of canonical Ethereum address, in bytes. diff --git a/nucypher-core/src/dkg.rs b/nucypher-core/src/dkg.rs index 11fb7882..807f78ed 100644 --- a/nucypher-core/src/dkg.rs +++ b/nucypher-core/src/dkg.rs @@ -7,7 +7,7 @@ use chacha20poly1305::{ChaCha20Poly1305, Key, Nonce}; use ferveo::api::{CiphertextHeader, FerveoVariant}; use generic_array::typenum::Unsigned; use serde::{Deserialize, Serialize}; -use umbral_pre::serde_bytes; // TODO should this be in umbral? +use serde_encoded_bytes::{Base64, SliceLike}; use crate::access_control::AccessControlPolicy; use crate::conditions::Context; @@ -107,21 +107,39 @@ pub mod session { use generic_array::{ typenum::{Unsigned, U32}, - GenericArray, + ArrayLength, GenericArray, }; + use hkdf::Hkdf; use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use rand_core::{CryptoRng, OsRng, RngCore}; + use secrecy::{ExposeSecret, ExposeSecretMut, SecretBox}; use serde::{Deserialize, Deserializer, Serialize, Serializer}; - use umbral_pre::serde_bytes; + use serde_encoded_bytes::{ArrayLike, Hex}; + use sha2::Sha256; use x25519_dalek::{PublicKey, SharedSecret, StaticSecret}; use zeroize::ZeroizeOnDrop; - use crate::secret_box::{kdf, SecretBox}; use crate::versioning::{ messagepack_deserialize, messagepack_serialize, ProtocolObject, ProtocolObjectInner, }; + pub fn kdf>( + seed: &[u8], + info: Option<&[u8]>, + ) -> SecretBox> { + let hk = Hkdf::::new(None, seed); + + let mut okm = SecretBox::init_with(GenericArray::::default); + + let def_info = info.unwrap_or_default(); + + // We can only get an error here if `S` is too large, and it's known at compile-time. + hk.expand(def_info, okm.expose_secret_mut()).unwrap(); + + okm + } + /// A Diffie-Hellman shared secret #[derive(ZeroizeOnDrop)] pub struct SessionSharedSecret { @@ -134,7 +152,8 @@ pub mod session { pub fn new(shared_secret: SharedSecret) -> Self { let info = b"SESSION_SHARED_SECRET_DERIVATION/"; let derived_key = kdf::(shared_secret.as_bytes(), Some(info)); - let derived_bytes = <[u8; 32]>::try_from(derived_key.as_secret().as_slice()).unwrap(); + let derived_bytes = + <[u8; 32]>::try_from(derived_key.expose_secret().as_slice()).unwrap(); Self { derived_bytes } } @@ -189,14 +208,13 @@ pub mod session { where S: Serializer, { - serde_bytes::as_hex::serialize(self.0.as_bytes(), serializer) + ArrayLike::::serialize(self.0.as_bytes(), serializer) } } - impl serde_bytes::TryFromBytes for SessionStaticKey { + impl TryFrom<[u8; 32]> for SessionStaticKey { type Error = core::array::TryFromSliceError; - fn try_from_bytes(bytes: &[u8]) -> Result { - let array: [u8; 32] = bytes.try_into()?; + fn try_from(array: [u8; 32]) -> Result { Ok(SessionStaticKey(PublicKey::from(array))) } } @@ -206,7 +224,7 @@ pub mod session { where D: Deserializer<'a>, { - serde_bytes::as_hex::deserialize(deserializer) + ArrayLike::::deserialize(deserializer) } } @@ -294,14 +312,14 @@ pub mod session { /// This class handles keyring material for session keys, by allowing deterministic /// derivation of `SessionStaticSecret` objects based on labels. - #[derive(Clone, ZeroizeOnDrop, PartialEq)] + #[derive(ZeroizeOnDrop)] pub struct SessionSecretFactory(SecretBox); impl SessionSecretFactory { /// Creates a session secret factory using the given RNG. pub fn random_with_rng(rng: &mut (impl CryptoRng + RngCore)) -> Self { - let mut bytes = SecretBox::new(SessionSecretFactorySeed::default()); - rng.fill_bytes(bytes.as_mut_secret()); + let mut bytes = SecretBox::init_with(SessionSecretFactorySeed::default); + rng.fill_bytes(bytes.expose_secret_mut()); Self(bytes) } @@ -325,18 +343,20 @@ pub mod session { if seed.len() != Self::seed_size() { return Err(InvalidSessionSecretFactorySeedLength); } - Ok(Self(SecretBox::new(*SessionSecretFactorySeed::from_slice( - seed, - )))) + Ok(Self(SecretBox::init_with(|| { + *SessionSecretFactorySeed::from_slice(seed) + }))) } /// Creates a `SessionStaticSecret` deterministically from the given label. pub fn make_key(&self, label: &[u8]) -> SessionStaticSecret { let prefix = b"SESSION_KEY_DERIVATION/"; let info = [prefix, label].concat(); - let seed = kdf::(self.0.as_secret(), Some(&info)); - let mut rng = - ChaCha20Rng::from_seed(<[u8; 32]>::try_from(seed.as_secret().as_slice()).unwrap()); + let seed = + kdf::(self.0.expose_secret(), Some(&info)); + let mut rng = ChaCha20Rng::from_seed( + <[u8; 32]>::try_from(seed.expose_secret().as_slice()).unwrap(), + ); SessionStaticSecret::random_from_rng(&mut rng) } } @@ -424,7 +444,7 @@ pub struct EncryptedThresholdDecryptionRequest { /// Public key of requester pub requester_public_key: SessionStaticKey, - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] /// Encrypted request ciphertext: Box<[u8]>, } @@ -487,7 +507,7 @@ pub struct ThresholdDecryptionResponse { pub ritual_id: u32, /// The decryption share to include in the response. - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] pub decryption_share: Box<[u8]>, } @@ -539,7 +559,7 @@ pub struct EncryptedThresholdDecryptionResponse { /// The ID of the ritual. pub ritual_id: u32, - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] ciphertext: Box<[u8]>, } diff --git a/nucypher-core/src/fleet_state.rs b/nucypher-core/src/fleet_state.rs index bd2f722b..8b608988 100644 --- a/nucypher-core/src/fleet_state.rs +++ b/nucypher-core/src/fleet_state.rs @@ -1,15 +1,15 @@ use core::fmt; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{ArrayLike, Hex}; use sha3::{digest::Update, Digest, Keccak256}; -use umbral_pre::serde_bytes; use crate::node_metadata::NodeMetadata; use crate::versioning::ProtocolObject; /// An identifier of the fleet state. #[derive(PartialEq, Eq, Debug, Clone, Copy, Serialize, Deserialize)] -pub struct FleetStateChecksum(#[serde(with = "serde_bytes::as_hex")] [u8; 32]); +pub struct FleetStateChecksum(#[serde(with = "ArrayLike::")] [u8; 32]); impl FleetStateChecksum { /// Creates a checksum from the given list of node metadata, and, possibly, diff --git a/nucypher-core/src/hrac.rs b/nucypher-core/src/hrac.rs index ff2f86d4..90526315 100644 --- a/nucypher-core/src/hrac.rs +++ b/nucypher-core/src/hrac.rs @@ -2,8 +2,9 @@ use core::fmt; use generic_array::{sequence::Split, typenum::U16, GenericArray}; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{ArrayLike, Hex}; use sha3::{digest::Update, Digest, Keccak256}; -use umbral_pre::{serde_bytes, PublicKey}; +use umbral_pre::PublicKey; /// "hashed resource access code". /// @@ -16,7 +17,7 @@ use umbral_pre::{serde_bytes, PublicKey}; /// Ursula does not, so we share it with her. #[allow(clippy::upper_case_acronyms)] #[derive(PartialEq, Eq, Debug, Copy, Clone, Serialize, Deserialize)] -pub struct HRAC(#[serde(with = "serde_bytes::as_hex")] [u8; HRAC::SIZE]); +pub struct HRAC(#[serde(with = "ArrayLike::")] [u8; HRAC::SIZE]); impl HRAC { /// The size of HRAC in bytes. diff --git a/nucypher-core/src/key_frag.rs b/nucypher-core/src/key_frag.rs index 2371ce8d..fcfce26e 100644 --- a/nucypher-core/src/key_frag.rs +++ b/nucypher-core/src/key_frag.rs @@ -4,9 +4,10 @@ use alloc::vec::Vec; use core::fmt; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{Base64, SliceLike}; use umbral_pre::{ - decrypt_original, encrypt, serde_bytes, Capsule, DecryptionError as UmbralDecryptionError, - EncryptionError, KeyFrag, PublicKey, SecretKey, Signature, Signer, VerifiedKeyFrag, + decrypt_original, encrypt, Capsule, DecryptionError as UmbralDecryptionError, EncryptionError, + KeyFrag, PublicKey, SecretKey, Signature, Signer, VerifiedKeyFrag, }; use crate::hrac::HRAC; @@ -98,7 +99,7 @@ impl fmt::Display for DecryptionError { #[derive(PartialEq, Debug, Clone, Serialize, Deserialize)] pub struct EncryptedKeyFrag { capsule: Capsule, - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] ciphertext: Box<[u8]>, } diff --git a/nucypher-core/src/lib.rs b/nucypher-core/src/lib.rs index 8d7870c1..995e1dad 100644 --- a/nucypher-core/src/lib.rs +++ b/nucypher-core/src/lib.rs @@ -19,7 +19,6 @@ mod node_metadata; mod reencryption; mod retrieval_kit; mod revocation_order; -mod secret_box; mod test_utils; mod threshold_message_kit; mod treasure_map; diff --git a/nucypher-core/src/message_kit.rs b/nucypher-core/src/message_kit.rs index f6d59761..29a8491c 100644 --- a/nucypher-core/src/message_kit.rs +++ b/nucypher-core/src/message_kit.rs @@ -2,9 +2,10 @@ use alloc::boxed::Box; use alloc::string::String; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{Base64, SliceLike}; use umbral_pre::{ - decrypt_original, decrypt_reencrypted, encrypt, serde_bytes, Capsule, DecryptionError, - EncryptionError, PublicKey, ReencryptionError, SecretKey, VerifiedCapsuleFrag, + decrypt_original, decrypt_reencrypted, encrypt, Capsule, DecryptionError, EncryptionError, + PublicKey, ReencryptionError, SecretKey, VerifiedCapsuleFrag, }; use crate::conditions::Conditions; @@ -17,7 +18,7 @@ use crate::versioning::{ pub struct MessageKit { /// Encapsulated symmetric key for this message. pub capsule: Capsule, - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] ciphertext: Box<[u8]>, /// Decryption conditions for this message. pub conditions: Option, diff --git a/nucypher-core/src/node_metadata.rs b/nucypher-core/src/node_metadata.rs index 4726b562..981d2ff4 100644 --- a/nucypher-core/src/node_metadata.rs +++ b/nucypher-core/src/node_metadata.rs @@ -5,9 +5,10 @@ use core::fmt; use ferveo::api::ValidatorPublicKey as FerveoPublicKey; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{Base64, SliceLike}; use serde_with::serde_as; use sha3::{digest::Update, Digest, Keccak256}; -use umbral_pre::{serde_bytes, PublicKey, RecoverableSignature, Signature, Signer}; +use umbral_pre::{PublicKey, RecoverableSignature, Signature, Signer}; use crate::address::Address; use crate::fleet_state::FleetStateChecksum; @@ -63,7 +64,7 @@ pub struct NodeMetadataPayload { /// Ferveo public key to use for DKG participation. pub ferveo_public_key: FerveoPublicKey, /// The node's SSL certificate (serialized in DER format). - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] pub certificate_der: Box<[u8]>, /// The hostname of the node's REST service. pub host: String, diff --git a/nucypher-core/src/secret_box.rs b/nucypher-core/src/secret_box.rs deleted file mode 100644 index 64135c14..00000000 --- a/nucypher-core/src/secret_box.rs +++ /dev/null @@ -1,92 +0,0 @@ -/* -This module implements a similar API to what the crate `secrecy` provides. -So, why our own implementation? - -First `secrecy::Secret` does not put its contents in a `Box`. -Using `Box` is a general recommendation of working with secret data, -because it prevents the compiler from putting it on stack, thus avoiding possible copies on borrow. - -Now, one could use `secrecy::Secret>`. -The problem here is that `secrecy::Secret` requires its type parameter to implement `Zeroize`. -This means that for a foreign type `F` (even if it does implement `Zeroize`) -we need to define `impl Zeroize for Box`. -But the compiler does not allow impls of foreign traits on foreign types. -This means that we also need to wrap `F` in a local type, impl `Zeroize` for the wrapper, -and then for the box of the wrapper. -This is too much boilerplate. - -Additionally, `secrecy::Secret>` means that after each `expose_secret()` -we will need to deal with opening the `Box` as well. -It's an inconvenience, albeit a minor one. - -The situation may improve in the future, and `secrecy` will actually become usable. -*/ - -use alloc::boxed::Box; - -use generic_array::{ArrayLength, GenericArray}; -use hkdf::Hkdf; -use sha2::Sha256; -use zeroize::{Zeroize, ZeroizeOnDrop}; - -/// A container for secret data. -/// Makes the usage of secret data explicit and easy to track, -/// prevents the secret data from being put on stack, -/// and zeroizes the contents on drop. -#[derive(Clone)] // No Debug derivation, to avoid exposing the secret data accidentally. -pub struct SecretBox(Box) -where - T: Zeroize + Clone; - -impl PartialEq> for SecretBox { - fn eq(&self, other: &Self) -> bool { - self.0 == other.0 - } -} - -impl SecretBox -where - T: Zeroize + Clone, -{ - pub(crate) fn new(val: T) -> Self { - Self(Box::new(val)) - } - - /// Returns an immutable reference to the secret data. - pub fn as_secret(&self) -> &T { - self.0.as_ref() - } - - /// Returns a mutable reference to the secret data. - pub fn as_mut_secret(&mut self) -> &mut T { - self.0.as_mut() - } -} - -impl Drop for SecretBox -where - T: Zeroize + Clone, -{ - fn drop(&mut self) { - self.0.zeroize() - } -} - -// Alternatively, it could be derived automatically, -// but there's some compilation problem in the macro. -// See https://github.com/RustCrypto/utils/issues/786 -// So we're asserting that this object is zeroized on drop, since there is a Drop impl just above. -impl ZeroizeOnDrop for SecretBox where T: Zeroize + Clone {} - -pub fn kdf>(seed: &[u8], info: Option<&[u8]>) -> SecretBox> { - let hk = Hkdf::::new(None, seed); - - let mut okm = SecretBox::new(GenericArray::::default()); - - let def_info = info.unwrap_or_default(); - - // We can only get an error here if `S` is too large, and it's known at compile-time. - hk.expand(def_info, okm.as_mut_secret()).unwrap(); - - okm -} diff --git a/nucypher-core/src/treasure_map.rs b/nucypher-core/src/treasure_map.rs index f6b4f0af..7a08816e 100644 --- a/nucypher-core/src/treasure_map.rs +++ b/nucypher-core/src/treasure_map.rs @@ -5,9 +5,10 @@ use alloc::string::String; use alloc::vec::Vec; use serde::{Deserialize, Serialize}; +use serde_encoded_bytes::{Base64, SliceLike}; use umbral_pre::{ - decrypt_original, encrypt, serde_bytes, Capsule, EncryptionError, PublicKey, SecretKey, - Signature, Signer, VerifiedKeyFrag, + decrypt_original, encrypt, Capsule, EncryptionError, PublicKey, SecretKey, Signature, Signer, + VerifiedKeyFrag, }; use crate::address::Address; @@ -185,7 +186,7 @@ impl<'a> ProtocolObject<'a> for AuthorizedTreasureMap {} #[derive(PartialEq, Debug, Clone, Serialize, Deserialize)] pub struct EncryptedTreasureMap { capsule: Capsule, - #[serde(with = "serde_bytes::as_base64")] + #[serde(with = "SliceLike::")] ciphertext: Box<[u8]>, }