mod attested;
mod compiled;
mod configured;
mod connected;
mod pki;
mod requested;
use super::config::Config;
use super::{Args, Package};
use std::sync::Arc;
use rustls::{ClientConfig, ServerConfig};
use wasi_common::WasiCtx;
use wasmtime::{Linker, Store, Val};
use zeroize::Zeroizing;
pub struct Configured {
args: Args,
}
pub struct Requested {
package: Package,
prvkey: Zeroizing<Vec<u8>>,
crtreq: Vec<u8>,
}
pub struct Attested {
srvcfg: Arc<ServerConfig>,
cltcfg: Arc<ClientConfig>,
config: Config,
webasm: Vec<u8>,
}
pub struct Compiled {
srvcfg: Arc<ServerConfig>,
cltcfg: Arc<ClientConfig>,
config: Config,
wstore: Store<WasiCtx>,
linker: Linker<WasiCtx>,
}
pub struct Connected {
wstore: Store<WasiCtx>,
linker: Linker<WasiCtx>,
}
pub struct Completed {
values: Vec<Val>,
}
pub struct Loader<T>(T);
impl Loader<Attested> {
#[cfg(test)]
pub fn run(module: &[u8]) -> anyhow::Result<Vec<Val>> {
use rustls::{server::ResolvesServerCert, RootCertStore};
struct Resolver;
impl ResolvesServerCert for Resolver {
fn resolve(
&self,
_client_hello: rustls::server::ClientHello<'_>,
) -> Option<Arc<rustls::sign::CertifiedKey>> {
None
}
}
let srvcfg = ServerConfig::builder()
.with_safe_defaults()
.with_no_client_auth()
.with_cert_resolver(Arc::new(Resolver));
let cltcfg = ClientConfig::builder()
.with_safe_defaults()
.with_root_certificates(RootCertStore::empty())
.with_no_client_auth();
let attested = Self(Attested {
srvcfg: Arc::new(srvcfg),
cltcfg: Arc::new(cltcfg),
config: Default::default(),
webasm: module.to_vec(),
});
let compiled = attested.next()?;
let connected = compiled.next()?;
let completed = connected.next()?;
Ok(completed.into())
}
}
impl From<Args> for Loader<Configured> {
fn from(args: Args) -> Self {
Self(Configured { args })
}
}
impl From<Loader<Completed>> for Vec<Val> {
fn from(value: Loader<Completed>) -> Self {
value.0.values
}
}