Skip to content

Commit de248d6

Browse files
haitaohuangmvasantaraoCopilot
authored andcommitted
build(migtd): improve Azure policy and IGVM build targets
- Add allow-all policy config for accept-all migration testing - Fix reject-all build to use IGVM_FEATURES_BASE - Set tcbDate for migTD in policy_data_raw.json - Add spdm_attestation to IGVM_FEATURES_BASE for SPDM support - Add early preflight checks for AzCVMEmu build dependencies: check cargo, pkg-config, tss2-sys, nasm, unzip, autoreconf, ocamlbuild and print actionable install commands when missing; fix azcvm-extract-report binary path resolution (local vs workspace target); replace build output filtering with explicit error reporting so the build fails fast with clear messages instead of cryptic tool-not-found errors. Co-authored-by: mvasantarao <mvasantarao@microsoft.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Signed-off-by: Haitao Huang <haitaohuang@microsoft.com>
1 parent 0154637 commit de248d6

5 files changed

Lines changed: 137 additions & 13 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"id":"ALLOW-ALL-0000-0000-0000-000000000000","version":"2.0","policySvn":1,"policy":[]}

config/Azure/policy_data_raw.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"id":"251E9C0A-0BB3-4B1F-8BEB-381F155CB8C6","version":"2.0","policySvn":1,"policy":[{"global":{"tcb":{"tcbDate":{"operation":"greater-or-equal","reference":"2023-08-09T00:00:00Z"},"tcbStatusAccepted":{"operation":"allow-list","reference":["UpToDate"]}},"platform":{"fmspc":{"operation":"equal","reference":"90C06F000000"}}}}],"forwardPolicy":[{"servtd":{"migtdIdentity":{"tcbDate":{"operation":"greater-or-equal","reference":"self"},"tcbStatusAccepted":{"operation":"allow-list","reference":["UpToDate"]}}}}]}
1+
{"id":"251E9C0A-0BB3-4B1F-8BEB-381F155CB8C6","version":"2.0","policySvn":1,"policy":[{"global":{"tcb":{"tcbDate":{"operation":"greater-or-equal","reference":"2023-08-09T00:00:00Z"}},"platform":{"fmspc":{"operation":"equal","reference":"90C06F000000"}}}},{"servtd":{"migtdIdentity":{"tcbDate":{"operation":"greater-or-equal","reference":"2026-04-03T00:00:00Z"}}}}]}

sh_script/Azure/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
IGVM_FILE ?= target/release/migtd.igvm
66
LOG_LEVEL ?= trace
77
# Common features for IGVM images
8-
IGVM_FEATURES_BASE ?= vmcall-raw,stack-guard,main,vmcall-interrupt,oneshot-apic
8+
IGVM_FEATURES_BASE ?= vmcall-raw,stack-guard,main,vmcall-interrupt,oneshot-apic,spdm_attestation
99
IGVM_FEATURES_GET_QUOTE ?= $(IGVM_FEATURES_BASE),igvm-attest
1010
# test_disable_ra_and_accept_all feature disables remote attestation and skips policy verification, bypassing RATLS security
1111
# test feature skips the compilation of attestation library when the remote attestation is not enabled or needed
@@ -74,7 +74,7 @@ build-igvm:
7474
build-igvm-all: pre-build build-igvm generate-hash
7575

7676
build-igvm-reject:
77-
cd ../../ && cargo image --no-default-features --features $(IGVM_FEATURES_GET_QUOTE) --log-level $(LOG_LEVEL) \
77+
cd ../../ && cargo image --no-default-features --features $(IGVM_FEATURES_BASE) --log-level $(LOG_LEVEL) \
7878
--image-format igvm --output $(IGVM_FILE) --debug
7979

8080
build-igvm-reject-all: pre-build build-igvm-reject generate-hash

sh_script/Azure/build_azure_mock_test.sh

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -441,9 +441,13 @@ echo
441441
# Make sure no ending newline is added (important for signing)
442442
#
443443
echo -e "${BLUE}=== Step 3: Updating TD Identity Template ===${NC}"
444+
# Set tcbDate and issueDate to current time so they satisfy the policy's
445+
# servtd tcbDate reference (which uses an absolute date).
446+
CURRENT_UTC=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
444447
jq -c ".xfam = \"$XFAM\" | .attributes = \"$ATTRIBUTES\" | .mrConfigId = \"$MR_CONFIG_ID\" | \
445448
.mrOwner = \"$MR_OWNER\" | .mrOwnerConfig = \"$MR_OWNER_CONFIG\" | .mrsigner = \"$MRSIGNER\" | \
446-
.isvProdId = $ISV_PROD_ID | .tcbLevels[0].tcb.isvsvn = $ISVSVN" \
449+
.isvProdId = $ISV_PROD_ID | .tcbLevels[0].tcb.isvsvn = $ISVSVN | \
450+
.tcbLevels[0].tcbDate = \"$CURRENT_UTC\" | .issueDate = \"$CURRENT_UTC\"" \
447451
"$TD_IDENTITY_TEMPLATE" | tr -d '\n' > "$TD_IDENTITY_UPDATED"
448452

449453
echo -e "${GREEN}✓ TD Identity updated: $TD_IDENTITY_UPDATED${NC}"

sh_script/build_AzCVMEmu_policy_and_test.sh

Lines changed: 128 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,112 @@ NC='\033[0m' # No Color
8080
echo -e "${BLUE}=== MigTD Custom Policy Builder ===${NC}"
8181
echo
8282

83+
print_error() {
84+
printf '%b\n' "${RED}Error: $1${NC}" >&2
85+
}
86+
87+
print_hint_header() {
88+
printf '%b\n' "${YELLOW}$1${NC}" >&2
89+
}
90+
91+
print_hint_lines() {
92+
local hint
93+
for hint in "$@"; do
94+
printf ' %s\n' "$hint" >&2
95+
done
96+
}
97+
98+
require_cmd() {
99+
local cmd="$1"
100+
local error_message="$2"
101+
local hint_header="$3"
102+
shift 3
103+
104+
if ! command -v "$cmd" >/dev/null 2>&1; then
105+
print_error "$error_message"
106+
print_hint_header "$hint_header"
107+
print_hint_lines "$@"
108+
exit 127
109+
fi
110+
}
111+
112+
require_pkg_config_module() {
113+
local module="$1"
114+
local error_message="$2"
115+
local hint_header="$3"
116+
shift 3
117+
118+
if ! pkg-config --exists "$module" >/dev/null 2>&1; then
119+
print_error "$error_message"
120+
print_hint_header "$hint_header"
121+
print_hint_lines "$@"
122+
exit 127
123+
fi
124+
}
125+
83126
# Default paths
84127
PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
85128
SOURCE_MATERIAL_DIR="$PROJECT_ROOT/config/AzCVMEmu"
86129
OUTPUT_DIR="$PROJECT_ROOT/config/AzCVMEmu"
87130
TEMP_DIR=$(mktemp -d)
88131
TOOLS_DIR="$PROJECT_ROOT/target/release"
132+
AZCVM_EXTRACT_REPORT_LOCAL_BIN="$PROJECT_ROOT/deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report"
133+
AZCVM_EXTRACT_REPORT_WORKSPACE_BIN="$TOOLS_DIR/azcvm-extract-report"
134+
AZCVM_EXTRACT_REPORT_BIN=""
135+
136+
# Ensure cargo is available (try loading rustup env first).
137+
if ! command -v cargo >/dev/null 2>&1; then
138+
if [ -f "$HOME/.cargo/env" ]; then
139+
# shellcheck source=/dev/null
140+
. "$HOME/.cargo/env"
141+
fi
142+
fi
143+
144+
require_cmd \
145+
cargo \
146+
"cargo not found in PATH." \
147+
"Install Rust toolchain and reload your shell (platform-specific):" \
148+
"Cross-platform (recommended): https://rustup.rs" \
149+
"Debian/Ubuntu: sudo apt install -y rustup" \
150+
"rustup default stable" \
151+
"source \"\$HOME/.cargo/env\"" \
152+
"./sh_script/build_AzCVMEmu_policy_and_test.sh --mock-report"
153+
154+
require_cmd \
155+
pkg-config \
156+
"pkg-config not found in PATH." \
157+
"Install required build dependencies (platform-specific):" \
158+
"Debian/Ubuntu: sudo apt install -y pkg-config libtss2-dev"
159+
160+
require_pkg_config_module \
161+
tss2-sys \
162+
"TPM2 system library 'tss2-sys' not found." \
163+
"Install required TPM2 development package (platform-specific):" \
164+
"Debian/Ubuntu: sudo apt install -y libtss2-dev"
165+
166+
require_cmd \
167+
nasm \
168+
"nasm not found in PATH." \
169+
"Install required assembler dependency (platform-specific):" \
170+
"Debian/Ubuntu: sudo apt install -y nasm"
171+
172+
require_cmd \
173+
unzip \
174+
"unzip not found in PATH." \
175+
"Install required archive extraction tool (platform-specific):" \
176+
"Debian/Ubuntu: sudo apt install -y unzip"
177+
178+
require_cmd \
179+
autoreconf \
180+
"autoreconf not found in PATH." \
181+
"Install required autotools dependencies (platform-specific):" \
182+
"Debian/Ubuntu: sudo apt install -y autoconf automake libtool"
183+
184+
require_cmd \
185+
ocamlbuild \
186+
"ocamlbuild not found in PATH." \
187+
"Install required OCaml build tools (platform-specific):" \
188+
"Debian/Ubuntu: sudo apt install -y ocaml ocamlbuild"
89189

90190
# Input Files
91191
POLICY_DATA_RAW="$SOURCE_MATERIAL_DIR/policy_v2_raw.json"
@@ -376,21 +476,40 @@ echo -e "${BLUE}=== Step 1: Building Tools ===${NC}"
376476
cd "$PROJECT_ROOT"
377477

378478
echo "Building azcvm-extract-report (from deps/td-shim-AzCVMEmu)..."
379-
(cd deps/td-shim-AzCVMEmu/azcvm-extract-report && cargo build --release) 2>&1 | grep -E "(Compiling|Finished|error)" || true
479+
if ! (cd deps/td-shim-AzCVMEmu/azcvm-extract-report && cargo build --release); then
480+
echo -e "${RED}Error: Failed to build azcvm-extract-report${NC}" >&2
481+
exit 1
482+
fi
380483

381484
echo "Building json-signer..."
382-
cargo build --release -p json-signer 2>&1 | grep -E "(Compiling|Finished|error)" || true
485+
if ! cargo build --release -p json-signer; then
486+
echo -e "${RED}Error: Failed to build json-signer${NC}" >&2
487+
exit 1
488+
fi
383489

384490
echo "Building servtd-collateral-generator..."
385-
cargo build --release -p servtd-collateral-generator 2>&1 | grep -E "(Compiling|Finished|error)" || true
491+
if ! cargo build --release -p servtd-collateral-generator; then
492+
echo -e "${RED}Error: Failed to build servtd-collateral-generator${NC}" >&2
493+
exit 1
494+
fi
386495

387496
echo "Building migtd-policy-generator..."
388-
cargo build --release -p migtd-policy-generator 2>&1 | grep -E "(Compiling|Finished|error)" || true
497+
if ! cargo build --release -p migtd-policy-generator; then
498+
echo -e "${RED}Error: Failed to build migtd-policy-generator${NC}" >&2
499+
exit 1
500+
fi
389501

390502
# Verify tools exist
391-
# Note: azcvm-extract-report is in a different location
392-
if [ ! -f "$PROJECT_ROOT/deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report" ]; then
393-
echo -e "${RED}Error: Tool 'azcvm-extract-report' not found${NC}" >&2
503+
# azcvm-extract-report may be emitted either to the local crate target/ or the
504+
# workspace target/ when CARGO_TARGET_DIR is set.
505+
if [ -f "$AZCVM_EXTRACT_REPORT_LOCAL_BIN" ]; then
506+
AZCVM_EXTRACT_REPORT_BIN="$AZCVM_EXTRACT_REPORT_LOCAL_BIN"
507+
elif [ -f "$AZCVM_EXTRACT_REPORT_WORKSPACE_BIN" ]; then
508+
AZCVM_EXTRACT_REPORT_BIN="$AZCVM_EXTRACT_REPORT_WORKSPACE_BIN"
509+
else
510+
echo -e "${RED}Error: Tool 'azcvm-extract-report' not found at either:${NC}" >&2
511+
echo -e "${RED} - $AZCVM_EXTRACT_REPORT_LOCAL_BIN${NC}" >&2
512+
echo -e "${RED} - $AZCVM_EXTRACT_REPORT_WORKSPACE_BIN${NC}" >&2
394513
exit 1
395514
fi
396515

@@ -424,7 +543,7 @@ if [ "$USE_MOCK_REPORT" = true ]; then
424543
export MOCK_QUOTE_FILE
425544
fi
426545

427-
"$PROJECT_ROOT/deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report" \
546+
"$AZCVM_EXTRACT_REPORT_BIN" \
428547
--mock-report \
429548
--output-json "migtd_report_data.json"
430549

@@ -436,7 +555,7 @@ if [ "$USE_MOCK_REPORT" = true ]; then
436555
else
437556
# Use sudo to access vTPM device (requires /dev/tpmrm0 access)
438557
echo "Note: Using sudo to access vTPM device..."
439-
sudo "$PROJECT_ROOT/deps/td-shim-AzCVMEmu/azcvm-extract-report/target/release/azcvm-extract-report"
558+
sudo "$AZCVM_EXTRACT_REPORT_BIN"
440559

441560
# Report extractor creates migtd_report_data.json in current directory
442561
if [ ! -f "migtd_report_data.json" ]; then

0 commit comments

Comments
 (0)