#![cfg(all(feature = "sev", feature = "dangerous_hw_tests"))]
#[cfg(feature = "openssl")]
use crate::{
certs::sev::{ca::Chain as CaChain, Chain as FullChain},
firmware::host::Firmware,
sev::Certificate,
Generation,
};
#[cfg(feature = "openssl")]
use reqwest::{
blocking::{get, Response},
StatusCode,
};
use std::{
env,
path::{Path, PathBuf},
};
#[cfg(feature = "openssl")]
use std::io::Cursor;
#[cfg(feature = "openssl")]
use crate::parser::Decoder;
fn append_rest<P: AsRef<Path>>(path: P) -> PathBuf {
let mut path = path.as_ref().to_path_buf();
path.push("amd-sev");
path.push("chain");
path
}
pub fn env_var() -> Option<PathBuf> {
env::var("SEV_CHAIN").ok().map(PathBuf::from)
}
pub fn home() -> Option<PathBuf> {
dirs::cache_dir().map(append_rest)
}
pub fn sys() -> Option<PathBuf> {
let sys = PathBuf::from("/var/cache");
if sys.exists() {
Some(append_rest(sys))
} else {
None
}
}
pub fn path() -> Vec<PathBuf> {
vec![env_var(), home(), sys()]
.into_iter()
.flatten()
.collect()
}
pub fn rm_cached_chain() {
let paths = path();
if let Some(path) = paths.first() {
if path.exists() {
std::fs::remove_file(path).unwrap();
}
}
}
#[cfg(all(feature = "sev", feature = "openssl"))]
pub fn get_chain() -> FullChain {
use std::convert::TryFrom;
let mut firmware = Firmware::open().unwrap();
const CEK_SVC: &str = "https://kdsintf.amd.com/cek/id";
let mut sev_chain = firmware.pdh_cert_export().unwrap();
let id = firmware.get_identifier().unwrap();
let url = format!("{}/{}", CEK_SVC, id);
let vcek_rsp: Response = get(url).expect("Failed to get CEK certificate");
let cek_resp_bytes = match vcek_rsp.status() {
StatusCode::OK => {
let vcek_rsp_bytes: Vec<u8> = vcek_rsp.bytes().unwrap().to_vec();
vcek_rsp_bytes
}
_ => panic!("Cek request returned an error"),
};
let mut cursor = Cursor::new(cek_resp_bytes);
sev_chain.cek = Certificate::decode(&mut cursor, ()).expect("Failed to decode CEK cert");
let ca_chain: CaChain = Generation::try_from(&sev_chain)
.expect("Failed to generate SEV CA chain")
.into();
FullChain {
ca: ca_chain,
sev: sev_chain,
}
}