用 Zig 0.17.0 获取并验证 AMD SEV-SNP 证明报告
Fetching AMD SEV Reports (With Zig)
一个 Zig 0.17.0 库可获取并验证 AMD SEV-SNP 证明报告,获取需在 x86_64 Linux SNP guest 中进行,保存的报告可在其他系统上解析和验证。
一个用于检索和验证 AMD SEV-SNP 认证报告的 Zig 0.17.0 库。 检索需要 x86_64 Linux SNP 客户机;保存的报告可以在其他系统上解析和 验证。
检索、解析、签名验证和策略验证是相互独立的 操作。解析报告并不使其可信。
构建
安装 Zig 0.17.0、OpenSSL 3 或 4 开发头文件以及 pkg-config。
没有 Zig 依赖项。测试可离线运行,无需 SNP 硬件。
# Debian / Ubuntu dependencies sudo apt install libssl-dev pkg-config zig build zig build test # Cross-compile Linux device code without OpenSSL or executing it zig build check -Dcrypto=false -Dtarget=x86_64-linux-musl
在其他系统上使用等效的软件包。对于自定义 OpenSSL 安装,
将 -Dopenssl-prefix=/path/to/openssl 传递给构建命令。
模糊测试工作流在 PR 和推送到 main 时分别运行每个原生 Zig 模糊测试目标。更长时间的测试活动可通过手动工作流调度进行。
要在本地运行某个目标:
zig build test -Doptimize=ReleaseSafe -Dtest-filter="fuzz report framing" --fuzz=1M
使用
将此包添加到你的 Zig 依赖项中,并导入其 sev_guest 模块。
验证器必须提供预期的报告数据、测量值、VMPL 和最低
TCB。除非明确允许,否则拒绝调试、SMT 和迁移。
const sev = @import("sev_guest"); var diagnostics: sev.verify.Diagnostics = .{}; const report = try sev.verify.andValidate(report_bytes, .{ .endorsement = vcek_bytes, }, .{ .product = .milan, .now = trusted_unix_time, .revocation = .{ .amd_root_crl = crl_bytes }, }, expected_policy, &diagnostics);
AMD 根证书已嵌入;自定义根证书会显式替换它们。证书有效期
使用调用方的可信时间。CRL 检查 ASK/ASVK 吊销;.unchecked
显式跳过该检查。TCB 下限适用于报告的、当前的、已提交的和启动
TCB。使用新的验证器挑战值和独立批准的测量值。
验证是离线的。可选的 KDS 检索使用 HTTPS、30 秒截止时间、 有界响应,并且不进行重定向或重试。VLEK 叶证书来自客户机 或 CSP。下载的根证书永远不会被自动信任。
示例
检查保存的报告:
zig build inspect -Dcrypto=false -- src/testdata/attestation.bin
验证包含的合成 VLEK 报告、证书表、CRL 和策略:
zig build verify -- --table \ src/testdata/synthetic/vlek-report.bin src/testdata/synthetic/vlek-table.bin \ examples/synthetic-policy.json - src/testdata/synthetic/root.der \ src/testdata/synthetic/vlek-valid.crl
在 Linux SNP 客户机内,保存报告和证书表。提供新的 64 字节挑战值(128 个十六进制字符)以及客户机的实际 VMPL:
zig build -Dcrypto=false sudo ./zig-out/bin/sev-fetch report.bin "$REPORT_DATA_HEX" "$VMPL" certs.bin
显式检索证书,然后根据你自己的 policy.json 进行验证:
./zig-out/bin/sev-kds report.bin milan amd ./zig-out/bin/sev-verify --table report.bin certs.bin policy.json - - amd.crl.der
启用加密构建以获得 sev-verify。示例策略格式
位于 examples/synthetic-policy.json 中;省略其历史性的 verification_time
以进行正常的基于时钟的验证。写入文件的示例会覆盖其输出。
支持报告版本 2–5。VCEK 验证支持 Milan、Genoa、Siena 和 Turin;VLEK 支持 Milan 和 Genoa。版本 2 使用 family-19h TCB 布局。 Turin 需要签名的 CPUID 字段。版本 6 和 Turin VLEK 被拒绝。真实的 Milan 版本 5 检索和验证已在 VMPL 2 的 GCP SNP 客户机上测试; VLEK 和 Turin 具有离线签名夹具覆盖。
公共 API 注释涵盖所有权和协议细节。Apache-2.0; 有关夹具来源,请参阅 NOTICE。
灵感来自 google/go-sev-guest。
来源:Hacker News · github.com