跳到正文
Hacker News· bschaatsbergen·· 7 天前AI 评分18

用 Zig 0.17.0 获取并验证 AMD SEV-SNP 证明报告

Fetching AMD SEV Reports (With Zig)

AI 导读

一个 Zig 0.17.0 库可获取并验证 AMD SEV-SNP 证明报告,获取需在 x86_64 Linux SNP guest 中进行,保存的报告可在其他系统上解析和验证。

正文 · AI 翻译

一个用于检索和验证 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