一、实验目的:
- 熟悉数据与硬件绑定的方法;
- 理解密钥填充对数据绑定的影响;
- 掌握硬件相关的程序设计流程和实现步骤;
二、实验内容、步骤及结论
1. 实验内容
- 按照数据绑定结构、密钥类型、密钥长度、密钥填充类型等进行数据与硬件绑定程序设计,并基于 TPM 进行调试
2. 实验步骤
1.启动相关模块
(1)启动TPM
sudo su
modprobe tpmd_dev
tpmd -f -d //-d 进入debug 模式 -f 使应用在前台运行
(2) 启动tcsd
sudo su
tcsd -e -f
(3) 设置owner和SRK密码
tpm_takeownership -u
(4) 编写代码
编写代码流程如下:
创建上下文对象……
创建TPM对象……
载入SRK密钥……
获取SRK的密钥对象……设置SRK的策略授权……创建绑定密钥……
在TPM产生密钥前,设置填充类型……
产生密钥,该密钥不与PCR绑定
装载绑定密钥到UUID……
执行数据绑定……
代码调用的接口顺序为
- Tspi_Context_Create (&hContext):创建上下文对象
- Tspi_Context_Connect (hContext,NULL):连接上下文
- Tspi_Context_GetTpmObject (hContext,&hTPM):获得隐式创建的TPM对象的句柄
- Tspi_GetPolicyObject (hTPM,TSS_POLICY_USAGE,&hownerpolicy):获得TSP隐式创建的策略对象
- Tspi_Policy_SetSecret (hownerpolicy,TSS_SECRET_MODE_POPUP,0,NULL):设置秘密
- Tspi_Context_LoadKeyByUUID (hContext,TSS_PS_TYPE_SYSTEM,SRK_UUID,&hSRK):根据UUID加载SRK密钥
- Tspi_GetPolicyObject (hSRK,TSS_POLICY_USAGE,&hSRKPolicy):获得SRK的策略对象
- Tspi_Policy_SetSecret (hSRKPolicy,TSS_SECRET_MODE_POPUP,0,NULL):设置SRK的策略授权
- Tspi_Context_CreateObject (hContext,TSS_OBJECT_TYPE_RSAKEY,initFlags,&hkey):设置好密钥标记initFlags后创建绑定密钥,hkey中存储加密的数据块
- Tspi_SetAttribUint32(hkey,TSS_TSPATTRIB_KEY_INFO,TSS_TSPATTRIB_KEYINFO_ENCSCHEME,T SS_ES_RSAESPKCSV15):在TPM产生密钥前,设置填充类型
- Tspi_Key_CreateKey(hkey,hSRK,0):产生密钥,该秘钥不与PCR绑定
- Tspi_Context_RegisterKey(hContext,hkey,TSS_PS_TYPE_USER,bindkeyUUID,TSS_PS_TYPE_SY STEM,SRK_UUID):装载绑定密钥到UUID
- Tspi_Context_CreateObject(hContext,TSS_OBJECT_TYPE_ENCDATA,TSS_ENCDATA_BIND,&hEncD ata):创建加密数据对象
- Tspi_GetAttribUint32(hkey,TSS_TSPATTRIB_KEY_INFO,TSS_TSPATTRIB_KEYINFO_SIZE,&keysi ze):执行这步后,要比较待加密数据长度与keysize -16的大小,以防加密数据过大
- Tspi_Data_Bind(hEncData,hkey,strlen(in),in):绑定数据
- Tspi_GetAttribData(hEncData,TSS_TSPATTRIB_ENCDATA_BLOB,TSS_TSPATTRIB_ENCDATABLOB_B LOB,&blobLen,&blob):执行这步后要比较blobLen 和 *blob大小,以防被加密的blob过大
- Tspi_Context_Close(hContext):关闭上下文
(5) 编译并运行代码
sudo su
gcc -o 20175318exp3 20175318exp3.c -ltspi
./20175318exp3
Download:20175318exp3.c
3. 实验结论
sb