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) -}