第29课:TPM 核心模块

阶段五实战项目 — TPM(Trusted Platform Module)是 PC 和服务器的标准安全芯片。本课实现 TPM 的核心功能模块。

1. TPM 架构

TPM 2.0 规范定义了安全芯片的完整功能:

2. PCR 扩展模块

PCR 是 TPM 的核心概念——不可重置的累积哈希寄存器:

PCR[new] = SHA-256(PCR[old] ‖ measurement)
✅Verilator验证通过
// 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

3. 密钥存储模块

✅Verilator验证通过
// 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

4. TPM 命令处理

TPM 2.0 定义了 100+ 条命令。命令处理流程:

  1. 接收命令(通过 SPI/LPC/TIS 接口)
  2. 解析命令头(tag, size, command code)
  3. 授权检查(HMAC 或 password)
  4. 执行命令逻辑
  5. 生成响应
  6. 返回响应

1. 实现 TPM 的 SPI 接口模块:接收命令帧,解析后分发到功能模块。

2. 实现 TPM 的 EK(背书密钥)和 SRK(存储根密钥)生成流程。

3. 设计 PCR 引用机制:对 PCR 值签名生成可验证的引用。

4. 研究 TPM 2.0 的增强授权(EA)机制:policy binding 和 policy OR。

🏆 成就解锁:TPM 架构师

你已实现 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!");

🔧 Verilator 编译仿真完整流程

# 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!");

🔧 Verilator 编译仿真完整流程

# 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 偏重面积和能效,服务器偏重吞吐量。