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

    • ibmtpm1119

      TPM Simulator

      安装方法
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      mkdir /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
    • ibmtss1119

      TSS以及TPM Simulator配套TPM用户态工具

      安装方式
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      mkdir /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
2
sudo /opt/ibmtpm/src/tpm_server  # 启动服务
/opt/ibmtss/utils/reg.sh -a # 调用测试脚本进行测试

TPM 直接匿名证明

UoS-SCCS/ecc-daa方式

该工具的实现不是很完善,仅能作为一个很简单的测试使用。

相关命令的详细解释见参考资料[11]。

编译并配置

从github仓库拉去并编译该代码

1
2
3
4
5
6
7
8
9
10
11
12
13
git clone --depth=1 https://github.com/UoS-SCCS/ecc-daa.git
cd ecc-daa
make

mkdir $(pwd)/bin

./copy_programs.sh $(pwd)/bin

# 如果使用了TPM模拟器则拷贝tpm_server命令到bin目录下
cp /opt/ibmtpm/src/tpm_server $(pwd)/bin

# 设置PATH
export PATH=$(pwd)/bin:$PATH

ecc-daa提供了脚本来设置一些环境变量

1
2
3
4
5
# TPM模拟器
source ./setupForTPMSim.sh $(pwd)/bin

# 物理TPM
source ./setupForTPMSim.sh $(pwd)/bin
测试执行

开启两个终端,其中一个用于启用tpm服务,另一个用于测试。

注意:由于直接使用export来注册的环境变量是临时的,仅对当前终端生效,并且会因为终端的关闭而被删除。因此需要对两个终端分别执行上述的环境变量注册;如果需要持久化,则将其写入到.bashrc

Terminals 1:启用tpm服务

1
2
3
mkdir ~/Daa_logs
cd /opt/ecc-daa # ecc-daa工具的根目录
./start_newTPM.sh ~/Daa_logs # 指定~/Daa_logs目录来存储日志信息

Terminals 2:用于测试

由于provision_tpm工具编写的原因,它需要一个固定的目录/home/cn0016/TPM_data/来存放数据。

provision_tpm用于准备将要使用的TPM。它会创建RSA背书密钥,此外该命令还会写入PCR 23以进行TPM2_Quote测试。

1
2
3
4
# 创建所需的文件夹
mkdir -p /home/cn0016/TPM_data/

provision_tpm -s

上述命令执行完之后会创建两个二进制文件。

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提供的脚本进行安装。

安装AMCL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 拉取源代码
git clone https://github.com/apache/incubator-milagro-crypto-c.git

# 安装相关依赖
sudo apt-get update -y
sudo apt-get install -y \
build-essential \
cmake \
doxygen \

cd incubator-milagro-crypto-c
mkdir -p target/build
cd target/build
cmake -D CMAKE_INSTALL_PREFIX=/opt/amcl ../..
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./
make
make test
make doc
sudo make install
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./:/opt/amcl/lib

安装tpm2-tss。这个可以不手动安装,可以使用xaptum/ecdaa提供的脚本进行安装。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
git clone https://github.com/tpm2-software/tpm2-tss.git
sudo apt -y update
sudo apt -y install \
autoconf-archive \
libcmocka0 \
libcmocka-dev \
procps \
iproute2 \
build-essential \
git \
pkg-config \
gcc \
libtool \
automake \
libssl-dev \
uthash-dev \
autoconf \
doxygen \
libjson-c-dev \
libini-config-dev \
libcurl4-openssl-dev

cd tpm2-tss

./bootstrap
./configure
make -j$(nproc)
sudo make install

sudo udevadm control --reload-rules && sudo udevadm trigger
sudo ldconfig

安装ECDAA相关开发库(这个没安装成功也不影响执行)

1
apt install -y libecdaa-dev libecdaa-tpm0 libecdaa-tpm-dev

下载v1.0.0版本的安装包。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
wget https://github.com/xaptum/ecdaa/archive/v1.0.0.tar.gz
tar -zxvf v1.0.0.tar.gz
cd ecdaa-1.0.0
mkdir -p build
cd build

# 提供四种可选的曲线算法(用逗号分隔) - 'BN254','BN254CX','BLS383','FP256BN'
export ECDAA_CURVES=BN254,BN254CX,BLS383,FP256BN
# 它也提供了一些依赖的安装脚本
mkdir -p ./deps
export CMAKE_PREFIX_PATH=$(pwd)/deps
## 使用提供的脚本编译AMCL
../.travis/install-amcl.sh ./amcl ./deps ${ECDAA_CURVES}
## 使用提供的脚本编译tpm2-tss (if building with TPM support)
../.travis/install-tpm2-tss.sh ./tpm2-tss ./deps
## 安装IBM TPM模拟器。因为路径使用的是局部变量,因此不用担心和之前安装的TPM模拟器冲突
## xaptum需要使用配套的软件。。。
../.travis/install-ibm-tpm2.sh ./ibm-tpm-simulator

# 编译
# 如果物理TPM芯片或TPM模拟器不可用,则ECDAA_TPM_SUPPORT必须设为OFF
# TEST_USE_TCP_TPM代表使用TCP socket来测试TPM
cmake .. -DCMAKE_BUILD_TYPE=Release -DECDAA_CURVES=${ECDAA_CURVES} -DECDAA_TPM_SUPPORT=ON -DTEST_USE_TCP_TPM=ON

cmake --build .

# 启动TPM模拟器
../.travis/run-ibm-tpm2.sh ./ibm-tpm-simulator/

# 生成pub_key.txt和handle.txt以测试
../.travis/prepare-tpm2.sh ./ibm-tpm-simulator/ ./test/tpm

# 测试
ctest -V

# 安装
cmake --build . --target install

# 配置AMCL动态链接库路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/root/ecdaa-1.0.0/build/amcl/build/lib

ldconfig
测试执行

创建Group

1
2
3
4
5
6
7
8
9
# Issuer creates a new keypair
ecdaa issuer genkeys -p issuer_public.bin -s issuer_private.bin

# Issuer分发issuer_public.bin给Verifier

# Verifier extracts group public key from Issuer's public key
ecdaa extractgpk -p issuer_public.bin -g group_public.bin

# Verifier持有group_public.bin

Join

1
2
3
4
5
6
7
8
9
10
11
# Member creates a keypair
ecdaa member genkeys -p member_public.bin -s member_private.bin

# Member发送member_public.bin给Issuer

# Issuer creates a credential on that public key
ecdaa issuer issuecredential -p member_public.bin -s issuer_private.bin -c member_credential.bin

# Issuer发送member_credential.bin给Member

# Member持有member_credential.bin和它自己的member_private.bin

Sign

1
2
3
4
5
6
7
echo 0123456 | xxd -r -ps > message.bin
# 用户将要被签名的信息存储在message.bin

# Member creates signature over the message
ecdaa member sign -s member_private.bin -c member_credential.bin -m message.bin -g signature.bin

# Member将message.bin和signature.bin发送给Verifier

Verify

1
2
3
4
5
6
7
# Verifier checks signature
ecdaa verify -g group_public.bin -m message.bin -s signature.bin

# 使用vim修改了签名的内容后再次Verify
vim -b signature.bin

ecdaa verify -g group_public.bin -m message.bin -s signature.bin

参考资料

[1] gpg: keyserver receive failed: Server indicated a failure

[2] tpm2-tools手册alg部分

[3] FIDO ECDAA

[4] xaptum/ecdaa

[5] Using Elliptic Curve Cryptography with TPM2

[6] Direct anonymous attestation

[7] ibm-research/ecdaa

[8] UoS-SCCS/ecc-daa

[9] ibmswtpm2

[10] ibmtpm20tss

[11] UoS-SCCS/ecc-daa Code Notes

[12] TPM DAA Figures

[13] xaptum/ecdaa BUILDING.md

Author

Chaos Chen

Posted on

2021-02-20

Updated on

2023-06-30

Licensed under

Commentaires