use std::future::Future;
use crate::error::AtlsVerificationError;
use dcap_qvl::verify::VerifiedReport;
#[cfg(not(target_arch = "wasm32"))]
pub use tokio::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
#[cfg(target_arch = "wasm32")]
pub use futures::io::{AsyncRead, AsyncReadExt, AsyncWrite, AsyncWriteExt};
#[cfg(not(target_arch = "wasm32"))]
pub trait AsyncByteStream: AsyncRead + AsyncWrite + Unpin + Send {}
#[cfg(not(target_arch = "wasm32"))]
impl<T: AsyncRead + AsyncWrite + Unpin + Send> AsyncByteStream for T {}
#[cfg(target_arch = "wasm32")]
pub trait AsyncByteStream: AsyncRead + AsyncWrite + Unpin {}
#[cfg(target_arch = "wasm32")]
impl<T: AsyncRead + AsyncWrite + Unpin> AsyncByteStream for T {}
#[derive(Debug, Clone)]
pub enum Report {
Tdx(VerifiedReport),
}
impl Report {
pub fn as_tdx(&self) -> Option<&VerifiedReport> {
match self {
Report::Tdx(r) => Some(r),
}
}
pub fn into_tdx(self) -> Option<VerifiedReport> {
match self {
Report::Tdx(r) => Some(r),
}
}
}
#[cfg(not(target_arch = "wasm32"))]
pub trait AtlsVerifier: Send + Sync {
fn verify<S>(
&self,
stream: &mut S,
peer_cert: &[u8],
session_ekm: &[u8],
hostname: &str,
) -> impl Future<Output = Result<Report, AtlsVerificationError>> + Send
where
S: AsyncByteStream;
}
#[cfg(target_arch = "wasm32")]
pub trait AtlsVerifier: Sync {
fn verify<S>(
&self,
stream: &mut S,
peer_cert: &[u8],
session_ekm: &[u8],
hostname: &str,
) -> impl Future<Output = Result<Report, AtlsVerificationError>>
where
S: AsyncByteStream;
}
pub trait IntoVerifier {
type Verifier: AtlsVerifier;
fn into_verifier(self) -> Result<Self::Verifier, AtlsVerificationError>;
}
pub enum Verifier {
DstackTdx(crate::dstack::DstackTDXVerifier),
}
#[cfg(not(target_arch = "wasm32"))]
impl AtlsVerifier for Verifier {
fn verify<S>(
&self,
stream: &mut S,
peer_cert: &[u8],
session_ekm: &[u8],
hostname: &str,
) -> impl Future<Output = Result<Report, AtlsVerificationError>> + Send
where
S: AsyncByteStream,
{
async move {
match self {
Verifier::DstackTdx(v) => v.verify(stream, peer_cert, session_ekm, hostname).await,
}
}
}
}
#[cfg(target_arch = "wasm32")]
impl AtlsVerifier for Verifier {
fn verify<S>(
&self,
stream: &mut S,
peer_cert: &[u8],
session_ekm: &[u8],
hostname: &str,
) -> impl Future<Output = Result<Report, AtlsVerificationError>>
where
S: AsyncByteStream,
{
async move {
match self {
Verifier::DstackTdx(v) => v.verify(stream, peer_cert, session_ekm, hostname).await,
}
}
}
}