Skip to content

Commit 02c5090

Browse files
committed
Add update-tcb-mapping function in migtd-hash tool
Signed-off-by: Wei Liu <[email protected]>
1 parent be197ed commit 02c5090

File tree

3 files changed

+84
-8
lines changed

3 files changed

+84
-8
lines changed

config/templates/tcb_mapping.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"id":"BB9668CA-4EE8-4523-941A-B3B03BE46E03","version":1,"issueDate":"2025-01-01T00:00:00Z","nextUpdate":"2026-01-01T00:00:00Z","mrSigner":"00000000000000000000000000000000","isvProdId":1,"svnMappings":[{"tdMeasurements":{"mrtd":"E2C7DA7CF0D93973480F0A34A6FE52A204EA81B4F1B6CD16018F5B4CAEE7B3B544A9738464A7C95E1705E20687A0ADA6","rtmr0":"518923B0F955D08DA077C96AABA522B9DECEDE61C599CEA6C41889CFBEA4AE4D50529D96FE4D1AFDAFB65E7F95BF23C4","rtmr1":"518923B0F955D08DA077C96AABA522B9DECEDE61C599CEA6C41889CFBEA4AE4D50529D96FE4D1AFDAFB65E7F95BF23C4"},"isvsvn":1}]}
1+
{"id":"BB9668CA-4EE8-4523-941A-B3B03BE46E03","issueDate":"2025-01-01T00:00:00Z","isvProdId":1,"mrSigner":"00000000000000000000000000000000","nextUpdate":"2026-01-01T00:00:00Z","svnMappings":[{"isvsvn":1,"tdMeasurements":{"mrtd":"7d657d691625088702dbf54f60008dbbfc428328f47f47ab3e39eb3d77dc933a67f95726dcd71317ab7d8c21d07046d2","rtmr0":"518923b0f955d08da077c96aaba522b9decede61c599cea6c41889cfbea4ae4d50529d96fe4d1afdafb65e7f95bf23c4","rtmr1":"5262cd5861ce73ee4ce27a7c961067011090b500b742c621120a5b797ac5950fa28a8276257985305a12f960c9fd48a6"}}],"version":1}

tools/migtd-hash/readme.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ popd
3232
./target/debug/migtd-hash --manifest config/servtd_info.json --image <migtd.bin> --verbose
3333
```
3434

35+
- Calculate migtd SERVTD_INFO_HASH and update tcb_mapping.json (For policy v2)
36+
```
37+
./target/debug/migtd-hash --manifest config/servtd_info.json --image <migtd.bin> --update-tcb-mapping <tcb_mapping.json> --policy-v2 --verbose
38+
```
39+
3540
- Generate migtd SERVTD_HASH with debug infomation:
3641
```
3742
./target/debug/migtd-hash --manifest config/servtd_info.json --image <migtd.bin> --servtd-attr 0 --calc-servtd-hash --verbose

tools/migtd-hash/src/main.rs

Lines changed: 78 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,76 @@
22
//
33
// SPDX-License-Identifier: BSD-2-Clause-Patent
44

5+
use anyhow::{anyhow, Context};
56
use clap::Parser;
67
use log::debug;
78
use migtd_hash::{
89
build_td_info, calculate_servtd_hash, calculate_servtd_info_hash, SERVTD_TYPE_MIGTD,
910
};
10-
use serde_json::json;
11+
use serde_json::{json, Value};
1112
use std::{
1213
fs::{self, File},
13-
path::PathBuf,
14+
path::{Path, PathBuf},
1415
process::exit,
1516
};
1617

1718
const SERVTD_HASH_KEY: &str = "servtdHash";
1819
const SERVTD_INFO_HASH_KEY: &str = "servtdInfoHash";
1920

21+
fn bytes_to_hex(bytes: &[u8]) -> String {
22+
bytes.iter().map(|byte| format!("{:02x}", byte)).collect()
23+
}
24+
25+
fn update_tcb_mapping_file(
26+
path: &Path,
27+
mrtd: &[u8],
28+
rtmr0: &[u8],
29+
rtmr1: &[u8],
30+
) -> anyhow::Result<()> {
31+
let manifest =
32+
fs::read_to_string(path).with_context(|| format!("Failed to read {}", path.display()))?;
33+
let mut tcb_mapping: Value = serde_json::from_str(&manifest)
34+
.with_context(|| format!("Failed to parse {}", path.display()))?;
35+
36+
let svn_mappings = tcb_mapping
37+
.get_mut("svnMappings")
38+
.and_then(Value::as_array_mut)
39+
.ok_or_else(|| {
40+
anyhow!(
41+
"'svnMappings' missing or not an array in {}",
42+
path.display()
43+
)
44+
})?;
45+
let td_measurements = svn_mappings
46+
.get_mut(0)
47+
.ok_or_else(|| anyhow!("'svnMappings' array is empty in {}", path.display()))?
48+
.get_mut("tdMeasurements")
49+
.and_then(Value::as_object_mut)
50+
.ok_or_else(|| {
51+
anyhow!(
52+
"'tdMeasurements' missing or not an object in {}",
53+
path.display()
54+
)
55+
})?;
56+
57+
for (key, value) in [("mrtd", mrtd), ("rtmr0", rtmr0), ("rtmr1", rtmr1)] {
58+
if !td_measurements.contains_key(key) {
59+
eprintln!("Warning: '{}' not found in tdMeasurements, adding it.", key);
60+
}
61+
td_measurements.insert(key.to_string(), Value::String(bytes_to_hex(value)));
62+
}
63+
64+
let serialized = serde_json::to_string(&tcb_mapping).with_context(|| {
65+
format!(
66+
"Failed to serialize updated tcb mapping for {}",
67+
path.display()
68+
)
69+
})?;
70+
fs::write(path, serialized)
71+
.with_context(|| format!("Failed to write updated tcb mapping to {}", path.display()))?;
72+
println!("Updated {} successfully.", path.display());
73+
Ok(())
74+
}
2075
#[derive(Clone, Parser)]
2176
struct Config {
2277
/// A json format manifest that contains values of TD info fields
@@ -49,6 +104,9 @@ struct Config {
49104
/// Enable verbose logging
50105
#[clap(short, long)]
51106
pub verbose: bool,
107+
/// Update the provided tcb_mapping JSON with the generated TD measurements
108+
#[clap(long)]
109+
pub update_tcb_mapping: Option<PathBuf>,
52110
}
53111

54112
fn main() {
@@ -157,11 +215,11 @@ fn main() {
157215
if let Some(output_td_info) = config.output_td_info {
158216
debug!("Writing TD Info to: {:?}", output_td_info);
159217
let td_info_json = json!({
160-
"mrtd": td_info.mrtd.iter().map(|b| format!("{:02x}", b)).collect::<String>(),
161-
"rtmr0": td_info.rtmr0.iter().map(|b| format!("{:02x}", b)).collect::<String>(),
162-
"rtmr1": td_info.rtmr1.iter().map(|b| format!("{:02x}", b)).collect::<String>(),
163-
"rtmr2": td_info.rtmr2.iter().map(|b| format!("{:02x}", b)).collect::<String>(),
164-
"rtmr3": td_info.rtmr3.iter().map(|b| format!("{:02x}", b)).collect::<String>(),
218+
"mrtd": bytes_to_hex(&td_info.mrtd),
219+
"rtmr0": bytes_to_hex(&td_info.rtmr0),
220+
"rtmr1": bytes_to_hex(&td_info.rtmr1),
221+
"rtmr2": bytes_to_hex(&td_info.rtmr2),
222+
"rtmr3": bytes_to_hex(&td_info.rtmr3),
165223
});
166224

167225
fs::write(
@@ -174,6 +232,19 @@ fn main() {
174232
})
175233
}
176234

235+
debug!("Updating tcb_mapping file...");
236+
if let Some(tcb_mapping_path) = &config.update_tcb_mapping {
237+
if let Err(e) = update_tcb_mapping_file(
238+
tcb_mapping_path,
239+
&td_info.mrtd,
240+
&td_info.rtmr0,
241+
&td_info.rtmr1,
242+
) {
243+
eprintln!("Failed to update tcb_mapping file: {}", e);
244+
exit(1);
245+
}
246+
}
247+
177248
debug!("Calculating servtd_info_hash...");
178249
let servtd_info_hash = calculate_servtd_info_hash(td_info).unwrap_or_else(|e| {
179250
eprintln!("Failed to calculate hash: {:?}", e);

0 commit comments

Comments
 (0)