@@ -46,6 +46,15 @@ impl Default for NsmState {
4646}
4747
4848impl 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 ( ) ;
0 commit comments