diff --git a/app/src/commands/attestation.rs b/app/src/commands/attestation.rs index 0a9fb15c..78b22173 100644 --- a/app/src/commands/attestation.rs +++ b/app/src/commands/attestation.rs @@ -1,10 +1,12 @@ -use crate::opts::{EnclaveOpts, Opts}; +use crate::{ + enclave::EnclaveLoader, + opts::{EnclaveOpts, Opts}, +}; use anyhow::{bail, Result}; use clap::Parser; use crypto::Address; use ecall_commands::IASRemoteAttestationInput; use enclave_api::{Enclave, EnclaveCommandAPI, EnclaveProtoAPI}; -use std::path::PathBuf; use store::transaction::CommitStore; /// `attestation` subcommand @@ -19,14 +21,11 @@ pub enum AttestationCmd { } impl AttestationCmd { - pub fn run( - &self, - opts: &Opts, - enclave_loader: impl FnOnce(&Opts, Option<&PathBuf>, bool) -> Result>, - ) -> Result<()> + pub fn run(&self, opts: &Opts, enclave_loader: L) -> Result<()> where S: CommitStore, Enclave: EnclaveProtoAPI, + L: EnclaveLoader, { let home = opts.get_home(); match self { @@ -35,7 +34,7 @@ impl AttestationCmd { bail!("home directory doesn't exist at {:?}", home); } run_ias_remote_attestation( - enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, cmd, ) } @@ -45,7 +44,7 @@ impl AttestationCmd { bail!("home directory doesn't exist at {:?}", home); } run_simulate_remote_attestation( - enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, cmd, ) } @@ -102,14 +101,14 @@ pub struct SimulateRemoteAttestation { long = "signing_cert_path", help = "Path to a der-encoded file that contains X.509 certificate" )] - pub signing_cert_path: PathBuf, + pub signing_cert_path: std::path::PathBuf, /// Path to a PEM-encoded file that contains PKCS#8 private key #[clap( long = "signing_key", help = "Path to a PEM-encoded file that contains PKCS#8 private key" )] - pub signing_key_path: PathBuf, + pub signing_key_path: std::path::PathBuf, /// Validate a signing certificate using openssl command #[clap( diff --git a/app/src/commands/elc.rs b/app/src/commands/elc.rs index 2bf48219..07aa0f86 100644 --- a/app/src/commands/elc.rs +++ b/app/src/commands/elc.rs @@ -1,4 +1,7 @@ -use crate::opts::{EnclaveOpts, Opts}; +use crate::{ + enclave::EnclaveLoader, + opts::{EnclaveOpts, Opts}, +}; use anyhow::Result; use clap::Parser; use enclave_api::{Enclave, EnclaveProtoAPI}; @@ -42,17 +45,15 @@ impl ELCOpts { } impl ELCCmd { - pub fn run( - &self, - opts: &Opts, - enclave_loader: impl FnOnce(&Opts, Option<&PathBuf>, bool) -> Result>, - ) -> Result<()> + pub fn run(&self, opts: &Opts, enclave_loader: L) -> Result<()> where S: CommitStore, Enclave: EnclaveProtoAPI, + L: EnclaveLoader, { let elc_opts = self.opts(); - let enclave = enclave_loader(opts, elc_opts.enclave.path.as_ref(), elc_opts.enclave.debug)?; + let enclave = + enclave_loader.load(opts, elc_opts.enclave.path.as_ref(), elc_opts.enclave.debug)?; match self { Self::CreateClient(_) => { let _ = enclave.proto_create_client(elc_opts.load()?)?; diff --git a/app/src/commands/enclave.rs b/app/src/commands/enclave.rs index 5e27dda3..224b1b1f 100644 --- a/app/src/commands/enclave.rs +++ b/app/src/commands/enclave.rs @@ -1,4 +1,7 @@ -use crate::opts::{EnclaveOpts, Opts}; +use crate::{ + enclave::EnclaveLoader, + opts::{EnclaveOpts, Opts}, +}; use anyhow::{anyhow, Result}; use clap::Parser; use ecall_commands::GenerateEnclaveKeyInput; @@ -6,7 +9,6 @@ use enclave_api::{Enclave, EnclaveCommandAPI, EnclaveProtoAPI}; use lcp_types::Mrenclave; use log::*; use serde_json::json; -use std::path::PathBuf; use store::transaction::CommitStore; // `enclave` subcommand @@ -23,14 +25,11 @@ pub enum EnclaveCmd { } impl EnclaveCmd { - pub fn run( - &self, - opts: &Opts, - enclave_loader: impl FnOnce(&Opts, Option<&PathBuf>, bool) -> Result>, - ) -> Result<()> + pub fn run(&self, opts: &Opts, enclave_loader: L) -> Result<()> where S: CommitStore, Enclave: EnclaveProtoAPI, + L: EnclaveLoader, { let home = opts.get_home(); if !home.exists() { @@ -39,15 +38,15 @@ impl EnclaveCmd { } match self { Self::GenerateKey(cmd) => run_generate_key( - enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, cmd, ), Self::ListKeys(cmd) => run_list_keys( - enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, cmd, ), Self::PruneKeys(cmd) => run_prune_keys( - enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?, cmd, ), Self::Metadata(cmd) => run_print_metadata(opts, cmd), diff --git a/app/src/commands/service.rs b/app/src/commands/service.rs index 9fc04fbd..0f5a81ae 100644 --- a/app/src/commands/service.rs +++ b/app/src/commands/service.rs @@ -1,10 +1,10 @@ +use crate::enclave::EnclaveLoader; use crate::opts::{EnclaveOpts, Opts}; use anyhow::Result; use clap::Parser; use enclave_api::{Enclave, EnclaveProtoAPI}; use log::*; use service::{run_service, AppService}; -use std::path::PathBuf; use std::sync::Arc; use store::transaction::CommitStore; use tokio::runtime::Builder; @@ -38,19 +38,17 @@ pub struct Start { } impl ServiceCmd { - pub fn run( - &self, - opts: &Opts, - enclave_loader: impl FnOnce(&Opts, Option<&PathBuf>, bool) -> Result>, - ) -> Result<()> + pub fn run(&self, opts: &Opts, enclave_loader: L) -> Result<()> where S: CommitStore + 'static, Enclave: EnclaveProtoAPI, + L: EnclaveLoader, { match self { Self::Start(cmd) => { let addr = cmd.address.parse()?; - let enclave = enclave_loader(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?; + let enclave = + enclave_loader.load(opts, cmd.enclave.path.as_ref(), cmd.enclave.debug)?; let mut rb = Builder::new_multi_thread(); let rb = if let Some(threads) = cmd.threads { diff --git a/app/src/enclave.rs b/app/src/enclave.rs index 6984be32..706bceda 100644 --- a/app/src/enclave.rs +++ b/app/src/enclave.rs @@ -5,12 +5,18 @@ use keymanager::EnclaveKeyManager; use std::path::PathBuf; use store::transaction::CommitStore; -pub(crate) fn build_enclave_loader( -) -> impl FnOnce(&Opts, Option<&PathBuf>, bool) -> Result> +pub trait EnclaveLoader { + fn load(&self, opts: &Opts, path: Option<&PathBuf>, debug: bool) -> Result>; +} + +#[derive(Debug)] +pub struct DefaultEnclaveLoader(std::marker::PhantomData); + +impl EnclaveLoader for DefaultEnclaveLoader where Enclave: EnclaveProtoAPI, { - |opts, path, debug| { + fn load(&self, opts: &Opts, path: Option<&PathBuf>, debug: bool) -> Result> { let path = if let Some(path) = path { path.clone() } else { @@ -30,3 +36,10 @@ where } } } + +pub const fn build_enclave_loader() -> DefaultEnclaveLoader +where + Enclave: EnclaveProtoAPI, +{ + DefaultEnclaveLoader(std::marker::PhantomData) +}