TPM2.0 ECDAA方法测试
VTPM
该方式是基于Vmware Fusion软件给虚拟机VM添加TPM设备。由于测试的物理机没有物理TPM设备,因此仅使用VTPM进行测试。
测试环境
Ubuntu 20.04.1
vmware虚拟TPM2.0
如何在Vmware虚拟机中安装TPM芯片,参见教程Vmware Fusion TPM安装过程
tpm2-software
Intel实现的tpm2软件栈全家桶,安装方式见Vmware Fusion TPM安装过程
(optional) xaptum/ecdaa工具
由于该工具的仓库存在搜索不到ecdaa工具的情况,在xaptum/ecdaa方式部分讲解手动安装的方式。
(optional) ibm-research/ecdaa方式
TPM 直接匿名证明
从TPM 2.0的用户态工具tpm2-tools的手册[1]中可以看到,TPM2.0支持基于椭圆曲线加密方案的直接匿名证明ECDAA。

然后在Ubuntu中检索相关的库,可以发现Ubuntu有不少关于ECDAA的编程库。

tpm2-tools方式(未完成)
使用Intel实现的用户态工具实现。
ibm-research/ecdaa方式(未完成)
这种方式是以Java语言实现的。
TPM-Emulator
测试环境
Ubuntu 18.04.5
为保证测试环境纯净,不会发生潜在的冲突,该VM内未添加TPM设备
Dependency:
- common:gcc,make
- IBM-software:openssl
- UoS-SCCS/ecc-daa:git,g++,libgmp3-dev
apt install -y git gcc g++ make libssl-dev libgmp3-dev
IBM-software
-
TPM Simulator
安装方法 1
2
3
4
5
6
7
8
9
10
11
12mkdir /opt/ibmtpm1119
cp ibmtpm1119.tar.gz /opt/ibmtpm1119
cd /opt/ibmtpm1119
gunzip ibmtpm1119.tar.gz
tar -xvf ibmtpm1119.tar
cd src
make
cd /opt
ln -s ibmtpm1119 ibmtpm -
TSS以及TPM Simulator配套TPM用户态工具
安装方式 1
2
3
4
5
6
7
8
9
10
11
12
13mkdir /opt/ibmtss1119
cp ibmtss1119.tar.gz /opt/ibmtss1119
cd /opt/ibmtss1119
gunzip ibmtss1119.tar.gz
tar -xvf ibmtss1119.tar
cd utils
make
cd /opt
ln -s ibmtss1119 ibmtss 设置文件权限
chmod 755 -R /opt/ibmt*
设置路径
1
2
3
4
5
6
7
8
9# 为了能够在非root用户下执行代码,设置以下环境变量
export LD_LIBRARY_PATH=/opt/ibmtss/utils
export PATH=$PATH:/opt/ibmtss/utils
# 如果拥有物理TPM则进行以下设置
export TPM_INTERFACE_TYPE=dev
# or 如果没有物理TPM则使用以下设置
export TPM_INTERFACE_TYPE=socsim
-
UoS-SCCS/ecc-daa方式
TPM-Emulator安装测试
另开一个新的终端窗口来启动TPM模拟器服务
1 | sudo /opt/ibmtpm/src/tpm_server # 启动服务 |


TPM 直接匿名证明
UoS-SCCS/ecc-daa方式
该工具的实现不是很完善,仅能作为一个很简单的测试使用。
相关命令的详细解释见参考资料[11]。
编译并配置
从github仓库拉去并编译该代码
1 | git clone --depth=1 https://github.com/UoS-SCCS/ecc-daa.git |
ecc-daa提供了脚本来设置一些环境变量
1 | # TPM模拟器 |
测试执行
开启两个终端,其中一个用于启用tpm服务,另一个用于测试。
注意:由于直接使用export来注册的环境变量是临时的,仅对当前终端生效,并且会因为终端的关闭而被删除。因此需要对两个终端分别执行上述的环境变量注册;如果需要持久化,则将其写入到
.bashrc
Terminals 1:启用tpm服务
1 | mkdir ~/Daa_logs |
Terminals 2:用于测试
由于provision_tpm工具编写的原因,它需要一个固定的目录/home/cn0016/TPM_data/
来存放数据。
provision_tpm用于准备将要使用的TPM。它会创建RSA背书密钥,此外该命令还会写入PCR 23以进行TPM2_Quote测试。
1 | # 创建所需的文件夹 |
上述命令执行完之后会创建两个二进制文件。


make_daa_credential将颁发者的公钥、Daa_key及其凭据写入文件。其中文件名中的S
代表TPM模拟器,如果是物理TPM,则使用字母T
;此外文件名最后的数字代表的是当前时间。
1 | make_daa_credential -s -d ~/Daa_logs |

日志文件Daa_S_cre_log_368538391
输出如下:

读取凭据文件并使用存储在文件中的密钥和凭据对消息进行签名。
1 | daa_sign_message -d ~/Daa_logs -n Daa_S_cre_368538391 |

日志文件Daa_S_sign_no_bsn_log_368538391
内容如下:

verify_daa_signature命令会读取签名文件,验证签名并检查随机凭证。
1 | verify_daa_signature -d ~/Daa_logs Daa_S_sign_no_bsn_368538391 |

签名校验Daa_S_sign_no_bsn_ver_368538391
结果如下:

daa_certify_key用于读取凭据文件,创建并加载ECDSA密钥,然后为其生成证书。密钥证书、基本名称(basename)、J点和K点、发行者的公钥、随机凭证和证书签名均存在文件中。
1 | daa_certify_key -d ~/Daa_logs -b Daa_S_cre_368538391 |

日志文件Daa_S_certify_bsn_log_368538391
内容如下:

verify_daa_attest命令用于检查来自certify和quote程序的证明数据。证明数据中的签名和随机凭证部分一起被验证。
1 | verify_daa_attest -d ~/Daa_logs Daa_S_certify_bsn_368538391 |

证明的结果Daa_S_certify_bsn_ver_368538391
如下:按照文档上的说法,此处应该出现一个*’Certify signature OK*。

xaptum/ecdaa方式
这种方式是以C语言实现的。
签名和验证过程中,验证者还维护一个秘密密钥吊销列表,该列表列出了已知已被破坏的DAA秘密密钥。发行者可能会参与将此列表传达给所有验证者。此过程不在此项目的范围内。
编译并配置
安装教程:https://github.com/xaptum/ecdaa/blob/master/doc/BUILDING.md
安装AMCL(Apache Milagro Cryptographic Library)。这个可以不手动安装,可以使用xaptum/ecdaa提供的脚本进行安装。
1 | # 拉取源代码 |
安装tpm2-tss。这个可以不手动安装,可以使用xaptum/ecdaa提供的脚本进行安装。
1 | git clone https://github.com/tpm2-software/tpm2-tss.git |
安装ECDAA相关开发库(这个没安装成功也不影响执行)
1 | apt install -y libecdaa-dev libecdaa-tpm0 libecdaa-tpm-dev |
下载v1.0.0版本的安装包。
1 | wget https://github.com/xaptum/ecdaa/archive/v1.0.0.tar.gz |
测试执行
创建Group
1 | # Issuer creates a new keypair |


Join
1 | # Member creates a keypair |

Sign
1 | echo 0123456 | xxd -r -ps > message.bin |


Verify
1 | # Verifier checks signature |


参考资料
[1] gpg: keyserver receive failed: Server indicated a failure
[3] FIDO ECDAA
[4] xaptum/ecdaa
[5] Using Elliptic Curve Cryptography with TPM2
[6] Direct anonymous attestation
[8] UoS-SCCS/ecc-daa
[9] ibmswtpm2
[10] ibmtpm20tss
[11] UoS-SCCS/ecc-daa Code Notes
[12] TPM DAA Figures
TPM2.0 ECDAA方法测试