Skip to content

Commit ca0eadd

Browse files
authored
Merge pull request #904 from Dstack-TEE/codex/fix-simulator-measured-nitro-pcrs
[STACKED on #888] fix(simulator): model measured Nitro enclave PCRs
2 parents 2af5274 + be19bac commit ca0eadd

2 files changed

Lines changed: 31 additions & 1 deletion

File tree

dstack/tee-simulator/src/nsm.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ impl Default for NsmState {
4646
}
4747

4848
impl NsmState {
49+
fn measured() -> Self {
50+
let mut state = Self::default();
51+
for index in 0..=2 {
52+
let digest = Sha384::digest(format!("dstack-tee-simulator/nsm/pcr/{index}").as_bytes());
53+
state.pcrs[index].copy_from_slice(&digest);
54+
}
55+
state
56+
}
57+
4958
fn handle(&mut self, generator: &NsmGenerator, request: Request) -> Response {
5059
match request {
5160
Request::DescribePCR { index } => {
@@ -381,7 +390,7 @@ pub fn run(config: &TeeSimulatorConfig) -> Result<()> {
381390
.set(Arc::new(NsmGenerator::from_seed(parse_seed(seed)?)?))
382391
.map_err(|_| anyhow::anyhow!("NSM simulator was already initialized"))?;
383392
STATE
384-
.set(Mutex::new(NsmState::default()))
393+
.set(Mutex::new(NsmState::measured()))
385394
.map_err(|_| anyhow::anyhow!("NSM simulator state was already initialized"))?;
386395

387396
let device_name = CString::new("DEVNAME=nsm")?;
@@ -446,6 +455,17 @@ mod tests {
446455
}
447456
}
448457

458+
#[test]
459+
fn measured_state_models_a_production_enclave() {
460+
let state = NsmState::measured();
461+
assert!(state.pcrs[..=2]
462+
.iter()
463+
.all(|value| value.iter().any(|byte| *byte != 0)));
464+
assert!(state.pcrs[3..]
465+
.iter()
466+
.all(|value| value.iter().all(|byte| *byte == 0)));
467+
}
468+
449469
#[test]
450470
fn pcr_lifecycle_matches_nsm_semantics() {
451471
let generator = NsmGenerator::from_seed([0x51; 32]).unwrap();

dstack/tests/e2e/attestation/run-platform.sh

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ elif [[ "$TEE_PLATFORM" == dstack-amd-sev-snp ]]; then
3838
dstack-util attest-json --input "$WORK/snp-fixture.bin" --output "$WORK/snp-fixture.json"
3939
VM_CONFIG=$(jq -c '.config | fromjson' "$WORK/snp-fixture.json")
4040
MR_CONFIG=$(jq -r .mr_config <<<"$VM_CONFIG")
41+
elif [[ "$TEE_PLATFORM" == dstack-nitro-enclave ]]; then
42+
for index in 0 1 2; do
43+
printf 'dstack-tee-simulator/nsm/pcr/%s' "$index" |
44+
sha384sum | cut -d' ' -f1 > "$WORK/pcr$index"
45+
done
46+
OS_IMAGE_HASH=$(
47+
cat "$WORK/pcr0" "$WORK/pcr1" "$WORK/pcr2" |
48+
xxd -r -p | sha256sum | cut -d' ' -f1
49+
)
50+
VM_CONFIG=$(jq -cn --arg os "$OS_IMAGE_HASH" '{os_image_hash:$os}')
4151
elif [[ "$TEE_PLATFORM" == dstack-aws-nitro-tpm ]]; then
4252
ZERO_PCR=$(printf '00%.0s' $(seq 1 48))
4353
printf '%s' "$ZERO_PCR" > "$WORK/pcr4"

0 commit comments

Comments
 (0)