From cb7f31c6b6b2bb0cfd6bb3427d6a2207781bd2e9 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 19 Feb 2024 11:13:34 -0800 Subject: [PATCH 01/49] Init quartz-enclave --- Cargo.lock | 4 ++++ utils/quartz-enclave/Cargo.toml | 8 ++++++++ utils/quartz-enclave/src/lib.rs | 21 +++++++++++++++++++++ 3 files changed, 33 insertions(+) create mode 100644 utils/quartz-enclave/Cargo.toml create mode 100644 utils/quartz-enclave/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index 6c496b0..18a75fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1635,6 +1635,10 @@ dependencies = [ "prost", ] +[[package]] +name = "quartz-enclave" +version = "0.1.0" + [[package]] name = "quote" version = "1.0.35" diff --git a/utils/quartz-enclave/Cargo.toml b/utils/quartz-enclave/Cargo.toml new file mode 100644 index 0000000..9091311 --- /dev/null +++ b/utils/quartz-enclave/Cargo.toml @@ -0,0 +1,8 @@ +[package] +name = "quartz-enclave" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] diff --git a/utils/quartz-enclave/src/lib.rs b/utils/quartz-enclave/src/lib.rs new file mode 100644 index 0000000..939bb65 --- /dev/null +++ b/utils/quartz-enclave/src/lib.rs @@ -0,0 +1,21 @@ +#![warn( + clippy::checked_conversions, + clippy::panic, + clippy::panic_in_result_fn, + clippy::unwrap_used, + rust_2018_idioms, + unused_lifetimes +)] +#![deny( + trivial_casts, + trivial_numeric_casts, + unused_import_braces, + unused_qualifications, + warnings +)] +#![forbid(unsafe_code)] + +#[cfg(test)] +mod tests { + +} From 7135e97c35eadd6aa6c3ba0605fa57226c16bcf6 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 03:16:41 -0800 Subject: [PATCH 02/49] Move quartz enclave and init gramine files for it --- .../quartz}/Cargo.toml | 0 enclaves/quartz/Dockerfile | 48 ++++++++++++++++++ enclaves/quartz/quartz.manifest.template | 50 +++++++++++++++++++ enclaves/quartz/src/main.rs | 1 + utils/quartz-enclave/src/lib.rs | 21 -------- 5 files changed, 99 insertions(+), 21 deletions(-) rename {utils/quartz-enclave => enclaves/quartz}/Cargo.toml (100%) create mode 100644 enclaves/quartz/Dockerfile create mode 100644 enclaves/quartz/quartz.manifest.template create mode 100644 enclaves/quartz/src/main.rs delete mode 100644 utils/quartz-enclave/src/lib.rs diff --git a/utils/quartz-enclave/Cargo.toml b/enclaves/quartz/Cargo.toml similarity index 100% rename from utils/quartz-enclave/Cargo.toml rename to enclaves/quartz/Cargo.toml diff --git a/enclaves/quartz/Dockerfile b/enclaves/quartz/Dockerfile new file mode 100644 index 0000000..88e8587 --- /dev/null +++ b/enclaves/quartz/Dockerfile @@ -0,0 +1,48 @@ +FROM gramineproject/gramine:v1.5 + +RUN apt-get update && apt-get install -y jq build-essential + +WORKDIR /workdir + +RUN curl https://sh.rustup.rs -sSf | bash -s -- -y +ENV PATH="/root/.cargo/bin:${PATH}" +RUN rustup toolchain install 1.72.0 + +RUN gramine-sgx-gen-private-key + +# This should be associated with an acive IAS SPID in order for +# gramine tools like gramine-sgx-ias-request and gramine-sgx-ias-verify +ARG RA_TYPE=epid +ENV RA_TYPE=$RA_TYPE +ARG RA_CLIENT_SPID=51CAF5A48B450D624AEFE3286D314894 +ENV RA_CLIENT_SPID=$RA_CLIENT_SPID +ARG RA_CLIENT_LINKABLE=1 +ENV RA_CLIENT_LINKABLE=$RA_CLIENT_LINKABLE + +ARG DEBUG=0 +ENV DEBUG=$DEBUG +ARG SGX=1 +ENV SGX=$SGX + +# Copy the quartz directory and build +COPY . ./quartz +WORKDIR /workdir/quartz +RUN cargo build --release + +WORKDIR /workdir +COPY quartz.manifest.template ./ + +# Make and sign the gramine manifest +RUN gramine-manifest \ + -Dlog_level="error" \ + -Dhome=${HOME} \ + -Darch_libdir="/lib/$(gcc -dumpmachine)" \ + -Dra_type="$RA_TYPE" \ + -Dra_client_spid="$RA_CLIENT_SPID" \ + -Dra_client_linkable="$RA_CLIENT_LINKABLE" \ + -Dquartz_dir="$(pwd)/quartz" \ + quartz.manifest.template quartz.manifest + +RUN gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx + +CMD [ "gramine-sgx-sigstruct-view quartz.sig" ] diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template new file mode 100644 index 0000000..cd0e9c4 --- /dev/null +++ b/enclaves/quartz/quartz.manifest.template @@ -0,0 +1,50 @@ +# Quartz manifest file + +loader.entrypoint = "file:{{ gramine.libos }}" +libos.entrypoint = "{{ quartz_dir }}/target/release/quartz-enclave" + +loader.log_level = "{{ log_level }}" + +loader.env.LD_LIBRARY_PATH = "/lib:{{ arch_libdir }}:/usr/{{ arch_libdir }}" +loader.env.HOME = "{{ home }}" +loader.env.INSIDE_SGX = "1" +loader.env.TLS = { passthrough = true } +loader.env.RA_TYPE = { passthrough = true } +loader.env.RA_TLS_ALLOW_DEBUG_ENCLAVE_INSECURE = { passthrough = true } +loader.env.RA_TLS_ALLOW_OUTDATED_TCB_INSECURE = { passthrough = true } +loader.env.RA_TLS_MRENCLAVE = { passthrough = true } +loader.env.RA_TLS_MRSIGNER = { passthrough = true } +loader.env.RA_TLS_ISV_SVN = { passthrough = true } +loader.env.RA_TLS_ISV_PROD_ID = { passthrough = true } +loader.env.RA_TLS_EPID_API_KEY = { passthrough = true } +loader.env.MYAPP_DATA = { passthrough = true } + +loader.argv = ["quartz-enclave"] + +fs.mounts = [ + { uri = "file:{{ gramine.runtimedir() }}", path = "/lib" }, + { uri = "file:{{ arch_libdir }}", path = "{{ arch_libdir }}" }, + { uri = "file:/usr/{{ arch_libdir }}", path = "/usr{{ arch_libdir }}" }, + { uri = "file:{{ quartz_dir }}", path = "{{ quartz_dir }}" }, +] + +sgx.enclave_size = "512M" +sgx.max_threads = 4 +sgx.edmm_enable = {{ 'true' if env.get('EDMM', '0') == '1' else 'false' }} + +sgx.remote_attestation = "{{ ra_type }}" +sgx.ra_client_spid = "{{ ra_client_spid }}" +sgx.ra_client_linkable = {{ 'true' if ra_client_linkable == '1' else 'false' }} + +sgx.trusted_files = [ + "file:{{ gramine.libos }}", + "file:{{ quartz_dir }}/target/release/quartz-enclave", + "file:{{ gramine.runtimedir() }}/", + "file:{{ arch_libdir }}/", + "file:/usr/{{ arch_libdir }}/", +] + +sgx.allowed_files = [ + "file:{{ quartz_dir }}/exchange.sk", + "file:{{ quartz_dir }}/request.json", +] diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs new file mode 100644 index 0000000..f328e4d --- /dev/null +++ b/enclaves/quartz/src/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/utils/quartz-enclave/src/lib.rs b/utils/quartz-enclave/src/lib.rs deleted file mode 100644 index 939bb65..0000000 --- a/utils/quartz-enclave/src/lib.rs +++ /dev/null @@ -1,21 +0,0 @@ -#![warn( - clippy::checked_conversions, - clippy::panic, - clippy::panic_in_result_fn, - clippy::unwrap_used, - rust_2018_idioms, - unused_lifetimes -)] -#![deny( - trivial_casts, - trivial_numeric_casts, - unused_import_braces, - unused_qualifications, - warnings -)] -#![forbid(unsafe_code)] - -#[cfg(test)] -mod tests { - -} From 665e7571bf4fe804b47f002bccb604ebe7262292 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 03:27:10 -0800 Subject: [PATCH 03/49] Setup proto machinery --- Cargo.lock | 348 ++++++++++++++++++++++++++++- enclaves/quartz/Cargo.toml | 8 +- enclaves/quartz/README.md | 1 + enclaves/quartz/build.rs | 4 + enclaves/quartz/proto/quartz.proto | 13 ++ enclaves/quartz/src/main.rs | 36 ++- enclaves/quartz/src/proto.rs | 5 + enclaves/quartz/src/server.rs | 22 ++ 8 files changed, 427 insertions(+), 10 deletions(-) create mode 100644 enclaves/quartz/README.md create mode 100644 enclaves/quartz/build.rs create mode 100644 enclaves/quartz/proto/quartz.proto create mode 100644 enclaves/quartz/src/proto.rs create mode 100644 enclaves/quartz/src/server.rs diff --git a/Cargo.lock b/Cargo.lock index 18a75fd..0d884d4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,6 +121,28 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +[[package]] +name = "async-stream" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" +dependencies = [ + "async-stream-impl", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-stream-impl" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", +] + [[package]] name = "async-trait" version = "0.1.77" @@ -138,6 +160,51 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + [[package]] name = "backtrace" version = "0.3.69" @@ -199,6 +266,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + [[package]] name = "block-buffer" version = "0.9.0" @@ -728,6 +801,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + [[package]] name = "eyre" version = "0.6.11" @@ -738,6 +821,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + [[package]] name = "ff" version = "0.13.0" @@ -748,6 +837,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + [[package]] name = "flex-error" version = "0.4.4" @@ -915,9 +1010,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.23" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b553656127a00601c8ae5590fcfdc118e4083a7924b6cf4ffc1ea4b99dc429d7" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -925,7 +1020,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -938,6 +1033,12 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hashbrown" version = "0.14.3" @@ -980,6 +1081,15 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "http" version = "0.2.11" @@ -1052,6 +1162,18 @@ dependencies = [ "tokio-rustls", ] +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + [[package]] name = "ics23" version = "0.11.0" @@ -1089,6 +1211,16 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + [[package]] name = "indexmap" version = "2.1.0" @@ -1096,7 +1228,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.3", ] [[package]] @@ -1246,6 +1378,12 @@ dependencies = [ "libsecp256k1-core", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "lock_api" version = "0.4.11" @@ -1271,6 +1409,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + [[package]] name = "maybe-uninit" version = "2.0.0" @@ -1327,6 +1471,12 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -1517,6 +1667,16 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "petgraph" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +dependencies = [ + "fixedbitset", + "indexmap 2.1.0", +] + [[package]] name = "pin-project" version = "1.1.3" @@ -1594,6 +1754,16 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "prettyplease" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" +dependencies = [ + "proc-macro2", + "syn 2.0.48", +] + [[package]] name = "proc-macro2" version = "1.0.76" @@ -1613,6 +1783,28 @@ dependencies = [ "prost-derive", ] +[[package]] +name = "prost-build" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" +dependencies = [ + "bytes", + "heck", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 2.0.48", + "tempfile", + "which", +] + [[package]] name = "prost-derive" version = "0.12.3" @@ -1638,6 +1830,12 @@ dependencies = [ [[package]] name = "quartz-enclave" version = "0.1.0" +dependencies = [ + "prost", + "tokio", + "tonic", + "tonic-build", +] [[package]] name = "quote" @@ -1684,7 +1882,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1842,6 +2040,19 @@ version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustls" version = "0.21.10" @@ -1885,6 +2096,12 @@ dependencies = [ "untrusted", ] +[[package]] +name = "rustversion" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" + [[package]] name = "ryu" version = "1.0.16" @@ -1945,7 +2162,7 @@ version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -2232,13 +2449,19 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "system-configuration" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "system-configuration-sys", ] @@ -2270,6 +2493,18 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tempfile" +version = "3.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +dependencies = [ + "cfg-if 1.0.0", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + [[package]] name = "tendermint" version = "0.34.0" @@ -2563,6 +2798,16 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-macros" version = "2.2.0" @@ -2584,6 +2829,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-stream" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + [[package]] name = "tokio-util" version = "0.7.10" @@ -2607,6 +2863,72 @@ dependencies = [ "serde", ] +[[package]] +name = "tonic" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76c4eb7a4e9ef9d4763600161f12f5070b92a578e1b634db88a6887844c91a13" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.21.6", + "bytes", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4ef6dd70a610078cb4e338a0f79d06bc759ff1b22d2120c2ff02ae264ba9c2" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + [[package]] name = "tower-service" version = "0.3.2" @@ -2869,6 +3191,18 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + [[package]] name = "winapi" version = "0.3.9" diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 9091311..20bfc63 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -3,6 +3,10 @@ name = "quartz-enclave" version = "0.1.0" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - [dependencies] +prost = "0.12" +tonic = "0.11" +tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } + +[build-dependencies] +tonic-build = "0.11" diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md new file mode 100644 index 0000000..95f554c --- /dev/null +++ b/enclaves/quartz/README.md @@ -0,0 +1 @@ +## Quartz enclave diff --git a/enclaves/quartz/build.rs b/enclaves/quartz/build.rs new file mode 100644 index 0000000..b164a31 --- /dev/null +++ b/enclaves/quartz/build.rs @@ -0,0 +1,4 @@ +fn main() -> Result<(), Box> { + tonic_build::compile_protos("proto/quartz.proto")?; + Ok(()) +} diff --git a/enclaves/quartz/proto/quartz.proto b/enclaves/quartz/proto/quartz.proto new file mode 100644 index 0000000..0d52cd6 --- /dev/null +++ b/enclaves/quartz/proto/quartz.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package quartz; + +service Core { + rpc SessionCreate (SessionCreateRequest) returns (SessionCreateResponse) {} +} + +message SessionCreateRequest {} + +message SessionCreateResponse { + string message = 1; +} diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index f328e4d..fea358f 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -1 +1,35 @@ -fn main() {} +#![doc = include_str!("../README.md")] +#![forbid(unsafe_code)] +#![warn( + clippy::checked_conversions, + clippy::panic, + clippy::panic_in_result_fn, + clippy::unwrap_used, + missing_docs, + trivial_casts, + trivial_numeric_casts, + rust_2018_idioms, + unused_lifetimes, + unused_import_braces, + unused_qualifications +)] + +mod proto; +mod server; + +use tonic::transport::Server; + +use crate::{proto::quartz::core_server::CoreServer, server::CoreService}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let addr = "[::1]:50051".parse()?; + let core_service = CoreService::default(); + + Server::builder() + .add_service(CoreServer::new(core_service)) + .serve(addr) + .await?; + + Ok(()) +} diff --git a/enclaves/quartz/src/proto.rs b/enclaves/quartz/src/proto.rs new file mode 100644 index 0000000..75a72f8 --- /dev/null +++ b/enclaves/quartz/src/proto.rs @@ -0,0 +1,5 @@ +#![allow(clippy::unwrap_used, unused_qualifications)] + +pub mod quartz { + tonic::include_proto!("quartz"); +} diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs new file mode 100644 index 0000000..0267da9 --- /dev/null +++ b/enclaves/quartz/src/server.rs @@ -0,0 +1,22 @@ +use tonic::{Request, Response, Status}; + +use crate::proto::quartz::{core_server::Core, SessionCreateRequest, SessionCreateResponse}; + +#[derive(Debug, Default)] +pub struct CoreService {} + +#[tonic::async_trait] +impl Core for CoreService { + async fn session_create( + &self, + request: Request, + ) -> Result, Status> { + println!("Got a request: {:?}", request); + + let reply = SessionCreateResponse { + message: "Hello!".to_string(), + }; + + Ok(Response::new(reply)) + } +} From c15d67fe71c71b6c03dbaf689244b478732b63fc Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 04:40:02 -0800 Subject: [PATCH 04/49] Get tonic-rs to run inside SGX --- enclaves/quartz/Dockerfile | 3 ++- enclaves/quartz/README.md | 12 ++++++++++++ enclaves/quartz/quartz.manifest.template | 3 +++ enclaves/quartz/src/main.rs | 2 +- 4 files changed, 18 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/Dockerfile b/enclaves/quartz/Dockerfile index 88e8587..0594dec 100644 --- a/enclaves/quartz/Dockerfile +++ b/enclaves/quartz/Dockerfile @@ -1,12 +1,13 @@ FROM gramineproject/gramine:v1.5 -RUN apt-get update && apt-get install -y jq build-essential +RUN apt-get update && apt-get install -y jq build-essential protobuf-compiler libprotobuf-dev WORKDIR /workdir RUN curl https://sh.rustup.rs -sSf | bash -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" RUN rustup toolchain install 1.72.0 +#ENV RUST_BACKTRACE=1 RUN gramine-sgx-gen-private-key diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 95f554c..44773ac 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -1 +1,13 @@ ## Quartz enclave + +```bash +docker build . --tag quartz +docker run -it \ + --device /dev/sgx_enclave \ + --device /dev/sgx_provision \ + -v /var/run/aesmd/aesm.socket:/var/run/aesmd/aesm.socket \ + -v ./data:/workdir/data \ + quartz bash +is-sgx-available +gramine-sgx ./quartz +``` diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template index cd0e9c4..2735e3e 100644 --- a/enclaves/quartz/quartz.manifest.template +++ b/enclaves/quartz/quartz.manifest.template @@ -28,6 +28,7 @@ fs.mounts = [ { uri = "file:{{ quartz_dir }}", path = "{{ quartz_dir }}" }, ] +# sgx.debug = true sgx.enclave_size = "512M" sgx.max_threads = 4 sgx.edmm_enable = {{ 'true' if env.get('EDMM', '0') == '1' else 'false' }} @@ -48,3 +49,5 @@ sgx.allowed_files = [ "file:{{ quartz_dir }}/exchange.sk", "file:{{ quartz_dir }}/request.json", ] + +sys.insecure__allow_eventfd = true diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index fea358f..d107ac0 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -23,7 +23,7 @@ use crate::{proto::quartz::core_server::CoreServer, server::CoreService}; #[tokio::main] async fn main() -> Result<(), Box> { - let addr = "[::1]:50051".parse()?; + let addr = "127.0.0.1:9090".parse()?; let core_service = CoreService::default(); Server::builder() From 6564d13d008a361cb0e50b42dde82caf483ff212 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 06:58:26 -0800 Subject: [PATCH 05/49] Use single threaded executor & update default gRPC port --- enclaves/quartz/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index d107ac0..e061dca 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -21,9 +21,9 @@ use tonic::transport::Server; use crate::{proto::quartz::core_server::CoreServer, server::CoreService}; -#[tokio::main] +#[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { - let addr = "127.0.0.1:9090".parse()?; + let addr = "127.0.0.1:11090".parse()?; let core_service = CoreService::default(); Server::builder() From 859323bdfb3492a0bb6cf29a2014b6198c36304b Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 08:34:42 -0800 Subject: [PATCH 06/49] Extract quartz-proto crate --- Cargo.lock | 18 ++++++++++++++++++ enclaves/quartz/Cargo.toml | 3 +-- enclaves/quartz/src/main.rs | 4 ++-- enclaves/quartz/src/server.rs | 3 +-- utils/quartz-proto/Cargo.toml | 11 +++++++++++ .../quartz => utils/quartz-proto}/build.rs | 0 .../quartz-proto}/proto/quartz.proto | 0 .../proto.rs => utils/quartz-proto/src/lib.rs | 0 8 files changed, 33 insertions(+), 6 deletions(-) create mode 100644 utils/quartz-proto/Cargo.toml rename {enclaves/quartz => utils/quartz-proto}/build.rs (100%) rename {enclaves/quartz => utils/quartz-proto}/proto/quartz.proto (100%) rename enclaves/quartz/src/proto.rs => utils/quartz-proto/src/lib.rs (100%) diff --git a/Cargo.lock b/Cargo.lock index 0d884d4..e44bda2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1832,11 +1832,29 @@ name = "quartz-enclave" version = "0.1.0" dependencies = [ "prost", + "quartz-proto", "tokio", "tonic", +] + +[[package]] +name = "quartz-proto" +version = "0.1.0" +dependencies = [ + "prost", + "tonic", "tonic-build", ] +[[package]] +name = "quartz-relayer" +version = "0.1.0" +dependencies = [ + "quartz-proto", + "tokio", + "tonic", +] + [[package]] name = "quote" version = "1.0.35" diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 20bfc63..bfdcdf3 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -8,5 +8,4 @@ prost = "0.12" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -[build-dependencies] -tonic-build = "0.11" +quartz-proto = { path = "../../utils/quartz-proto" } diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index e061dca..8f8bfe0 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -14,12 +14,12 @@ unused_qualifications )] -mod proto; mod server; +use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{proto::quartz::core_server::CoreServer, server::CoreService}; +use crate::server::CoreService; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 0267da9..3a99741 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,7 +1,6 @@ +use quartz_proto::quartz::{core_server::Core, SessionCreateRequest, SessionCreateResponse}; use tonic::{Request, Response, Status}; -use crate::proto::quartz::{core_server::Core, SessionCreateRequest, SessionCreateResponse}; - #[derive(Debug, Default)] pub struct CoreService {} diff --git a/utils/quartz-proto/Cargo.toml b/utils/quartz-proto/Cargo.toml new file mode 100644 index 0000000..d406f0f --- /dev/null +++ b/utils/quartz-proto/Cargo.toml @@ -0,0 +1,11 @@ +[package] +name = "quartz-proto" +version = "0.1.0" +edition = "2021" + +[dependencies] +prost = "0.12" +tonic = "0.11" + +[build-dependencies] +tonic-build = "0.11" diff --git a/enclaves/quartz/build.rs b/utils/quartz-proto/build.rs similarity index 100% rename from enclaves/quartz/build.rs rename to utils/quartz-proto/build.rs diff --git a/enclaves/quartz/proto/quartz.proto b/utils/quartz-proto/proto/quartz.proto similarity index 100% rename from enclaves/quartz/proto/quartz.proto rename to utils/quartz-proto/proto/quartz.proto diff --git a/enclaves/quartz/src/proto.rs b/utils/quartz-proto/src/lib.rs similarity index 100% rename from enclaves/quartz/src/proto.rs rename to utils/quartz-proto/src/lib.rs From e74badc7bb832e5492c811db44114e84ae756b64 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 20 Feb 2024 08:42:04 -0800 Subject: [PATCH 07/49] Init relayer crate with tonic client code --- utils/quartz-relayer/Cargo.toml | 10 ++++++++++ utils/quartz-relayer/src/main.rs | 13 +++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 utils/quartz-relayer/Cargo.toml create mode 100644 utils/quartz-relayer/src/main.rs diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml new file mode 100644 index 0000000..a5523e0 --- /dev/null +++ b/utils/quartz-relayer/Cargo.toml @@ -0,0 +1,10 @@ +[package] +name = "quartz-relayer" +version = "0.1.0" +edition = "2021" + +[dependencies] +tonic = "0.11" +tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } + +quartz-proto = { path = "../../utils/quartz-proto" } diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs new file mode 100644 index 0000000..37cb9e2 --- /dev/null +++ b/utils/quartz-relayer/src/main.rs @@ -0,0 +1,13 @@ +use quartz_proto::quartz::{core_client::CoreClient, SessionCreateRequest}; + +#[tokio::main] +async fn main() -> Result<(), Box> { + let mut client = CoreClient::connect("http://localhost:11090").await?; + + let request = tonic::Request::new(SessionCreateRequest {}); + + let response = client.session_create(request).await?; + println!("{:?}", response.into_inner()); + + Ok(()) +} From 4dc293062f2857c7dccaaaa04af2dbe3d30240dc Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Thu, 22 Feb 2024 12:09:25 -0800 Subject: [PATCH 08/49] Add instantiate to proto --- utils/quartz-proto/proto/quartz.proto | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/utils/quartz-proto/proto/quartz.proto b/utils/quartz-proto/proto/quartz.proto index 0d52cd6..60f2aff 100644 --- a/utils/quartz-proto/proto/quartz.proto +++ b/utils/quartz-proto/proto/quartz.proto @@ -3,9 +3,16 @@ syntax = "proto3"; package quartz; service Core { + rpc Instantiate (InstantiateRequest) returns (InstantiateResponse) {} rpc SessionCreate (SessionCreateRequest) returns (SessionCreateResponse) {} } +message InstantiateRequest {} + +message InstantiateResponse { + string message = 1; +} + message SessionCreateRequest {} message SessionCreateResponse { From cb8c4c828f76a8c0fbff6c89badd9207fd9dd1b3 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Thu, 22 Feb 2024 12:09:32 -0800 Subject: [PATCH 09/49] Write generated proto files to prost/ --- utils/quartz-proto/build.rs | 4 +- utils/quartz-proto/src/lib.rs | 2 +- utils/quartz-proto/src/prost/quartz.rs | 383 +++++++++++++++++++++++++ 3 files changed, 387 insertions(+), 2 deletions(-) create mode 100644 utils/quartz-proto/src/prost/quartz.rs diff --git a/utils/quartz-proto/build.rs b/utils/quartz-proto/build.rs index b164a31..755f1e0 100644 --- a/utils/quartz-proto/build.rs +++ b/utils/quartz-proto/build.rs @@ -1,4 +1,6 @@ fn main() -> Result<(), Box> { - tonic_build::compile_protos("proto/quartz.proto")?; + tonic_build::configure() + .out_dir("src/prost") + .compile(&["proto/quartz.proto"], &["proto"])?; Ok(()) } diff --git a/utils/quartz-proto/src/lib.rs b/utils/quartz-proto/src/lib.rs index 75a72f8..60fef7c 100644 --- a/utils/quartz-proto/src/lib.rs +++ b/utils/quartz-proto/src/lib.rs @@ -1,5 +1,5 @@ #![allow(clippy::unwrap_used, unused_qualifications)] pub mod quartz { - tonic::include_proto!("quartz"); + include!(concat!("prost/", "quartz.rs")); } diff --git a/utils/quartz-proto/src/prost/quartz.rs b/utils/quartz-proto/src/prost/quartz.rs new file mode 100644 index 0000000..10aff4b --- /dev/null +++ b/utils/quartz-proto/src/prost/quartz.rs @@ -0,0 +1,383 @@ +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InstantiateRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct InstantiateResponse { + #[prost(string, tag = "1")] + pub message: ::prost::alloc::string::String, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SessionCreateRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SessionCreateResponse { + #[prost(string, tag = "1")] + pub message: ::prost::alloc::string::String, +} +/// Generated client implementations. +pub mod core_client { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + use tonic::codegen::http::Uri; + #[derive(Debug, Clone)] + pub struct CoreClient { + inner: tonic::client::Grpc, + } + impl CoreClient { + /// Attempt to create a new client by connecting to a given endpoint. + pub async fn connect(dst: D) -> Result + where + D: TryInto, + D::Error: Into, + { + let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; + Ok(Self::new(conn)) + } + } + impl CoreClient + where + T: tonic::client::GrpcService, + T::Error: Into, + T::ResponseBody: Body + Send + 'static, + ::Error: Into + Send, + { + pub fn new(inner: T) -> Self { + let inner = tonic::client::Grpc::new(inner); + Self { inner } + } + pub fn with_origin(inner: T, origin: Uri) -> Self { + let inner = tonic::client::Grpc::with_origin(inner, origin); + Self { inner } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> CoreClient> + where + F: tonic::service::Interceptor, + T::ResponseBody: Default, + T: tonic::codegen::Service< + http::Request, + Response = http::Response< + >::ResponseBody, + >, + >, + , + >>::Error: Into + Send + Sync, + { + CoreClient::new(InterceptedService::new(inner, interceptor)) + } + /// Compress requests with the given encoding. + /// + /// This requires the server to support it otherwise it might respond with an + /// error. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.send_compressed(encoding); + self + } + /// Enable decompressing responses. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.inner = self.inner.accept_compressed(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_decoding_message_size(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.inner = self.inner.max_encoding_message_size(limit); + self + } + pub async fn instantiate( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/quartz.Core/Instantiate"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("quartz.Core", "Instantiate")); + self.inner.unary(req, path, codec).await + } + pub async fn session_create( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/quartz.Core/SessionCreate", + ); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("quartz.Core", "SessionCreate")); + self.inner.unary(req, path, codec).await + } + } +} +/// Generated server implementations. +pub mod core_server { + #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] + use tonic::codegen::*; + /// Generated trait containing gRPC methods that should be implemented for use with CoreServer. + #[async_trait] + pub trait Core: Send + Sync + 'static { + async fn instantiate( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + async fn session_create( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; + } + #[derive(Debug)] + pub struct CoreServer { + inner: _Inner, + accept_compression_encodings: EnabledCompressionEncodings, + send_compression_encodings: EnabledCompressionEncodings, + max_decoding_message_size: Option, + max_encoding_message_size: Option, + } + struct _Inner(Arc); + impl CoreServer { + pub fn new(inner: T) -> Self { + Self::from_arc(Arc::new(inner)) + } + pub fn from_arc(inner: Arc) -> Self { + let inner = _Inner(inner); + Self { + inner, + accept_compression_encodings: Default::default(), + send_compression_encodings: Default::default(), + max_decoding_message_size: None, + max_encoding_message_size: None, + } + } + pub fn with_interceptor( + inner: T, + interceptor: F, + ) -> InterceptedService + where + F: tonic::service::Interceptor, + { + InterceptedService::new(Self::new(inner), interceptor) + } + /// Enable decompressing requests with the given encoding. + #[must_use] + pub fn accept_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.accept_compression_encodings.enable(encoding); + self + } + /// Compress responses with the given encoding, if the client supports it. + #[must_use] + pub fn send_compressed(mut self, encoding: CompressionEncoding) -> Self { + self.send_compression_encodings.enable(encoding); + self + } + /// Limits the maximum size of a decoded message. + /// + /// Default: `4MB` + #[must_use] + pub fn max_decoding_message_size(mut self, limit: usize) -> Self { + self.max_decoding_message_size = Some(limit); + self + } + /// Limits the maximum size of an encoded message. + /// + /// Default: `usize::MAX` + #[must_use] + pub fn max_encoding_message_size(mut self, limit: usize) -> Self { + self.max_encoding_message_size = Some(limit); + self + } + } + impl tonic::codegen::Service> for CoreServer + where + T: Core, + B: Body + Send + 'static, + B::Error: Into + Send + 'static, + { + type Response = http::Response; + type Error = std::convert::Infallible; + type Future = BoxFuture; + fn poll_ready( + &mut self, + _cx: &mut Context<'_>, + ) -> Poll> { + Poll::Ready(Ok(())) + } + fn call(&mut self, req: http::Request) -> Self::Future { + let inner = self.inner.clone(); + match req.uri().path() { + "/quartz.Core/Instantiate" => { + #[allow(non_camel_case_types)] + struct InstantiateSvc(pub Arc); + impl tonic::server::UnaryService + for InstantiateSvc { + type Response = super::InstantiateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::instantiate(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = InstantiateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + "/quartz.Core/SessionCreate" => { + #[allow(non_camel_case_types)] + struct SessionCreateSvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for SessionCreateSvc { + type Response = super::SessionCreateResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::session_create(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = SessionCreateSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } + _ => { + Box::pin(async move { + Ok( + http::Response::builder() + .status(200) + .header("grpc-status", "12") + .header("content-type", "application/grpc") + .body(empty_body()) + .unwrap(), + ) + }) + } + } + } + } + impl Clone for CoreServer { + fn clone(&self) -> Self { + let inner = self.inner.clone(); + Self { + inner, + accept_compression_encodings: self.accept_compression_encodings, + send_compression_encodings: self.send_compression_encodings, + max_decoding_message_size: self.max_decoding_message_size, + max_encoding_message_size: self.max_encoding_message_size, + } + } + } + impl Clone for _Inner { + fn clone(&self) -> Self { + Self(Arc::clone(&self.0)) + } + } + impl std::fmt::Debug for _Inner { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self.0) + } + } + impl tonic::server::NamedService for CoreServer { + const NAME: &'static str = "quartz.Core"; + } +} From 054e77d6937d024706fc9b69cb67adb4b013199a Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Thu, 22 Feb 2024 12:09:44 -0800 Subject: [PATCH 10/49] Impl instantiate in server.rs --- enclaves/quartz/src/server.rs | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 3a99741..14934f0 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,11 +1,26 @@ -use quartz_proto::quartz::{core_server::Core, SessionCreateRequest, SessionCreateResponse}; +use quartz_proto::quartz::{ + core_server::Core, InstantiateRequest, InstantiateResponse, SessionCreateRequest, + SessionCreateResponse, +}; use tonic::{Request, Response, Status}; #[derive(Debug, Default)] -pub struct CoreService {} +pub struct CoreService; #[tonic::async_trait] impl Core for CoreService { + async fn instantiate( + &self, + request: Request, + ) -> Result, Status> { + println!("Got a request: {:?}", request); + + let reply = InstantiateResponse { + message: "Hello!".to_string(), + }; + + Ok(Response::new(reply)) + } async fn session_create( &self, request: Request, From 3a201cca82afb9a5dbbb53d7936e4d7f2c00c219 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Thu, 22 Feb 2024 12:48:13 -0800 Subject: [PATCH 11/49] Impl config + CLI --- Cargo.lock | 6 ++++ enclaves/quartz/Cargo.toml | 6 ++++ enclaves/quartz/src/cli.rs | 56 ++++++++++++++++++++++++++++++++ enclaves/quartz/src/main.rs | 28 +++++++++++++--- enclaves/quartz/src/server.rs | 61 +++++++++++++++++++++++++++++++++-- 5 files changed, 150 insertions(+), 7 deletions(-) create mode 100644 enclaves/quartz/src/cli.rs diff --git a/Cargo.lock b/Cargo.lock index e44bda2..c14f1d5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1831,8 +1831,14 @@ dependencies = [ name = "quartz-enclave" version = "0.1.0" dependencies = [ + "clap", + "color-eyre", "prost", "quartz-proto", + "serde", + "serde_json", + "tendermint", + "tendermint-light-client", "tokio", "tonic", ] diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index bfdcdf3..815fecd 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -4,7 +4,13 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.1.8", features = ["derive"] } +color-eyre = "0.6.2" prost = "0.12" +tendermint = "0.34.0" +tendermint-light-client = "0.34.0" +serde = { version = "1.0.189", features = ["derive"] } +serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs new file mode 100644 index 0000000..bb618ac --- /dev/null +++ b/enclaves/quartz/src/cli.rs @@ -0,0 +1,56 @@ +use std::net::SocketAddr; + +use clap::Parser; +use color_eyre::eyre::{eyre, Result}; +use tendermint::Hash; +use tendermint_light_client::types::{Height, TrustThreshold}; + +fn parse_trust_threshold(s: &str) -> Result { + if let Some((l, r)) = s.split_once('/') { + TrustThreshold::new(l.parse()?, r.parse()?).map_err(Into::into) + } else { + Err(eyre!( + "invalid trust threshold: {s}, format must be X/Y where X and Y are integers" + )) + } +} + +#[derive(Debug, Parser)] +#[command(author, version, about, long_about = None)] +pub struct Cli { + /// RPC server address + #[clap(long, default_value = "127.0.0.1:11090")] + pub rpc_addr: SocketAddr, + + /// Identifier of the chain + #[clap(long)] + pub chain_id: String, + + /// Height of the header to verify + #[clap(long)] + pub target_height: Height, + + /// Height of the trusted header (AKA root-of-trust) + #[clap(long)] + pub trusted_height: Height, + + /// Hash of the trusted header (AKA root-of-trust) + #[clap(long)] + pub trusted_hash: Hash, + + /// Trust threshold + #[clap(long, value_parser = parse_trust_threshold, default_value_t = TrustThreshold::TWO_THIRDS)] + pub trust_threshold: TrustThreshold, + + /// Trusting period, in seconds (default: two weeks) + #[clap(long, default_value = "1209600")] + pub trusting_period: u64, + + /// Maximum clock drift, in seconds + #[clap(long, default_value = "5")] + pub max_clock_drift: u64, + + /// Maximum block lag, in seconds + #[clap(long, default_value = "5")] + pub max_block_lag: u64, +} diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 8f8bfe0..64b04b8 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -14,21 +14,39 @@ unused_qualifications )] +mod cli; mod server; +use std::time::Duration; + +use clap::Parser; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::server::CoreService; +use crate::{ + cli::Cli, + server::{Config, CoreService, LightClientOpts}, +}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { - let addr = "127.0.0.1:11090".parse()?; - let core_service = CoreService::default(); + let args = Cli::parse(); + + let light_client_opts = LightClientOpts::new( + args.chain_id, + args.target_height, + args.trusted_height, + args.trusted_hash, + args.trust_threshold, + args.trusting_period, + args.max_clock_drift, + args.max_block_lag, + ); + let config = Config::new(Duration::from_secs(30 * 24 * 60), light_client_opts); Server::builder() - .add_service(CoreServer::new(core_service)) - .serve(addr) + .add_service(CoreServer::new(CoreService(config))) + .serve(args.rpc_addr) .await?; Ok(()) diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 14934f0..57e05b7 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,11 +1,16 @@ +use std::time::Duration; + use quartz_proto::quartz::{ core_server::Core, InstantiateRequest, InstantiateResponse, SessionCreateRequest, SessionCreateResponse, }; +use serde::{Deserialize, Serialize}; +use tendermint::Hash; +use tendermint_light_client::types::{Height, TrustThreshold}; use tonic::{Request, Response, Status}; -#[derive(Debug, Default)] -pub struct CoreService; +#[derive(Clone, Debug)] +pub struct CoreService(pub Config); #[tonic::async_trait] impl Core for CoreService { @@ -34,3 +39,55 @@ impl Core for CoreService { Ok(Response::new(reply)) } } + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct Config { + epoch_duration: Duration, + light_client_opts: LightClientOpts, +} + +impl Config { + pub fn new(epoch_duration: Duration, light_client_opts: LightClientOpts) -> Self { + Self { + epoch_duration, + light_client_opts, + } + } +} + +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct LightClientOpts { + chain_id: String, + target_height: Height, + trusted_height: Height, + trusted_hash: Hash, + trust_threshold: TrustThreshold, + trusting_period: u64, + max_clock_drift: u64, + max_block_lag: u64, +} + +impl LightClientOpts { + #[allow(clippy::too_many_arguments)] + pub fn new( + chain_id: String, + target_height: Height, + trusted_height: Height, + trusted_hash: Hash, + trust_threshold: TrustThreshold, + trusting_period: u64, + max_clock_drift: u64, + max_block_lag: u64, + ) -> Self { + Self { + chain_id, + target_height, + trusted_height, + trusted_hash, + trust_threshold, + trusting_period, + max_clock_drift, + max_block_lag, + } + } +} From d10edd75bc3617191aa9e6bcf7d37d4b3490a94a Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 12:48:56 -0800 Subject: [PATCH 12/49] Add MRENCLAVE to CLI args --- enclaves/quartz/Cargo.toml | 3 +++ enclaves/quartz/src/cli.rs | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 815fecd..2b6ccf3 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" [dependencies] clap = { version = "4.1.8", features = ["derive"] } color-eyre = "0.6.2" +cosmwasm-std = "1.4.0" prost = "0.12" tendermint = "0.34.0" tendermint-light-client = "0.34.0" @@ -15,3 +16,5 @@ tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } quartz-proto = { path = "../../utils/quartz-proto" } +quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs index bb618ac..6868973 100644 --- a/enclaves/quartz/src/cli.rs +++ b/enclaves/quartz/src/cli.rs @@ -2,6 +2,8 @@ use std::net::SocketAddr; use clap::Parser; use color_eyre::eyre::{eyre, Result}; +use cosmwasm_std::HexBinary; +use quartz_cw::state::MrEnclave; use tendermint::Hash; use tendermint_light_client::types::{Height, TrustThreshold}; @@ -15,6 +17,11 @@ fn parse_trust_threshold(s: &str) -> Result { } } +fn parse_mr_enclave(s: &str) -> Result { + Ok(HexBinary::from_hex(s)?.to_array()?) +} + + #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] pub struct Cli { @@ -22,6 +29,10 @@ pub struct Cli { #[clap(long, default_value = "127.0.0.1:11090")] pub rpc_addr: SocketAddr, + /// MRENCLAVE of this enclave + #[clap(long, value_parser = parse_mr_enclave)] + pub mr_enclave: MrEnclave, + /// Identifier of the chain #[clap(long)] pub chain_id: String, From d2e8c612f4eb50ac0d7d8f0817cf6ad5b69275e0 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 12:49:19 -0800 Subject: [PATCH 13/49] Domain types --- enclaves/quartz/src/main.rs | 1 + enclaves/quartz/src/types.rs | 58 ++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 enclaves/quartz/src/types.rs diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 64b04b8..56df9a8 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -16,6 +16,7 @@ mod cli; mod server; +mod types; use std::time::Duration; diff --git a/enclaves/quartz/src/types.rs b/enclaves/quartz/src/types.rs new file mode 100644 index 0000000..e341e59 --- /dev/null +++ b/enclaves/quartz/src/types.rs @@ -0,0 +1,58 @@ +use cosmwasm_std::{HexBinary, StdError}; +use quartz_cw::state::{Config, RawConfig}; +use quartz_proto::quartz::InstantiateResponse as RawInstantiateResponse; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq)] +pub struct InstantiateResponse { + message: InstantiateResponseMsg, +} + +impl InstantiateResponse { + pub fn new(config: Config, quote: Vec) -> Self { + Self { + message: InstantiateResponseMsg { config, quote }, + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct InstantiateResponseMsg { + config: Config, + quote: Vec, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct RawInstantiateResponseMsg { + config: RawConfig, + quote: HexBinary, +} + +impl TryFrom for InstantiateResponseMsg { + type Error = StdError; + + fn try_from(value: RawInstantiateResponseMsg) -> Result { + Ok(Self { + config: value.config.try_into()?, + quote: value.quote.into(), + }) + } +} + +impl From for RawInstantiateResponseMsg { + fn from(value: InstantiateResponseMsg) -> Self { + Self { + config: value.config.into(), + quote: value.quote.into(), + } + } +} + +impl From for RawInstantiateResponse { + fn from(value: InstantiateResponse) -> Self { + let raw_message: RawInstantiateResponseMsg = value.message.into(); + Self { + message: serde_json::to_string(&raw_message).expect("infallible serializer"), + } + } +} From 092c221d483d6ad0cb59330fa3b5e8ef3483a865 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 12:51:20 -0800 Subject: [PATCH 14/49] Use config from quartz-cw crate --- enclaves/quartz/src/main.rs | 14 ++++--- enclaves/quartz/src/server.rs | 69 ++++++++++------------------------- 2 files changed, 27 insertions(+), 56 deletions(-) diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 56df9a8..5441d91 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -21,13 +21,11 @@ mod types; use std::time::Duration; use clap::Parser; +use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{ - cli::Cli, - server::{Config, CoreService, LightClientOpts}, -}; +use crate::{cli::Cli, server::CoreService}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { @@ -43,10 +41,14 @@ async fn main() -> Result<(), Box> { args.max_clock_drift, args.max_block_lag, ); - let config = Config::new(Duration::from_secs(30 * 24 * 60), light_client_opts); + let config = Config::new( + args.mr_enclave, + Duration::from_secs(30 * 24 * 60), + light_client_opts, + ); Server::builder() - .add_service(CoreServer::new(CoreService(config))) + .add_service(CoreServer::new(CoreService::new(config))) .serve(args.rpc_addr) .await?; diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 57e05b7..bfc2025 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,5 +1,9 @@ use std::time::Duration; +use quartz_cw::{ + msg::{execute::attested::HasUserData, instantiate::CoreInstantiate}, + state::{Config, UserData}, +}; use quartz_proto::quartz::{ core_server::Core, InstantiateRequest, InstantiateResponse, SessionCreateRequest, SessionCreateResponse, @@ -10,7 +14,15 @@ use tendermint_light_client::types::{Height, TrustThreshold}; use tonic::{Request, Response, Status}; #[derive(Clone, Debug)] -pub struct CoreService(pub Config); +pub struct CoreService { + config: Config, +} + +impl CoreService { + pub fn new(config: Config) -> Self { + Self { config } + } +} #[tonic::async_trait] impl Core for CoreService { @@ -40,54 +52,11 @@ impl Core for CoreService { } } -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct Config { - epoch_duration: Duration, - light_client_opts: LightClientOpts, -} +pub fn attestion_quote(user_data: UserData) -> IoResult> { + let mut user_report_data = File::create("/dev/attestation/user_report_data")?; + user_report_data.write_all(user_data.as_slice())?; + user_report_data.flush()?; -impl Config { - pub fn new(epoch_duration: Duration, light_client_opts: LightClientOpts) -> Self { - Self { - epoch_duration, - light_client_opts, - } - } -} - -#[derive(Clone, Debug, Serialize, Deserialize)] -pub struct LightClientOpts { - chain_id: String, - target_height: Height, - trusted_height: Height, - trusted_hash: Hash, - trust_threshold: TrustThreshold, - trusting_period: u64, - max_clock_drift: u64, - max_block_lag: u64, -} - -impl LightClientOpts { - #[allow(clippy::too_many_arguments)] - pub fn new( - chain_id: String, - target_height: Height, - trusted_height: Height, - trusted_hash: Hash, - trust_threshold: TrustThreshold, - trusting_period: u64, - max_clock_drift: u64, - max_block_lag: u64, - ) -> Self { - Self { - chain_id, - target_height, - trusted_height, - trusted_hash, - trust_threshold, - trusting_period, - max_clock_drift, - max_block_lag, - } - } + let quote = read("/dev/attestation/quote")?; + Ok(quote) } From 089b1eac4df32feba230ff99e277a84203524033 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 12:51:55 -0800 Subject: [PATCH 15/49] Impl instantiate handler correctly --- enclaves/quartz/src/server.rs | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index bfc2025..600f546 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,18 +1,22 @@ -use std::time::Duration; +use std::{ + fs::{read, File}, + io::{Result as IoResult, Write}, +}; use quartz_cw::{ msg::{execute::attested::HasUserData, instantiate::CoreInstantiate}, state::{Config, UserData}, }; use quartz_proto::quartz::{ - core_server::Core, InstantiateRequest, InstantiateResponse, SessionCreateRequest, - SessionCreateResponse, + core_server::Core, InstantiateRequest as RawInstantiateRequest, + InstantiateResponse as RawInstantiateResponse, SessionCreateRequest, SessionCreateResponse, }; -use serde::{Deserialize, Serialize}; -use tendermint::Hash; -use tendermint_light_client::types::{Height, TrustThreshold}; use tonic::{Request, Response, Status}; +use crate::types::InstantiateResponse; + +type TonicResult = Result; + #[derive(Clone, Debug)] pub struct CoreService { config: Config, @@ -28,20 +32,20 @@ impl CoreService { impl Core for CoreService { async fn instantiate( &self, - request: Request, - ) -> Result, Status> { - println!("Got a request: {:?}", request); + _request: Request, + ) -> TonicResult> { + let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); - let reply = InstantiateResponse { - message: "Hello!".to_string(), - }; + let user_data = core_instantiate_msg.user_data(); + let quote = attestion_quote(user_data).map_err(|e| Status::internal(e.to_string()))?; - Ok(Response::new(reply)) + let response = InstantiateResponse::new(self.config.clone(), quote); + Ok(Response::new(response.into())) } async fn session_create( &self, request: Request, - ) -> Result, Status> { + ) -> TonicResult> { println!("Got a request: {:?}", request); let reply = SessionCreateResponse { From aa32b7798a35a0f78fe93964e5c1db2d0dd00bfc Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:26:43 -0800 Subject: [PATCH 16/49] Remove target height from config --- enclaves/quartz/src/cli.rs | 4 ---- enclaves/quartz/src/main.rs | 1 - 2 files changed, 5 deletions(-) diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs index 6868973..de87ea8 100644 --- a/enclaves/quartz/src/cli.rs +++ b/enclaves/quartz/src/cli.rs @@ -37,10 +37,6 @@ pub struct Cli { #[clap(long)] pub chain_id: String, - /// Height of the header to verify - #[clap(long)] - pub target_height: Height, - /// Height of the trusted header (AKA root-of-trust) #[clap(long)] pub trusted_height: Height, diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 5441d91..89c8839 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -33,7 +33,6 @@ async fn main() -> Result<(), Box> { let light_client_opts = LightClientOpts::new( args.chain_id, - args.target_height, args.trusted_height, args.trusted_hash, args.trust_threshold, From 83ef846afa7b9b4915fd98f77191e07e84ecfb27 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:27:29 -0800 Subject: [PATCH 17/49] Move domain types to relayer --- enclaves/quartz/src/server.rs | 3 +- enclaves/quartz/src/types.rs | 58 ------------------------ utils/quartz-relayer/Cargo.toml | 5 +++ utils/quartz-relayer/src/lib.rs | 1 + utils/quartz-relayer/src/types.rs | 74 +++++++++++++++++++++++++++++++ 5 files changed, 81 insertions(+), 60 deletions(-) create mode 100644 utils/quartz-relayer/src/lib.rs create mode 100644 utils/quartz-relayer/src/types.rs diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 600f546..e8d924c 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -11,10 +11,9 @@ use quartz_proto::quartz::{ core_server::Core, InstantiateRequest as RawInstantiateRequest, InstantiateResponse as RawInstantiateResponse, SessionCreateRequest, SessionCreateResponse, }; +use quartz_relayer::types::InstantiateResponse; use tonic::{Request, Response, Status}; -use crate::types::InstantiateResponse; - type TonicResult = Result; #[derive(Clone, Debug)] diff --git a/enclaves/quartz/src/types.rs b/enclaves/quartz/src/types.rs index e341e59..e69de29 100644 --- a/enclaves/quartz/src/types.rs +++ b/enclaves/quartz/src/types.rs @@ -1,58 +0,0 @@ -use cosmwasm_std::{HexBinary, StdError}; -use quartz_cw::state::{Config, RawConfig}; -use quartz_proto::quartz::InstantiateResponse as RawInstantiateResponse; -use serde::{Deserialize, Serialize}; - -#[derive(Clone, Debug, PartialEq)] -pub struct InstantiateResponse { - message: InstantiateResponseMsg, -} - -impl InstantiateResponse { - pub fn new(config: Config, quote: Vec) -> Self { - Self { - message: InstantiateResponseMsg { config, quote }, - } - } -} - -#[derive(Clone, Debug, PartialEq)] -pub struct InstantiateResponseMsg { - config: Config, - quote: Vec, -} - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub struct RawInstantiateResponseMsg { - config: RawConfig, - quote: HexBinary, -} - -impl TryFrom for InstantiateResponseMsg { - type Error = StdError; - - fn try_from(value: RawInstantiateResponseMsg) -> Result { - Ok(Self { - config: value.config.try_into()?, - quote: value.quote.into(), - }) - } -} - -impl From for RawInstantiateResponseMsg { - fn from(value: InstantiateResponseMsg) -> Self { - Self { - config: value.config.into(), - quote: value.quote.into(), - } - } -} - -impl From for RawInstantiateResponse { - fn from(value: InstantiateResponse) -> Self { - let raw_message: RawInstantiateResponseMsg = value.message.into(); - Self { - message: serde_json::to_string(&raw_message).expect("infallible serializer"), - } - } -} diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index a5523e0..1bf6c0f 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -4,7 +4,12 @@ version = "0.1.0" edition = "2021" [dependencies] +clap = { version = "4.1.8", features = ["derive"] } +cosmwasm-std = "1.4.0" +serde = { version = "1.0.189", features = ["derive"] } +serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } +quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } quartz-proto = { path = "../../utils/quartz-proto" } diff --git a/utils/quartz-relayer/src/lib.rs b/utils/quartz-relayer/src/lib.rs new file mode 100644 index 0000000..cd40856 --- /dev/null +++ b/utils/quartz-relayer/src/lib.rs @@ -0,0 +1 @@ +pub mod types; diff --git a/utils/quartz-relayer/src/types.rs b/utils/quartz-relayer/src/types.rs new file mode 100644 index 0000000..354d56e --- /dev/null +++ b/utils/quartz-relayer/src/types.rs @@ -0,0 +1,74 @@ +use cosmwasm_std::{HexBinary, StdError}; +use quartz_cw::state::{Config, RawConfig}; +use quartz_proto::quartz::InstantiateResponse as RawInstantiateResponse; +use serde::{Deserialize, Serialize}; + +#[derive(Clone, Debug, PartialEq)] +pub struct InstantiateResponse { + message: InstantiateResponseMsg, +} + +impl InstantiateResponse { + pub fn new(config: Config, quote: Vec) -> Self { + Self { + message: InstantiateResponseMsg { config, quote }, + } + } + + pub fn quote(&self) -> &[u8] { + &self.message.quote + } +} + +impl TryFrom for InstantiateResponse { + type Error = StdError; + + fn try_from(value: RawInstantiateResponse) -> Result { + let raw_message: RawInstantiateResponseMsg = serde_json::from_str(&value.message) + .map_err(|e| StdError::parse_err("RawInstantiateResponseMsg", e))?; + Ok(Self { + message: raw_message.try_into()?, + }) + } +} + +impl From for RawInstantiateResponse { + fn from(value: InstantiateResponse) -> Self { + let raw_message: RawInstantiateResponseMsg = value.message.into(); + Self { + message: serde_json::to_string(&raw_message).expect("infallible serializer"), + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct InstantiateResponseMsg { + config: Config, + quote: Vec, +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct RawInstantiateResponseMsg { + config: RawConfig, + quote: HexBinary, +} + +impl TryFrom for InstantiateResponseMsg { + type Error = StdError; + + fn try_from(value: RawInstantiateResponseMsg) -> Result { + Ok(Self { + config: value.config.try_into()?, + quote: value.quote.into(), + }) + } +} + +impl From for RawInstantiateResponseMsg { + fn from(value: InstantiateResponseMsg) -> Self { + Self { + config: value.config.into(), + quote: value.quote.into(), + } + } +} From 4f6bcde8654b69227cb51998d5e1cad3f07c6b4a Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:27:51 -0800 Subject: [PATCH 18/49] Update README.md to add CLI usage --- enclaves/quartz/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 44773ac..98a849d 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -1,5 +1,7 @@ ## Quartz enclave +### Enclave usage + ```bash docker build . --tag quartz docker run -it \ @@ -11,3 +13,12 @@ docker run -it \ is-sgx-available gramine-sgx ./quartz ``` + +### CLI usage + +```bash +cargo run -- --chain-id testing \ + --mr-enclave "fa9149158c693b09e83480b48c2e7344c941aadca6d5829834f2af9f2690435e" \ + --trusted-height 1 \ + --trusted-hash "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869" +``` From 5f11d004b08a14ff49b407d1515d587d929105ca Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:28:52 -0800 Subject: [PATCH 19/49] CLI for relayer --- utils/quartz-relayer/src/cli.rs | 10 ++++++++++ utils/quartz-relayer/src/main.rs | 20 +++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) create mode 100644 utils/quartz-relayer/src/cli.rs diff --git a/utils/quartz-relayer/src/cli.rs b/utils/quartz-relayer/src/cli.rs new file mode 100644 index 0000000..24c2bb0 --- /dev/null +++ b/utils/quartz-relayer/src/cli.rs @@ -0,0 +1,10 @@ +use clap::Parser; +use tonic::transport::Endpoint; + +#[derive(Debug, Parser)] +#[command(author, version, about, long_about = None)] +pub struct Cli { + /// RPC server address + #[clap(long, default_value = "http://localhost:11090")] + pub enclave_addr: Endpoint, +} diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index 37cb9e2..c46bc49 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -1,13 +1,23 @@ -use quartz_proto::quartz::{core_client::CoreClient, SessionCreateRequest}; +mod cli; + +use std::{fs::File, io::Write}; + +use clap::Parser; +use quartz_proto::quartz::{core_client::CoreClient, InstantiateRequest}; +use quartz_relayer::types::InstantiateResponse; + +use crate::{cli::Cli}; #[tokio::main] async fn main() -> Result<(), Box> { - let mut client = CoreClient::connect("http://localhost:11090").await?; + let args = Cli::parse(); - let request = tonic::Request::new(SessionCreateRequest {}); + let mut client = CoreClient::connect(args.enclave_addr).await?; + let response = client.instantiate(InstantiateRequest {}).await?; + let response: InstantiateResponse = response.into_inner().try_into()?; - let response = client.session_create(request).await?; - println!("{:?}", response.into_inner()); + let mut quote_file = File::create("test.quote")?; + quote_file.write_all(response.quote())?; Ok(()) } From c31b1c8e69b2d29a8347a78a928f82573dc64a35 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:29:14 -0800 Subject: [PATCH 20/49] Update Cargo.lock --- Cargo.lock | 710 ++++++++++++++++++++++++++---------- enclaves/quartz/Cargo.toml | 3 +- enclaves/quartz/src/cli.rs | 1 - enclaves/quartz/src/main.rs | 1 - 4 files changed, 521 insertions(+), 194 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c14f1d5..2f13a70 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -29,9 +29,9 @@ dependencies = [ [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if 1.0.0", "cipher", @@ -52,6 +52,17 @@ dependencies = [ "subtle", ] +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + [[package]] name = "aho-corasick" version = "1.1.2" @@ -63,9 +74,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.5" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -77,9 +88,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -111,9 +122,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.79" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arrayref" @@ -121,6 +132,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + [[package]] name = "async-stream" version = "0.3.5" @@ -140,7 +157,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -151,7 +168,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -234,9 +251,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79fed4cdb43e993fcdadc7e58a09fd0e3e649c4436fa11da71c9f1f3ee7feb9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64ct" @@ -244,6 +261,12 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + [[package]] name = "bip32" version = "0.5.1" @@ -253,7 +276,7 @@ dependencies = [ "bs58", "hmac", "k256", - "rand_core", + "rand_core 0.6.4", "ripemd", "sha2 0.10.8", "subtle", @@ -272,6 +295,28 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" +[[package]] +name = "blake2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46502ad458c9a52b69d4d4d32775c788b7a1b85e8bc9d482d92250fc0e3f8efe" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "blake3" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0231f06152bf547e9c2b5194f247cd97aacf6dcd8b15d8e5ec0663f64580da87" +dependencies = [ + "arrayref", + "arrayvec", + "cc", + "cfg-if 1.0.0", + "constant_time_eq", +] + [[package]] name = "block-buffer" version = "0.9.0" @@ -290,6 +335,12 @@ dependencies = [ "generic-array", ] +[[package]] +name = "bnum" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" + [[package]] name = "bs58" version = "0.5.0" @@ -301,9 +352,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" [[package]] name = "byteorder" @@ -322,12 +373,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" [[package]] name = "cfg-if" @@ -343,9 +391,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b" dependencies = [ "num-traits", "serde", @@ -363,9 +411,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.14" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e92c5c1a78c62968ec57dbc2440366a2d6e5a23faf829970ff1585dc6b18e2" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -373,33 +421,33 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.14" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4323769dc8a61e2c39ad7dc26f6f2800524691a44d74fe3d1071a5c24db6370" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", "clap_lex", - "strsim", + "strsim 0.11.0", ] [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "color-eyre" @@ -440,6 +488,12 @@ version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +[[package]] +name = "constant_time_eq" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7144d30dcf0fafbce74250a3963025d8d52177934239851c917d29f1df280c2" + [[package]] name = "contracts" version = "0.6.3" @@ -489,7 +543,7 @@ dependencies = [ "ecdsa", "eyre", "k256", - "rand_core", + "rand_core 0.6.4", "serde", "serde_json", "signature", @@ -498,6 +552,75 @@ dependencies = [ "thiserror", ] +[[package]] +name = "cosmwasm-crypto" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ed6aa9f904de106fa16443ad14ec2abe75e94ba003bb61c681c0e43d4c58d2a" +dependencies = [ + "digest 0.10.7", + "ecdsa", + "ed25519-zebra", + "k256", + "rand_core 0.6.4", + "thiserror", +] + +[[package]] +name = "cosmwasm-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5e72e330bd3bdab11c52b5ecbdeb6a8697a004c57964caeb5d876f0b088b3c" +dependencies = [ + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-schema" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3e3a2136e2a60e8b6582f5dffca5d1a683ed77bf38537d330bc1dfccd69010" +dependencies = [ + "cosmwasm-schema-derive", + "schemars", + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "cosmwasm-schema-derive" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d803bea6bd9ed61bd1ee0b4a2eb09ee20dbb539cc6e0b8795614d20952ebb1" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "cosmwasm-std" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad011ae7447188e26e4a7dbca2fcd0fc186aa21ae5c86df0503ea44c78f9e469" +dependencies = [ + "base64 0.21.7", + "bech32", + "bnum", + "cosmwasm-crypto", + "cosmwasm-derive", + "derivative", + "forward_ref", + "hex", + "schemars", + "serde", + "serde-json-wasm", + "sha2 0.10.8", + "static_assertions", + "thiserror", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -541,7 +664,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" dependencies = [ "generic-array", - "rand_core", + "rand_core 0.6.4", "subtle", "zeroize", ] @@ -565,6 +688,19 @@ dependencies = [ "cipher", ] +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + [[package]] name = "curve25519-dalek-ng" version = "4.1.1" @@ -573,7 +709,7 @@ checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" dependencies = [ "byteorder", "digest 0.9.0", - "rand_core", + "rand_core 0.6.4", "subtle-ng", "zeroize", ] @@ -609,10 +745,21 @@ dependencies = [ ] [[package]] -name = "darling" -version = "0.20.3" +name = "cw-storage-plus" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "d5ff29294ee99373e2cd5fd21786a3c0ced99a52fec2ca347d565489c61b723c" +dependencies = [ + "cosmwasm-std", + "schemars", + "serde", +] + +[[package]] +name = "darling" +version = "0.20.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a5d17510e4a1a87f323de70b7b1eaac1ee0e37866c6720b2d279452d0edf389" dependencies = [ "darling_core", "darling_macro", @@ -620,27 +767,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "a98eea36a7ff910fa751413d0895551143a8ea41d695d9798ec7d665df7f7f5e" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", - "strsim", - "syn 2.0.48", + "strsim 0.10.0", + "syn 2.0.50", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "d6a366a3f90c5d59a4b91169775f88e52e8f71a0e7804cc98a8db2932cf4ed57" dependencies = [ "darling_core", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -663,6 +810,17 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.17" @@ -703,9 +861,15 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] +[[package]] +name = "dyn-clone" +version = "1.0.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" + [[package]] name = "ecdsa" version = "0.16.9" @@ -732,7 +896,7 @@ dependencies = [ "libsecp256k1", "once_cell", "parking_lot", - "rand_core", + "rand_core 0.6.4", "sha2 0.10.8", "typenum", "wasm-bindgen", @@ -756,16 +920,31 @@ checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" dependencies = [ "curve25519-dalek-ng", "hex", - "rand_core", + "rand_core 0.6.4", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "serde", "sha2 0.9.9", "zeroize", ] [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "elliptic-curve" @@ -780,7 +959,7 @@ dependencies = [ "generic-array", "group", "pkcs8", - "rand_core", + "rand_core 0.6.4", "sec1", "subtle", "zeroize", @@ -813,9 +992,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.11" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -833,7 +1012,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" dependencies = [ - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -868,6 +1047,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "forward_ref" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8cbd1169bd7b4a0a20d92b9af7a7e0422888bd38a6f5ec29c1fd8c1558a272e" + [[package]] name = "futures" version = "0.3.30" @@ -924,7 +1109,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1004,7 +1189,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ "ff", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -1020,7 +1205,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 2.1.0", + "indexmap 2.2.3", "slab", "tokio", "tokio-util", @@ -1038,6 +1223,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash", +] [[package]] name = "hashbrown" @@ -1053,9 +1241,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -1063,6 +1251,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + [[package]] name = "hkdf" version = "0.12.4" @@ -1176,11 +1370,13 @@ dependencies = [ [[package]] name = "ics23" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "661e2d6f79952a65bc92b1c81f639ebd37228dae6ff412a5aba7d474bdc4b957" +checksum = "dc3b8be84e7285c73b88effdc3294b552277d6b0ec728ee016c861b7b9a2c19c" dependencies = [ "anyhow", + "blake2", + "blake3", "bytes", "hex", "prost", @@ -1223,9 +1419,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown 0.14.3", @@ -1263,9 +1459,9 @@ checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -1279,14 +1475,16 @@ dependencies = [ "cfg-if 1.0.0", "ecdsa", "elliptic-curve", + "once_cell", "sha2 0.10.8", + "signature", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -1323,9 +1521,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1435,9 +1633,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -1487,6 +1685,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-bigint-dig" version = "0.8.4" @@ -1505,6 +1714,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-derive" version = "0.3.3" @@ -1518,19 +1733,18 @@ dependencies = [ [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", "num-integer", @@ -1539,9 +1753,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -1674,27 +1888,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1761,14 +1975,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -1800,7 +2014,7 @@ dependencies = [ "prost", "prost-types", "regex", - "syn 2.0.48", + "syn 2.0.50", "tempfile", "which", ] @@ -1815,7 +2029,7 @@ dependencies = [ "itertools", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -1827,14 +2041,35 @@ dependencies = [ "prost", ] +[[package]] +name = "quartz-cw" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "k256", + "quartz-tee-ra 0.1.0", + "serde", + "serde_json", + "sha2 0.10.8", + "tendermint", + "tendermint-light-client", + "thiserror", +] + [[package]] name = "quartz-enclave" version = "0.1.0" dependencies = [ "clap", "color-eyre", + "cosmwasm-std", "prost", + "quartz-cw", "quartz-proto", + "quartz-relayer", + "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", "serde", "serde_json", "tendermint", @@ -1856,11 +2091,43 @@ dependencies = [ name = "quartz-relayer" version = "0.1.0" dependencies = [ + "clap", + "cosmwasm-std", + "quartz-cw", "quartz-proto", + "serde", + "serde_json", "tokio", "tonic", ] +[[package]] +name = "quartz-tee-ra" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "hex-literal", + "num-bigint", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + +[[package]] +name = "quartz-tee-ra" +version = "0.1.0" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#d3903031823af4bc870a8fa42f633f9f414850c2" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "hex-literal", + "num-bigint", + "serde_json", + "sha2 0.10.8", + "thiserror", +] + [[package]] name = "quote" version = "1.0.35" @@ -1878,7 +2145,7 @@ checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -1888,9 +2155,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", ] +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + [[package]] name = "rand_core" version = "0.6.4" @@ -1911,13 +2184,13 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -1932,9 +2205,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1955,11 +2228,11 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.23" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -1982,6 +2255,7 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-rustls", @@ -2005,16 +2279,17 @@ dependencies = [ [[package]] name = "ring" -version = "0.17.7" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", + "cfg-if 1.0.0", "getrandom", "libc", "spin 0.9.8", "untrusted", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2039,7 +2314,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "serde", "signature", "spki", @@ -2107,7 +2382,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", ] [[package]] @@ -2128,9 +2403,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "same-file" @@ -2150,6 +2425,30 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "schemars" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45a28f4c49489add4ce10783f7911893516f15afe45d015608d41faca6bc4d29" +dependencies = [ + "dyn-clone", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c767fd6fa65d9ccf9cf026122c1b555f2ef9a4f0cea69da4d7dbc3e258d30967" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 1.0.109", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2205,19 +2504,28 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] +[[package]] +name = "serde-json-wasm" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e9213a07d53faa0b8dd81e767a54a8188a242fdb9be99ab75ec576a774bfdd7" +dependencies = [ + "serde", +] + [[package]] name = "serde_bytes" version = "0.11.14" @@ -2239,20 +2547,31 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", +] + +[[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 1.0.109", ] [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2267,7 +2586,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2284,14 +2603,15 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.6", + "base64 0.21.7", "chrono", "hex", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -2299,14 +2619,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2368,7 +2688,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest 0.10.7", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -2382,9 +2702,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -2430,6 +2750,12 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +[[package]] +name = "strsim" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" + [[package]] name = "subtle" version = "2.5.0" @@ -2464,9 +2790,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.48" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2638,9 +2964,9 @@ dependencies = [ [[package]] name = "tendermint-proto" -version = "0.34.0" +version = "0.34.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc728a4f9e891d71adf66af6ecaece146f9c7a11312288a3107b3e1d6979aaf" +checksum = "b797dd3d2beaaee91d2f065e7bdf239dc8d80bba4a183a288bc1279dd5a69a1e" dependencies = [ "bytes", "flex-error", @@ -2688,29 +3014,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ "cfg-if 1.0.0", "once_cell", @@ -2718,11 +3044,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", + "num-conv", "powerfmt", "serde", "time-core", @@ -2737,10 +3064,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -2805,9 +3133,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -2840,7 +3168,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2896,7 +3224,7 @@ dependencies = [ "async-stream", "async-trait", "axum", - "base64 0.21.6", + "base64 0.21.7", "bytes", "h2", "http", @@ -2924,7 +3252,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -2978,7 +3306,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] [[package]] @@ -3044,9 +3372,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -3056,9 +3384,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" dependencies = [ "tinyvec", ] @@ -3141,9 +3469,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if 1.0.0", "wasm-bindgen-macro", @@ -3151,24 +3479,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if 1.0.0", "js-sys", @@ -3178,9 +3506,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3188,28 +3516,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -3273,7 +3601,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.3", ] [[package]] @@ -3293,17 +3621,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", ] [[package]] @@ -3314,9 +3642,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" [[package]] name = "windows_aarch64_msvc" @@ -3326,9 +3654,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" [[package]] name = "windows_i686_gnu" @@ -3338,9 +3666,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" [[package]] name = "windows_i686_msvc" @@ -3350,9 +3678,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" [[package]] name = "windows_x86_64_gnu" @@ -3362,9 +3690,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" [[package]] name = "windows_x86_64_gnullvm" @@ -3374,9 +3702,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" [[package]] name = "windows_x86_64_msvc" @@ -3386,9 +3714,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" [[package]] name = "winreg" @@ -3417,5 +3745,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.48", + "syn 2.0.50", ] diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 2b6ccf3..0714bb4 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -15,6 +15,7 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-proto = { path = "../../utils/quartz-proto" } quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-proto = { path = "../../utils/quartz-proto" } +quartz-relayer = { path = "../../utils/quartz-relayer" } quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs index de87ea8..65c5484 100644 --- a/enclaves/quartz/src/cli.rs +++ b/enclaves/quartz/src/cli.rs @@ -21,7 +21,6 @@ fn parse_mr_enclave(s: &str) -> Result { Ok(HexBinary::from_hex(s)?.to_array()?) } - #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] pub struct Cli { diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 89c8839..d1e47e1 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -16,7 +16,6 @@ mod cli; mod server; -mod types; use std::time::Duration; From f7acb4629b44dcd6b9cecfc50804477c7d37cc75 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Fri, 23 Feb 2024 14:49:21 -0800 Subject: [PATCH 21/49] WIP gramine-sgx-ias-request --- enclaves/quartz/src/server.rs | 9 ++++++--- utils/quartz-relayer/src/main.rs | 18 ++++++++++++++++++ 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index e8d924c..e56aa09 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -3,6 +3,7 @@ use std::{ io::{Result as IoResult, Write}, }; +use cosmwasm_std::HexBinary; use quartz_cw::{ msg::{execute::attested::HasUserData, instantiate::CoreInstantiate}, state::{Config, UserData}, @@ -33,10 +34,12 @@ impl Core for CoreService { &self, _request: Request, ) -> TonicResult> { - let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); + // let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); - let user_data = core_instantiate_msg.user_data(); - let quote = attestion_quote(user_data).map_err(|e| Status::internal(e.to_string()))?; + // let user_data = core_instantiate_msg.user_data(); + // let quote = attestion_quote(user_data).map_err(|e| Status::internal(e.to_string()))?; + + let quote = HexBinary::from_hex("03000200000000000a000f00939a7233f79c4ca9940a0db3957f0607ce48836fd48a951172fe155220a719bd0000000014140207018001000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000700000000000000dc43f8c42d8e5f52c8bbd68f426242153f0be10630ff8cca255129a3ca03d27300000000000000000000000000000000000000000000000000000000000000001cf2e52911410fbf3f199056a98d58795a559a2e800933f7fcd13d048462271c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009113b0be77ed5d0d68680ec77206b8d587ed40679b71321ccdd5405e4d54a68200000000000000000000000000000000000000000000000000000000000000004410000091b1361bf167764045c3cc0e702ef50938c0417e5863380fb0ddbcaa803627d5b168f38bffbd00893f2ed842ebf744137c65b2c6161eb81237cd43d4ed420206be6177e039634cfbca4739ac246fda7df8c312a98f30f57b63f3c8921fce51d90a93031f97f769637be9b028e7b007a4e458d4fa717befbd81b06905082580131414020701800100000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000070000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0f056c5355f6c770413938c2a41ed1b5c34ecb35f85fa539f16cca7a30d6da90000000000000000000000000000000000000000000000000000000000000000a67269ee80d0dfc26e9bbcf5525ec6a7bf3f4a4092e0a6dd1bf2053962dbb49c59af50a49e784ea3c7e57cd669a9c0e6bc51e04dcc5582393c6393168846cf7e2000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500dc0d00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949456a544343424453674177494241674956414a5172493559365a78484836785034424941715a4e6b326e4c7a594d416f4743437147534d343942414d430a4d484578497a416842674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a4165467730794d7a45784d5441784e7a45334d4452614677307a4d4445784d5441784e7a45330a4d4452614d484178496a416742674e5642414d4d47556c756447567349464e4857434251513073675132567964476c6d61574e6864475578476a415942674e560a42416f4d45556c756447567349454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b470a413155454341774351304578437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741450a77625468574d583134443163657835317875614958456771517a69636e744b7a48454a32536f31336e384a427050314a67383673764263462f7070715a554e710a68524b4642667469584c6d4f536c614955784e6e51364f434171677767674b6b4d42384741315564497751594d426141464e446f71747031312f6b75535265590a504873555a644456386c6c4e4d477747413155644877526c4d474d77596142666f463247573268306448427a4f693876595842704c6e527964584e305a57527a0a5a584a3261574e6c63793570626e526c6243356a62323076633264344c324e6c636e52705a6d6c6a5958527062323476646a517663474e7259334a7350324e680a5058427962324e6c63334e7663695a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464a57566e41395a63736f3753356b6a2f647a4a0a594f3034534175644d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949423141594a4b6f5a496876684e0a415130424249494278544343416345774867594b4b6f5a496876684e41513042415151514d6d5867725757774c59554164456d6c766c366153444343415751470a43697147534962345451454e41514977676746554d42414743797147534962345451454e41514942416745554d42414743797147534962345451454e415149430a416745554d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745454d42414743797147534962340a5451454e41514946416745424d42454743797147534962345451454e41514947416749416744415142677371686b69472b4530424451454342774942414441510a42677371686b69472b45304244514543434149424144415142677371686b69472b45304244514543435149424144415142677371686b69472b453042445145430a436749424144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69470a2b45304244514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b4530424451454344774942414441510a42677371686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b453042445145430a4567515146425143424147414141414141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b4530420a44514545424159416b473668414141774477594b4b6f5a496876684e4151304242516f424144414b42676771686b6a4f5051514441674e4841444245416942560a6e584667364277466a6945474230417162424e702b4b56734a477245744f4f49666e6f365450387031414967536c4430574e39595261575968346534656835330a314637434537664964724f55414c5177757632735948513d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436d444343416a36674177494241674956414e446f71747031312f6b7553526559504873555a644456386c6c4e4d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484578497a41680a42674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b4442464a626e526c0a6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e420a4d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424c39712b4e4d7032494f670a74646c31626b2f75575a352b5447516d38614369387a373866732b664b435133642b75447a586e56544154325a68444369667949754a77764e33774e427039690a484253534d4a4d4a72424f6a6762737767626777487759445652306a42426777466f4155496d554d316c71644e496e7a6737535655723951477a6b6e427177770a556759445652306642457377535442486f45576751345a426148523063484d364c79396a5a584a3061575a70593246305a584d7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253394a626e526c62464e4857464a76623352445153356b5a584977485159445652304f42425945464e446f0a71747031312f6b7553526559504873555a644456386c6c4e4d41344741315564447745422f77514541774942426a415342674e5648524d4241663845434441470a4151482f416745414d416f4743437147534d343942414d43413067414d4555434951434a6754627456714f795a316d336a716941584d365159613672357357530a34792f4737793875494a4778647749675271507642534b7a7a516167424c517135733541373070646f6961524a387a2f3075447a344e675639316b3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00").expect("harcoded hex").into(); let response = InstantiateResponse::new(self.config.clone(), quote); Ok(Response::new(response.into())) diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index c46bc49..a28948c 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -1,8 +1,11 @@ mod cli; use std::{fs::File, io::Write}; +use std::fs::read_to_string; +use std::process::Command; use clap::Parser; +use serde_json::json; use quartz_proto::quartz::{core_client::CoreClient, InstantiateRequest}; use quartz_relayer::types::InstantiateResponse; @@ -19,5 +22,20 @@ async fn main() -> Result<(), Box> { let mut quote_file = File::create("test.quote")?; quote_file.write_all(response.quote())?; + let gramine_sgx_ias_request_output = Command::new("gramine-sgx-ias-request") + .arg("report") + .args(["-g", "51CAF5A48B450D624AEFE3286D314894"]) + .args(["-k", "669244b3e6364b5888289a11d2a1726d"]) + .args(["-q", "test.quote"]) + .args(["-r", "datareport"]) + .args(["-s", "datareportsig"]) + .output()?; + println!("{gramine_sgx_ias_request_output:?}"); + + let report = read_to_string("datareport")?; + let report_sig = read_to_string("datareportsig")?; + let ias_report = json!({"report": report, "reportsig": report_sig}); + println!("{}", serde_json::to_string(&ias_report).expect("infallible serializer")); + Ok(()) } From cdd83e657df10eae23b497b5c394dc7669a7b792 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 02:56:55 -0800 Subject: [PATCH 22/49] Attestor abstraction --- enclaves/quartz/src/attestor.rs | 27 +++++++++++++++++ enclaves/quartz/src/main.rs | 5 ++-- enclaves/quartz/src/server.rs | 52 +++++++++++++-------------------- 3 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 enclaves/quartz/src/attestor.rs diff --git a/enclaves/quartz/src/attestor.rs b/enclaves/quartz/src/attestor.rs new file mode 100644 index 0000000..2402948 --- /dev/null +++ b/enclaves/quartz/src/attestor.rs @@ -0,0 +1,27 @@ +use std::{ + fs::{read, File}, + io::{Error as IoError, Write}, +}; + +use quartz_cw::msg::execute::attested::HasUserData; + +pub trait Attestor { + type Error: ToString; + + fn quote(&self, user_data: impl HasUserData) -> Result, Self::Error>; +} + +#[derive(Clone, PartialEq, Debug)] +pub struct EpidAttestor; + +impl Attestor for EpidAttestor { + type Error = IoError; + + fn quote(&self, user_data: impl HasUserData) -> Result, Self::Error> { + let user_data = user_data.user_data(); + let mut user_report_data = File::create("/dev/attestation/user_report_data")?; + user_report_data.write_all(user_data.as_slice())?; + user_report_data.flush()?; + read("/dev/attestation/quote") + } +} diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index d1e47e1..e04df30 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -14,6 +14,7 @@ unused_qualifications )] +mod attestor; mod cli; mod server; @@ -24,7 +25,7 @@ use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{cli::Cli, server::CoreService}; +use crate::{attestor::EpidAttestor, cli::Cli, server::CoreService}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { @@ -46,7 +47,7 @@ async fn main() -> Result<(), Box> { ); Server::builder() - .add_service(CoreServer::new(CoreService::new(config))) + .add_service(CoreServer::new(CoreService::new(config, EpidAttestor))) .serve(args.rpc_addr) .await?; diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index e56aa09..d53a852 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,13 +1,4 @@ -use std::{ - fs::{read, File}, - io::{Result as IoResult, Write}, -}; - -use cosmwasm_std::HexBinary; -use quartz_cw::{ - msg::{execute::attested::HasUserData, instantiate::CoreInstantiate}, - state::{Config, UserData}, -}; +use quartz_cw::{msg::instantiate::CoreInstantiate, state::Config}; use quartz_proto::quartz::{ core_server::Core, InstantiateRequest as RawInstantiateRequest, InstantiateResponse as RawInstantiateResponse, SessionCreateRequest, SessionCreateResponse, @@ -15,31 +6,39 @@ use quartz_proto::quartz::{ use quartz_relayer::types::InstantiateResponse; use tonic::{Request, Response, Status}; +use crate::attestor::Attestor; + type TonicResult = Result; -#[derive(Clone, Debug)] -pub struct CoreService { +#[derive(Clone, PartialEq, Debug)] +pub struct CoreService { config: Config, + attestor: A, } -impl CoreService { - pub fn new(config: Config) -> Self { - Self { config } +impl CoreService +where + A: Attestor, +{ + pub fn new(config: Config, attestor: A) -> Self { + Self { config, attestor } } } #[tonic::async_trait] -impl Core for CoreService { +impl Core for CoreService +where + A: Attestor + Send + Sync + 'static, +{ async fn instantiate( &self, _request: Request, ) -> TonicResult> { - // let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); - - // let user_data = core_instantiate_msg.user_data(); - // let quote = attestion_quote(user_data).map_err(|e| Status::internal(e.to_string()))?; - - let quote = HexBinary::from_hex("03000200000000000a000f00939a7233f79c4ca9940a0db3957f0607ce48836fd48a951172fe155220a719bd0000000014140207018001000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000700000000000000dc43f8c42d8e5f52c8bbd68f426242153f0be10630ff8cca255129a3ca03d27300000000000000000000000000000000000000000000000000000000000000001cf2e52911410fbf3f199056a98d58795a559a2e800933f7fcd13d048462271c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009113b0be77ed5d0d68680ec77206b8d587ed40679b71321ccdd5405e4d54a68200000000000000000000000000000000000000000000000000000000000000004410000091b1361bf167764045c3cc0e702ef50938c0417e5863380fb0ddbcaa803627d5b168f38bffbd00893f2ed842ebf744137c65b2c6161eb81237cd43d4ed420206be6177e039634cfbca4739ac246fda7df8c312a98f30f57b63f3c8921fce51d90a93031f97f769637be9b028e7b007a4e458d4fa717befbd81b06905082580131414020701800100000000000000000000000000000000000000000000000000000000000000000000000000000000001500000000000000070000000000000096b347a64e5a045e27369c26e6dcda51fd7c850e9b3a3a79e718f43261dee1e400000000000000000000000000000000000000000000000000000000000000008c4f5775d796503e96137f77c68a829a0056ac8ded70140b081b094490c57bff00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0f056c5355f6c770413938c2a41ed1b5c34ecb35f85fa539f16cca7a30d6da90000000000000000000000000000000000000000000000000000000000000000a67269ee80d0dfc26e9bbcf5525ec6a7bf3f4a4092e0a6dd1bf2053962dbb49c59af50a49e784ea3c7e57cd669a9c0e6bc51e04dcc5582393c6393168846cf7e2000000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f0500dc0d00002d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949456a544343424453674177494241674956414a5172493559365a78484836785034424941715a4e6b326e4c7a594d416f4743437147534d343942414d430a4d484578497a416842674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b0a4442464a626e526c6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e560a4241674d416b4e424d517377435159445651514745774a56557a4165467730794d7a45784d5441784e7a45334d4452614677307a4d4445784d5441784e7a45330a4d4452614d484178496a416742674e5642414d4d47556c756447567349464e4857434251513073675132567964476c6d61574e6864475578476a415942674e560a42416f4d45556c756447567349454e76636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b470a413155454341774351304578437a414a42674e5642415954416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a304441516344516741450a77625468574d583134443163657835317875614958456771517a69636e744b7a48454a32536f31336e384a427050314a67383673764263462f7070715a554e710a68524b4642667469584c6d4f536c614955784e6e51364f434171677767674b6b4d42384741315564497751594d426141464e446f71747031312f6b75535265590a504873555a644456386c6c4e4d477747413155644877526c4d474d77596142666f463247573268306448427a4f693876595842704c6e527964584e305a57527a0a5a584a3261574e6c63793570626e526c6243356a62323076633264344c324e6c636e52705a6d6c6a5958527062323476646a517663474e7259334a7350324e680a5058427962324e6c63334e7663695a6c626d4e765a476c755a7a316b5a584977485159445652304f42425945464a57566e41395a63736f3753356b6a2f647a4a0a594f3034534175644d41344741315564447745422f775145417749477744414d42674e5648524d4241663845416a41414d4949423141594a4b6f5a496876684e0a415130424249494278544343416345774867594b4b6f5a496876684e41513042415151514d6d5867725757774c59554164456d6c766c366153444343415751470a43697147534962345451454e41514977676746554d42414743797147534962345451454e41514942416745554d42414743797147534962345451454e415149430a416745554d42414743797147534962345451454e41514944416745434d42414743797147534962345451454e41514945416745454d42414743797147534962340a5451454e41514946416745424d42454743797147534962345451454e41514947416749416744415142677371686b69472b4530424451454342774942414441510a42677371686b69472b45304244514543434149424144415142677371686b69472b45304244514543435149424144415142677371686b69472b453042445145430a436749424144415142677371686b69472b45304244514543437749424144415142677371686b69472b45304244514543444149424144415142677371686b69470a2b45304244514543445149424144415142677371686b69472b45304244514543446749424144415142677371686b69472b4530424451454344774942414441510a42677371686b69472b45304244514543454149424144415142677371686b69472b45304244514543455149424454416642677371686b69472b453042445145430a4567515146425143424147414141414141414141414141414144415142676f71686b69472b45304244514544424149414144415542676f71686b69472b4530420a44514545424159416b473668414141774477594b4b6f5a496876684e4151304242516f424144414b42676771686b6a4f5051514441674e4841444245416942560a6e584667364277466a6945474230417162424e702b4b56734a477245744f4f49666e6f365450387031414967536c4430574e39595261575968346534656835330a314637434537664964724f55414c5177757632735948513d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436d444343416a36674177494241674956414e446f71747031312f6b7553526559504873555a644456386c6c4e4d416f4743437147534d343942414d430a4d476778476a415942674e5642414d4d45556c756447567349464e48574342536232393049454e424d526f77474159445651514b4442464a626e526c624342440a62334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e424d5173770a435159445651514745774a56557a4165467730784f4441314d6a45784d4455774d5442614677307a4d7a41314d6a45784d4455774d5442614d484578497a41680a42674e5642414d4d476b6c756447567349464e48574342515130736755484a765932567a6332397949454e424d526f77474159445651514b4442464a626e526c0a6243424462334a7762334a6864476c76626a45554d424947413155454277774c553246756447456751327868636d4578437a414a42674e564241674d416b4e420a4d517377435159445651514745774a56557a425a4d424d4742797147534d34394167454743437147534d34394177454841304941424c39712b4e4d7032494f670a74646c31626b2f75575a352b5447516d38614369387a373866732b664b435133642b75447a586e56544154325a68444369667949754a77764e33774e427039690a484253534d4a4d4a72424f6a6762737767626777487759445652306a42426777466f4155496d554d316c71644e496e7a6737535655723951477a6b6e427177770a556759445652306642457377535442486f45576751345a426148523063484d364c79396a5a584a3061575a70593246305a584d7564484a316333526c5a484e6c0a636e5a705932567a4c6d6c75644756734c6d4e766253394a626e526c62464e4857464a76623352445153356b5a584977485159445652304f42425945464e446f0a71747031312f6b7553526559504873555a644456386c6c4e4d41344741315564447745422f77514541774942426a415342674e5648524d4241663845434441470a4151482f416745414d416f4743437147534d343942414d43413067414d4555434951434a6754627456714f795a316d336a716941584d365159613672357357530a34792f4737793875494a4778647749675271507642534b7a7a516167424c517135733541373070646f6961524a387a2f3075447a344e675639316b3d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949436a7a4343416a53674177494241674955496d554d316c71644e496e7a6737535655723951477a6b6e42717777436759494b6f5a497a6a3045417749770a614445614d4267474131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e760a636e4276636d4630615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a0a42674e5642415954416c56544d423458445445344d4455794d5445774e4455784d466f58445451354d54497a4d54497a4e546b314f566f77614445614d4267470a4131554541777752535735305a5777675530645949464a766233516751304578476a415942674e5642416f4d45556c756447567349454e76636e4276636d46300a615739754d5251774567594456515148444174545957353059534244624746795954454c4d416b47413155454341774351304578437a414a42674e56424159540a416c56544d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a3044415163445167414543366e45774d4449595a4f6a2f69505773437a61454b69370a314f694f534c52466857476a626e42564a66566e6b59347533496a6b4459594c304d784f346d717379596a6c42616c54565978465032734a424b357a6c4b4f420a757a43427544416642674e5648534d4547444157674251695a517a575770303069664f44744a5653763141624f5363477244425342674e5648523845537a424a0a4d45656752614244686b466f64485277637a6f764c324e6c636e52705a6d6c6a5958526c63793530636e567a6447566b63325679646d6c6a5a584d75615735300a5a577775593239744c306c756447567355306459556d397664454e424c6d526c636a416442674e564851344546675155496d554d316c71644e496e7a673753560a55723951477a6b6e4271777744675944565230504151482f42415144416745474d42494741315564457745422f7751494d4159424166384341514577436759490a4b6f5a497a6a3045417749445351417752674968414f572f35516b522b533943695344634e6f6f774c7550524c735747662f59693747535839344267775477670a41694541344a306c72486f4d732b586f356f2f7358364f39515778485241765a55474f6452513763767152586171493d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a00").expect("harcoded hex").into(); + let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); + let quote = self + .attestor + .quote(core_instantiate_msg) + .map_err(|e| Status::internal(e.to_string()))?; let response = InstantiateResponse::new(self.config.clone(), quote); Ok(Response::new(response.into())) @@ -57,12 +56,3 @@ impl Core for CoreService { Ok(Response::new(reply)) } } - -pub fn attestion_quote(user_data: UserData) -> IoResult> { - let mut user_report_data = File::create("/dev/attestation/user_report_data")?; - user_report_data.write_all(user_data.as_slice())?; - user_report_data.flush()?; - - let quote = read("/dev/attestation/quote")?; - Ok(quote) -} From 256509a74b9e71793b524139e13027cd70bf53e3 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 03:44:09 -0800 Subject: [PATCH 23/49] Use git deps --- enclaves/quartz/Cargo.toml | 6 +++--- utils/quartz-relayer/Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 0714bb4..cf9d225 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -15,7 +15,7 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } -quartz-proto = { path = "../../utils/quartz-proto" } -quartz-relayer = { path = "../../utils/quartz-relayer" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-proto = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } +quartz-relayer = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 1bf6c0f..6043a6c 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -11,5 +11,5 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } -quartz-proto = { path = "../../utils/quartz-proto" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-proto = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } From 47c26da51efeb4d8a02a820687b54a2313ca8615 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 03:49:08 -0800 Subject: [PATCH 24/49] Modify Dockerfile to work with git deps --- enclaves/quartz/Dockerfile | 10 ++++++++-- enclaves/quartz/README.md | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/enclaves/quartz/Dockerfile b/enclaves/quartz/Dockerfile index 0594dec..ee1f687 100644 --- a/enclaves/quartz/Dockerfile +++ b/enclaves/quartz/Dockerfile @@ -1,6 +1,10 @@ FROM gramineproject/gramine:v1.5 -RUN apt-get update && apt-get install -y jq build-essential protobuf-compiler libprotobuf-dev +RUN apt-get update && apt-get install -y jq build-essential protobuf-compiler libprotobuf-dev git + +RUN mkdir /root/.ssh/ \ + && touch /root/.ssh/known_hosts \ + && ssh-keyscan github.com >> /root/.ssh/known_hosts WORKDIR /workdir @@ -28,7 +32,9 @@ ENV SGX=$SGX # Copy the quartz directory and build COPY . ./quartz WORKDIR /workdir/quartz -RUN cargo build --release +RUN mkdir -p .cargo/ +RUN echo "net.git-fetch-with-cli = true" > .cargo/config.toml +RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_ed25519 cargo build --release WORKDIR /workdir COPY quartz.manifest.template ./ diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 98a849d..c5d092a 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -3,7 +3,8 @@ ### Enclave usage ```bash -docker build . --tag quartz +# docker build . --tag quartz +DOCKER_BUILDKIT=1 docker build --tag quartz --secret id=ssh_id,src=/home/hu55a1n1/.ssh/id_ed25519 . docker run -it \ --device /dev/sgx_enclave \ --device /dev/sgx_provision \ From 74ee45c5dc7a3b47c60867bf53986aba70e75c8e Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:39:19 -0800 Subject: [PATCH 25/49] Update Cargo.lock --- Cargo.lock | 51 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 2f13a70..0ed81b4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2044,12 +2044,13 @@ dependencies = [ [[package]] name = "quartz-cw" version = "0.1.0" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#c49fc8da96d2039179aec962c85f190aee999d62" dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", "k256", - "quartz-tee-ra 0.1.0", + "quartz-tee-ra", "serde", "serde_json", "sha2 0.10.8", @@ -2067,9 +2068,9 @@ dependencies = [ "cosmwasm-std", "prost", "quartz-cw", - "quartz-proto", - "quartz-relayer", - "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", + "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", + "quartz-relayer 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", + "quartz-tee-ra", "serde", "serde_json", "tendermint", @@ -2087,6 +2088,16 @@ dependencies = [ "tonic-build", ] +[[package]] +name = "quartz-proto" +version = "0.1.0" +source = "git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework#c9fc72f90b50d0de85a67f78ccdc9708a03defbb" +dependencies = [ + "prost", + "tonic", + "tonic-build", +] + [[package]] name = "quartz-relayer" version = "0.1.0" @@ -2094,7 +2105,22 @@ dependencies = [ "clap", "cosmwasm-std", "quartz-cw", - "quartz-proto", + "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", + "serde", + "serde_json", + "tokio", + "tonic", +] + +[[package]] +name = "quartz-relayer" +version = "0.1.0" +source = "git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework#c9fc72f90b50d0de85a67f78ccdc9708a03defbb" +dependencies = [ + "clap", + "cosmwasm-std", + "quartz-cw", + "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", "serde", "serde_json", "tokio", @@ -2104,20 +2130,7 @@ dependencies = [ [[package]] name = "quartz-tee-ra" version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "hex-literal", - "num-bigint", - "serde_json", - "sha2 0.10.8", - "thiserror", -] - -[[package]] -name = "quartz-tee-ra" -version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#d3903031823af4bc870a8fa42f633f9f414850c2" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#c49fc8da96d2039179aec962c85f190aee999d62" dependencies = [ "cosmwasm-schema", "cosmwasm-std", From 6e7a4013a24d699def914f83d0e441267e4f01fe Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:39:30 -0800 Subject: [PATCH 26/49] Avoid using Dockerfile --- enclaves/quartz/Dockerfile | 55 -------------------------------------- enclaves/quartz/README.md | 24 ++++++++++------- 2 files changed, 15 insertions(+), 64 deletions(-) delete mode 100644 enclaves/quartz/Dockerfile diff --git a/enclaves/quartz/Dockerfile b/enclaves/quartz/Dockerfile deleted file mode 100644 index ee1f687..0000000 --- a/enclaves/quartz/Dockerfile +++ /dev/null @@ -1,55 +0,0 @@ -FROM gramineproject/gramine:v1.5 - -RUN apt-get update && apt-get install -y jq build-essential protobuf-compiler libprotobuf-dev git - -RUN mkdir /root/.ssh/ \ - && touch /root/.ssh/known_hosts \ - && ssh-keyscan github.com >> /root/.ssh/known_hosts - -WORKDIR /workdir - -RUN curl https://sh.rustup.rs -sSf | bash -s -- -y -ENV PATH="/root/.cargo/bin:${PATH}" -RUN rustup toolchain install 1.72.0 -#ENV RUST_BACKTRACE=1 - -RUN gramine-sgx-gen-private-key - -# This should be associated with an acive IAS SPID in order for -# gramine tools like gramine-sgx-ias-request and gramine-sgx-ias-verify -ARG RA_TYPE=epid -ENV RA_TYPE=$RA_TYPE -ARG RA_CLIENT_SPID=51CAF5A48B450D624AEFE3286D314894 -ENV RA_CLIENT_SPID=$RA_CLIENT_SPID -ARG RA_CLIENT_LINKABLE=1 -ENV RA_CLIENT_LINKABLE=$RA_CLIENT_LINKABLE - -ARG DEBUG=0 -ENV DEBUG=$DEBUG -ARG SGX=1 -ENV SGX=$SGX - -# Copy the quartz directory and build -COPY . ./quartz -WORKDIR /workdir/quartz -RUN mkdir -p .cargo/ -RUN echo "net.git-fetch-with-cli = true" > .cargo/config.toml -RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_ed25519 cargo build --release - -WORKDIR /workdir -COPY quartz.manifest.template ./ - -# Make and sign the gramine manifest -RUN gramine-manifest \ - -Dlog_level="error" \ - -Dhome=${HOME} \ - -Darch_libdir="/lib/$(gcc -dumpmachine)" \ - -Dra_type="$RA_TYPE" \ - -Dra_client_spid="$RA_CLIENT_SPID" \ - -Dra_client_linkable="$RA_CLIENT_LINKABLE" \ - -Dquartz_dir="$(pwd)/quartz" \ - quartz.manifest.template quartz.manifest - -RUN gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx - -CMD [ "gramine-sgx-sigstruct-view quartz.sig" ] diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index c5d092a..8703092 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -3,15 +3,21 @@ ### Enclave usage ```bash -# docker build . --tag quartz -DOCKER_BUILDKIT=1 docker build --tag quartz --secret id=ssh_id,src=/home/hu55a1n1/.ssh/id_ed25519 . -docker run -it \ - --device /dev/sgx_enclave \ - --device /dev/sgx_provision \ - -v /var/run/aesmd/aesm.socket:/var/run/aesmd/aesm.socket \ - -v ./data:/workdir/data \ - quartz bash -is-sgx-available +gramine-sgx-gen-private-key + +CARGO_TARGET_DIR=./target cargo build --release + +gramine-manifest \ + -Dlog_level="error" \ + -Dhome=${HOME} \ + -Darch_libdir="/lib/$(gcc -dumpmachine)" \ + -Dra_type="epid" \ + -Dra_client_spid="51CAF5A48B450D624AEFE3286D314894" \ + -Dra_client_linkable=1 \ + -Dquartz_dir="$(pwd)/quartz" \ + quartz.manifest.template quartz.manifest + +gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx gramine-sgx ./quartz ``` From 72f319a78985af86aa12e36a158f3e04a513e9ba Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:40:21 -0800 Subject: [PATCH 27/49] Update manifest - set argv - set sys.enable_sigterm_injection --- enclaves/quartz/quartz.manifest.template | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template index 2735e3e..15b681e 100644 --- a/enclaves/quartz/quartz.manifest.template +++ b/enclaves/quartz/quartz.manifest.template @@ -19,7 +19,11 @@ loader.env.RA_TLS_ISV_PROD_ID = { passthrough = true } loader.env.RA_TLS_EPID_API_KEY = { passthrough = true } loader.env.MYAPP_DATA = { passthrough = true } -loader.argv = ["quartz-enclave"] +loader.argv = ["quartz-enclave", + "--chain-id", "testing", + "--mr-enclave", "fa9149158c693b09e83480b48c2e7344c941aadca6d5829834f2af9f2690435e", + "--trusted-height", "1", + "--trusted-hash", "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869"] fs.mounts = [ { uri = "file:{{ gramine.runtimedir() }}", path = "/lib" }, @@ -51,3 +55,4 @@ sgx.allowed_files = [ ] sys.insecure__allow_eventfd = true +sys.enable_sigterm_injection = true From 578f1f305bab08710e8a8d8b5b3cc26391487a1d Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:41:12 -0800 Subject: [PATCH 28/49] Revert "Use git deps" This reverts commit 256509a74b9e71793b524139e13027cd70bf53e3. --- enclaves/quartz/Cargo.toml | 6 +++--- utils/quartz-relayer/Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index cf9d225..0714bb4 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -15,7 +15,7 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } -quartz-proto = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } -quartz-relayer = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } +quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-proto = { path = "../../utils/quartz-proto" } +quartz-relayer = { path = "../../utils/quartz-relayer" } quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 6043a6c..1bf6c0f 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -11,5 +11,5 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } -quartz-proto = { git = "ssh://git@github.com/informalsystems/tee-mtcs.git", branch = "hu55a1n1/40-quartz-framework" } +quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-proto = { path = "../../utils/quartz-proto" } From 0ddad2d774869114fd791a2eb1d99ee8b2c796ea Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:43:05 -0800 Subject: [PATCH 29/49] Use git deps only for out-of-tree quartz deps --- enclaves/quartz/Cargo.toml | 2 +- utils/quartz-relayer/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index 0714bb4..a8c47e5 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -15,7 +15,7 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } quartz-proto = { path = "../../utils/quartz-proto" } quartz-relayer = { path = "../../utils/quartz-relayer" } quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 1bf6c0f..b9193cd 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -11,5 +11,5 @@ serde_json = "1.0.94" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } quartz-proto = { path = "../../utils/quartz-proto" } From 3c2588dcd2ae2d1819e0354e892322e814eb086d Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:45:48 -0800 Subject: [PATCH 30/49] Update Cargo.lock --- Cargo.lock | 31 +++---------------------------- 1 file changed, 3 insertions(+), 28 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0ed81b4..8e67706 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2068,8 +2068,8 @@ dependencies = [ "cosmwasm-std", "prost", "quartz-cw", - "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", - "quartz-relayer 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", + "quartz-proto", + "quartz-relayer", "quartz-tee-ra", "serde", "serde_json", @@ -2088,16 +2088,6 @@ dependencies = [ "tonic-build", ] -[[package]] -name = "quartz-proto" -version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework#c9fc72f90b50d0de85a67f78ccdc9708a03defbb" -dependencies = [ - "prost", - "tonic", - "tonic-build", -] - [[package]] name = "quartz-relayer" version = "0.1.0" @@ -2105,22 +2095,7 @@ dependencies = [ "clap", "cosmwasm-std", "quartz-cw", - "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", - "serde", - "serde_json", - "tokio", - "tonic", -] - -[[package]] -name = "quartz-relayer" -version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework#c9fc72f90b50d0de85a67f78ccdc9708a03defbb" -dependencies = [ - "clap", - "cosmwasm-std", - "quartz-cw", - "quartz-proto 0.1.0 (git+ssh://git@github.com/informalsystems/tee-mtcs.git?branch=hu55a1n1/40-quartz-framework)", + "quartz-proto", "serde", "serde_json", "tokio", From bfb426bca034f48d78d29860b27dfb1c55475631 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:47:16 -0800 Subject: [PATCH 31/49] Fix README.md usage instructions --- enclaves/quartz/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 8703092..40a68d7 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -14,7 +14,7 @@ gramine-manifest \ -Dra_type="epid" \ -Dra_client_spid="51CAF5A48B450D624AEFE3286D314894" \ -Dra_client_linkable=1 \ - -Dquartz_dir="$(pwd)/quartz" \ + -Dquartz_dir="$(pwd)" \ quartz.manifest.template quartz.manifest gramine-sgx-sign --manifest quartz.manifest --output quartz.manifest.sgx From f94803a2749c90b41f5fbf812bc0d72287a5b991 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:57:54 -0800 Subject: [PATCH 32/49] Use tempfiles in relayer --- Cargo.lock | 1 + utils/quartz-relayer/Cargo.toml | 1 + utils/quartz-relayer/src/main.rs | 34 +++++++++++++++++++++----------- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8e67706..5c26965 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2098,6 +2098,7 @@ dependencies = [ "quartz-proto", "serde", "serde_json", + "tempfile", "tokio", "tonic", ] diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index b9193cd..ded46a7 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -8,6 +8,7 @@ clap = { version = "4.1.8", features = ["derive"] } cosmwasm-std = "1.4.0" serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.94" +tempfile = "3" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index a28948c..1e5fb29 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -1,15 +1,17 @@ mod cli; -use std::{fs::File, io::Write}; -use std::fs::read_to_string; -use std::process::Command; +use std::{ + fs::{read_to_string, File}, + io::Write, + process::Command, +}; use clap::Parser; -use serde_json::json; use quartz_proto::quartz::{core_client::CoreClient, InstantiateRequest}; use quartz_relayer::types::InstantiateResponse; +use serde_json::json; -use crate::{cli::Cli}; +use crate::cli::Cli; #[tokio::main] async fn main() -> Result<(), Box> { @@ -19,23 +21,31 @@ async fn main() -> Result<(), Box> { let response = client.instantiate(InstantiateRequest {}).await?; let response: InstantiateResponse = response.into_inner().try_into()?; - let mut quote_file = File::create("test.quote")?; + let dir = tempfile::tempdir()?; + let quote_file_path = dir.path().join("test.quote"); + let datareport_file_path = dir.path().join("datareport"); + let datareportsig_file_path = dir.path().join("datareportsig"); + + let mut quote_file = File::create(quote_file_path)?; quote_file.write_all(response.quote())?; let gramine_sgx_ias_request_output = Command::new("gramine-sgx-ias-request") .arg("report") .args(["-g", "51CAF5A48B450D624AEFE3286D314894"]) .args(["-k", "669244b3e6364b5888289a11d2a1726d"]) - .args(["-q", "test.quote"]) - .args(["-r", "datareport"]) - .args(["-s", "datareportsig"]) + .args(["-q", quote_file_path]) + .args(["-r", datareport_file_path]) + .args(["-s", datareportsig_file_path]) .output()?; println!("{gramine_sgx_ias_request_output:?}"); - let report = read_to_string("datareport")?; - let report_sig = read_to_string("datareportsig")?; + let report = read_to_string(datareport_file_path)?; + let report_sig = read_to_string(datareportsig_file_path)?; let ias_report = json!({"report": report, "reportsig": report_sig}); - println!("{}", serde_json::to_string(&ias_report).expect("infallible serializer")); + println!( + "{}", + serde_json::to_string(&ias_report).expect("infallible serializer") + ); Ok(()) } From a6f20290f88ca1d38e8f009174c48175e785d1d7 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 13:59:47 -0800 Subject: [PATCH 33/49] Add quartz .gitignore --- enclaves/quartz/.gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 enclaves/quartz/.gitignore diff --git a/enclaves/quartz/.gitignore b/enclaves/quartz/.gitignore new file mode 100644 index 0000000..53111ad --- /dev/null +++ b/enclaves/quartz/.gitignore @@ -0,0 +1 @@ +quartz.sig From c277230e0a363f0e0436db0f07063bb2b7d28b22 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 14:10:45 -0800 Subject: [PATCH 34/49] Fix tempdir usage --- utils/quartz-relayer/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index 1e5fb29..4c277f5 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -26,16 +26,16 @@ async fn main() -> Result<(), Box> { let datareport_file_path = dir.path().join("datareport"); let datareportsig_file_path = dir.path().join("datareportsig"); - let mut quote_file = File::create(quote_file_path)?; + let mut quote_file = File::create(quote_file_path.clone())?; quote_file.write_all(response.quote())?; let gramine_sgx_ias_request_output = Command::new("gramine-sgx-ias-request") .arg("report") .args(["-g", "51CAF5A48B450D624AEFE3286D314894"]) .args(["-k", "669244b3e6364b5888289a11d2a1726d"]) - .args(["-q", quote_file_path]) - .args(["-r", datareport_file_path]) - .args(["-s", datareportsig_file_path]) + .args(["-q", "e_file_path.display().to_string()]) + .args(["-r", &datareport_file_path.display().to_string()]) + .args(["-s", &datareportsig_file_path.display().to_string()]) .output()?; println!("{gramine_sgx_ias_request_output:?}"); From 178a738eec5b0dd21ffee65f4b2539d7dfd72e6d Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 14:43:00 -0800 Subject: [PATCH 35/49] delete types.rs --- enclaves/quartz/src/types.rs | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 enclaves/quartz/src/types.rs diff --git a/enclaves/quartz/src/types.rs b/enclaves/quartz/src/types.rs deleted file mode 100644 index e69de29..0000000 From c3e9af7ce92e23da1ce6f8efc84cd73dd418656e Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 14:43:44 -0800 Subject: [PATCH 36/49] Extract gramine_sgx_ias_report --- utils/quartz-relayer/src/main.rs | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index 4c277f5..347d059 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -1,6 +1,7 @@ mod cli; use std::{ + error::Error, fs::{read_to_string, File}, io::Write, process::Command, @@ -9,7 +10,7 @@ use std::{ use clap::Parser; use quartz_proto::quartz::{core_client::CoreClient, InstantiateRequest}; use quartz_relayer::types::InstantiateResponse; -use serde_json::json; +use serde_json::{json, Value}; use crate::cli::Cli; @@ -21,13 +22,23 @@ async fn main() -> Result<(), Box> { let response = client.instantiate(InstantiateRequest {}).await?; let response: InstantiateResponse = response.into_inner().try_into()?; + let ias_report = gramine_sgx_ias_report(response.quote())?; + println!( + "{}", + serde_json::to_string(&ias_report).expect("infallible serializer") + ); + + Ok(()) +} + +fn gramine_sgx_ias_report(quote: &[u8]) -> Result> { let dir = tempfile::tempdir()?; let quote_file_path = dir.path().join("test.quote"); let datareport_file_path = dir.path().join("datareport"); let datareportsig_file_path = dir.path().join("datareportsig"); let mut quote_file = File::create(quote_file_path.clone())?; - quote_file.write_all(response.quote())?; + quote_file.write_all(quote)?; let gramine_sgx_ias_request_output = Command::new("gramine-sgx-ias-request") .arg("report") @@ -42,10 +53,5 @@ async fn main() -> Result<(), Box> { let report = read_to_string(datareport_file_path)?; let report_sig = read_to_string(datareportsig_file_path)?; let ias_report = json!({"report": report, "reportsig": report_sig}); - println!( - "{}", - serde_json::to_string(&ias_report).expect("infallible serializer") - ); - - Ok(()) + Ok(ias_report) } From e0ce71de3f6c0d7c38e0cb09aa7da21079af64ee Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Mon, 26 Feb 2024 16:15:42 -0800 Subject: [PATCH 37/49] Add tx broadcast machinery --- Cargo.lock | 719 ++++++++++++++++++++++++++---- utils/quartz-relayer/Cargo.toml | 12 +- utils/quartz-relayer/src/cli.rs | 43 ++ utils/quartz-relayer/src/main.rs | 130 +++++- utils/quartz-relayer/src/types.rs | 10 + 5 files changed, 816 insertions(+), 98 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5c26965..c1c68fe 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -237,6 +237,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "base16ct" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349a06037c7bf932dd7e7d1f653678b2038b9ad46a74102f1fc7bd7872678cce" + [[package]] name = "base16ct" version = "0.2.0" @@ -267,15 +273,33 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" +[[package]] +name = "bip32" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b30ed1d6f8437a487a266c8293aeb95b61a23261273e3e02912cdb8b68bf798b" +dependencies = [ + "bs58 0.4.0", + "hmac", + "k256 0.11.6", + "once_cell", + "pbkdf2", + "rand_core 0.6.4", + "ripemd", + "sha2 0.10.8", + "subtle", + "zeroize", +] + [[package]] name = "bip32" version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7e141fb0f8be1c7b45887af94c88b182472b57c96b56773250ae00cd6a14a164" dependencies = [ - "bs58", + "bs58 0.5.0", "hmac", - "k256", + "k256 0.13.3", "rand_core 0.6.4", "ripemd", "sha2 0.10.8", @@ -341,6 +365,15 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab9008b6bb9fc80b5277f2fe481c09e828743d9151203e804583eb4c9e15b31d" +[[package]] +name = "bs58" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" +dependencies = [ + "sha2 0.9.9", +] + [[package]] name = "bs58" version = "0.5.0" @@ -521,15 +554,47 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "cosmos-sdk-proto" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4776e787b24d9568dd61d3237eeb4eb321d622fb881b858c7b82806420e87d4" +dependencies = [ + "prost 0.11.9", + "prost-types 0.11.9", + "tendermint-proto 0.27.0", + "tonic 0.8.3", +] + [[package]] name = "cosmos-sdk-proto" version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" dependencies = [ - "prost", - "prost-types", - "tendermint-proto", + "prost 0.12.3", + "prost-types 0.12.3", + "tendermint-proto 0.34.1", +] + +[[package]] +name = "cosmrs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "424675b6cf29795e5db8a808a78dd4229f0fdf90f64d9286dec0490f62534003" +dependencies = [ + "bip32 0.4.0", + "cosmos-sdk-proto 0.16.0", + "ecdsa 0.14.8", + "eyre", + "getrandom", + "k256 0.11.6", + "rand_core 0.6.4", + "serde", + "serde_json", + "subtle-encoding", + "tendermint 0.27.0", + "thiserror", ] [[package]] @@ -538,17 +603,17 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ - "bip32", - "cosmos-sdk-proto", - "ecdsa", + "bip32 0.5.1", + "cosmos-sdk-proto 0.20.0", + "ecdsa 0.16.9", "eyre", - "k256", + "k256 0.13.3", "rand_core 0.6.4", "serde", "serde_json", - "signature", + "signature 2.2.0", "subtle-encoding", - "tendermint", + "tendermint 0.34.0", "thiserror", ] @@ -559,9 +624,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6aa9f904de106fa16443ad14ec2abe75e94ba003bb61c681c0e43d4c58d2a" dependencies = [ "digest 0.10.7", - "ecdsa", + "ecdsa 0.16.9", "ed25519-zebra", - "k256", + "k256 0.13.3", "rand_core 0.6.4", "thiserror", ] @@ -657,6 +722,18 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +[[package]] +name = "crypto-bigint" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2b4b23cddf68b89b8f8069890e8c270d54e2d5fe1b143820234805e4cb17ef" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -719,14 +796,14 @@ name = "cw-proof" version = "0.1.0" dependencies = [ "clap", - "cosmrs", + "cosmrs 0.15.0", "displaydoc", "hex", "ics23", - "prost", + "prost 0.12.3", "serde", "serde_with", - "tendermint", + "tendermint 0.34.0", "tendermint-rpc", ] @@ -735,11 +812,11 @@ name = "cw-prover" version = "0.1.0" dependencies = [ "clap", - "cosmrs", + "cosmrs 0.15.0", "cw-proof", "hex", "serde_json", - "tendermint", + "tendermint 0.34.0", "tendermint-rpc", "tokio", ] @@ -790,6 +867,16 @@ dependencies = [ "syn 2.0.50", ] +[[package]] +name = "der" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a467a65c5e759bce6e65eaf91cc29f466cdc57cb65777bd646872a8a1fd4de" +dependencies = [ + "const-oid", + "zeroize", +] + [[package]] name = "der" version = "0.7.8" @@ -870,18 +957,30 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +[[package]] +name = "ecdsa" +version = "0.14.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413301934810f597c1d19ca71c8710e99a3f1ba28a0d2ebc01551a2daeea3c5c" +dependencies = [ + "der 0.6.1", + "elliptic-curve 0.12.3", + "rfc6979 0.3.1", + "signature 1.6.4", +] + [[package]] name = "ecdsa" version = "0.16.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ - "der", + "der 0.7.8", "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "elliptic-curve 0.13.8", + "rfc6979 0.4.0", + "signature 2.2.0", + "spki 0.7.3", ] [[package]] @@ -895,6 +994,7 @@ dependencies = [ "hkdf", "libsecp256k1", "once_cell", + "openssl", "parking_lot", "rand_core 0.6.4", "sha2 0.10.8", @@ -902,14 +1002,23 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "ed25519" +version = "1.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" +dependencies = [ + "signature 1.6.4", +] + [[package]] name = "ed25519" version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" dependencies = [ - "pkcs8", - "signature", + "pkcs8 0.10.2", + "signature 2.2.0", ] [[package]] @@ -925,6 +1034,18 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ed25519-dalek" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" +dependencies = [ + "curve25519-dalek", + "ed25519 1.5.3", + "sha2 0.9.9", + "zeroize", +] + [[package]] name = "ed25519-zebra" version = "3.1.0" @@ -946,21 +1067,41 @@ version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +[[package]] +name = "elliptic-curve" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7bb888ab5300a19b8e5bceef25ac745ad065f3c9f7efc6de1b91958110891d3" +dependencies = [ + "base16ct 0.1.1", + "crypto-bigint 0.4.9", + "der 0.6.1", + "digest 0.10.7", + "ff 0.12.1", + "generic-array", + "group 0.12.1", + "pkcs8 0.9.0", + "rand_core 0.6.4", + "sec1 0.3.0", + "subtle", + "zeroize", +] + [[package]] name = "elliptic-curve" version = "0.13.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ - "base16ct", - "crypto-bigint", + "base16ct 0.2.0", + "crypto-bigint 0.5.5", "digest 0.10.7", - "ff", + "ff 0.13.0", "generic-array", - "group", - "pkcs8", + "group 0.13.0", + "pkcs8 0.10.2", "rand_core 0.6.4", - "sec1", + "sec1 0.7.3", "subtle", "zeroize", ] @@ -1006,6 +1147,16 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +[[package]] +name = "ff" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d013fc25338cc558c5c2cfbad646908fb23591e2404481826742b651c9af7160" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "ff" version = "0.13.0" @@ -1038,6 +1189,21 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1182,13 +1348,24 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "group" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfbfb3a6cfbd390d5c9564ab283a0349b9b9fcd46a706c1eb10e0db70bfbac7" +dependencies = [ + "ff 0.12.1", + "rand_core 0.6.4", + "subtle", +] + [[package]] name = "group" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "ff", + "ff 0.13.0", "rand_core 0.6.4", "subtle", ] @@ -1379,7 +1556,7 @@ dependencies = [ "blake3", "bytes", "hex", - "prost", + "prost 0.12.3", "ripemd", "sha2 0.10.8", "sha3", @@ -1442,6 +1619,15 @@ version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -1466,6 +1652,19 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "k256" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72c1e0b51e7ec0a97369623508396067a486bd0cbed95a2659a4b863d28cfc8b" +dependencies = [ + "cfg-if 1.0.0", + "ecdsa 0.14.8", + "elliptic-curve 0.12.3", + "sha2 0.10.8", + "sha3", +] + [[package]] name = "k256" version = "0.13.3" @@ -1473,11 +1672,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "956ff9b67e26e1a6a866cb758f12c6f8746208489e3e4a4b5580802f2f0a587b" dependencies = [ "cfg-if 1.0.0", - "ecdsa", - "elliptic-curve", + "ecdsa 0.16.9", + "elliptic-curve 0.13.8", "once_cell", "sha2 0.10.8", - "signature", + "signature 2.2.0", ] [[package]] @@ -1495,11 +1694,11 @@ version = "0.1.0" dependencies = [ "clap", "color-eyre", - "cosmrs", + "cosmrs 0.15.0", "cw-proof", "ecies", "hex", - "k256", + "k256 0.13.3", "rand", "serde", "serde_json", @@ -1657,10 +1856,10 @@ version = "0.1.0" dependencies = [ "clap", "color-eyre", - "cosmrs", + "cosmrs 0.15.0", "ecies", "hex", - "k256", + "k256 0.13.3", "rand", "serde", "serde_json", @@ -1792,12 +1991,50 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +[[package]] +name = "openssl" +version = "0.10.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +dependencies = [ + "bitflags 2.4.2", + "cfg-if 1.0.0", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.50", +] + [[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.98" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "overload" version = "0.1.1" @@ -1839,6 +2076,15 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest 0.10.7", +] + [[package]] name = "peg" version = "0.7.0" @@ -1929,9 +2175,19 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" dependencies = [ - "der", - "pkcs8", - "spki", + "der 0.7.8", + "pkcs8 0.10.2", + "spki 0.7.3", +] + +[[package]] +name = "pkcs8" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9eca2c590a5f85da82668fa685c09ce2888b9430e83299debf1f34b65fd4a4ba" +dependencies = [ + "der 0.6.1", + "spki 0.6.0", ] [[package]] @@ -1940,10 +2196,16 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "der", - "spki", + "der 0.7.8", + "spki 0.7.3", ] +[[package]] +name = "pkg-config" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" + [[package]] name = "polyval" version = "0.6.1" @@ -1987,6 +2249,16 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive 0.11.9", +] + [[package]] name = "prost" version = "0.12.3" @@ -1994,7 +2266,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "146c289cda302b98a28d40c8b3b90498d6e526dd24ac2ecea73e4e491685b94a" dependencies = [ "bytes", - "prost-derive", + "prost-derive 0.12.3", ] [[package]] @@ -2005,20 +2277,33 @@ checksum = "c55e02e35260070b6f716a2423c2ff1c3bb1642ddca6f99e1f26d06268a0e2d2" dependencies = [ "bytes", "heck", - "itertools", + "itertools 0.11.0", "log", "multimap", "once_cell", "petgraph", "prettyplease", - "prost", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "regex", "syn 2.0.50", "tempfile", "which", ] +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools 0.10.5", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "prost-derive" version = "0.12.3" @@ -2026,19 +2311,45 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "efb6c9a1dd1def8e2124d17e83a20af56f1570d6c2d2bd9e266ccb768df3840e" dependencies = [ "anyhow", - "itertools", + "itertools 0.11.0", "proc-macro2", "quote", "syn 2.0.50", ] +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost 0.11.9", +] + [[package]] name = "prost-types" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "193898f59edcf43c26227dcd4c8427f00d99d61e95dcde58dabd49fa291d470e" dependencies = [ - "prost", + "prost 0.12.3", +] + +[[package]] +name = "quartz-cw" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "cw-storage-plus", + "k256 0.13.3", + "quartz-tee-ra 0.1.0", + "serde", + "serde_json", + "sha2 0.10.8", + "tendermint 0.34.0", + "tendermint-light-client", + "thiserror", ] [[package]] @@ -2049,12 +2360,12 @@ dependencies = [ "cosmwasm-schema", "cosmwasm-std", "cw-storage-plus", - "k256", - "quartz-tee-ra", + "k256 0.13.3", + "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", "serde", "serde_json", "sha2 0.10.8", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", "thiserror", ] @@ -2066,25 +2377,25 @@ dependencies = [ "clap", "color-eyre", "cosmwasm-std", - "prost", - "quartz-cw", + "prost 0.12.3", + "quartz-cw 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", "quartz-proto", "quartz-relayer", - "quartz-tee-ra", + "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", "serde", "serde_json", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", "tokio", - "tonic", + "tonic 0.11.0", ] [[package]] name = "quartz-proto" version = "0.1.0" dependencies = [ - "prost", - "tonic", + "prost 0.12.3", + "tonic 0.11.0", "tonic-build", ] @@ -2093,14 +2404,35 @@ name = "quartz-relayer" version = "0.1.0" dependencies = [ "clap", + "cosmos-sdk-proto 0.16.0", + "cosmrs 0.11.0", "cosmwasm-std", - "quartz-cw", + "displaydoc", + "ecies", + "quartz-cw 0.1.0", "quartz-proto", + "quartz-tee-ra 0.1.0", "serde", "serde_json", + "subtle-encoding", "tempfile", + "tendermint 0.29.1", + "thiserror", "tokio", - "tonic", + "tonic 0.8.3", +] + +[[package]] +name = "quartz-tee-ra" +version = "0.1.0" +dependencies = [ + "cosmwasm-schema", + "cosmwasm-std", + "hex-literal", + "num-bigint", + "serde_json", + "sha2 0.10.8", + "thiserror", ] [[package]] @@ -2256,6 +2588,17 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfc6979" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb" +dependencies = [ + "crypto-bigint 0.4.9", + "hmac", + "zeroize", +] + [[package]] name = "rfc6979" version = "0.4.0" @@ -2290,6 +2633,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "ripemd160" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eca4ecc81b7f313189bf73ce724400a07da2a6dac19588b03c8bd76a2dcc251" +dependencies = [ + "block-buffer 0.9.0", + "digest 0.9.0", + "opaque-debug", +] + [[package]] name = "rsa" version = "0.9.6" @@ -2302,11 +2656,11 @@ dependencies = [ "num-integer", "num-traits", "pkcs1", - "pkcs8", + "pkcs8 0.10.2", "rand_core 0.6.4", "serde", - "signature", - "spki", + "signature 2.2.0", + "spki 0.7.3", "subtle", "zeroize", ] @@ -2454,16 +2808,30 @@ dependencies = [ "untrusted", ] +[[package]] +name = "sec1" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be24c1842290c45df0a7bf069e0c268a747ad05a192f2fd7dcfdbc1cba40928" +dependencies = [ + "base16ct 0.1.1", + "der 0.6.1", + "generic-array", + "pkcs8 0.9.0", + "subtle", + "zeroize", +] + [[package]] name = "sec1" version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" dependencies = [ - "base16ct", - "der", + "base16ct 0.2.0", + "der 0.7.8", "generic-array", - "pkcs8", + "pkcs8 0.10.2", "subtle", "zeroize", ] @@ -2670,6 +3038,16 @@ dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "1.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + [[package]] name = "signature" version = "2.2.0" @@ -2717,6 +3095,16 @@ version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +[[package]] +name = "spki" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67cf02bbac7a337dc36e4f5a693db6c21e7863f45070f7064577eb4367a3212b" +dependencies = [ + "base64ct", + "der 0.6.1", +] + [[package]] name = "spki" version = "0.7.3" @@ -2724,7 +3112,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" dependencies = [ "base64ct", - "der", + "der 0.7.8", ] [[package]] @@ -2825,7 +3213,7 @@ dependencies = [ "rsa", "serde", "serde_json", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", "tm-stateless-verifier", "tracing", @@ -2846,31 +3234,92 @@ dependencies = [ [[package]] name = "tendermint" -version = "0.34.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" +checksum = "eeb6f9c129bc9f1a3c38bc91c63a5e8d3c00ed998e7fa4ca44e06467466d0e77" +dependencies = [ + "bytes", + "ed25519 1.5.3", + "ed25519-dalek", + "flex-error", + "futures", + "k256 0.11.6", + "num-traits", + "once_cell", + "prost 0.11.9", + "prost-types 0.11.9", + "ripemd160", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.9.9", + "signature 1.6.4", + "subtle", + "subtle-encoding", + "tendermint-proto 0.27.0", + "time", + "zeroize", +] + +[[package]] +name = "tendermint" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cda53c85447577769cdfc94c10a56f34afef2c00e4108badb57fce6b1a0c75eb" dependencies = [ "bytes", "digest 0.10.7", - "ed25519", + "ed25519 1.5.3", "ed25519-consensus", "flex-error", "futures", - "k256", + "k256 0.11.6", "num-traits", "once_cell", - "prost", - "prost-types", + "prost 0.11.9", + "prost-types 0.11.9", "ripemd", "serde", "serde_bytes", "serde_json", "serde_repr", "sha2 0.10.8", - "signature", + "signature 1.6.4", "subtle", "subtle-encoding", - "tendermint-proto", + "tendermint-proto 0.29.1", + "time", + "zeroize", +] + +[[package]] +name = "tendermint" +version = "0.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc2294fa667c8b548ee27a9ba59115472d0a09c2ba255771092a7f1dcf03a789" +dependencies = [ + "bytes", + "digest 0.10.7", + "ed25519 2.2.3", + "ed25519-consensus", + "flex-error", + "futures", + "k256 0.13.3", + "num-traits", + "once_cell", + "prost 0.12.3", + "prost-types 0.12.3", + "ripemd", + "serde", + "serde_bytes", + "serde_json", + "serde_repr", + "sha2 0.10.8", + "signature 2.2.0", + "subtle", + "subtle-encoding", + "tendermint-proto 0.34.1", "time", "zeroize", ] @@ -2884,7 +3333,7 @@ dependencies = [ "flex-error", "serde", "serde_json", - "tendermint", + "tendermint 0.34.0", "toml", "url", ] @@ -2906,7 +3355,7 @@ dependencies = [ "serde_derive", "serde_json", "static_assertions", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client-verifier", "tendermint-rpc", "time", @@ -2930,9 +3379,9 @@ dependencies = [ "serde_derive", "serde_json", "static_assertions", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", - "tendermint-proto", + "tendermint-proto 0.34.1", "tendermint-rpc", "time", "tracing", @@ -2947,7 +3396,43 @@ dependencies = [ "derive_more", "flex-error", "serde", - "tendermint", + "tendermint 0.34.0", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5895470f28c530f8ae8c4071bf8190304ce00bd131d25e81730453124a3375c" +dependencies = [ + "bytes", + "flex-error", + "num-derive", + "num-traits", + "prost 0.11.9", + "prost-types 0.11.9", + "serde", + "serde_bytes", + "subtle-encoding", + "time", +] + +[[package]] +name = "tendermint-proto" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c943f78c929cdf14553842f705f2c30324bc35b9179caaa5c9b80620f60652e6" +dependencies = [ + "bytes", + "flex-error", + "num-derive", + "num-traits", + "prost 0.11.9", + "prost-types 0.11.9", + "serde", + "serde_bytes", + "subtle-encoding", "time", ] @@ -2961,8 +3446,8 @@ dependencies = [ "flex-error", "num-derive", "num-traits", - "prost", - "prost-types", + "prost 0.12.3", + "prost-types 0.12.3", "serde", "serde_bytes", "subtle-encoding", @@ -2989,9 +3474,9 @@ dependencies = [ "serde_json", "subtle", "subtle-encoding", - "tendermint", + "tendermint 0.34.0", "tendermint-config", - "tendermint-proto", + "tendermint-proto 0.34.1", "thiserror", "time", "tokio", @@ -3084,7 +3569,7 @@ dependencies = [ "color-eyre", "serde", "serde_json", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", "tm-stateless-verifier", "tracing", @@ -3097,12 +3582,12 @@ version = "0.1.0" dependencies = [ "clap", "color-eyre", - "cosmrs", + "cosmrs 0.15.0", "cw-proof", "futures", "serde", "serde_json", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", "tendermint-light-client-detector", "tendermint-rpc", @@ -3116,7 +3601,7 @@ name = "tm-stateless-verifier" version = "0.1.0" dependencies = [ "displaydoc", - "tendermint", + "tendermint 0.34.0", "tendermint-light-client", ] @@ -3204,6 +3689,38 @@ dependencies = [ "serde", ] +[[package]] +name = "tonic" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb" +dependencies = [ + "async-stream", + "async-trait", + "axum", + "base64 0.13.1", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost 0.11.9", + "prost-derive 0.11.9", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tower-layer", + "tower-service", + "tracing", + "tracing-futures", +] + [[package]] name = "tonic" version = "0.11.0" @@ -3222,7 +3739,7 @@ dependencies = [ "hyper-timeout", "percent-encoding", "pin-project", - "prost", + "prost 0.12.3", "tokio", "tokio-stream", "tower", @@ -3318,6 +3835,16 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + [[package]] name = "tracing-log" version = "0.2.0" @@ -3425,6 +3952,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +[[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.4" diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index ded46a7..5ac984b 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -5,12 +5,20 @@ edition = "2021" [dependencies] clap = { version = "4.1.8", features = ["derive"] } +cosmos-sdk-proto = "0.16.0" +cosmrs = { version = "=0.11.0", features = ["cosmwasm"] } cosmwasm-std = "1.4.0" +displaydoc = { version = "0.2.3", default-features = false } +ecies = "0.2.6" serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.94" +subtle-encoding = { version = "0.5.1", features = ["bech32-preview"] } tempfile = "3" -tonic = "0.11" +tendermint = { version = "0.29.0", features = ["secp256k1"] } +thiserror = "1.0.38" +tonic = "=0.8.3" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } +quartz-tee-ra = { path = "../../../bisenzone-cw-mvp/packages/quartz-tee-ra" } quartz-proto = { path = "../../utils/quartz-proto" } diff --git a/utils/quartz-relayer/src/cli.rs b/utils/quartz-relayer/src/cli.rs index 24c2bb0..c1160a8 100644 --- a/utils/quartz-relayer/src/cli.rs +++ b/utils/quartz-relayer/src/cli.rs @@ -1,10 +1,53 @@ +use std::path::PathBuf; + use clap::Parser; +use cosmrs::{tendermint::chain::Id, AccountId}; +use displaydoc::Display; +use subtle_encoding::{bech32::decode as bech32_decode, Error as Bech32DecodeError}; +use thiserror::Error; use tonic::transport::Endpoint; +#[derive(Display, Error, Debug)] +pub enum AddressError { + /// Address is not bech32 encoded + NotBech32Encoded(#[source] Bech32DecodeError), + /// Human readable part mismatch (expected `wasm`, found {0}) + HumanReadableMismatch(String), +} + #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] pub struct Cli { /// RPC server address #[clap(long, default_value = "http://localhost:11090")] pub enclave_addr: Endpoint, + + /// Blockchain node gRPC URL + #[arg(short, long, default_value = "tcp://127.0.0.1:9090")] + pub node_addr: Endpoint, + + /// Chain-id of MTCS chain + #[arg(long, default_value = "testing")] + pub chain_id: Id, + + /// Smart contract address + #[arg(short, long, value_parser = wasm_address)] + pub contract: AccountId, + + /// Path to TSP secret key file + #[arg(short, long)] + pub secret: PathBuf, + + /// Gas limit for the set-offs submission transaction + #[arg(long, default_value = "900000000")] + pub gas_limit: u64, +} + +fn wasm_address(address_str: &str) -> Result { + let (hr, _) = bech32_decode(address_str).map_err(AddressError::NotBech32Encoded)?; + if hr != "wasm" { + return Err(AddressError::HumanReadableMismatch(hr)); + } + + Ok(address_str.parse().unwrap()) } diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index 347d059..400e075 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -3,14 +3,43 @@ mod cli; use std::{ error::Error, fs::{read_to_string, File}, - io::Write, + io::{Read, Write}, process::Command, }; use clap::Parser; +use cosmos_sdk_proto::{ + cosmos::{ + auth::v1beta1::{ + query_client::QueryClient as AuthQueryClient, BaseAccount as RawBaseAccount, + QueryAccountRequest, + }, + tx::v1beta1::{service_client::ServiceClient, BroadcastMode, BroadcastTxRequest}, + }, + traits::Message, + Any, +}; +use cosmrs::{ + auth::BaseAccount, + cosmwasm::MsgExecuteContract, + crypto::secp256k1::{SigningKey, VerifyingKey}, + tendermint::{account::Id as TmAccountId, chain::Id as TmChainId}, + tx, + tx::{Fee, Msg, SignDoc, SignerInfo}, + AccountId, Coin, +}; +use ecies::{PublicKey, SecretKey}; +use quartz_cw::msg::{ + execute::attested::{Attested, EpidAttestation}, + instantiate::{CoreInstantiate, RawInstantiate}, + InstantiateMsg, +}; use quartz_proto::quartz::{core_client::CoreClient, InstantiateRequest}; use quartz_relayer::types::InstantiateResponse; +use quartz_tee_ra::IASReport; use serde_json::{json, Value}; +use subtle_encoding::base64; +use tendermint::public_key::Secp256k1 as TmPublicKey; use crate::cli::Cli; @@ -18,16 +47,111 @@ use crate::cli::Cli; async fn main() -> Result<(), Box> { let args = Cli::parse(); - let mut client = CoreClient::connect(args.enclave_addr).await?; + let mut client = CoreClient::connect(args.enclave_addr.uri().to_string()).await?; let response = client.instantiate(InstantiateRequest {}).await?; let response: InstantiateResponse = response.into_inner().try_into()?; + let (config, quote) = response.into_message().into_tuple(); - let ias_report = gramine_sgx_ias_report(response.quote())?; + let ias_report = gramine_sgx_ias_report("e)?; println!( "{}", serde_json::to_string(&ias_report).expect("infallible serializer") ); + let ias_report: IASReport = serde_json::from_str(&ias_report.to_string())?; + let mr_enclave = ias_report.report.isv_enclave_quote_body.mrenclave(); + let user_data = ias_report.report.isv_enclave_quote_body.user_data(); + let attestation = EpidAttestation::new(ias_report, mr_enclave, user_data); + let cw_instantiate_msg = Attested::new(CoreInstantiate::new(config), attestation); + + // Read the TSP secret + let secret = { + let mut secret = Vec::new(); + let mut tsp_sk_file = File::open(args.secret)?; + tsp_sk_file.read_to_end(secret.as_mut())?; + let secret = base64::decode(secret).unwrap(); + SecretKey::parse_slice(&secret).unwrap() + }; + let tm_pubkey = { + let pubkey = PublicKey::from_secret_key(&secret); + TmPublicKey::from_sec1_bytes(&pubkey.serialize()).unwrap() + }; + let sender = { + let tm_key = TmAccountId::from(tm_pubkey); + AccountId::new("wasm", tm_key.as_bytes()).unwrap() + }; + + let msgs = vec![MsgExecuteContract { + sender: sender.clone(), + contract: args.contract.clone(), + msg: serde_json::to_string::(&InstantiateMsg(cw_instantiate_msg).into())? + .into_bytes(), + funds: vec![], + } + .to_any() + .unwrap()]; + + let account = account_info(args.node_addr.uri().clone(), sender.clone()).await?; + let amount = Coin { + amount: 0u128, + denom: "cosm".parse()?, + }; + let tx_bytes = tx_bytes( + &secret, + amount, + args.gas_limit, + tm_pubkey, + msgs, + account.sequence, + account.account_number, + &args.chain_id, + )?; + + send_tx(args.node_addr.uri().clone(), tx_bytes).await?; + + Ok(()) +} + +pub async fn account_info( + node: impl ToString, + address: impl ToString, +) -> Result> { + let mut client = AuthQueryClient::connect(node.to_string()).await?; + let request = tonic::Request::new(QueryAccountRequest { + address: address.to_string(), + }); + let response = client.account(request).await?; + let response = RawBaseAccount::decode(response.into_inner().account.unwrap().value.as_slice())?; + let account = BaseAccount::try_from(response)?; + Ok(account) +} + +#[allow(clippy::too_many_arguments)] +pub fn tx_bytes( + secret: &SecretKey, + amount: Coin, + gas: u64, + tm_pubkey: VerifyingKey, + msgs: Vec, + sequence_number: u64, + account_number: u64, + chain_id: &TmChainId, +) -> Result, Box> { + let tx_body = tx::Body::new(msgs, "", 0u16); + let signer_info = SignerInfo::single_direct(Some(tm_pubkey.into()), sequence_number); + let auth_info = signer_info.auth_info(Fee::from_amount_and_gas(amount, gas)); + let sign_doc = SignDoc::new(&tx_body, &auth_info, chain_id, account_number)?; + let tx_signed = sign_doc.sign(&SigningKey::from_bytes(&secret.serialize()).unwrap())?; + Ok(tx_signed.to_bytes()?) +} + +pub async fn send_tx(node: impl ToString, tx_bytes: Vec) -> Result<(), Box> { + let mut client = ServiceClient::connect(node.to_string()).await?; + let request = tonic::Request::new(BroadcastTxRequest { + tx_bytes, + mode: BroadcastMode::Block.into(), + }); + let _response = client.broadcast_tx(request).await?; Ok(()) } diff --git a/utils/quartz-relayer/src/types.rs b/utils/quartz-relayer/src/types.rs index 354d56e..367be79 100644 --- a/utils/quartz-relayer/src/types.rs +++ b/utils/quartz-relayer/src/types.rs @@ -18,6 +18,10 @@ impl InstantiateResponse { pub fn quote(&self) -> &[u8] { &self.message.quote } + + pub fn into_message(self) -> InstantiateResponseMsg { + self.message + } } impl TryFrom for InstantiateResponse { @@ -47,6 +51,12 @@ pub struct InstantiateResponseMsg { quote: Vec, } +impl InstantiateResponseMsg { + pub fn into_tuple(self) -> (Config, Vec) { + (self.config, self.quote) + } +} + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] pub struct RawInstantiateResponseMsg { config: RawConfig, From d5a6395056c236ebe46b380fe9cb209253c640d7 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 02:46:48 -0800 Subject: [PATCH 38/49] git deps for bisenzone-cw-mvp cratees --- Cargo.lock | 40 +++++---------------------------- utils/quartz-relayer/Cargo.toml | 4 ++-- 2 files changed, 7 insertions(+), 37 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c1c68fe..c328995 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2335,23 +2335,6 @@ dependencies = [ "prost 0.12.3", ] -[[package]] -name = "quartz-cw" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "cw-storage-plus", - "k256 0.13.3", - "quartz-tee-ra 0.1.0", - "serde", - "serde_json", - "sha2 0.10.8", - "tendermint 0.34.0", - "tendermint-light-client", - "thiserror", -] - [[package]] name = "quartz-cw" version = "0.1.0" @@ -2361,7 +2344,7 @@ dependencies = [ "cosmwasm-std", "cw-storage-plus", "k256 0.13.3", - "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", + "quartz-tee-ra", "serde", "serde_json", "sha2 0.10.8", @@ -2378,10 +2361,10 @@ dependencies = [ "color-eyre", "cosmwasm-std", "prost 0.12.3", - "quartz-cw 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", + "quartz-cw", "quartz-proto", "quartz-relayer", - "quartz-tee-ra 0.1.0 (git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz)", + "quartz-tee-ra", "serde", "serde_json", "tendermint 0.34.0", @@ -2409,9 +2392,9 @@ dependencies = [ "cosmwasm-std", "displaydoc", "ecies", - "quartz-cw 0.1.0", + "quartz-cw", "quartz-proto", - "quartz-tee-ra 0.1.0", + "quartz-tee-ra", "serde", "serde_json", "subtle-encoding", @@ -2422,19 +2405,6 @@ dependencies = [ "tonic 0.8.3", ] -[[package]] -name = "quartz-tee-ra" -version = "0.1.0" -dependencies = [ - "cosmwasm-schema", - "cosmwasm-std", - "hex-literal", - "num-bigint", - "serde_json", - "sha2 0.10.8", - "thiserror", -] - [[package]] name = "quartz-tee-ra" version = "0.1.0" diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 5ac984b..a012887 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -19,6 +19,6 @@ thiserror = "1.0.38" tonic = "=0.8.3" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } -quartz-cw = { path = "../../../bisenzone-cw-mvp/packages/quartz-cw" } -quartz-tee-ra = { path = "../../../bisenzone-cw-mvp/packages/quartz-tee-ra" } +quartz-cw = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } +quartz-tee-ra = { git = "ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git", branch = "hu55a1n1/11-use-quartz" } quartz-proto = { path = "../../utils/quartz-proto" } From 6351c10932898a85e2fd2a7edcfd517545e2639a Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 11:12:03 -0800 Subject: [PATCH 39/49] Update README.md --- enclaves/quartz/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 40a68d7..3f36371 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -24,7 +24,7 @@ gramine-sgx ./quartz ### CLI usage ```bash -cargo run -- --chain-id testing \ +cargo run -- --chain-id testing \ --mr-enclave "fa9149158c693b09e83480b48c2e7344c941aadca6d5829834f2af9f2690435e" \ --trusted-height 1 \ --trusted-hash "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869" From 02863d7746affb0f01d41c8aad49198824753efa Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 11:52:23 -0800 Subject: [PATCH 40/49] Add MockAttestor --- enclaves/quartz/src/attestor.rs | 11 +++++++++++ enclaves/quartz/src/main.rs | 4 ++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/src/attestor.rs b/enclaves/quartz/src/attestor.rs index 2402948..626dbe6 100644 --- a/enclaves/quartz/src/attestor.rs +++ b/enclaves/quartz/src/attestor.rs @@ -25,3 +25,14 @@ impl Attestor for EpidAttestor { read("/dev/attestation/quote") } } + +#[derive(Clone, PartialEq, Debug)] +pub struct MockAttestor; + +impl Attestor for MockAttestor { + type Error = String; + + fn quote(&self, _user_data: impl HasUserData) -> Result, Self::Error> { + Ok(vec![]) + } +} diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index e04df30..be7eba9 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -25,7 +25,7 @@ use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{attestor::EpidAttestor, cli::Cli, server::CoreService}; +use crate::{attestor::MockAttestor, cli::Cli, server::CoreService}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { @@ -47,7 +47,7 @@ async fn main() -> Result<(), Box> { ); Server::builder() - .add_service(CoreServer::new(CoreService::new(config, EpidAttestor))) + .add_service(CoreServer::new(CoreService::new(config, MockAttestor))) .serve(args.rpc_addr) .await?; From 4984ce141360a32b747d0f2cdd8a2231e770241d Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 12:01:18 -0800 Subject: [PATCH 41/49] Default to EpidAttestor --- enclaves/quartz/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index be7eba9..e04df30 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -25,7 +25,7 @@ use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{attestor::MockAttestor, cli::Cli, server::CoreService}; +use crate::{attestor::EpidAttestor, cli::Cli, server::CoreService}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { @@ -47,7 +47,7 @@ async fn main() -> Result<(), Box> { ); Server::builder() - .add_service(CoreServer::new(CoreService::new(config, MockAttestor))) + .add_service(CoreServer::new(CoreService::new(config, EpidAttestor))) .serve(args.rpc_addr) .await?; From 6145608ff7bd0a0fd5fd1a2a91c9fb6115108257 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 13:28:59 -0800 Subject: [PATCH 42/49] Read MRENCLAVE from sigfile --- enclaves/quartz/README.md | 2 +- enclaves/quartz/quartz.manifest.template | 2 +- enclaves/quartz/src/cli.rs | 14 ++++---------- enclaves/quartz/src/main.rs | 13 +++++++++++-- 4 files changed, 17 insertions(+), 14 deletions(-) diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 3f36371..57b7c49 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -25,7 +25,7 @@ gramine-sgx ./quartz ```bash cargo run -- --chain-id testing \ - --mr-enclave "fa9149158c693b09e83480b48c2e7344c941aadca6d5829834f2af9f2690435e" \ + --sigfile "quartz.sig" \ --trusted-height 1 \ --trusted-hash "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869" ``` diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template index 15b681e..36e39ab 100644 --- a/enclaves/quartz/quartz.manifest.template +++ b/enclaves/quartz/quartz.manifest.template @@ -21,7 +21,7 @@ loader.env.MYAPP_DATA = { passthrough = true } loader.argv = ["quartz-enclave", "--chain-id", "testing", - "--mr-enclave", "fa9149158c693b09e83480b48c2e7344c941aadca6d5829834f2af9f2690435e", + "--sigile", "quartz.sig", "--trusted-height", "1", "--trusted-hash", "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869"] diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs index 65c5484..3f9c0fb 100644 --- a/enclaves/quartz/src/cli.rs +++ b/enclaves/quartz/src/cli.rs @@ -1,9 +1,7 @@ -use std::net::SocketAddr; +use std::{net::SocketAddr, path::PathBuf}; use clap::Parser; use color_eyre::eyre::{eyre, Result}; -use cosmwasm_std::HexBinary; -use quartz_cw::state::MrEnclave; use tendermint::Hash; use tendermint_light_client::types::{Height, TrustThreshold}; @@ -17,10 +15,6 @@ fn parse_trust_threshold(s: &str) -> Result { } } -fn parse_mr_enclave(s: &str) -> Result { - Ok(HexBinary::from_hex(s)?.to_array()?) -} - #[derive(Debug, Parser)] #[command(author, version, about, long_about = None)] pub struct Cli { @@ -28,9 +22,9 @@ pub struct Cli { #[clap(long, default_value = "127.0.0.1:11090")] pub rpc_addr: SocketAddr, - /// MRENCLAVE of this enclave - #[clap(long, value_parser = parse_mr_enclave)] - pub mr_enclave: MrEnclave, + /// Gramine SIGFILE for this enclave (to read MRENCLAVE from) + #[clap(long)] + pub sigfile: PathBuf, /// Identifier of the chain #[clap(long)] diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index e04df30..6c04829 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -18,9 +18,10 @@ mod attestor; mod cli; mod server; -use std::time::Duration; +use std::{process::Command, time::Duration}; use clap::Parser; +use cosmwasm_std::HexBinary; use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; @@ -31,6 +32,14 @@ use crate::{attestor::EpidAttestor, cli::Cli, server::CoreService}; async fn main() -> Result<(), Box> { let args = Cli::parse(); + let gramine_sgx_sigstruct_view = Command::new("gramine-sgx-sigstruct-view") + .args(["--output-format", "json"]) + .arg(args.sigfile) + .output()?; + + let sigstruct_json: serde_json::Value = + serde_json::from_str(&String::from_utf8(gramine_sgx_sigstruct_view.stdout)?)?; + let mr_enclave = HexBinary::from_hex(&sigstruct_json["mr_enclave"].to_string())?.to_array()?; let light_client_opts = LightClientOpts::new( args.chain_id, args.trusted_height, @@ -41,7 +50,7 @@ async fn main() -> Result<(), Box> { args.max_block_lag, ); let config = Config::new( - args.mr_enclave, + mr_enclave, Duration::from_secs(30 * 24 * 60), light_client_opts, ); From 59fbf665e1787b35360186602446ae239c14ac75 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 13:30:10 -0800 Subject: [PATCH 43/49] Fix typo in manifest --- enclaves/quartz/quartz.manifest.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template index 36e39ab..91b352f 100644 --- a/enclaves/quartz/quartz.manifest.template +++ b/enclaves/quartz/quartz.manifest.template @@ -21,7 +21,7 @@ loader.env.MYAPP_DATA = { passthrough = true } loader.argv = ["quartz-enclave", "--chain-id", "testing", - "--sigile", "quartz.sig", + "--sigfile", "quartz.sig", "--trusted-height", "1", "--trusted-hash", "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869"] From c7eddffc2c851a4c347d0ec4229e4b07d31c8ced Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 14:30:36 -0800 Subject: [PATCH 44/49] Read mrenclave from quote --- enclaves/quartz/README.md | 1 - enclaves/quartz/quartz.manifest.template | 1 - enclaves/quartz/src/attestor.rs | 26 +++++++++++++++++++++++- enclaves/quartz/src/cli.rs | 6 +----- enclaves/quartz/src/main.rs | 19 +++++++---------- 5 files changed, 33 insertions(+), 20 deletions(-) diff --git a/enclaves/quartz/README.md b/enclaves/quartz/README.md index 57b7c49..59920a9 100644 --- a/enclaves/quartz/README.md +++ b/enclaves/quartz/README.md @@ -25,7 +25,6 @@ gramine-sgx ./quartz ```bash cargo run -- --chain-id testing \ - --sigfile "quartz.sig" \ --trusted-height 1 \ --trusted-hash "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869" ``` diff --git a/enclaves/quartz/quartz.manifest.template b/enclaves/quartz/quartz.manifest.template index 91b352f..11017a7 100644 --- a/enclaves/quartz/quartz.manifest.template +++ b/enclaves/quartz/quartz.manifest.template @@ -21,7 +21,6 @@ loader.env.MYAPP_DATA = { passthrough = true } loader.argv = ["quartz-enclave", "--chain-id", "testing", - "--sigfile", "quartz.sig", "--trusted-height", "1", "--trusted-hash", "A1D115BA3A5E9FCC12ED68A9D8669159E9085F6F96EC26619F5C7CEB4EE02869"] diff --git a/enclaves/quartz/src/attestor.rs b/enclaves/quartz/src/attestor.rs index 626dbe6..5ae0c04 100644 --- a/enclaves/quartz/src/attestor.rs +++ b/enclaves/quartz/src/attestor.rs @@ -3,12 +3,17 @@ use std::{ io::{Error as IoError, Write}, }; -use quartz_cw::msg::execute::attested::HasUserData; +use quartz_cw::{ + msg::execute::attested::HasUserData, + state::{MrEnclave, UserData}, +}; pub trait Attestor { type Error: ToString; fn quote(&self, user_data: impl HasUserData) -> Result, Self::Error>; + + fn mr_enclave(&self) -> Result; } #[derive(Clone, PartialEq, Debug)] @@ -24,6 +29,13 @@ impl Attestor for EpidAttestor { user_report_data.flush()?; read("/dev/attestation/quote") } + + fn mr_enclave(&self) -> Result { + let quote = self.quote(NullUserData)?; + Ok(quote[112..(112 + 32)] + .try_into() + .expect("hardcoded array size")) + } } #[derive(Clone, PartialEq, Debug)] @@ -35,4 +47,16 @@ impl Attestor for MockAttestor { fn quote(&self, _user_data: impl HasUserData) -> Result, Self::Error> { Ok(vec![]) } + + fn mr_enclave(&self) -> Result { + Ok([0u8; 32]) + } +} + +struct NullUserData; + +impl HasUserData for NullUserData { + fn user_data(&self) -> UserData { + [0u8; 64] + } } diff --git a/enclaves/quartz/src/cli.rs b/enclaves/quartz/src/cli.rs index 3f9c0fb..30c5035 100644 --- a/enclaves/quartz/src/cli.rs +++ b/enclaves/quartz/src/cli.rs @@ -1,4 +1,4 @@ -use std::{net::SocketAddr, path::PathBuf}; +use std::net::SocketAddr; use clap::Parser; use color_eyre::eyre::{eyre, Result}; @@ -22,10 +22,6 @@ pub struct Cli { #[clap(long, default_value = "127.0.0.1:11090")] pub rpc_addr: SocketAddr, - /// Gramine SIGFILE for this enclave (to read MRENCLAVE from) - #[clap(long)] - pub sigfile: PathBuf, - /// Identifier of the chain #[clap(long)] pub chain_id: String, diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 6c04829..569c67e 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -18,28 +18,23 @@ mod attestor; mod cli; mod server; -use std::{process::Command, time::Duration}; +use std::time::Duration; use clap::Parser; -use cosmwasm_std::HexBinary; use quartz_cw::state::{Config, LightClientOpts}; use quartz_proto::quartz::core_server::CoreServer; use tonic::transport::Server; -use crate::{attestor::EpidAttestor, cli::Cli, server::CoreService}; +use crate::{ + attestor::{Attestor, EpidAttestor}, + cli::Cli, + server::CoreService, +}; #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Box> { let args = Cli::parse(); - let gramine_sgx_sigstruct_view = Command::new("gramine-sgx-sigstruct-view") - .args(["--output-format", "json"]) - .arg(args.sigfile) - .output()?; - - let sigstruct_json: serde_json::Value = - serde_json::from_str(&String::from_utf8(gramine_sgx_sigstruct_view.stdout)?)?; - let mr_enclave = HexBinary::from_hex(&sigstruct_json["mr_enclave"].to_string())?.to_array()?; let light_client_opts = LightClientOpts::new( args.chain_id, args.trusted_height, @@ -50,7 +45,7 @@ async fn main() -> Result<(), Box> { args.max_block_lag, ); let config = Config::new( - mr_enclave, + EpidAttestor.mr_enclave()?, Duration::from_secs(30 * 24 * 60), light_client_opts, ); From f8db27a55fe327b0040ec30166dd9436b619c20c Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 15:29:06 -0800 Subject: [PATCH 45/49] Impl SessionCreate handling --- Cargo.lock | 109 +++++++++++++++--------------- enclaves/quartz/Cargo.toml | 5 +- enclaves/quartz/src/main.rs | 14 ++-- enclaves/quartz/src/server.rs | 29 +++++--- utils/quartz-relayer/src/types.rs | 87 +++++++++++++++++++++++- 5 files changed, 171 insertions(+), 73 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c328995..4fd20cb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -74,9 +74,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.12" +version = "0.6.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" +checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb" dependencies = [ "anstyle", "anstyle-parse", @@ -157,7 +157,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -168,7 +168,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -406,9 +406,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.86" +version = "1.0.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" +checksum = "02f341c093d19155a6e41631ce5971aac4e9a868262212153124c15fa22d1cdc" [[package]] name = "cfg-if" @@ -473,7 +473,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -834,9 +834,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.7" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a5d17510e4a1a87f323de70b7b1eaac1ee0e37866c6720b2d279452d0edf389" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" dependencies = [ "darling_core", "darling_macro", @@ -844,27 +844,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.7" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a98eea36a7ff910fa751413d0895551143a8ea41d695d9798ec7d665df7f7f5e" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim 0.10.0", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] name = "darling_macro" -version = "0.20.7" +version = "0.20.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a366a3f90c5d59a4b91169775f88e52e8f71a0e7804cc98a8db2932cf4ed57" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" dependencies = [ "darling_core", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -948,14 +948,14 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] name = "dyn-clone" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" [[package]] name = "ecdsa" @@ -1275,7 +1275,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -1391,9 +1391,9 @@ dependencies = [ [[package]] name = "half" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] name = "hashbrown" @@ -1418,9 +1418,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" +checksum = "379dada1584ad501b383485dd706b8afb7a70fcbc7f4da7d780638a5a6124a60" [[package]] name = "hex" @@ -1993,9 +1993,9 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" dependencies = [ "bitflags 2.4.2", "cfg-if 1.0.0", @@ -2014,7 +2014,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2025,9 +2025,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" dependencies = [ "cc", "libc", @@ -2154,7 +2154,7 @@ checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2202,9 +2202,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polyval" @@ -2237,7 +2237,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5" dependencies = [ "proc-macro2", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2286,7 +2286,7 @@ dependencies = [ "prost 0.12.3", "prost-types 0.12.3", "regex", - "syn 2.0.50", + "syn 2.0.51", "tempfile", "which", ] @@ -2314,7 +2314,7 @@ dependencies = [ "itertools 0.11.0", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2338,7 +2338,7 @@ dependencies = [ [[package]] name = "quartz-cw" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#c49fc8da96d2039179aec962c85f190aee999d62" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#0e877198416e3c2fb85777c177bcbabb3ca80b69" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2348,8 +2348,6 @@ dependencies = [ "serde", "serde_json", "sha2 0.10.8", - "tendermint 0.34.0", - "tendermint-light-client", "thiserror", ] @@ -2365,6 +2363,7 @@ dependencies = [ "quartz-proto", "quartz-relayer", "quartz-tee-ra", + "rand", "serde", "serde_json", "tendermint 0.34.0", @@ -2408,7 +2407,7 @@ dependencies = [ [[package]] name = "quartz-tee-ra" version = "0.1.0" -source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#c49fc8da96d2039179aec962c85f190aee999d62" +source = "git+ssh://git@github.com/informalsystems/bisenzone-cw-mvp.git?branch=hu55a1n1/11-use-quartz#0e877198416e3c2fb85777c177bcbabb3ca80b69" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -2880,7 +2879,7 @@ checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2913,7 +2912,7 @@ checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -2953,7 +2952,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -3045,12 +3044,12 @@ checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.5.5" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3137,9 +3136,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.50" +version = "2.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" +checksum = "6ab617d94515e94ae53b8406c628598680aa0c9587474ecbe58188f7b345d66c" dependencies = [ "proc-macro2", "quote", @@ -3192,9 +3191,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.10.0" +version = "3.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -3473,7 +3472,7 @@ checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -3612,7 +3611,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -3728,7 +3727,7 @@ dependencies = [ "proc-macro2", "prost-build", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -3782,7 +3781,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] [[package]] @@ -3980,7 +3979,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", "wasm-bindgen-shared", ] @@ -4014,7 +4013,7 @@ checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -4237,5 +4236,5 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.50", + "syn 2.0.51", ] diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index a8c47e5..d6bcda8 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -8,10 +8,11 @@ clap = { version = "4.1.8", features = ["derive"] } color-eyre = "0.6.2" cosmwasm-std = "1.4.0" prost = "0.12" -tendermint = "0.34.0" -tendermint-light-client = "0.34.0" +rand = "0.8.5" serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.94" +tendermint = "0.34.0" +tendermint-light-client = "0.34.0" tonic = "0.11" tokio = { version = "1.0", features = ["macros", "rt-multi-thread"] } diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index 569c67e..b852e06 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -37,13 +37,19 @@ async fn main() -> Result<(), Box> { let light_client_opts = LightClientOpts::new( args.chain_id, - args.trusted_height, - args.trusted_hash, - args.trust_threshold, + args.trusted_height.into(), + Vec::from(args.trusted_hash) + .try_into() + .expect("invalid trusted hash"), + ( + args.trust_threshold.numerator(), + args.trust_threshold.denominator(), + ), args.trusting_period, args.max_clock_drift, args.max_block_lag, - ); + )?; + let config = Config::new( EpidAttestor.mr_enclave()?, Duration::from_secs(30 * 24 * 60), diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index d53a852..201c78b 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,9 +1,14 @@ -use quartz_cw::{msg::instantiate::CoreInstantiate, state::Config}; +use quartz_cw::{ + msg::{execute::session_create::SessionCreate, instantiate::CoreInstantiate}, + state::{Config, Nonce}, +}; use quartz_proto::quartz::{ core_server::Core, InstantiateRequest as RawInstantiateRequest, - InstantiateResponse as RawInstantiateResponse, SessionCreateRequest, SessionCreateResponse, + InstantiateResponse as RawInstantiateResponse, SessionCreateRequest as RawSessionCreateRequest, + SessionCreateResponse as RawSessionCreateResponse, }; -use quartz_relayer::types::InstantiateResponse; +use quartz_relayer::types::{InstantiateResponse, SessionCreateResponse}; +use rand::Rng; use tonic::{Request, Response, Status}; use crate::attestor::Attestor; @@ -35,6 +40,7 @@ where _request: Request, ) -> TonicResult> { let core_instantiate_msg = CoreInstantiate::new(self.config.clone()); + let quote = self .attestor .quote(core_instantiate_msg) @@ -45,14 +51,17 @@ where } async fn session_create( &self, - request: Request, - ) -> TonicResult> { - println!("Got a request: {:?}", request); + _request: Request, + ) -> TonicResult> { + let nonce = rand::thread_rng().gen::(); + let session_create_msg = SessionCreate::new(nonce); - let reply = SessionCreateResponse { - message: "Hello!".to_string(), - }; + let quote = self + .attestor + .quote(session_create_msg) + .map_err(|e| Status::internal(e.to_string()))?; - Ok(Response::new(reply)) + let response = SessionCreateResponse::new(nonce, quote); + Ok(Response::new(response.into())) } } diff --git a/utils/quartz-relayer/src/types.rs b/utils/quartz-relayer/src/types.rs index 367be79..c6ed744 100644 --- a/utils/quartz-relayer/src/types.rs +++ b/utils/quartz-relayer/src/types.rs @@ -1,6 +1,9 @@ use cosmwasm_std::{HexBinary, StdError}; -use quartz_cw::state::{Config, RawConfig}; -use quartz_proto::quartz::InstantiateResponse as RawInstantiateResponse; +use quartz_cw::state::{Config, Nonce, RawConfig}; +use quartz_proto::quartz::{ + InstantiateResponse as RawInstantiateResponse, + SessionCreateResponse as RawSessionCreateResponse, +}; use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, PartialEq)] @@ -82,3 +85,83 @@ impl From for RawInstantiateResponseMsg { } } } + +#[derive(Clone, Debug, PartialEq)] +pub struct SessionCreateResponse { + message: SessionCreateResponseMsg, +} + +impl SessionCreateResponse { + pub fn new(nonce: Nonce, quote: Vec) -> Self { + Self { + message: SessionCreateResponseMsg { nonce, quote }, + } + } + + pub fn quote(&self) -> &[u8] { + &self.message.quote + } + + pub fn into_message(self) -> SessionCreateResponseMsg { + self.message + } +} + +impl TryFrom for SessionCreateResponse { + type Error = StdError; + + fn try_from(value: RawSessionCreateResponse) -> Result { + let raw_message: RawSessionCreateResponseMsg = serde_json::from_str(&value.message) + .map_err(|e| StdError::parse_err("RawSessionCreateResponseMsg", e))?; + Ok(Self { + message: raw_message.try_into()?, + }) + } +} + +impl From for RawSessionCreateResponse { + fn from(value: SessionCreateResponse) -> Self { + let raw_message: RawSessionCreateResponseMsg = value.message.into(); + Self { + message: serde_json::to_string(&raw_message).expect("infallible serializer"), + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct SessionCreateResponseMsg { + nonce: Nonce, + quote: Vec, +} + +impl SessionCreateResponseMsg { + pub fn into_tuple(self) -> (Nonce, Vec) { + (self.nonce, self.quote) + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct RawSessionCreateResponseMsg { + nonce: HexBinary, + quote: HexBinary, +} + +impl TryFrom for SessionCreateResponseMsg { + type Error = StdError; + + fn try_from(value: RawSessionCreateResponseMsg) -> Result { + Ok(Self { + nonce: value.nonce.to_array()?, + quote: value.quote.into(), + }) + } +} + +impl From for RawSessionCreateResponseMsg { + fn from(value: SessionCreateResponseMsg) -> Self { + Self { + nonce: value.nonce.into(), + quote: value.quote.into(), + } + } +} From 73e28c112be1e3ecda5f713a23e62ec5149ccf79 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Tue, 27 Feb 2024 15:59:25 -0800 Subject: [PATCH 46/49] Impl SessionSetPubKey handling --- Cargo.lock | 2 + enclaves/quartz/Cargo.toml | 1 + enclaves/quartz/src/main.rs | 1 - enclaves/quartz/src/server.rs | 48 +++++++++++-- utils/quartz-proto/proto/quartz.proto | 7 ++ utils/quartz-proto/src/prost/quartz.rs | 87 +++++++++++++++++++++++ utils/quartz-relayer/Cargo.toml | 1 + utils/quartz-relayer/src/types.rs | 98 +++++++++++++++++++++++++- 8 files changed, 236 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4fd20cb..d27f973 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2358,6 +2358,7 @@ dependencies = [ "clap", "color-eyre", "cosmwasm-std", + "k256 0.13.3", "prost 0.12.3", "quartz-cw", "quartz-proto", @@ -2391,6 +2392,7 @@ dependencies = [ "cosmwasm-std", "displaydoc", "ecies", + "k256 0.13.3", "quartz-cw", "quartz-proto", "quartz-tee-ra", diff --git a/enclaves/quartz/Cargo.toml b/enclaves/quartz/Cargo.toml index d6bcda8..8fafd73 100644 --- a/enclaves/quartz/Cargo.toml +++ b/enclaves/quartz/Cargo.toml @@ -7,6 +7,7 @@ edition = "2021" clap = { version = "4.1.8", features = ["derive"] } color-eyre = "0.6.2" cosmwasm-std = "1.4.0" +k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } prost = "0.12" rand = "0.8.5" serde = { version = "1.0.189", features = ["derive"] } diff --git a/enclaves/quartz/src/main.rs b/enclaves/quartz/src/main.rs index b852e06..90a15c8 100644 --- a/enclaves/quartz/src/main.rs +++ b/enclaves/quartz/src/main.rs @@ -4,7 +4,6 @@ clippy::checked_conversions, clippy::panic, clippy::panic_in_result_fn, - clippy::unwrap_used, missing_docs, trivial_casts, trivial_numeric_casts, diff --git a/enclaves/quartz/src/server.rs b/enclaves/quartz/src/server.rs index 201c78b..56266d4 100644 --- a/enclaves/quartz/src/server.rs +++ b/enclaves/quartz/src/server.rs @@ -1,13 +1,21 @@ +use std::sync::{Arc, Mutex}; + +use k256::ecdsa::SigningKey; use quartz_cw::{ - msg::{execute::session_create::SessionCreate, instantiate::CoreInstantiate}, + msg::{ + execute::{session_create::SessionCreate, session_set_pub_key::SessionSetPubKey}, + instantiate::CoreInstantiate, + }, state::{Config, Nonce}, }; use quartz_proto::quartz::{ core_server::Core, InstantiateRequest as RawInstantiateRequest, InstantiateResponse as RawInstantiateResponse, SessionCreateRequest as RawSessionCreateRequest, SessionCreateResponse as RawSessionCreateResponse, + SessionSetPubKeyRequest as RawSessionSetPubKeyRequest, + SessionSetPubKeyResponse as RawSessionSetPubKeyResponse, }; -use quartz_relayer::types::{InstantiateResponse, SessionCreateResponse}; +use quartz_relayer::types::{InstantiateResponse, SessionCreateResponse, SessionSetPubKeyResponse}; use rand::Rng; use tonic::{Request, Response, Status}; @@ -15,9 +23,10 @@ use crate::attestor::Attestor; type TonicResult = Result; -#[derive(Clone, PartialEq, Debug)] +#[derive(Clone, Debug)] pub struct CoreService { config: Config, + nonce: Arc>, attestor: A, } @@ -26,7 +35,11 @@ where A: Attestor, { pub fn new(config: Config, attestor: A) -> Self { - Self { config, attestor } + Self { + config, + nonce: Arc::new(Mutex::new([0u8; 32])), + attestor, + } } } @@ -53,15 +66,36 @@ where &self, _request: Request, ) -> TonicResult> { - let nonce = rand::thread_rng().gen::(); - let session_create_msg = SessionCreate::new(nonce); + let mut nonce = self.nonce.lock().unwrap(); + *nonce = rand::thread_rng().gen::(); + + let session_create_msg = SessionCreate::new(*nonce); let quote = self .attestor .quote(session_create_msg) .map_err(|e| Status::internal(e.to_string()))?; - let response = SessionCreateResponse::new(nonce, quote); + let response = SessionCreateResponse::new(*nonce, quote); + Ok(Response::new(response.into())) + } + + async fn session_set_pub_key( + &self, + _request: Request, + ) -> TonicResult> { + let nonce = self.nonce.lock().unwrap(); + let sk = SigningKey::random(&mut rand::thread_rng()); + let pk = sk.verifying_key(); + + let session_set_pub_key_msg = SessionSetPubKey::new(*nonce, *pk); + + let quote = self + .attestor + .quote(session_set_pub_key_msg) + .map_err(|e| Status::internal(e.to_string()))?; + + let response = SessionSetPubKeyResponse::new(*nonce, *pk, quote); Ok(Response::new(response.into())) } } diff --git a/utils/quartz-proto/proto/quartz.proto b/utils/quartz-proto/proto/quartz.proto index 60f2aff..7312b86 100644 --- a/utils/quartz-proto/proto/quartz.proto +++ b/utils/quartz-proto/proto/quartz.proto @@ -5,6 +5,7 @@ package quartz; service Core { rpc Instantiate (InstantiateRequest) returns (InstantiateResponse) {} rpc SessionCreate (SessionCreateRequest) returns (SessionCreateResponse) {} + rpc SessionSetPubKey (SessionSetPubKeyRequest) returns (SessionSetPubKeyResponse) {} } message InstantiateRequest {} @@ -18,3 +19,9 @@ message SessionCreateRequest {} message SessionCreateResponse { string message = 1; } + +message SessionSetPubKeyRequest {} + +message SessionSetPubKeyResponse { + string message = 1; +} diff --git a/utils/quartz-proto/src/prost/quartz.rs b/utils/quartz-proto/src/prost/quartz.rs index 10aff4b..a55c500 100644 --- a/utils/quartz-proto/src/prost/quartz.rs +++ b/utils/quartz-proto/src/prost/quartz.rs @@ -16,6 +16,15 @@ pub struct SessionCreateResponse { #[prost(string, tag = "1")] pub message: ::prost::alloc::string::String, } +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SessionSetPubKeyRequest {} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SessionSetPubKeyResponse { + #[prost(string, tag = "1")] + pub message: ::prost::alloc::string::String, +} /// Generated client implementations. pub mod core_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] @@ -147,6 +156,31 @@ pub mod core_client { req.extensions_mut().insert(GrpcMethod::new("quartz.Core", "SessionCreate")); self.inner.unary(req, path, codec).await } + pub async fn session_set_pub_key( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static( + "/quartz.Core/SessionSetPubKey", + ); + let mut req = request.into_request(); + req.extensions_mut() + .insert(GrpcMethod::new("quartz.Core", "SessionSetPubKey")); + self.inner.unary(req, path, codec).await + } } } /// Generated server implementations. @@ -170,6 +204,13 @@ pub mod core_server { tonic::Response, tonic::Status, >; + async fn session_set_pub_key( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; } #[derive(Debug)] pub struct CoreServer { @@ -340,6 +381,52 @@ pub mod core_server { }; Box::pin(fut) } + "/quartz.Core/SessionSetPubKey" => { + #[allow(non_camel_case_types)] + struct SessionSetPubKeySvc(pub Arc); + impl< + T: Core, + > tonic::server::UnaryService + for SessionSetPubKeySvc { + type Response = super::SessionSetPubKeyResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::session_set_pub_key(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = SessionSetPubKeySvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } _ => { Box::pin(async move { Ok( diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index a012887..765828f 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -10,6 +10,7 @@ cosmrs = { version = "=0.11.0", features = ["cosmwasm"] } cosmwasm-std = "1.4.0" displaydoc = { version = "0.2.3", default-features = false } ecies = "0.2.6" +k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.94" subtle-encoding = { version = "0.5.1", features = ["bech32-preview"] } diff --git a/utils/quartz-relayer/src/types.rs b/utils/quartz-relayer/src/types.rs index c6ed744..2d9ce27 100644 --- a/utils/quartz-relayer/src/types.rs +++ b/utils/quartz-relayer/src/types.rs @@ -1,8 +1,13 @@ use cosmwasm_std::{HexBinary, StdError}; -use quartz_cw::state::{Config, Nonce, RawConfig}; +use k256::ecdsa::VerifyingKey; +use quartz_cw::{ + error::Error as QuartzCwError, + state::{Config, Nonce, RawConfig}, +}; use quartz_proto::quartz::{ InstantiateResponse as RawInstantiateResponse, SessionCreateResponse as RawSessionCreateResponse, + SessionSetPubKeyResponse as RawSessionSetPubKeyResponse, }; use serde::{Deserialize, Serialize}; @@ -165,3 +170,94 @@ impl From for RawSessionCreateResponseMsg { } } } + +#[derive(Clone, Debug, PartialEq)] +pub struct SessionSetPubKeyResponse { + message: SessionSetPubKeyResponseMsg, +} + +impl SessionSetPubKeyResponse { + pub fn new(nonce: Nonce, pub_key: VerifyingKey, quote: Vec) -> Self { + Self { + message: SessionSetPubKeyResponseMsg { + nonce, + pub_key, + quote, + }, + } + } + + pub fn quote(&self) -> &[u8] { + &self.message.quote + } + + pub fn into_message(self) -> SessionSetPubKeyResponseMsg { + self.message + } +} + +impl TryFrom for SessionSetPubKeyResponse { + type Error = StdError; + + fn try_from(value: RawSessionSetPubKeyResponse) -> Result { + let raw_message: RawSessionSetPubKeyResponseMsg = serde_json::from_str(&value.message) + .map_err(|e| StdError::parse_err("RawSessionSetPubKeyResponseMsg", e))?; + Ok(Self { + message: raw_message.try_into()?, + }) + } +} + +impl From for RawSessionSetPubKeyResponse { + fn from(value: SessionSetPubKeyResponse) -> Self { + let raw_message: RawSessionSetPubKeyResponseMsg = value.message.into(); + Self { + message: serde_json::to_string(&raw_message).expect("infallible serializer"), + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub struct SessionSetPubKeyResponseMsg { + nonce: Nonce, + pub_key: VerifyingKey, + quote: Vec, +} + +impl SessionSetPubKeyResponseMsg { + pub fn into_tuple(self) -> (VerifyingKey, Vec) { + (self.pub_key, self.quote) + } +} + +#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] +pub struct RawSessionSetPubKeyResponseMsg { + nonce: HexBinary, + pub_key: HexBinary, + quote: HexBinary, +} + +impl TryFrom for SessionSetPubKeyResponseMsg { + type Error = StdError; + + fn try_from(value: RawSessionSetPubKeyResponseMsg) -> Result { + let pub_key = VerifyingKey::from_sec1_bytes(&value.pub_key) + .map_err(QuartzCwError::from) + .map_err(|e| StdError::generic_err(e.to_string()))?; + Ok(Self { + nonce: value.nonce.to_array()?, + pub_key, + quote: value.quote.into(), + }) + } +} + +impl From for RawSessionSetPubKeyResponseMsg { + fn from(value: SessionSetPubKeyResponseMsg) -> Self { + Self { + nonce: value.nonce.into(), + pub_key: value.pub_key.to_sec1_bytes().into_vec().into(), + quote: value.quote.into(), + } + } +} From 812558e402df97a962ae0070d1c4406960c2a907 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Wed, 28 Feb 2024 10:45:02 -0800 Subject: [PATCH 47/49] Fix compilation --- utils/quartz-relayer/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/quartz-relayer/Cargo.toml b/utils/quartz-relayer/Cargo.toml index 765828f..2cdd7fa 100644 --- a/utils/quartz-relayer/Cargo.toml +++ b/utils/quartz-relayer/Cargo.toml @@ -9,7 +9,7 @@ cosmos-sdk-proto = "0.16.0" cosmrs = { version = "=0.11.0", features = ["cosmwasm"] } cosmwasm-std = "1.4.0" displaydoc = { version = "0.2.3", default-features = false } -ecies = "0.2.6" +ecies = { version = "0.2.6", default-features = false, features = ["pure"] } k256 = { version = "0.13.2", default-features = false, features = ["ecdsa", "alloc"] } serde = { version = "1.0.189", features = ["derive"] } serde_json = "1.0.94" From 5c2b72c6ef5db34698ce15c82420f12d6e5619d0 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Wed, 28 Feb 2024 10:45:09 -0800 Subject: [PATCH 48/49] cargo update --- Cargo.lock | 114 +++++++++++------------------------------------------ 1 file changed, 24 insertions(+), 90 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d27f973..ed621a9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -994,7 +994,6 @@ dependencies = [ "hkdf", "libsecp256k1", "once_cell", - "openssl", "parking_lot", "rand_core 0.6.4", "sha2 0.10.8", @@ -1189,21 +1188,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - [[package]] name = "form_urlencoded" version = "1.2.1" @@ -1991,50 +1975,12 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "openssl" -version = "0.10.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f" -dependencies = [ - "bitflags 2.4.2", - "cfg-if 1.0.0", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.51", -] - [[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.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "overload" version = "0.1.1" @@ -2200,12 +2146,6 @@ dependencies = [ "spki 0.7.3", ] -[[package]] -name = "pkg-config" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" - [[package]] name = "polyval" version = "0.6.1" @@ -3923,12 +3863,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[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.4" @@ -4094,7 +4028,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.3", + "windows-targets 0.52.4", ] [[package]] @@ -4114,17 +4048,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" dependencies = [ - "windows_aarch64_gnullvm 0.52.3", - "windows_aarch64_msvc 0.52.3", - "windows_i686_gnu 0.52.3", - "windows_i686_msvc 0.52.3", - "windows_x86_64_gnu 0.52.3", - "windows_x86_64_gnullvm 0.52.3", - "windows_x86_64_msvc 0.52.3", + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -4135,9 +4069,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -4147,9 +4081,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -4159,9 +4093,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -4171,9 +4105,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -4183,9 +4117,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -4195,9 +4129,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -4207,9 +4141,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.3" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "winreg" From 25547172f572655052e5dde6163384fa02524997 Mon Sep 17 00:00:00 2001 From: hu55a1n1 Date: Wed, 28 Feb 2024 10:46:35 -0800 Subject: [PATCH 49/49] Fix clippy --- utils/quartz-relayer/src/main.rs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/utils/quartz-relayer/src/main.rs b/utils/quartz-relayer/src/main.rs index 400e075..a6355e2 100644 --- a/utils/quartz-relayer/src/main.rs +++ b/utils/quartz-relayer/src/main.rs @@ -58,10 +58,7 @@ async fn main() -> Result<(), Box> { serde_json::to_string(&ias_report).expect("infallible serializer") ); let ias_report: IASReport = serde_json::from_str(&ias_report.to_string())?; - let mr_enclave = ias_report.report.isv_enclave_quote_body.mrenclave(); - let user_data = ias_report.report.isv_enclave_quote_body.user_data(); - let attestation = EpidAttestation::new(ias_report, mr_enclave, user_data); - + let attestation = EpidAttestation::new(ias_report); let cw_instantiate_msg = Attested::new(CoreInstantiate::new(config), attestation); // Read the TSP secret