diff --git a/CHANGELOG.md b/CHANGELOG.md index f2535650..4b406fd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,7 +16,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Removed `E2EThresholdDecryptionRequest` type and bindings. ([54]) - Modified `EncryptedThresholdDecryptionRequest`/`EncryptedThresholdDecryptionResponse` to use Curve 25519 keys instead of Umbral keys for encryption/decryption. ([#54]) - +- Modified `ThresholdDecryptionResponse`/`EncryptedThresholdDecryptionResponse` to include `ritual_id` member in struct. [#54]: https://github.com/nucypher/nucypher-core/pull/54 diff --git a/Cargo.lock b/Cargo.lock index 8d0fe5da..e1278e50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "aead" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c192eb8f11fc081b0fe4259ba5af04217d4e0faddd02417310a927911abd7c8" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ "crypto-common", "generic-array", @@ -23,6 +23,12 @@ dependencies = [ "version_check", ] +[[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" @@ -94,7 +100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" dependencies = [ "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -107,7 +113,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -143,7 +149,7 @@ checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -176,9 +182,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] name = "bincode" @@ -197,18 +203,18 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byteorder" @@ -230,9 +236,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chacha20" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fc89c7c5b9e7a02dfe45cd2367bae382f9ed31c61ca8debe5f827c420a2f08" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" dependencies = [ "cfg-if", "cipher", @@ -254,12 +260,12 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.24" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ + "android-tzdata", "iana-time-zone", - "num-integer", "num-traits", "serde", "winapi", @@ -267,9 +273,9 @@ dependencies = [ [[package]] name = "cipher" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1873270f8f7942c191139cb8a40fd228da6c3fd2fc376d7e92d47aa14aeb59e" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ "crypto-common", "inout", @@ -288,9 +294,9 @@ dependencies = [ [[package]] name = "const-oid" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cec318a675afcb6a1ea1d4340e2d377e56e47c266f28043ceccbf4412ddfdd3b" +checksum = "520fbf3c07483f94e3e3ca9d0cfd913d7718ef2483d2cfd91c0d9e91474ab913" [[package]] name = "core-foundation-sys" @@ -300,9 +306,9 @@ checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "3e4c1eaa2012c47becbbad2ab175484c2a84d1185b566fb2cc5b8707343dfe58" dependencies = [ "libc", ] @@ -376,7 +382,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -390,7 +396,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -401,7 +407,7 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core 0.13.4", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -412,7 +418,7 @@ checksum = "29a358ff9f12ec09c3e61fef9b5a9902623a695a46a917b07f269bff1445611a" dependencies = [ "darling_core 0.20.1", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -432,7 +438,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -443,14 +449,14 @@ checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", "crypto-common", @@ -527,7 +533,7 @@ dependencies = [ "derive_more", "ferveo-common-pre-release", "generic-array", - "getrandom 0.2.8", + "getrandom 0.2.9", "group-threshold-cryptography-pre-release", "hex", "itertools", @@ -592,9 +598,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" dependencies = [ "cfg-if", "js-sys", @@ -786,18 +792,18 @@ dependencies = [ [[package]] name = "keccak" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3afef3b6eff9ce9d8ff9b3601125eec7f0c8cbac7abd14f355d053fa56c98768" +checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" dependencies = [ "cpufeatures", ] [[package]] name = "libc" -version = "0.2.139" +version = "0.2.144" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" [[package]] name = "libm" @@ -817,12 +823,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de" [[package]] name = "measure_time" @@ -930,9 +933,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.17.1" +version = "1.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" +checksum = "9670a07f94779e00908f3e686eab508878ebb390ba6e604d3a284c00e8d0487b" [[package]] name = "opaque-debug" @@ -975,9 +978,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.11" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" [[package]] name = "platforms" @@ -1004,9 +1007,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro2" -version = "1.0.58" +version = "1.0.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa1fb82fc0c281dd9671101b66b771ebbe1eaf967b96ac8740dcba4b70005ca8" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" dependencies = [ "unicode-ident", ] @@ -1057,7 +1060,7 @@ dependencies = [ "proc-macro2", "pyo3-macros-backend", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -1068,14 +1071,14 @@ checksum = "97daff08a4c48320587b5224cc98d609e3c27b6d437315bd40b605c98eeb5918" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] name = "quote" -version = "1.0.27" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4f29d145265ec1c483c7c654450edde0bfe043d3938d6972630663356d9500" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" dependencies = [ "proc-macro2", ] @@ -1139,7 +1142,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.8", + "getrandom 0.2.9", ] [[package]] @@ -1265,7 +1268,7 @@ checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -1314,7 +1317,7 @@ dependencies = [ "darling 0.13.4", "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", ] [[package]] @@ -1326,7 +1329,7 @@ dependencies = [ "darling 0.20.1", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -1342,9 +1345,9 @@ dependencies = [ [[package]] name = "sha3" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ "digest", "keccak", @@ -1387,15 +1390,15 @@ dependencies = [ [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1404,27 +1407,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.16" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6f671d4b5ffdb8eadec19c0ae67fe2639df8684bd7bc4b83d986b8db549cf01" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "synstructure" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.107", - "unicode-xid", -] - [[package]] name = "target-lexicon" version = "0.12.7" @@ -1448,7 +1439,7 @@ checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", ] [[package]] @@ -1489,11 +1480,11 @@ name = "umbral-pre" version = "0.9.2" source = "git+https://github.com/piotr-roslaniec/rust-umbral.git?rev=90a5075bb3462421fa6db79463960cd8e10a7025#90a5075bb3462421fa6db79463960cd8e10a7025" dependencies = [ - "base64 0.21.0", + "base64 0.21.2", "chacha20poly1305", "derive_more", "generic-array", - "getrandom 0.2.8", + "getrandom 0.2.9", "hex", "hkdf", "js-sys", @@ -1511,15 +1502,9 @@ dependencies = [ [[package]] name = "unicode-ident" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" - -[[package]] -name = "unicode-xid" -version = "0.2.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" [[package]] name = "unindent" @@ -1529,9 +1514,9 @@ checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c" [[package]] name = "universal-hash" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ "crypto-common", "subtle", @@ -1576,7 +1561,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", "wasm-bindgen-shared", ] @@ -1589,7 +1574,7 @@ dependencies = [ "js-sys", "proc-macro2", "quote", - "syn 1.0.107", + "syn 1.0.109", "wasm-bindgen", ] @@ -1623,7 +1608,7 @@ checksum = "e128beba882dd1eb6200e1dc92ae6c5dbaa4311aa7bb211ca035779e5efc39f8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.16", + "syn 2.0.18", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1660,9 +1645,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.61" +version = "0.3.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +checksum = "3bdd9ef4e984da1187bf8110c5cf5b845fbc87a23602cdf912386a76fcd3a7c2" dependencies = [ "js-sys", "wasm-bindgen", @@ -1845,12 +1830,11 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.3.3" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44bf07cb3e50ea2003396695d58bf46bc9887a1f362260446fad6bc4e79bd36c" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 1.0.107", - "synstructure", + "syn 2.0.18", ] diff --git a/nucypher-core-python/nucypher_core/__init__.pyi b/nucypher-core-python/nucypher_core/__init__.pyi index 1aff8c6e..87e40ed0 100644 --- a/nucypher-core-python/nucypher_core/__init__.pyi +++ b/nucypher-core-python/nucypher_core/__init__.pyi @@ -450,11 +450,13 @@ class EncryptedThresholdDecryptionRequest: class ThresholdDecryptionResponse: - def __init__(self, decryption_share: bytes): + def __init__(self, ritual_id: int, decryption_share: bytes): ... decryption_share: bytes + ritual_id: int + def encrypt(self, shared_secret: RequestSharedSecret) -> EncryptedThresholdDecryptionResponse: ... @@ -468,6 +470,8 @@ class ThresholdDecryptionResponse: class EncryptedThresholdDecryptionResponse: + ritual_id: int + def decrypt( self, shared_secret: RequestSharedSecret diff --git a/nucypher-core-python/src/lib.rs b/nucypher-core-python/src/lib.rs index e8ca0dca..2684236a 100644 --- a/nucypher-core-python/src/lib.rs +++ b/nucypher-core-python/src/lib.rs @@ -644,7 +644,7 @@ pub struct RequestSharedSecret { } #[pyclass(module = "nucypher_core")] -#[derive(derive_more::From, derive_more::AsRef)] +#[derive(Clone, PartialEq, Eq, derive_more::From, derive_more::AsRef)] pub struct RequestPublicKey { backend: nucypher_core::RequestPublicKey, } @@ -660,6 +660,14 @@ impl RequestPublicKey { to_bytes(self) } + fn __richcmp__(&self, other: &Self, op: CompareOp) -> PyResult { + richcmp(self, other, op) + } + + fn __hash__(&self) -> PyResult { + hash("RequestPublicKey", self) + } + fn __str__(&self) -> PyResult { Ok(format!("{}", self.backend)) } @@ -680,7 +688,6 @@ impl RequestSecretKey { }) } - #[getter] pub fn public_key(&self) -> RequestPublicKey { RequestPublicKey { backend: self.backend.public_key(), @@ -832,10 +839,11 @@ impl ThresholdDecryptionRequest { shared_secret: &RequestSharedSecret, requester_public_key: &RequestPublicKey, ) -> EncryptedThresholdDecryptionRequest { + let encrypted_request = self + .backend + .encrypt(shared_secret.as_ref(), requester_public_key.as_ref()); EncryptedThresholdDecryptionRequest { - backend: self - .backend - .encrypt(shared_secret.as_ref(), requester_public_key.as_ref()), + backend: encrypted_request, } } @@ -866,8 +874,9 @@ impl EncryptedThresholdDecryptionRequest { self.backend.ritual_id } + #[getter] pub fn requester_public_key(&self) -> RequestPublicKey { - RequestPublicKey::from(self.backend.requester_public_key) + self.backend.requester_public_key.into() } pub fn decrypt( @@ -903,12 +912,17 @@ pub struct ThresholdDecryptionResponse { #[pymethods] impl ThresholdDecryptionResponse { #[new] - pub fn new(decryption_share: &[u8]) -> Self { + pub fn new(ritual_id: u16, decryption_share: &[u8]) -> Self { ThresholdDecryptionResponse { - backend: nucypher_core::ThresholdDecryptionResponse::new(decryption_share), + backend: nucypher_core::ThresholdDecryptionResponse::new(ritual_id, decryption_share), } } + #[getter] + pub fn ritual_id(&self) -> u16 { + self.backend.ritual_id + } + #[getter] pub fn decryption_share(&self) -> &[u8] { self.backend.decryption_share.as_ref() @@ -945,6 +959,11 @@ pub struct EncryptedThresholdDecryptionResponse { #[pymethods] impl EncryptedThresholdDecryptionResponse { + #[getter] + pub fn ritual_id(&self) -> u16 { + self.backend.ritual_id + } + pub fn decrypt( &self, shared_secret: &RequestSharedSecret, diff --git a/nucypher-core-wasm/src/lib.rs b/nucypher-core-wasm/src/lib.rs index 5956ab88..a896f27b 100644 --- a/nucypher-core-wasm/src/lib.rs +++ b/nucypher-core-wasm/src/lib.rs @@ -571,6 +571,10 @@ impl RequestPublicKey { pub fn to_string(&self) -> String { format!("{}", self.0) } + + pub fn equals(&self, other: &RequestPublicKey) -> bool { + self.0 == other.0 + } } #[wasm_bindgen] @@ -660,7 +664,7 @@ pub struct ThresholdDecryptionRequest(nucypher_core::ThresholdDecryptionRequest) impl ThresholdDecryptionRequest { #[wasm_bindgen(constructor)] pub fn new( - id: u16, + ritual_id: u16, variant: u8, ciphertext: &Ciphertext, conditions: &OptionConditions, @@ -676,7 +680,7 @@ impl ThresholdDecryptionRequest { }; Ok(Self(nucypher_core::ThresholdDecryptionRequest::new( - id, + ritual_id, ciphertext.as_ref(), typed_conditions.as_ref().map(|conditions| &conditions.0), typed_context.as_ref().map(|context| &context.0), @@ -776,12 +780,21 @@ pub struct ThresholdDecryptionResponse(nucypher_core::ThresholdDecryptionRespons #[wasm_bindgen] impl ThresholdDecryptionResponse { #[wasm_bindgen(constructor)] - pub fn new(decryption_share: &[u8]) -> Result { + pub fn new( + ritual_id: u16, + decryption_share: &[u8], + ) -> Result { Ok(Self(nucypher_core::ThresholdDecryptionResponse::new( + ritual_id, decryption_share, ))) } + #[wasm_bindgen(getter, js_name = ritualId)] + pub fn ritual_id(&self) -> u16 { + self.0.ritual_id + } + #[wasm_bindgen(getter, js_name = decryptionShare)] pub fn decryption_share(&self) -> Box<[u8]> { self.0.decryption_share.clone() @@ -817,6 +830,11 @@ pub struct EncryptedThresholdDecryptionResponse( #[wasm_bindgen] impl EncryptedThresholdDecryptionResponse { + #[wasm_bindgen(getter, js_name = ritualId)] + pub fn ritual_id(&self) -> u16 { + self.0.ritual_id + } + pub fn decrypt( &self, shared_secret: &RequestSharedSecret, diff --git a/nucypher-core-wasm/tests/wasm.rs b/nucypher-core-wasm/tests/wasm.rs index 36b18e9d..5d407bd9 100644 --- a/nucypher-core-wasm/tests/wasm.rs +++ b/nucypher-core-wasm/tests/wasm.rs @@ -691,10 +691,6 @@ fn threshold_decryption_request() { let service_public_key = service_secret.public_key(); let requester_secret = RequestSecretKey::random(); - let requester_public_key = requester_secret.public_key(); - - let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); - let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); let conditions = "{'some': 'condition'}"; let conditions_js: JsValue = Some(Conditions::new(conditions)).into(); @@ -714,8 +710,9 @@ fn threshold_decryption_request() { .unwrap(); // requester encrypts request to send to service - let requester_key = requester_secret.public_key(); - let encrypted_request = request.encrypt(&requester_shared_secret, &requester_key); + let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); + let requester_public_key = requester_secret.public_key(); + let encrypted_request = request.encrypt(&requester_shared_secret, &requester_public_key); // mimic encrypted request going over the wire let encrypted_request_bytes = encrypted_request.to_bytes(); @@ -726,10 +723,12 @@ fn threshold_decryption_request() { assert_eq!(encrypted_request_from_bytes.ritual_id(), ritual_id); assert_eq!( encrypted_request_from_bytes.requester_public_key(), - requester_key + requester_public_key ); // service decrypts request + let service_shared_secret = + service_secret.diffie_hellman(&encrypted_request_from_bytes.requester_public_key()); let decrypted_request = encrypted_request_from_bytes .decrypt(&service_shared_secret) .unwrap(); @@ -746,21 +745,21 @@ fn threshold_decryption_request() { #[wasm_bindgen_test] fn threshold_decryption_response() { + let ritual_id = 10; + let service_secret = RequestSecretKey::random(); - let service_public_key = service_secret.public_key(); let requester_secret = RequestSecretKey::random(); let requester_public_key = requester_secret.public_key(); - let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); - let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); - let decryption_share = b"The Tyranny of Merit"; - let response = ThresholdDecryptionResponse::new(decryption_share).unwrap(); + let response = ThresholdDecryptionResponse::new(ritual_id, decryption_share).unwrap(); // service encrypts response to send back + let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); let encrypted_response = response.encrypt(&service_shared_secret); + assert_eq!(encrypted_response.ritual_id(), ritual_id); // mimic serialization/deserialization over the wire let encrypted_response_bytes = encrypted_response.to_bytes(); @@ -768,10 +767,13 @@ fn threshold_decryption_response() { EncryptedThresholdDecryptionResponse::from_bytes(&encrypted_response_bytes).unwrap(); // requester decrypts response + let service_public_key = service_secret.public_key(); + let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); let decrypted_response = encrypted_response_from_bytes .decrypt(&requester_shared_secret) .unwrap(); assert_eq!(response, decrypted_response); + assert_eq!(response.ritual_id(), ritual_id); assert_eq!( response.decryption_share(), decrypted_response.decryption_share() diff --git a/nucypher-core/src/dkg.rs b/nucypher-core/src/dkg.rs index 37d253a4..d3f9fb98 100644 --- a/nucypher-core/src/dkg.rs +++ b/nucypher-core/src/dkg.rs @@ -518,6 +518,9 @@ impl<'a> ProtocolObject<'a> for EncryptedThresholdDecryptionRequest {} /// A response from Ursula with a derived decryption share. #[derive(PartialEq, Eq, Debug, Serialize, Deserialize, Clone)] pub struct ThresholdDecryptionResponse { + /// The ID of the ritual. + pub ritual_id: u16, + /// The decryption share to include in the response. #[serde(with = "serde_bytes::as_base64")] pub decryption_share: Box<[u8]>, @@ -525,8 +528,9 @@ pub struct ThresholdDecryptionResponse { impl ThresholdDecryptionResponse { /// Creates and a new decryption response. - pub fn new(decryption_share: &[u8]) -> Self { + pub fn new(ritual_id: u16, decryption_share: &[u8]) -> Self { ThresholdDecryptionResponse { + ritual_id, decryption_share: decryption_share.to_vec().into(), } } @@ -567,6 +571,9 @@ impl<'a> ProtocolObject<'a> for ThresholdDecryptionResponse {} /// An encrypted response from Ursula with a derived decryption share. #[derive(PartialEq, Debug, Clone, Serialize, Deserialize)] pub struct EncryptedThresholdDecryptionResponse { + /// The ID of the ritual. + pub ritual_id: u16, + #[serde(with = "serde_bytes::as_base64")] ciphertext: Box<[u8]>, } @@ -575,7 +582,10 @@ impl EncryptedThresholdDecryptionResponse { fn new(response: &ThresholdDecryptionResponse, shared_secret: &RequestSharedSecret) -> Self { let ciphertext = encrypt_with_shared_secret(shared_secret, &response.to_bytes()) .expect("encryption failed - out of memory?"); - Self { ciphertext } + Self { + ritual_id: response.ritual_id, + ciphertext, + } } /// Decrypts the decryption request @@ -716,14 +726,10 @@ mod tests { let ritual_id = 0; let service_secret = RequestSecretKey::random(); - let service_public_key = service_secret.public_key(); let requester_secret = RequestSecretKey::random(); let requester_public_key = requester_secret.public_key(); - let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); - let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); - let dkg_pk = DkgPublicKey::random(); let message = "The Tyranny of Merit".as_bytes().to_vec(); let aad = "my-add".as_bytes(); @@ -738,6 +744,8 @@ mod tests { ); // requester encrypts request to send to service + let service_public_key = service_secret.public_key(); + let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); let encrypted_request = request.encrypt(&requester_shared_secret, &requester_public_key); // mimic serialization/deserialization over the wire @@ -752,6 +760,8 @@ mod tests { ); // service decrypts request + let service_shared_secret = + service_secret.diffie_hellman(&encrypted_request_from_bytes.requester_public_key); let decrypted_request = encrypted_request_from_bytes .decrypt(&service_shared_secret) .unwrap(); @@ -767,21 +777,20 @@ mod tests { #[test] fn threshold_decryption_response() { - let service_secret = RequestSecretKey::random(); - let service_public_key = service_secret.public_key(); + let ritual_id = 5; + let service_secret = RequestSecretKey::random(); let requester_secret = RequestSecretKey::random(); - let requester_public_key = requester_secret.public_key(); - - let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); - let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); let decryption_share = b"The Tyranny of Merit"; - let response = ThresholdDecryptionResponse::new(decryption_share); + let response = ThresholdDecryptionResponse::new(ritual_id, decryption_share); // service encrypts response to send back + let requester_public_key = requester_secret.public_key(); + let service_shared_secret = service_secret.diffie_hellman(&requester_public_key); let encrypted_response = response.encrypt(&service_shared_secret); + assert_eq!(encrypted_response.ritual_id, ritual_id); // mimic serialization/deserialization over the wire let encrypted_response_bytes = encrypted_response.to_bytes(); @@ -789,10 +798,13 @@ mod tests { EncryptedThresholdDecryptionResponse::from_bytes(&encrypted_response_bytes).unwrap(); // requester decrypts response + let service_public_key = service_secret.public_key(); + let requester_shared_secret = requester_secret.diffie_hellman(&service_public_key); let decrypted_response = encrypted_response_from_bytes .decrypt(&requester_shared_secret) .unwrap(); assert_eq!(response, decrypted_response); + assert_eq!(response.ritual_id, ritual_id); assert_eq!( response.decryption_share, decrypted_response.decryption_share