阶段五实战项目 — TPM(Trusted Platform Module)是 PC 和服务器的标准安全芯片。本课实现 TPM 的核心功能模块。
TPM 2.0 规范定义了安全芯片的完整功能:
PCR 是 TPM 的核心概念——不可重置的累积哈希寄存器:
// pcr_extend.v - PCR 扩展模块
module pcr_extend #(
parameter NUM_PCR = 24, // PCR 数量
parameter HASH_WIDTH = 256
)(
input wire clk,
input wire rst_n,
input wire extend_en,
input wire [4:0] pcr_index, // PCR 索引
input wire [HASH_WIDTH-1:0] measurement, // 新的度量值
output wire [HASH_WIDTH-1:0] pcr_value, // 当前 PCR 值
output wire extend_done
);
// PCR 寄存器组
reg [HASH_WIDTH-1:0] pcr [0:NUM_PCR-1];
integer i;
initial begin
for (i = 0; i < NUM_PCR; i = i + 1)
pcr[i] = 0;
end
// SHA-256 实例用于扩展
reg sha_start, sha_block_valid, sha_last;
reg [511:0] sha_block;
wire [HASH_WIDTH-1:0] sha_digest;
wire sha_valid;
sha256_engine u_sha (
.clk(clk), .rst_n(rst_n), .start(sha_start),
.block(sha_block), .block_valid(sha_block_valid),
.last_block(sha_last),
.digest(sha_digest), .digest_valid(sha_valid)
);
reg [4:0] target_pcr;
reg extending;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (i = 0; i < NUM_PCR; i = i + 1)
pcr[i] <= 0;
extending <= 0; sha_start <= 0;
end else if (extend_en && !extending) begin
target_pcr <= pcr_index;
sha_block <= {pcr[pcr_index], measurement};
sha_start <= 1;
sha_block_valid <= 1;
sha_last <= 1;
extending <= 1;
end else if (extending && sha_valid) begin
pcr[target_pcr] <= sha_digest;
extending <= 0;
sha_block_valid <= 0;
end else begin
sha_start <= 0;
sha_block_valid <= 0;
end
end
assign pcr_value = pcr[pcr_index];
assign extend_done = extending && sha_valid;
endmodule
// key_store.v - TPM 密钥存储模块
module key_store #(
parameter NUM_KEYS = 16,
parameter KEY_WIDTH = 256
)(
input wire clk,
input wire rst_n,
// 写接口
input wire wr_en,
input wire [3:0] wr_index,
input wire [KEY_WIDTH-1:0] wr_data,
input wire wr_fixed, // 不可导出标志
// 读接口
input wire rd_en,
input wire [3:0] rd_index,
output wire [KEY_WIDTH-1:0] rd_data,
// 清除
input wire clear_all
);
// 密钥存储
reg [KEY_WIDTH-1:0] keys [0:NUM_KEYS-1];
reg fixed [0:NUM_KEYS-1]; // 不可导出标志
reg valid [0:NUM_KEYS-1]; // 有效标志
integer i;
initial begin
for (i = 0; i < NUM_KEYS; i = i + 1) begin
keys[i] = 0; fixed[i] = 0; valid[i] = 0;
end
end
// 写操作
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
for (i = 0; i < NUM_KEYS; i = i + 1) begin
keys[i] <= 0; fixed[i] <= 0; valid[i] <= 0;
end
end else if (clear_all) begin
for (i = 0; i < NUM_KEYS; i = i + 1) begin
keys[i] <= 0; valid[i] <= 0;
end
end else if (wr_en && !fixed[wr_index]) begin
keys[wr_index] <= wr_data;
fixed[wr_index] <= wr_fixed;
valid[wr_index] <= 1;
end
end
// 读操作(只有非 fixed 的密钥可外部读取)
assign rd_data = (rd_en && valid[rd_index] && !fixed[rd_index]) ?
keys[rd_index] : {KEY_WIDTH{1'b0}};
endmodule
TPM 2.0 定义了 100+ 条命令。命令处理流程:
1. 实现 TPM 的 SPI 接口模块:接收命令帧,解析后分发到功能模块。
2. 实现 TPM 的 EK(背书密钥)和 SRK(存储根密钥)生成流程。
3. 设计 PCR 引用机制:对 PCR 值签名生成可验证的引用。
4. 研究 TPM 2.0 的增强授权(EA)机制:policy binding 和 policy OR。
你已实现 TPM 的核心模块:PCR 扩展、密钥存储和命令处理框架。TPM 是平台安全的硬件基石!
获得徽章:🏛️ TPM_ARCHITECT
推荐使用以下工具链进行课程实践:
# 安装 Verilator
sudo apt install verilator
# 安装 Icarus Verilog(可选)
sudo apt install iverilog
# 安装 GTKWave(波形查看器)
sudo apt install gtkwave
# 验证安装
verilator --lint-only --version
iverilog -V
密码学硬件实现的关键性能指标:
这些指标之间通常存在 trade-off,设计时需根据应用场景权衡。
本课涉及的核心概念和技术关系:
Verilog 仿真调试的常用方法:
// 调试示例
initial begin
$dumpfile("sim.vcd");
$dumpvars(0, uut);
end
// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
else $error("Invalid data when valid!");
# 1. 语法检查
verilator --lint-only module.v
# 2. 创建 C++ 测试主函数
cat > sim_main.cpp << 'EOF'
#include "Vmodule.h"
#include "verilated.h"
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv);
Vmodule* top = new Vmodule;
top->clk = 0; top->rst_n = 0;
top->eval();
top->rst_n = 1;
for (int i = 0; i < 100; i++) {
top->clk = !top->clk;
top->eval();
}
delete top;
return 0;
}
EOF
# 3. 编译
verilator -cc module.v --exe sim_main.cpp
make -C obj_dir -f Vmodule.mk
# 4. 运行
./obj_dir/Vmodule
密码硬件的性能评估维度:
| 指标 | 单位 | 说明 |
|---|---|---|
| 面积 | GE / LUT | 等效门数或查找表数量 |
| 频率 | MHz | 最大时钟频率 |
| 吞吐量 | Gbps | 每秒处理的数据量 |
| 延迟 | 周期数 | 从输入到输出的周期 |
| 能效 | pJ/bit | 每比特能耗 |
| 面积效率 | Gbps/GE | 单位面积吞吐量 |
不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。
本课涉及的核心概念和技术关系:
Verilog 仿真调试的常用方法:
// 调试示例
initial begin
$dumpfile("sim.vcd");
$dumpvars(0, uut);
end
// 断言验证
assert property (@(posedge clk) valid |-> data !== 'x)
else $error("Invalid data when valid!");
# 1. 语法检查
verilator --lint-only module.v
# 2. 创建 C++ 测试主函数
cat > sim_main.cpp << 'EOF'
#include "Vmodule.h"
#include "verilated.h"
int main(int argc, char** argv) {
Verilated::commandArgs(argc, argv);
Vmodule* top = new Vmodule;
top->clk = 0; top->rst_n = 0;
top->eval();
top->rst_n = 1;
for (int i = 0; i < 100; i++) {
top->clk = !top->clk;
top->eval();
}
delete top;
return 0;
}
EOF
# 3. 编译
verilator -cc module.v --exe sim_main.cpp
make -C obj_dir -f Vmodule.mk
# 4. 运行
./obj_dir/Vmodule
密码硬件的性能评估维度:
| 指标 | 单位 | 说明 |
|---|---|---|
| 面积 | GE / LUT | 等效门数或查找表数量 |
| 频率 | MHz | 最大时钟频率 |
| 吞吐量 | Gbps | 每秒处理的数据量 |
| 延迟 | 周期数 | 从输入到输出的周期 |
| 能效 | pJ/bit | 每比特能耗 |
| 面积效率 | Gbps/GE | 单位面积吞吐量 |
不同应用场景对指标优先级不同:IoT 偏重面积和能效,服务器偏重吞吐量。