use axum::Json;
use axum::extract::State;
use crate::auth::SuperAdminAuth;
use crate::error::{AppError, tee_attestation_error};
use crate::operations;
use crate::server::AppState;
use crate::tee::mnemonic_guard::{MnemonicExportResponse, MnemonicExportStatus};
use crate::tee::types::{AttestationRequest, AttestationResponse, TeeStatus};
pub async fn status(State(state): State<AppState>) -> Result<Json<TeeStatus>, AppError> {
let tee_state = state
.tee
.as_ref()
.map(|tc| &tc.state)
.ok_or_else(|| tee_attestation_error("TEE attestation is not enabled on this VTA"))?;
Ok(Json(operations::attestation::get_tee_status(tee_state)))
}
pub async fn generate_report(
State(state): State<AppState>,
Json(body): Json<AttestationRequest>,
) -> Result<Json<AttestationResponse>, AppError> {
let tee_state = state
.tee
.as_ref()
.map(|tc| &tc.state)
.ok_or_else(|| tee_attestation_error("TEE attestation is not enabled on this VTA"))?;
let response =
operations::attestation::generate_attestation_report(tee_state, &state.config, &body.nonce)
.await?;
Ok(Json(response))
}
pub async fn cached_report(
State(state): State<AppState>,
) -> Result<Json<AttestationResponse>, AppError> {
let tee_state = state
.tee
.as_ref()
.map(|tc| &tc.state)
.ok_or_else(|| tee_attestation_error("TEE attestation is not enabled on this VTA"))?;
let response = operations::attestation::get_cached_report(tee_state, &state.config).await?;
Ok(Json(response))
}
pub async fn did_log(State(state): State<AppState>) -> Result<String, AppError> {
let log_bytes = state.keys_ks.get_raw("tee:did_log").await?.ok_or_else(|| {
AppError::NotFound(
"no auto-generated DID log found — the VTA may not have \
been configured with a vta_did_template"
.into(),
)
})?;
String::from_utf8(log_bytes)
.map_err(|e| AppError::Internal(format!("DID log is not valid UTF-8: {e}")))
}
pub async fn admin_credential(State(state): State<AppState>) -> Result<String, AppError> {
let cred_bytes = state
.keys_ks
.get_raw("tee:admin_credential")
.await?
.ok_or_else(|| {
AppError::NotFound(
"no bootstrapped admin credential found — already retrieved or \
VTA was not configured with KMS bootstrap"
.into(),
)
})?;
let credential = String::from_utf8(cred_bytes)
.map_err(|e| AppError::Internal(format!("admin credential is not valid UTF-8: {e}")))?;
let _ = state.keys_ks.remove("tee:admin_credential").await;
tracing::info!("admin credential retrieved and deleted from store");
Ok(credential)
}
pub async fn mnemonic_status(
_auth: SuperAdminAuth,
State(state): State<AppState>,
) -> Result<Json<MnemonicExportStatus>, AppError> {
let guard = state
.tee
.as_ref()
.and_then(|tc| tc.mnemonic_guard.as_ref())
.ok_or_else(|| {
tee_attestation_error(
"mnemonic export not available (TEE mode not active or no KMS bootstrap)",
)
})?;
Ok(Json(guard.status()))
}
pub async fn mnemonic_export(
_auth: SuperAdminAuth,
State(state): State<AppState>,
) -> Result<Json<MnemonicExportResponse>, AppError> {
let guard = state
.tee
.as_ref()
.and_then(|tc| tc.mnemonic_guard.as_ref())
.ok_or_else(|| {
tee_attestation_error(
"mnemonic export not available (TEE mode not active or no KMS bootstrap)",
)
})?;
let response = guard.export()?;
Ok(Json(response))
}