Skip to content

Commit 6717c27

Browse files
committed
WIP: Test warm reset with debug unlocked
1 parent 15071c1 commit 6717c27

5 files changed

Lines changed: 97 additions & 40 deletions

File tree

drivers/src/ecc384.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Abstract:
1414

1515
use crate::kv_access::{KvAccess, KvAccessErr};
1616
use crate::{
17-
array_concat3, okmutref, wait, Array4x12, Array4xN, CaliptraError, CaliptraResult, KeyReadArgs,
18-
KeyWriteArgs, Trng,
17+
array_concat3, cprintln, okmutref, wait, Array4x12, Array4xN, CaliptraError, CaliptraResult,
18+
KeyReadArgs, KeyWriteArgs, Trng,
1919
};
2020
#[cfg(not(feature = "no-cfi"))]
2121
use caliptra_cfi_derive::cfi_impl_fn;
@@ -516,11 +516,17 @@ impl Ecc384 {
516516

517517
// Verify the signature just created
518518
let _r = self.verify_r(pub_key, data, sig)?;
519+
520+
cprintln!("{:?}", _r.0);
521+
cprintln!("{:?}", sig.r.0);
522+
519523
// Not using standard error flow here for increased CFI safety
520524
// An error here will end up reporting the CFI assert failure
521525
#[cfg(not(feature = "no-cfi"))]
522526
caliptra_cfi_lib::cfi_assert_eq_12_words(&_r.0, &sig.r.0);
523527

528+
cprintln!("fips check");
529+
524530
#[cfg(feature = "fips-test-hooks")]
525531
let sig_result = Ok(unsafe {
526532
crate::FipsTestHook::corrupt_data_if_hook_set(

fmc/src/hand_off.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ impl HandOff {
6161
.fmc_pub_key_x_dv_hdl
6262
.try_into()
6363
.unwrap_or_else(|e: CaliptraError| {
64-
cprintln!("[fht] Invalid FMC ALias Public Key X DV handle");
64+
//cprintln!("[fht] Invalid FMC ALias Public Key X DV handle");
6565
handle_fatal_error(e.into());
6666
});
6767

@@ -78,7 +78,7 @@ impl HandOff {
7878
.fmc_pub_key_y_dv_hdl
7979
.try_into()
8080
.unwrap_or_else(|e: CaliptraError| {
81-
cprintln!("[fht] Invalid FMC ALias Public Key Y DV handle");
81+
//cprintln!("[fht] Invalid FMC ALias Public Key Y DV handle");
8282
handle_fatal_error(e.into());
8383
});
8484

@@ -110,17 +110,17 @@ impl HandOff {
110110
.fmc_priv_key_kv_hdl
111111
.try_into()
112112
.unwrap_or_else(|e: CaliptraError| {
113-
cprintln!("[fht] Invalid FMC ALias Private Key KV handle");
113+
//cprintln!("[fht] Invalid FMC ALias Private Key KV handle");
114114
handle_fatal_error(e.into())
115115
});
116116

117117
match ds {
118118
KeyVaultSlot(key_id) => {
119-
cprintln!("[fht] FMC Alias Private Key: {:?}", u32::from(key_id));
119+
//cprintln!("[fht] FMC Alias Private Key: {:?}", u32::from(key_id));
120120
key_id
121121
}
122122
_ => {
123-
cprintln!("[fht] Invalid KeySlot DV Entry");
123+
//cprintln!("[fht] Invalid KeySlot DV Entry");
124124
handle_fatal_error(CaliptraError::FMC_HANDOFF_INVALID_PARAM.into())
125125
}
126126
}
@@ -138,7 +138,7 @@ impl HandOff {
138138
match IccmAddr::<u32>::validate_addr(rt_entry_point) {
139139
Ok(_) => unsafe { transfer_control(rt_entry_point) },
140140
Err(e) => {
141-
cprintln!("[fht] Invalid RT Entry Point");
141+
//cprintln!("[fht] Invalid RT Entry Point");
142142
handle_fatal_error(e.into());
143143
}
144144
}
@@ -151,7 +151,7 @@ impl HandOff {
151151
.rt_tci_dv_hdl
152152
.try_into()
153153
.unwrap_or_else(|e: CaliptraError| {
154-
cprintln!("[fht] Invalid TCI DV handle");
154+
//cprintln!("[fht] Invalid TCI DV handle");
155155
handle_fatal_error(e.into())
156156
});
157157

@@ -172,7 +172,7 @@ impl HandOff {
172172
.rt_svn_dv_hdl
173173
.try_into()
174174
.unwrap_or_else(|e: CaliptraError| {
175-
cprintln!("[fht] Invalid RT SVN handle");
175+
//cprintln!("[fht] Invalid RT SVN handle");
176176
handle_fatal_error(e.into())
177177
});
178178

@@ -193,7 +193,7 @@ impl HandOff {
193193
.rt_min_svn_dv_hdl
194194
.try_into()
195195
.unwrap_or_else(|e: CaliptraError| {
196-
cprintln!("[fht] Invalid RT Min SVN handle");
196+
//cprintln!("[fht] Invalid RT Min SVN handle");
197197
handle_fatal_error(e.into())
198198
});
199199

@@ -213,7 +213,7 @@ impl HandOff {
213213
.rt_min_svn_dv_hdl
214214
.try_into()
215215
.unwrap_or_else(|e: CaliptraError| {
216-
cprintln!("[fht] Invalid RT Min SVN handle");
216+
//cprintln!("[fht] Invalid RT Min SVN handle");
217217
handle_fatal_error(e.into())
218218
});
219219

@@ -247,7 +247,7 @@ impl HandOff {
247247
.rt_fw_entry_point_hdl
248248
.try_into()
249249
.unwrap_or_else(|e: CaliptraError| {
250-
cprintln!("[fht] Invalid runtime entry point DV handle");
250+
//cprintln!("[fht] Invalid runtime entry point DV handle");
251251
handle_fatal_error(e.into());
252252
});
253253
// The data store is either a warm reset entry or a cold reset entry.

fmc/src/main.rs

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ pub extern "C" fn entry_point() -> ! {
9898
#[inline(never)]
9999
#[allow(clippy::empty_loop)]
100100
extern "C" fn exception_handler(trap_record: &TrapRecord) {
101-
cprintln!(
102-
"FMC EXCEPTION mcause=0x{:08X} mscause=0x{:08X} mepc=0x{:08X}",
103-
trap_record.mcause,
104-
trap_record.mscause,
105-
trap_record.mepc
106-
);
101+
//cprintln!(
102+
//"FMC EXCEPTION mcause=0x{:08X} mscause=0x{:08X} mepc=0x{:08X}",
103+
//trap_record.mcause,
104+
//trap_record.mscause,
105+
//trap_record.mepc
106+
//);
107107
log_trap_record(trap_record, None);
108108

109109
handle_fatal_error(CaliptraError::FMC_GLOBAL_EXCEPTION.into());
@@ -125,13 +125,13 @@ extern "C" fn nmi_handler(trap_record: &TrapRecord) {
125125
.read(),
126126
);
127127
log_trap_record(trap_record, Some(err_interrupt_status));
128-
cprintln!(
129-
"FMC NMI mcause=0x{:08X} mscause=0x{:08X} mepc=0x{:08X}error_internal_intr_r={:08X}",
130-
trap_record.mcause,
131-
trap_record.mscause,
132-
trap_record.mepc,
133-
err_interrupt_status,
134-
);
128+
//cprintln!(
129+
//"FMC NMI mcause=0x{:08X} mscause=0x{:08X} mepc=0x{:08X}error_internal_intr_r={:08X}",
130+
//trap_record.mcause,
131+
//trap_record.mscause,
132+
//trap_record.mepc,
133+
//err_interrupt_status,
134+
//);
135135
let mut error = CaliptraError::FMC_GLOBAL_NMI;
136136

137137
let wdt_status = soc_ifc.regs().cptra_wdt_status().read();

rom/dev/src/main.rs

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,13 +73,13 @@ pub extern "C" fn rom_entry() -> ! {
7373
};
7474

7575
if !cfg!(feature = "no-cfi") {
76-
cprintln!("[state] CFI Enabled");
76+
//cprintln!("[state] CFI Enabled");
7777
let mut entropy_gen = || env.trng.generate().map(|a| a.0);
7878
CfiCounter::reset(&mut entropy_gen);
7979
CfiCounter::reset(&mut entropy_gen);
8080
CfiCounter::reset(&mut entropy_gen);
8181
} else {
82-
cprintln!("[state] CFI Disabled");
82+
//cprintln!("[state] CFI Disabled");
8383
}
8484

8585
// Check if TRNG is correctly sourced as per hw config.
@@ -93,24 +93,24 @@ pub extern "C" fn rom_entry() -> ! {
9393
caliptra_drivers::Lifecycle::Production => "Production",
9494
caliptra_drivers::Lifecycle::Reserved2 => "Unknown",
9595
};
96-
cprintln!("[state] LifecycleState = {}", _lifecyle);
96+
//cprintln!("[state] LifecycleState = {}", _lifecyle);
9797

9898
if cfg!(feature = "fake-rom")
9999
&& (env.soc_ifc.lifecycle() == caliptra_drivers::Lifecycle::Production)
100100
&& !(env.soc_ifc.prod_en_in_fake_mode())
101101
{
102-
cprintln!("Fake ROM in Prod lifecycle disabled");
102+
//cprintln!("Fake ROM in Prod lifecycle disabled");
103103
handle_fatal_error(CaliptraError::ROM_GLOBAL_FAKE_ROM_IN_PRODUCTION.into());
104104
}
105105

106-
cprintln!(
107-
"[state] DebugLocked = {}",
108-
if env.soc_ifc.debug_locked() {
109-
"Yes"
110-
} else {
111-
"No"
112-
}
113-
);
106+
//cprintln!(
107+
//"[state] DebugLocked = {}",
108+
//if env.soc_ifc.debug_locked() {
109+
//"Yes"
110+
//} else {
111+
//"No"
112+
//}
113+
//);
114114

115115
// Set the ROM version
116116
let rom_info = unsafe { &CALIPTRA_ROM_INFO };
@@ -202,7 +202,7 @@ pub extern "C" fn rom_entry() -> ! {
202202
fn run_fips_tests(env: &mut KatsEnv) -> CaliptraResult<()> {
203203
report_boot_status(KatStarted.into());
204204

205-
cprintln!("[kat] SHA2-256");
205+
//cprintln!("[kat] SHA2-256");
206206
Sha256Kat::default().execute(env.sha256)?;
207207

208208
#[cfg(feature = "fips-test-hooks")]
@@ -233,7 +233,7 @@ fn rom_integrity_test(env: &mut KatsEnv, expected_digest: &[u32; 8]) -> Caliptra
233233

234234
let n_blocks = unsafe { &CALIPTRA_ROM_INFO as *const RomInfo as usize / 64 };
235235
let mut digest = unsafe { env.sha256.digest_blocks_raw(rom_start, n_blocks)? };
236-
cprintln!("ROM Digest: {}", HexBytes(&<[u8; 32]>::from(digest)));
236+
//cprintln!("ROM Digest: {}", HexBytes(&<[u8; 32]>::from(digest)));
237237
if digest.0 != *expected_digest {
238238
digest.zeroize();
239239
cprintln!("ROM integrity test failed");

runtime/tests/runtime_integration_tests/test_warm_reset.rs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,57 @@ fn test_mbox_busy_during_warm_reset() {
160160
);
161161
}
162162

163+
#[test]
164+
fn test_warm_reset_with_debug_unlock() {
165+
let security_state = *SecurityState::default()
166+
.set_debug_locked(false)
167+
.set_device_lifecycle(DeviceLifecycle::Production);
168+
169+
let rom = caliptra_builder::rom_for_fw_integration_tests().unwrap();
170+
let image = caliptra_builder::build_and_sign_image(
171+
&FMC_WITH_UART,
172+
&APP_WITH_UART,
173+
ImageOptions::default(),
174+
)
175+
.unwrap();
176+
let vendor_pk_hash =
177+
bytes_to_be_words_48(&sha384(image.manifest.preamble.vendor_pub_keys.as_bytes()));
178+
let owner_pk_hash =
179+
bytes_to_be_words_48(&sha384(image.manifest.preamble.owner_pub_keys.as_bytes()));
180+
181+
let mut model = caliptra_hw_model::new(
182+
InitParams {
183+
rom: &rom,
184+
security_state,
185+
..Default::default()
186+
},
187+
BootParams {
188+
fuses: Fuses {
189+
key_manifest_pk_hash: vendor_pk_hash,
190+
owner_pk_hash,
191+
..Default::default()
192+
},
193+
fw_image: Some(&image.to_bytes().unwrap()),
194+
..Default::default()
195+
},
196+
)
197+
.unwrap();
198+
199+
// Wait for boot
200+
model.step_until(|m| m.soc_ifc().cptra_flow_status().read().ready_for_runtime());
201+
202+
// Perform warm reset
203+
model.warm_reset_flow(&Fuses {
204+
key_manifest_pk_hash: vendor_pk_hash,
205+
owner_pk_hash,
206+
..Default::default()
207+
});
208+
209+
// Wait for boot
210+
model.step_until(|m| m.soc_ifc().cptra_flow_status().read().ready_for_runtime());
211+
assert_eq!(model.soc_ifc().cptra_fw_error_non_fatal().read(), 0);
212+
}
213+
163214
#[cfg(not(feature = "fpga_realtime"))]
164215
#[test]
165216
fn test_mbox_idle_during_warm_reset() {

0 commit comments

Comments
 (0)