From efafddbca9891956a7ad8a1533402458e200de51 Mon Sep 17 00:00:00 2001 From: Fritz Schmid Date: Wed, 15 Jun 2022 13:25:18 +0200 Subject: [PATCH] Init. --- .gitignore | 2 + Cargo.lock | 2177 ++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 37 + README.md | 29 + src/core.rs | 279 ++++++ src/cryptoservice.rs | 85 ++ src/lib.rs | 6 + src/proofs.rs | 97 ++ src/serializers.rs | 129 +++ src/shamir.rs | 145 +++ src/utils.rs | 186 ++++ 11 files changed, 3172 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 src/core.rs create mode 100644 src/cryptoservice.rs create mode 100644 src/lib.rs create mode 100644 src/proofs.rs create mode 100644 src/serializers.rs create mode 100644 src/shamir.rs create mode 100644 src/utils.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab2b470 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +target +.code diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..01104a6 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2177 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "async-stream" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +dependencies = [ + "async-stream-impl", + "futures-core", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "async-trait" +version = "0.1.51" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44318e776df68115a881de9a8fd1b9e53368d7a4a5ce4cc48517da3393233a5e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "atomic" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3410529e8288c463bedb5930f82833bc0c90e5d2fe639a56582a4d09220b281" +dependencies = [ + "autocfg", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi", + "libc", + "winapi", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "base-x" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4521f3e3d031370679b3b140beb36dfe4801b09ac77e30c61941f97df3ef28b" + +[[package]] +name = "base64" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" + +[[package]] +name = "bencher" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dfdb4953a096c551ce9ace855a604d702e6e62d77fac690575ae347571717f5" + +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + +[[package]] +name = "bit-vec" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0dc55f2d8a1a85650ac47858bb001b4c0dd73d79e3c455a842925e68d29cd3" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitvec" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f2c3b67785753567f75abebf8922c3feeb45b41c9c1c0923a8e411ddaecda6d" +dependencies = [ + "funty 1.2.0", + "radium 0.6.2", + "tap", + "wyz 0.4.0", +] + +[[package]] +name = "bitvec" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1489fcb93a5bb47da0462ca93ad252ad6af2145cce58d10d46a83931ba9f016b" +dependencies = [ + "funty 2.0.0", + "radium 0.7.0", + "tap", + "wyz 0.5.0", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bls12_381" +version = "0.7.0" +source = "git+https://github.com/Kradxn/bls12_381#82ccd475d5abb6dd10717a70220a2be48bcdeb42" +dependencies = [ + "ff", + "group", + "pairing", + "rand_core", + "subtle", +] + +[[package]] +name = "bumpalo" +version = "3.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9df67f7bf9ef8498769f994239c45613ef0c5899415fb58e9add412d2c1a538" + +[[package]] +name = "byteorder" +version = "1.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" + +[[package]] +name = "bytes" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" + +[[package]] +name = "cc" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "const_fn" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92cfa0fd5690b3cf8c1ef2cabbd9b7ef22fa53cf5e1f92b05103f6d5d1cf6e7" + +[[package]] +name = "cookie" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f1c7727e460397e56abc4bddc1d49e07a1ad78fc98eb2e1c8f032a58a2f80d" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" + +[[package]] +name = "cpufeatures" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +dependencies = [ + "cfg-if", + "crossbeam-utils", + "lazy_static", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +dependencies = [ + "cfg-if", + "lazy_static", +] + +[[package]] +name = "darling" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[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", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" +dependencies = [ + "darling_core", + "quote", + "syn", +] + +[[package]] +name = "devise" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50c7580b072f1c8476148f16e0a0d5dedddab787da98d86c5082c5e9ed8ab595" +dependencies = [ + "devise_codegen", + "devise_core", +] + +[[package]] +name = "devise_codegen" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123c73e7a6e51b05c75fe1a1b2f4e241399ea5740ed810b0e3e6cacd9db5e7b2" +dependencies = [ + "devise_core", + "quote", +] + +[[package]] +name = "devise_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841ef46f4787d9097405cac4e70fb8644fc037b526e8c14054247c0263c400d0" +dependencies = [ + "bitflags", + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "discard" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d0f5754cb6769937f4501cc0e67f4f4483c8d2c3e1e922ee9edbe4ab4c7c0" + +[[package]] +name = "dyn-clone" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e50f3adc76d6a43f5ed73b698a87d0760ca74617f60f7c3b879003536fdd28" + +[[package]] +name = "either" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" + +[[package]] +name = "encoding_rs" +version = "0.8.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ff" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df689201f395c6b90dfe87127685f8dbfc083a5e779e613575d8bd7314300c3e" +dependencies = [ + "bitvec 1.0.0", + "rand_core", + "subtle", +] + +[[package]] +name = "figment" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790b4292c72618abbab50f787a477014fe15634f96291de45672ce46afe122df" +dependencies = [ + "atomic", + "pear", + "serde", + "toml", + "uncased", + "version_check", +] + +[[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.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +dependencies = [ + "matches", + "percent-encoding", +] + +[[package]] +name = "funty" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847abb9cb65d566acd5942e94aea9c8f547ad02c98e1649326fc0e8910b8b1e" + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a12aa0eb539080d55c3f2d45a67c3b58b6b0773c1a3ca2dfec66d58c97fd66ca" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da6ba8c3bb3c165d3c7319fc1cc8304facf1fb8db99c5de877183c08a273888" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d1c26957f23603395cd326b0ffe64124b818f4449552f960d815cfba83a53d" + +[[package]] +name = "futures-executor" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45025be030969d763025784f7f355043dc6bc74093e4ecc5000ca4dc50d8745c" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "522de2a0fe3e380f1bc577ba0474108faf3f6b18321dbf60b3b9c39a75073377" + +[[package]] +name = "futures-macro" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18e4a4b95cea4b4ccbcf1c5675ca7c4ee4e9e75eb79944d07defde18068f79bb" +dependencies = [ + "autocfg", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "futures-sink" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36ea153c13024fe480590b3e3d4cad89a0cfacecc24577b68f86c6ced9c2bc11" + +[[package]] +name = "futures-task" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d3d00f4eddb73e498a54394f228cd55853bdf059259e8e7bc6e69d408892e99" + +[[package]] +name = "futures-util" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36568465210a3a6ee45e1f165136d68671471a501e632e9a98d96872222b5481" +dependencies = [ + "autocfg", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "proc-macro-hack", + "proc-macro-nested", + "slab", +] + +[[package]] +name = "generator" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d9279ca822891c1a4dae06d185612cf8fc6acfe5dff37781b41297811b12ee" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "winapi", +] + +[[package]] +name = "generic-array" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "group" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7391856def869c1c81063a03457c676fbcd419709c3dfb33d8d319de484b154d" +dependencies = [ + "byteorder", + "ff", + "rand_core", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c06815895acec637cd6ed6e9662c935b866d20a106f8361892893a7d9234964" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "http" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +dependencies = [ + "bytes", + "fnv", + "itoa 0.4.8", +] + +[[package]] +name = "http-body" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "399c583b2979440c60be0821a6199eca73bc3c8dcd9d070d75ac726e2c6186e5" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" + +[[package]] +name = "httpdate" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440" + +[[package]] +name = "hyper" +version = "0.14.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15d1cfb9e4f68655fa04c01f59edb405b6074a0f7118ea881e5026e4a1cd8593" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 0.4.8", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +dependencies = [ + "autocfg", + "hashbrown", + "serde", +] + +[[package]] +name = "inlinable_string" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3094308123a0e9fd59659ce45e22de9f53fc1d2ac6e1feb9fef988e4f76cad77" + +[[package]] +name = "instant" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b" + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d" + +[[package]] +name = "js-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8f7255a17a627354f321ef0055d63b898c6fb27eff628af4d1b66b7331edf6" + +[[package]] +name = "lock_api" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "loom" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2111607c723d7857e0d8299d5ce7a0bf4b844d3e44f8de136b13da513eaf8fc4" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", +] + +[[package]] +name = "matches" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" + +[[package]] +name = "memchr" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" + +[[package]] +name = "memoffset" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" + +[[package]] +name = "mio" +version = "0.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16" +dependencies = [ + "libc", + "log", + "miow", + "ntapi", + "winapi", +] + +[[package]] +name = "miow" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +dependencies = [ + "winapi", +] + +[[package]] +name = "multer" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "408327e2999b839cd1af003fc01b2019a6c10a1361769542203f6fedc5179680" +dependencies = [ + "bytes", + "encoding_rs", + "futures-util", + "http", + "httparse", + "log", + "mime", + "spin", + "tokio", + "tokio-util", + "twoway", + "version_check", +] + +[[package]] +name = "native-tls" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ntapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +dependencies = [ + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "okapi" +version = "0.7.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce66b6366e049880a35c378123fddb630b1a1a3c37fa1ca70caaf4a09f6e2893" +dependencies = [ + "log", + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "once_cell" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "openssl" +version = "0.10.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" +dependencies = [ + "autocfg", + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "ophe" +version = "0.1.0" +dependencies = [ + "base64", + "bencher", + "bit-vec", + "bitvec 0.22.0", + "bls12_381", + "group", + "lazy_static", + "rand", + "rand_core", + "rayon", + "reqwest", + "rocket", + "rocket_okapi", + "serde", + "serde_json", + "serde_with", + "sha2", + "time", +] + +[[package]] +name = "pairing" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135590d8bdba2b31346f9cd1fb2a912329f5135e832a4f422942eb6ead8b6b3b" +dependencies = [ + "group", +] + +[[package]] +name = "parking_lot" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +dependencies = [ + "instant", + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +dependencies = [ + "cfg-if", + "instant", + "libc", + "redox_syscall", + "smallvec", + "winapi", +] + +[[package]] +name = "pear" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15e44241c5e4c868e3eaa78b7c1848cadd6344ed4f54d029832d32b415a58702" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82a5ca643c2303ecb740d506539deba189e16f2754040a42901cd8105d0282d0" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn", +] + +[[package]] +name = "percent-encoding" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" + +[[package]] +name = "pin-project-lite" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" + +[[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.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" + +[[package]] +name = "proc-macro-hack" +version = "0.5.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5" + +[[package]] +name = "proc-macro-nested" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086" + +[[package]] +name = "proc-macro2" +version = "1.0.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9f5105d4fdaab20335ca9565e106a5d9b82b6219b5ba735731124ac6711d23d" +dependencies = [ + "unicode-xid", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "version_check", + "yansi", +] + +[[package]] +name = "quote" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", + "rand_hc", +] + +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_hc" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] + +[[package]] +name = "rayon" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06aca804d41dbc8ba42dfd964f0d01334eceb64314b9ecf7c5fad5188a06d90" +dependencies = [ + "autocfg", + "crossbeam-deque", + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d78120e2c850279833f1dd3582f730c4ab53ed95aeaaaa862a2a5c71b1656d8e" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "lazy_static", + "num_cpus", +] + +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "ref-cast" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300f2a835d808734ee295d45007adacb9ebb29dd3ae2424acfa17930cae541da" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c38e3aecd2b21cb3959637b883bb3714bc7e43f0268b9a29d3743ee3e55cdd2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "remove_dir_all" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +dependencies = [ + "winapi", +] + +[[package]] +name = "reqwest" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c4e0a76dc12a116108933f6301b95e83634e0c47b0afbed6abbaa0601e99258" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "lazy_static", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rocket" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a71c18c42a0eb15bf3816831caf0dad11e7966f2a41aaf486a701979c4dd1f2" +dependencies = [ + "async-stream", + "async-trait", + "atomic", + "atty", + "binascii", + "bytes", + "either", + "figment", + "futures", + "indexmap", + "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_codegen" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66f5fa462f7eb958bba8710c17c5d774bbbd59809fa76fb1957af7e545aea8bb" +dependencies = [ + "devise", + "glob", + "indexmap", + "proc-macro2", + "quote", + "rocket_http", + "syn", + "unicode-xid", +] + +[[package]] +name = "rocket_http" +version = "0.5.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23c8b7d512d2fcac2316ebe590cde67573844b99e6cc9ee0f53375fa16e25ebd" +dependencies = [ + "cookie", + "either", + "http", + "hyper", + "indexmap", + "log", + "memchr", + "mime", + "parking_lot", + "pear", + "percent-encoding", + "pin-project-lite", + "ref-cast", + "serde", + "smallvec", + "stable-pattern", + "state", + "time", + "tokio", + "uncased", +] + +[[package]] +name = "rocket_okapi" +version = "0.8.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0025aa04994af8cd8e1fcdd5a73579a395c941ae090ecb0a39b41cca7e237a20" +dependencies = [ + "either", + "log", + "okapi", + "rocket", + "rocket_okapi_codegen", + "schemars", + "serde", + "serde_json", +] + +[[package]] +name = "rocket_okapi_codegen" +version = "0.8.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc114779fc27afb78179233e966f469e47fd7a98dc15181cff2574cdddb65612" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "rocket_http", + "syn", +] + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustversion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61b3909d758bb75c79f23d4736fac9433868679d3ad2ea7a61e3c25cfda9a088" + +[[package]] +name = "ryu" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" + +[[package]] +name = "schannel" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +dependencies = [ + "lazy_static", + "windows-sys", +] + +[[package]] +name = "schemars" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1847b767a3d62d95cbf3d8a9f0e421cf57a0d8aa4f411d4b16525afb0284d4ed" +dependencies = [ + "dyn-clone", + "indexmap", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af4d7e1b012cb3d9129567661a63755ea4b8a7386d339dc945ae187e403c6743" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn", +] + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.130" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_derive_internals" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.68" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8" +dependencies = [ + "itoa 0.4.8", + "ryu", + "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 1.0.2", + "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", +] + +[[package]] +name = "serde_with_macros" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "sha1" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" + +[[package]] +name = "sha2" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +dependencies = [ + "block-buffer", + "cfg-if", + "cpufeatures", + "digest", + "opaque-debug", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590" + +[[package]] +name = "smallvec" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" + +[[package]] +name = "socket2" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511254be0c5bcf062b019a6c89c01a664aa359ded62f78aa72c6fc137c0590e5" + +[[package]] +name = "stable-pattern" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045" +dependencies = [ + "memchr", +] + +[[package]] +name = "standback" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e113fb6f3de07a243d434a56ec6f186dfd51cb08448239fe7bcae73f87ff28ff" +dependencies = [ + "version_check", +] + +[[package]] +name = "state" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cf4f5369e6d3044b5e365c9690f451516ac8f0954084622b49ea3fde2f6de5" +dependencies = [ + "loom", +] + +[[package]] +name = "stdweb" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d022496b16281348b52d0e30ae99e01a73d737b2f45d38fed4edf79f9325a1d5" +dependencies = [ + "discard", + "rustc_version", + "stdweb-derive", + "stdweb-internal-macros", + "stdweb-internal-runtime", + "wasm-bindgen", +] + +[[package]] +name = "stdweb-derive" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c87a60a40fccc84bef0652345bbbbbe20a605bf5d0ce81719fc476f5c03b50ef" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "serde_derive", + "syn", +] + +[[package]] +name = "stdweb-internal-macros" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fa5ff6ad0d98d1ffa8cb115892b6e69d67799f6763e162a1c9db421dc22e11" +dependencies = [ + "base-x", + "proc-macro2", + "quote", + "serde", + "serde_derive", + "serde_json", + "sha1", + "syn", +] + +[[package]] +name = "stdweb-internal-runtime" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213701ba3370744dcd1a12960caa4843b3d68b4d1c0a5d575e0d65b2ee9d16c0" + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "subtle" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "343f3f510c2915908f155e94f17220b19ccfacf2a64a2a5d8004f2c3e311e7fd" + +[[package]] +name = "syn" +version = "1.0.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5239bc68e0fef57495900cfea4e8dc75596d9a319d7e16b1e0a440d24e6fe0a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +dependencies = [ + "cfg-if", + "libc", + "rand", + "redox_syscall", + "remove_dir_all", + "winapi", +] + +[[package]] +name = "time" +version = "0.2.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4752a97f8eebd6854ff91f1c1824cd6160626ac4bd44287f7f4ea2035a02a242" +dependencies = [ + "const_fn", + "libc", + "standback", + "stdweb", + "time-macros", + "version_check", + "winapi", +] + +[[package]] +name = "time-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "957e9c6e26f12cb6d0dd7fc776bb67a706312e7299aed74c8dd5b17ebb27e2f1" +dependencies = [ + "proc-macro-hack", + "time-macros-impl", +] + +[[package]] +name = "time-macros-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c141a1b43194f3f56a1411225df8646c55781d5f26db825b3d98507eb482f" +dependencies = [ + "proc-macro-hack", + "proc-macro2", + "quote", + "standback", + "syn", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" + +[[package]] +name = "tokio" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc" +dependencies = [ + "autocfg", + "bytes", + "libc", + "memchr", + "mio", + "num_cpus", + "once_cell", + "pin-project-lite", + "signal-hook-registry", + "tokio-macros", + "winapi", +] + +[[package]] +name = "tokio-macros" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "154794c8f499c2619acd19e839294703e9e32e7630ef5f46ea80d4ef0fbee5eb" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2f3f698253f03119ac0102beaa64f67a67e08074d03a22d18784104543727f" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "log", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +dependencies = [ + "serde", +] + +[[package]] +name = "tower-service" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" + +[[package]] +name = "tracing" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "try-lock" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" + +[[package]] +name = "twoway" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c57ffb460d7c24cd6eda43694110189030a3d1dfe418416d9468fd1c1d290b47" +dependencies = [ + "memchr", + "unchecked-index", +] + +[[package]] +name = "typenum" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" + +[[package]] +name = "ubyte" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42756bb9e708855de2f8a98195643dff31a97f0485d90d8467b39dc24be9e8fe" +dependencies = [ + "serde", +] + +[[package]] +name = "uncased" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5baeed7327e25054889b9bd4f975f32e5f4c5d434042d59ab6cd4142c0a76ed0" +dependencies = [ + "serde", + "version_check", +] + +[[package]] +name = "unchecked-index" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" + +[[package]] +name = "unicode-bidi" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" + +[[package]] +name = "unicode-normalization" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-xid" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" + +[[package]] +name = "url" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +dependencies = [ + "form_urlencoded", + "idna", + "matches", + "percent-encoding", +] + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "wasm-bindgen" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" +dependencies = [ + "bumpalo", + "lazy_static", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" + +[[package]] +name = "web-sys" +version = "0.3.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +dependencies = [ + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" + +[[package]] +name = "windows_i686_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" + +[[package]] +name = "windows_i686_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.36.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" + +[[package]] +name = "winreg" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +dependencies = [ + "winapi", +] + +[[package]] +name = "wyz" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "129e027ad65ce1453680623c3fb5163cbf7107bfe1aa32257e7d0e63f9ced188" +dependencies = [ + "tap", +] + +[[package]] +name = "wyz" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b31594f29d27036c383b53b59ed3476874d518f0efb151b27a4c275141390e" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..03164ce --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,37 @@ +[package] +name = "ophe" +version = "0.1.0" +authors = ["fritz "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +bls12_381 = {features =[ "groups","pairings","alloc"],git="https://github.com/Kradxn/bls12_381"} +#bls12_381 = "*" +rand = "*" +bencher = "*" +bit-vec = "*" +lazy_static = "*" +group = "0.12.0" +rand_core= {version = "0.6", features = ["getrandom"]} +bitvec = "=0.22.0" +sha2 = "*" +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +time = "*" +rocket = "0.5.0-rc.1" +rayon = "*" +base64 = "*" +serde_with = "*" +reqwest ={ version = "*", features = ["json"]} + +rocket_okapi = { version = "0.8.0-alpha-1", features = ["swagger", "rapidoc"] } + +[[bin]] +name = "cryptoservice" +path = "src/cryptoservice.rs" + +[[bin]] +name = "ophe" +path = "src/ophe.rs" \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..62138f6 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# OPHE Test Implementation + + + +## Requirements +Rust 1.59.0+ stable + + +# Running the cryptoservice +```ROCKET_PORT=9999 cargo run --release --bin cryptoservice``` + +# Running the webclient +A rudimentary webclient is available. Currently providing a custom message(for now 32 bytes of value 0 are encrypted) for encryption is not possbile. + +```cargo run --release --bin ophe``` +Go to http://localhost:8000/rapidoc to checkout the documentation. +# Benchmarking +Benchmark can be run by ```cargo test --release -- --nocapture``` + +Of course it should be done using --release otherwise performance optimization do not run + +Every performance test can be edited to specify the number of threads used by changing 1 in +``` rayon::ThreadPoolBuilder::new().num_threads(1).build_global().unwrap(); ``` to the number of threads you want to use (Meaning the mulitple cpu cores can be used) + + +Tested with Rust 1.59.0 stable + +## Todo +- Split core functionality from the webclient code into 2 seperate crates \ No newline at end of file diff --git a/src/core.rs b/src/core.rs new file mode 100644 index 0000000..2c61ca7 --- /dev/null +++ b/src/core.rs @@ -0,0 +1,279 @@ +use bls12_381::*; +use crate::utils; +use crate::proofs; +use std::collections::HashMap; +use std::time::Instant; +use rayon::prelude::*; +use serde::{Deserialize, Serialize}; +use rocket_okapi::okapi::schemars; +use rocket_okapi::okapi::schemars::JsonSchema; + +use crate::serializers; +use serde_with::serde_as; + +#[serde_as] +#[derive(Deserialize, Serialize,JsonSchema)] +pub struct PublicParameters{ + #[serde_as(as = "Vec")] + #[schemars(with = "Vec::")] + pub space: Vec, + pub k: usize, + #[serde_as(as = "serializers::SerializeGt")] + #[schemars(with = "String")] + pub gt_gen: Gt, + #[serde_as(as = "Vec")] + #[schemars(with = "Vec::")] + pub ratelimiter_public_keys: Vec +} + + +pub struct ServerState{ + r: Scalar, + pub n: Scalar, + p: G2Projective +} + +impl ServerState { + fn new(username: &String, password: &String) -> ServerState{ + let r = utils::random_scalar(); + let n = utils::random_scalar(); + + let username = username.to_owned(); + let to_be_hashed = username + password; + let h2 = G2Affine::generator() * utils::hash_string_to_scalar(to_be_hashed); + let p = h2 * r; + ServerState{r,n,p} + } + + fn from_nonce(username: &String, password: &String, nonce: &Scalar) -> ServerState{ + let r = utils::random_scalar(); + + let username = username.to_owned(); + let to_be_hashed = username + password; + let h2 = G2Affine::generator() * utils::hash_string_to_scalar(to_be_hashed); + let p = h2 * r; + ServerState{r,n: nonce.clone(),p} + } +} + +#[serde_as] +#[derive(Serialize, Deserialize, JsonSchema)] +pub struct RatelimiterRequest{ + #[serde_as(as = "serializers::SerializeScalar")] + #[schemars(with = "String")] + n: Scalar, + #[serde_as(as = "serializers::SerializeG2")] + #[schemars(with = "String")] + p: G2Projective, +} + +#[serde_as] +#[derive(Serialize, Deserialize, JsonSchema)] +pub struct RatelimiterResponse{ + elements: Vec +} + +#[serde_as] +#[derive(Serialize, Deserialize, JsonSchema)] +pub struct RatelimiterResponseElement{ + proof: proofs::SameDLogProof, + #[serde_as(as = "serializers::SerializeGt")] + #[schemars(with = "String")] + p: Gt +} + +pub fn phe_init(username: &String, password: &String) -> (ServerState,RatelimiterRequest){ + let ss = ServerState::new(username,password); + let rr = RatelimiterRequest{n:ss.n,p:ss.p}; + + return (ss,rr) +} + +pub fn phe_init_decrypt(username: &String, password: &String,n: &Scalar) -> (ServerState,RatelimiterRequest){ + let ss = ServerState::from_nonce(username,password,n); + let rr = RatelimiterRequest{n:ss.n,p:ss.p}; + + return (ss,rr) +} + +pub fn phe_ratelimiter(private_keys: &Vec, request: &RatelimiterRequest,pp: &PublicParameters) -> RatelimiterResponse { + let u = pairing(&G1Affine::from(G1Affine::generator() * request.n) , &G2Affine::from(request.p)); + let results = private_keys.par_iter().zip(&pp.ratelimiter_public_keys).map(|(private_key,public_key)| { + let value = u*private_key; + let proof = proofs::SameDLogProofPublic{g:pp.gt_gen,h:u,y1:*public_key,y2:value}.proof(&private_key); + RatelimiterResponseElement{proof,p:value} + }).collect::>(); + RatelimiterResponse{elements:results} +} + +pub fn phe_enc_finish(msg: &Vec,pp: &PublicParameters,response: &RatelimiterResponse,ss:&ServerState) -> Result,String>{ + let split_message = utils::split_message_into_space(msg,&pp.space,pp.k); + assert_eq!(split_message.len(),pp.ratelimiter_public_keys.len(),"key length {} and msglength {} do not match",pp.ratelimiter_public_keys.len(),split_message.len()); + let u = pairing(&G1Affine::from(G1Affine::generator() * ss.n) , &G2Affine::from(ss.p)); + let r_inv = ss.r.invert().unwrap(); + let values = pp.ratelimiter_public_keys.par_iter().zip(&response.elements).zip(&split_message).map(|((public_key,x),msg)|{ + if !x.proof.verify(&proofs::SameDLogProofPublic{g:pp.gt_gen,h:u,y1:*public_key,y2:x.p}){ + Err("Invalid Proof".to_string()) + }else{ + Ok(x.p * r_inv * msg) + } + }).collect::,String>>(); + + values +} + +pub fn phe_dec_finish_simple(ciphertext: &Vec,pp: &PublicParameters,response: &RatelimiterResponse,ss:&ServerState) -> Result,String>{ + let u = pairing(&G1Affine::from(G1Affine::generator() * ss.n) , &G2Affine::from(ss.p)); + let r_inv = ss.r.invert().unwrap(); + + let values = pp.ratelimiter_public_keys.par_iter().zip(&response.elements).map(|(public_key,x)|{ + if !x.proof.verify(&proofs::SameDLogProofPublic{g:pp.gt_gen,h:u,y1:*public_key,y2:x.p}){ + Err("Invalid Proof".to_string()) + }else{ + Ok(x.p * r_inv) + } + }).collect::,String>>()?; + + return Ok(utils::solve_dlog(&values, ciphertext, &pp.space, pp.k)?); +} + +fn phe_dec_finish_preparedspace(pp: &PublicParameters,response: &RatelimiterResponse,ss:&ServerState,preparedspace: &Vec>) -> Result,String>{ + let u = pairing(&G1Affine::from(G1Affine::generator() * ss.n) , &G2Affine::from(ss.p)); + let r_inv = ss.r.invert().unwrap(); + + let values = pp.ratelimiter_public_keys.par_iter().zip(&response.elements).map(|(public_key,x)|{ + if !x.proof.verify(&proofs::SameDLogProofPublic{g:pp.gt_gen,h:u,y1:*public_key,y2:x.p}){ + Err("Invalid Proof".to_string()) + }else{ + Ok(x.p * r_inv) + } + }).collect::,String>>()?; + + return Ok(utils::find_in_precomputed_space(&values, &pp.space,preparedspace, pp.k)); +} + + +#[test] +fn test_core(){ + rayon::ThreadPoolBuilder::new().num_threads(1).build_global().unwrap(); + test_core_k(32,2); + //test_core_k(32,4); + //test_core_k(32,8); +} + +#[test] +fn test_speed_operations() { + let mut s1 = utils::random_scalar(); + let s2 = utils::random_scalar(); + let g11 = G1Affine::from(G1Affine::generator() * s1); + let g11p = G1Affine::generator() * s1; + let g12 = G1Affine::from(G1Affine::generator() * s2); + let g12p = G1Affine::generator() * s2; + let g21 = G2Affine::from(G2Affine::generator() * s1); + let g21p = G2Affine::generator() * s1; + let g22 = G2Affine::from(G2Affine::generator() * s2); + let g22p = G2Affine::generator() * s2; + let mut gt1 = pairing(&g11,&g21); + let gt2 = pairing(&g12,&g22); + let mut g1res = &g11p + &g12p; + let mut g2res = &g21p + &g22p; + let mut gtres = >1 + >2; + + let start = Instant::now(); + for _i in 0..100000{ + s1 = s1 * s2; + } + println!(" {:.2?} scalar *",start.elapsed()/100000); + + let start = Instant::now(); + for _i in 0..100000{ + s1 = s1 + s2; + } + println!(" {:.2?} scalar +",start.elapsed()/100000); + + let start = Instant::now(); + for _i in 0..1000{ + gt1 = pairing(&g11,&g21); + } + println!(" {:.2?} pairing ",start.elapsed()/1000); + + + let start = Instant::now(); + for _i in 0..1000000{ + g1res = &g1res + &g12p; + } + println!(" {:.2?} g1 + ",start.elapsed()/1000000); + + + let start = Instant::now(); + for _i in 0..1000000{ + g2res = &g2res + &g22p; + } + println!(" {:.2?} g2 + ",start.elapsed()/1000000); + + let start = Instant::now(); + for _i in 0..1000000{ + gtres = >res + >2; + } + println!(" {:.2?} gt + ",start.elapsed()/1000000); + + + let start = Instant::now(); + for _i in 0..10000{ + g1res = &g1res * s1; + } + println!(" {:.2?} g1 exp ",start.elapsed()/10000); + + + let start = Instant::now(); + for _i in 0..1000{ + g2res = &g2res * s1; + } + println!(" {:.2?} g2 exp ",start.elapsed()/1000); + + let start = Instant::now(); + for _i in 0..1000{ + gtres = >res * s1; + } + println!(" {:.2?} gt exp ",start.elapsed()/1000); +} + + + +fn test_core_k(bytes:usize, k:usize) { + + let keysize = bytes*8/k; //in bytes + let msg = (0..keysize/8*k).map(|x|(255*x/(keysize/8*k-1)) as u8).collect::>(); + let generator = utils::random_gt(); + let keys = (0..keysize).map(|_|utils::random_scalar()).collect::>(); + let public_keys = keys.iter().map(|x|generator*x).collect::>(); + let space = utils::prepare_messages_to_space(k); + let pp = PublicParameters{space, ratelimiter_public_keys:public_keys,gt_gen:generator,k}; + + + let start = Instant::now(); + let (ss,request) = phe_init(&"test".to_string(),&"test".to_string()); + println!("k: {} {:.2?} phe_init", k,start.elapsed()); + let start = Instant::now(); + let response = phe_ratelimiter(&keys,&request,&pp); + println!("k: {} {:.2?} phe_ratelimiter", k,start.elapsed()); + let start = Instant::now(); + let ciphertext = phe_enc_finish(&msg,&pp,&response,&ss).unwrap(); + println!("k: {} {:.2?} phe_enc_finish", k,start.elapsed()); + + let start = Instant::now(); + let expected = phe_dec_finish_simple(&ciphertext,&pp,&response,&ss).unwrap(); + println!("k: {} {:.2?} phe_dec_finish_simple", k,start.elapsed()); + assert_eq!(expected,msg); + + let start = Instant::now(); + let prepared_space = ciphertext.iter().map(|x|utils::prepare_messages_to_precomputed_space(&pp.space, x)).collect::>(); + println!("k: {} {:.2?} prepare_messages_to_precomputed_space", k,start.elapsed()); + + let start = Instant::now(); + + let expected = phe_dec_finish_preparedspace(&pp, &response, &ss, &prepared_space).unwrap(); + println!("k: {} {:.2?} phe_dec_finish_preparedspace", k,start.elapsed()); + assert_eq!(expected,msg); + +} \ No newline at end of file diff --git a/src/cryptoservice.rs b/src/cryptoservice.rs new file mode 100644 index 0000000..afddfdb --- /dev/null +++ b/src/cryptoservice.rs @@ -0,0 +1,85 @@ + +#[macro_use] extern crate rocket; +extern crate bls12_381; +extern crate rand; + +use rocket_okapi::settings::UrlObject; +use rocket_okapi::{openapi, openapi_get_routes, rapidoc::*, swagger_ui::*}; +use rocket::serde::json::Json; +use rocket::Request; + +use ophe::core::{RatelimiterRequest,RatelimiterResponse}; +use ophe::core; +use ophe::utils; +use rocket::State; +use bls12_381::Scalar; + + + +fn make_public_parameters() -> (Vec,core::PublicParameters){ + let bytes = 32; + let k = 2; + let keysize = bytes*8/k; + let generator = utils::random_gt(); + let keys = (0..keysize).map(|_|utils::random_scalar()).collect::>(); + let public_keys = keys.iter().map(|x|generator*x).collect::>(); + let space = utils::prepare_messages_to_space(k); + + (keys,core::PublicParameters{space, ratelimiter_public_keys:public_keys,gt_gen:generator,k}) +} + + +#[rocket::main] +async fn main() { + let (keys,pp) = make_public_parameters(); + + let launch_result = rocket::build() + .manage(pp) + .manage(keys) + .mount("/", openapi_get_routes![phe_help,get_public_parameters]) + .mount( + "/swagger-ui/", + make_swagger_ui(&SwaggerUIConfig { + url: "../openapi.json".to_owned(), + ..Default::default() + }), + ) .mount( + "/rapidoc/", + make_rapidoc(&RapiDocConfig { + general: GeneralConfig { + spec_urls: vec![UrlObject::new("General", "../openapi.json")], + ..Default::default() + }, + hide_show: HideShowConfig { + allow_spec_url_load: false, + allow_spec_file_load: false, + ..Default::default() + }, + ..Default::default() + }), + ) + .register("/",catchers![serialize_failed]) + .launch() + .await; + match launch_result { + Ok(_) => println!("Rocket shut down gracefully."), + Err(err) => println!("Rocket had an error: {}", err), + }; +} + +#[openapi()] +#[post("/phe_help",format = "json", data = "")] +fn phe_help(request: Json,pp: &State,keys: &State>) -> Json { + Json(core::phe_ratelimiter(keys,&request,pp)) +} + +#[openapi()] +#[get("/get_public_parameters")] +fn get_public_parameters(pp: &State) -> Json<&core::PublicParameters>{ + Json(pp) +} + +#[catch(422)] +fn serialize_failed(_req: &Request) -> String { + format!("Malformed Request") +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..b6c3c88 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,6 @@ +#![allow(dead_code)] +mod proofs; +pub mod utils; +mod shamir; +pub mod core; +pub mod serializers; \ No newline at end of file diff --git a/src/proofs.rs b/src/proofs.rs new file mode 100644 index 0000000..10b9c3d --- /dev/null +++ b/src/proofs.rs @@ -0,0 +1,97 @@ +use bls12_381::*; +use crate::utils; +use crate::serializers; +use serde::{Deserialize, Serialize}; +use rocket_okapi::okapi::schemars; +use rocket_okapi::okapi::schemars::JsonSchema; +use serde_with::serde_as; +#[cfg(test)] +use group::Group; + + + +pub struct SameDLogProofPublic { + pub g: Gt, + pub h: Gt, + pub y1: Gt, + pub y2: Gt, +} + +impl SameDLogProofPublic{ + pub fn new(g: Gt, h: Gt, x: Scalar) -> Self { + SameDLogProofPublic { + g, + h, + y1: g * x, + y2: h * x, + } + } + + pub fn proof(&self,x: &Scalar) -> SameDLogProof{ + let r = utils::random_scalar(); + let c = utils::hash_gt_to_scalar(&[&self.g, &self.h, &self.y1, &self.y2]); + let t = r - x * c; + SameDLogProof { + a: self.g * r, + b: self.h * r, + t, + } + } +} + + +#[serde_as] +#[derive(Eq,PartialEq,Debug,Serialize,Deserialize,JsonSchema)] +pub struct SameDLogProof { + #[serde_as(as = "serializers::SerializeGt")] + #[schemars(with = "String")] + a: Gt, + #[serde_as(as = "serializers::SerializeGt")] + #[schemars(with = "String")] + b: Gt, + #[serde_as(as = "serializers::SerializeScalar")] + #[schemars(with = "String")] + t: Scalar, +} + + +impl SameDLogProof { + pub fn verify(&self,pp: &SameDLogProofPublic) -> bool{ + let c = utils::hash_gt_to_scalar(&[&pp.g, &pp.h, &pp.y1, &pp.y2]); + self.a == (pp.g * self.t) + (pp.y1 * c) && self.b == (pp.h * self.t) + (pp.y2 * c) + } +} + + +#[test] +fn test_proof_correct() { + let x = utils::random_scalar(); + let g = Gt::generator(); + let h = utils::random_gt(); + let pp = SameDLogProofPublic::new(g, h, x); + let proof = pp.proof(&x); + assert!(proof.verify(&pp)); +} + +#[test] +fn test_proof_incorrect() { + let x = utils::random_scalar(); + let g = Gt::generator(); + let h = utils::random_gt(); + let pp = SameDLogProofPublic::new(g, h, utils::random_scalar()); + let proof = pp.proof(&x); + assert!(!proof.verify(&pp)); +} + + +#[test] +fn test_proof_serialize() { + let x = utils::random_scalar(); + let g = Gt::generator(); + let h = utils::random_gt(); + let pp = SameDLogProofPublic::new(g, h, utils::random_scalar()); + let proof = pp.proof(&x); + let serialized = serde_json::to_string(&proof).unwrap(); + let proof2: SameDLogProof = serde_json::from_str(&serialized).unwrap(); + assert_eq!(proof, proof2); +} \ No newline at end of file diff --git a/src/serializers.rs b/src/serializers.rs new file mode 100644 index 0000000..225ffaf --- /dev/null +++ b/src/serializers.rs @@ -0,0 +1,129 @@ +use crate::serializers; +use bls12_381::*; +use serde::de::{Deserializer, Error}; +use serde::ser::Serializer; +use serde::{Deserialize, Serialize}; +use std::convert::TryInto; +use base64; +use serde_with::{SerializeAs,DeserializeAs}; +use serde_with::serde_as; + + +pub struct SerializeScalar; + +impl SerializeAs for SerializeScalar { + fn serialize_as(g: &Scalar, serializer: S) -> Result + where + S: Serializer, + { + let base64 = base64::encode(g.to_bytes().to_vec()); + String::serialize(&base64, serializer) + } +} + +impl<'de> DeserializeAs<'de, Scalar> for SerializeScalar { + fn deserialize_as(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let base64 = String::deserialize(deserializer)?; + let s = base64::decode(base64.as_bytes()).map_err(|_x| Error::custom("Invalid Base64 string"))?; + let a: &[u8; 32]; + a = s + .as_slice() + .try_into() + .map_err(|_x| Error::custom("Invalid Sized Array"))?; + let result = Scalar::from_bytes(a); + if result.is_none().into() { + Err(Error::custom("Invalid Scalar")) + } else { + Ok(result.unwrap()) + } + } +} + + +pub struct SerializeGt; + +impl SerializeAs for SerializeGt { + fn serialize_as(g: &Gt, serializer: S) -> Result + where + S: Serializer, + { + let base64 = base64::encode(g.to_uncompressed().to_vec()); + String::serialize(&base64, serializer) + } +} + +impl<'de> DeserializeAs<'de, Gt> for SerializeGt { + fn deserialize_as(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let base64 = String::deserialize(deserializer)?; + let s = base64::decode(base64.as_bytes()).map_err(|_x| Error::custom("Invalid Base64 string"))?; + let a: &[u8; 576]; + a = s.as_slice().try_into().map_err(|_x| Error::custom("Invalid Sized Array"))?; + let result = Gt::from_uncompressed(a); + if result.is_none().into() { + Err(Error::custom("Invalid Gt")) + } else { + Ok(result.unwrap()) + } + } +} + + +pub struct SerializeG2; + +impl SerializeAs for SerializeG2 { + fn serialize_as(g: &G2Projective, serializer: S) -> Result + where + S: Serializer, + { + let base64 = base64::encode(G2Affine::from(g).to_compressed().to_vec()); + String::serialize(&base64, serializer) + } +} + +impl<'de> DeserializeAs<'de, G2Projective> for SerializeG2 { + fn deserialize_as(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let base64 = String::deserialize(deserializer)?; + let s = base64::decode(base64.as_bytes()).map_err(|_x| Error::custom("Invalid Base64 string"))?; + let a: &[u8; 96]; + a = s.as_slice().try_into().map_err(|_x| Error::custom("Invalid Sized Array"))?; + let result = G2Affine::from_compressed(a); + if result.is_none().into() { + Err(Error::custom("Invalid G2 Element")) + } else { + Ok(result.unwrap().into()) + } + } +} + + +#[serde_as] +#[derive(Eq, PartialEq, Debug, Serialize, Deserialize)] +struct GtTest { + #[serde_as(as = "serializers::SerializeGt")] + g: Gt, +} + +#[test] +fn test_gt() { + let point = GtTest { + g: crate::utils::random_gt(), + }; + let serialized = serde_json::to_string(&point).unwrap(); + + println!("serialized = {}", serialized); + + // Convert the JSON string back to a Point. + let deserialized: GtTest = serde_json::from_str(&serialized).unwrap(); + + println!("deserialized = {:?}", deserialized); + assert_eq!(deserialized, point); +} diff --git a/src/shamir.rs b/src/shamir.rs new file mode 100644 index 0000000..1cfd268 --- /dev/null +++ b/src/shamir.rs @@ -0,0 +1,145 @@ +use bls12_381::*; +use crate::utils; + +fn lambda(i: i64, shares: i64) -> (Scalar, bool) { + assert!(i >= 0); + assert!(shares > 0); + assert!(shares >= i); + let mut temp = 1.0; + for j in 1..shares + 1 { + if j != i { + temp = temp * (-(j as f64) / ((i as f64) - (j as f64))); + } + } + let scalar = Scalar::from(temp.round().abs() as u64); + if temp < 0.0 { + return (scalar, true); + } else { + return (scalar, false); + } +} + +fn recover_shares(shares: &Vec, n: i64) -> Gt { + let mut target = Gt::identity(); + for i in 0..shares.len() { + let (l, b) = lambda((i + 1) as i64, n); + let mut temp = shares[i] * l; + if b { + temp = -temp + } + target = target + temp; + } + return target; +} + +fn recover_shares_scalar(shares: &Vec, n: i64) -> Scalar { + let mut target = Scalar::zero(); + for i in 0..shares.len() { + let (l, b) = lambda((i + 1) as i64, n); + let mut temp = shares[i] * l; + if b { + temp = -temp + } + target = target + temp; + } + return target; +} + +fn eval_at(poly: &Vec, x: i64) -> Gt { + let mut y = Gt::identity(); + for j in 0..poly.len() { + y = y + (poly[j] * Scalar::from((x.pow(j as u32)) as u64)); + } + return y; +} + +fn eval_at_scalar(poly: &Vec, x: i64) -> Scalar { + let mut y = Scalar::zero(); + for j in 0..poly.len() { + y = y + (poly[j] * Scalar::from((x.pow(j as u32)) as u64)); + } + return y; +} + +fn gen_shares(secret: Gt, n: i64, t: i64) -> Vec { + assert!(t > 0); + assert!(n >= t); + assert!(t <= n); + let mut poly = Vec::new(); + poly.push(secret); + (0..t - 1).for_each(|_| { + poly.push(utils::random_gt()); + }); + let mut shares = Vec::new(); + for i in 0..n { + shares.push(eval_at(&poly, i + 1)); + } + return shares; +} + +fn gen_shares_scalar(secret: Scalar, n: i64, t: i64) -> Vec { + assert!(t > 0); + assert!(n >= t); + assert!(t <= n); + let mut poly = Vec::new(); + poly.push(secret); + (0..t - 1).for_each(|_| { + poly.push(utils::random_scalar()); + }); + let mut shares = Vec::new(); + for i in 0..n { + shares.push(eval_at_scalar(&poly, i + 1)); + } + return shares; +} + + +#[cfg(test)] +fn test_shamir_scalar(t:i64,n:i64){ + let scalar = Scalar::from(329183724587293224); + + let scalarshares = gen_shares_scalar(scalar,n,t); + + let gt = utils::random_scalar(); + + let shares = gen_shares_scalar(gt,n,t); + let gt2 = recover_shares_scalar(&shares[0..((t+1) as usize)].to_vec(),n); + assert_eq!(gt,gt2); + + let mut newershares = Vec::new(); + for i in 0..shares.len() { + newershares.push(shares[i]+scalarshares[i]); + } + let gt3 = recover_shares_scalar(&newershares[0..((t+1) as usize)].to_vec(),n); + assert_eq!(gt3,gt+scalar); +} + + +#[cfg(test)] +fn test_shamir_scalar_into_gt(t:i64,n:i64){ + let scalar = utils::random_scalar(); + + let scalarshares = gen_shares_scalar(scalar,n,t); + + let gt2 = recover_shares_scalar(&scalarshares[0..((t+1) as usize)].to_vec(),n); + + + assert_eq!(scalar,gt2); + + + let gt_elm1 = utils::random_gt(); + + let gt_shares1 :Vec = scalarshares.iter().map(|x| gt_elm1 * x).collect(); + + let gt41 = recover_shares(>_shares1[0..((t+1) as usize)].to_vec(),n); + assert_eq!(gt_elm1*scalar,gt41); +} + + +#[test] +fn test(){ + let t = 3; + let n = 4; + test_shamir_scalar(t,n); + test_shamir_scalar_into_gt(t,n); +} diff --git a/src/utils.rs b/src/utils.rs new file mode 100644 index 0000000..c59fe16 --- /dev/null +++ b/src/utils.rs @@ -0,0 +1,186 @@ +extern crate time; +use group::Group; +use sha2::{Digest, Sha512}; +use std::convert::TryInto; +use bls12_381::*; +use rand_core::{OsRng,RngCore}; +use std::collections::HashMap; +use rayon::prelude::*; +#[cfg(test)] +use std::time::Instant; + + +pub fn random_scalar() -> Scalar { + let mut buf = [0u8; 64]; + OsRng.fill_bytes(&mut buf); + Scalar::from_bytes_wide(&buf) +} + +pub fn random_gt() -> Gt{ + Gt::random(OsRng) +} + +pub fn hash_string_to_scalar(element: String) -> Scalar { + let buf:[u8; 64]; + let mut hasher = Sha512::new(); + + hasher.update(element.as_bytes()); + + let result = hasher.finalize(); + buf = result.as_slice().try_into().expect("Wrong length"); + + Scalar::from_bytes_wide(&buf) +} + +pub fn hash_gt_to_scalar(elements: &[&Gt]) -> Scalar { + let buf:[u8; 64]; + let mut hasher = Sha512::new(); + for x in elements { + hasher.update(x.to_compressed()); + } + let result = hasher.finalize(); + buf = result.as_slice().try_into().expect("Wrong length"); + + Scalar::from_bytes_wide(&buf) +} + +pub fn prepare_messages_to_space(k: usize) -> Vec{ + let mut m = Vec::new(); + for j in 0..1 << k { + let current_m = Scalar::from_raw([(j + 1) as u64, 0, 0, 0]); + m.push(current_m); + } + m +} + + +pub fn prepare_messages_to_precomputed_space(space: &Vec,cipher: &Gt) -> HashMap<[u8;288],usize>{ + let mapped = space.par_iter().map(|x|(cipher * x.invert().unwrap()).to_compressed()).collect::>(); + let mut m = HashMap::new(); + (0..space.len()).for_each(|i| { + m.insert( mapped[i],i); + }); + m +} + +pub fn find_in_precomputed_space(ciphertext: &Vec,_space: &Vec,maps: &Vec>,k:usize) -> Vec{ + let mut prep = Vec::new(); + for i in 0..ciphertext.len() { + let index = maps[i][&ciphertext[i].to_compressed()]; + for z in 0..k{ + prep.push((index>>z)&1); + } + } + let mut result = Vec::new(); + for i in 0..prep.len()/8{ + let mut x = 0u8; + for j in 0..8{ + x = x + (prep[i*8+j]<,space: &Vec,k: usize) -> Vec { + let mut preparedmsg = Vec::new(); + for i in 0..msg.len() { + for j in 0..8{ + preparedmsg.push((msg[i]&(1<>j); + } + } + let msgsize = preparedmsg.len(); // size of msg in bits + assert!(msgsize%k==0,"Msg must be aligned to space"); //TODO extend msg with size and padding + let steps = msgsize / k; + let mut result = Vec::new(); + for i in 0..steps{ + let mut x = 0; + for j in 0..k{ + x = x + ((preparedmsg[i*k+j] as usize)<,ciphertext: &Vec,space:& Vec,k: usize) -> Result,String>{ + let mut prep = Vec::new(); + let spacesize = space.len(); + + let t = target.par_iter().map(|x|space.iter().map(|y|x*y).collect::>()).collect::>(); + + for i in 0..target.len() { + let mut found = false; + for j in 0..spacesize{ + if t[i][j] == ciphertext[i]{ + found = true; + for z in 0..k{ + prep.push((j>>z)&1); + } + } + } + if !found { + return Err("Decryption failed.".to_string()) + } + } + let mut result = Vec::new(); + for i in 0..prep.len()/8{ + let mut x = 0u8; + for j in 0..8{ + x = x | (prep[i*8+j]<>(); + let test = (&split).into_iter().map(|x|gt*x).collect::>(); + + let start = Instant::now(); + let solved = solve_dlog(>s, &test, &space, k).unwrap(); + + println!("k: {} {:.2?} solve dlog ", k,start.elapsed()); + + assert_eq!(msg.to_vec(),solved); + let start = Instant::now(); + let prepared_space= (&test).into_iter().map(|x|prepare_messages_to_precomputed_space(&space, x)).collect::>>(); + + + println!("k: {} {:.2?} precomputing message space", k,start.elapsed()); + + let start = Instant::now(); + let prepared_solved = find_in_precomputed_space(>s,&space,&prepared_space, k); + + println!("k: {} {:.2?} lookup in prepared message space", k,start.elapsed()); + + assert_eq!(msg.to_vec(),prepared_solved); + +} + + +#[test] +fn test_msg_space() { + //rayon::ThreadPoolBuilder::new().num_threads(1).build_global().unwrap(); + test_msg_space_k(2); + test_msg_space_k(4); + test_msg_space_k(8); + //test_msg_space_k(16); +} \ No newline at end of file