Skip to content

wolfTPMのビルド

wolfTPM ライブラリをビルドするには、最初に wolfSSL ライブラリをビルドしてインストールする必要があります。この ダウンロードページ, から取得するか"git clone" コマンドを使ってクローンしてください:

$ git clone https://github.com/wolfssl/wolfssl

wolfSSL ライブラリをダウンロードしたら、configure スクリプトに次のオプションを渡してビルドします:

$ cd wolfssl
$ ./configure --enable-wolftpm

または同等の、次のオプションを使用します:

$ ./configure --enable-certgen --enable-certreq --enable-certext
--enable-pkcs7 --enable-cryptocb --enable-aescfb

次に、wolfSSL ライブラリをビルドしてインストールするだけで、ユーザーの好みに応じてインストールできます。

次のステップは、wolfTPM ライブラリをダウンロードしてインストールすることです。 wolfTPM は、同様に次の Web サイトからダウンロードできます ダウンロードページ あるいはGitHubからクローンします。次のコマンドでwolfTPMをビルドします:

$ git clone https://github.com/wolfssl/wolftpm
$ cd wolftpm
$ ./autogen.sh
$ ./configure
$ make

ビルドオプションとマクロ定義

--enable-debug          デバッグ出力を有効にする/最適化をオフにする
                        --enable-debug=yes|no|verbose|io が指定可
                        これらは次のマクロ定義と同義: DEBUG_WOLFTPM, WOLFTPM_DEBUG_VERBOSE, WOLFTPM_DEBUG_IO

--enable-examples       サンプルプログラムもビルドする(デフォルトで有効)

--enable-wrapper        ラッパーコードを有効にする(デフォルトで有効)
             無効にする場合には次のマクロを定義: WOLFTPM2_NO_WRAPPER

--enable-wolfcrypt      wolfCryptのRNG,セッション認証、パラメータ暗号化に関するフック関数を有効化する(デフォルトで有効)
                        無効にする場合には次のマクロを定義:WOLFTPM2_NO_WOLFCRYPT

--enable-advio          アドバンストIOを有効にする(デフォルトで無効)
             次のマクロ定義と同義:WOLFTPM_ADV_IO

--enable-i2c            I2C TPM のサポートを有効にする(デフォルトで無効)。加えてadvioを有効化も必要
                        次のマクロ定義と同義:WOLFTPM_I2C

--enable-checkwaitstate TIS / SPI Check Wait Stateを有効化する(デフォルトではチップに依存する)
                        次のマクロ定義と同義:WOLFTPM_CHECK_WAIT_STATE

--enable-smallstack     スタック使用量を削減する

--enable-tislock        Linuxの名前付きセマフォをSPIドライバーのプロセス間排他ロックに使用 
                        次のマクロ定義と同義:WOLFTPM_TIS_LOCK

--enable-autodetect     実行時モジュール検出を有効にする(デフォルトで有効。モジュールが指定されない場合)
                        次のマクロ定義と同義:WOLFTPM_AUTODETECT

--enable-infineon       Infineon SLB9670 TPM のサポートを有効化する(デフォルトで無効)

--enable-st             ST ST33TPM のサポートを有効化する(デフォルトで無効)
                        次のマクロ定義と同義:WOLFTPM_ST33

--enable-microchip      Enable Microchip ATTPM20のサポートを有効化する(デフォルトで無効)
                        次のマクロ定義と同義:WOLFTPM_MCHP

--enable-nuvoton        Nuvoton NPCT65x/NPCT75x のサポートを有効化する(デフォルトで無効)
                        次のマクロ定義と同義: WOLFTPM_NUVOTON

--enable-devtpm         Linux /dev/tpmX用カーネルドライバーのサポートを有効化する(デフォルトで無効)
                        次のマクロ定義と同義:WOLFTPM_LINUX_DEV

--enable-swtpm          SWTPM TCP protocolのサポートを有効化する(デフォルトで無効) 
                        次のマクロ定義と同義: WOLFTPM_SWTPM

--enable-winapi         Windows TBS APIを使用する (デフォルトで無効)
                        次のマクロ定義と同義: WOLFTPM_WINAPI

WOLFTPM_USE_SYMMETRIC   TLSサンプルプログラムで対称 AES/Hashing/HMAC のサポートを有効化する

WOLFTPM2_USE_SW_ECDHE   TLSサンプルプログラムでECCエフェメラル鍵の生成とシェアードシークレットの生成にTPMを使用しない

TLS_BENCH_MODE          TLSベンチマークを有効にする

NO_TPM_BENCH            TPMのベンチマークサンプルプログラムを無効にする

Infineon SLB9670向けビルド

以下のコマンドでwolfTPMをビルド:

git clone https://github.com/wolfSSL/wolfTPM.git
cd wolfTPM
./autogen.sh
./configure
make

ST ST33TP* 向けビルド

以下のコマンドでwolfTPMをビルド:

./autogen.sh
./configure --enable-st33 [--enable-i2c]
make

Raspberry Pi上のI2C向けにビルドする際にはIC2を有効にする必要があります。以下がその手順です:
1. sudo vim /boot/config.txt で編集します。
2. dtparam=i2c_arm=on の行のコメントを外し有効にします。
3. sudo reboot で再起動します。

Microchip ATTPM20 向けビルド

以下のコマンドでwolfTPMをビルド:

./autogen.sh
./configure --enable-microchip
make

Nuvoton向けビルド

以下のコマンドでwolfTPMをビルド:

./autogen.sh
./configure --enable-nuvoton
make

"/dev/tpmX"向けビルド

次のビルドオプションはLinux TIS カーネルドライバーでサポートされているいずれのTPMベンダーに対して使用できます。

以下のコマンドでwolfTPMをビルド:

./autogen.sh
./configure --enable-devtpm
make

注意:Linuxカーネルドライバーを通してTPMデバイスを使用する際にはwolfTPMを使用するアプリケーションに対して必要なパーミッションが付与されていることを確認してください。何故なら通常、"/dev/tpmX"は"tss"ユーザーグループにのみRead/Writeパーミッションが与えられているからです。wolfTPMのサンプルプログラムを"sudo"コマンドと共に実行するかあるいはユーザーを次のようにして"tss"グループに追加する必要があります:

sudo adduser yourusername tss

QEMU と swtpmを使ってのビルド

以下ではQEMU上でwolfTPMを使いlinuxカーネルデバイスの"/dev/tpmX"を使うデモンストレーションを行います。これにはswtpmのインストールかビルドが必要です。以下の手順は短いビルドの手順の一つを示したものです。操作にはlibtpmsswtpmを参照する必要があります。

PREFIX=$PWD/inst
git clone git@github.com:stefanberger/libtpms.git
cd libtpms/
./autogen.sh --with-openssl --with-tpm2 --prefix=$PREFIX && make install
cd ..
git clone git@github.com:stefanberger/swtpm.git
cd swtpm
PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig/ ./autogen.sh --with-openssl --with-tpm2 \
    --prefix=$PREFIX && \
  make install
cd ..

基本的なLinuxインストールをセットアップします。他のインストールベースをインストールしてもかまいません。このセットアップには時間を要します。

# ミニインストールイメージをダウンロード
curl -O http://archive.ubuntu.com/ubuntu/dists/bionic-updates/main/installer-amd64/current/images/netboot/mini.iso
# qemuイメージファイルを作成
qemu-img create -f qcow2 lubuntu.qcow2 5G
# tpm用にディレクトリを作成
mkdir $PREFIX/mytpm
# swtpmを実行
$PREFIX/bin/swtpm socket --tpm2 --tpmstate dir=$PREFIX/mytpm \
  --ctrl type=unixio,path=$PREFIX/mytpm/swtpm-sock --log level=20 &
# インストールのためにqemuを起動
qemu-system-x86_64 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \
  -chardev socket,id=chrtpm,path=$PREFIX/mytpm/swtpm-sock \
  -tpmdev emulator,id=tpm0,chardev=chrtpm \
  -device tpm-tis,tpmdev=tpm0 -hda lubuntu.qcow2 -cdrom mini.iso

ベースシステムがインストールされたら、qemuを実行する準備が整ったので、qemuインスタンス中からwolfSSLとwolfTPMをビルドします。

# swtpm を再スタート
$PREFIX/bin/swtpm socket --tpm2 --tpmstate dir=$PREFIX/mytpm \
  --ctrl type=unixio,path=$PREFIX/mytpm/swtpm-sock --log level=20 &
# wolfTPMをインストールして起動するためにqemu システムをスタート
qemu-system-x86_64 -m 1024 -boot d -bios bios-256k.bin -boot menu=on \
  -chardev socket,id=chrtpm,path=$PREFIX/mytpm/swtpm-sock \
  -tpmdev emulator,id=tpm0,chardev=chrtpm \
  -device tpm-tis,tpmdev=tpm0 -hda lubuntu.qcow2

以下のコマンドでQEMUターミナルでwolfTPMをチェックアウトしてビルドします:

sudo apt install automake libtool gcc git make

# wolfSSLを取得してビルド
git clone https://github.com/wolfssl/wolfssl.git
pushd wolfssl
./autogen.sh && \
  ./configure --enable-wolftpm --disable-examples --prefix=$PWD/../inst && \
  make install
popd

# wolfTPMを取得してビルド
git clone https://github.com/wolfssl/wolftpm.git
pushd wolftpm
./autogen.sh && \
  ./configure --enable-devtpm --prefix=$PWD/../inst --enable-debug && \
  make install
sudo make check
popd

次のコマンドでQEMUでサンプルプログラムを実行できます。sudo ./examples/wrap/wrap /dev/tpm0へのアクセスには"sudo"を付加する必要になる場合があります。

SWTPM向けにビルド

wolfTPMは次の仕様書のD.3章に記載のSW TPMとインターフェイスすることが可能。 TPM-Rev-2.0-Part-4-Supporting-Routines-01.38-code

SWTPMに接続するソケットは排他的に使用しなければならず、TISあるいはdevtpmとはコンパチブルではありません。

wolTPMのテストでは機能のサブセットのみがサポートされています。プラットフォームの要求事項はwolfTPMでは使用されません。

テストでは次の二つの実装が使用されます:

  • https://sourceforge.net/projects/ibmswtpm2/files/
  • https://github.com/stefanberger/swtpm

この機能を有効にするにはwolfTPMを以下のオプションとともにビルド:

./configure --enable-swtpm
make

SWTPM シミュレーターのセットアップ

ibmswtpm2

チェックアウトとビルド

git clone https://github.com/kgoldman/ibmswtpm2.git
cd ibmswtpm2/src/
make

実行

./tpm_server --rm

"rm"スイッチはオプションで、指定するとキャッシュファイル(NVChip)を削除します。あるいは"rm NVChip"を実行しても同様です。

swtpm

libtpmsをビルド

git clone git@github.com:stefanberger/libtpms.git
(cd libtpms && ./autogen.sh --with-tpm2 --with-openssl --prefix=/usr && make install)

swtpmをビルド

git clone git@github.com:stefanberger/swtpm.git
(cd swtpm && ./autogen.sh && make install)

注意:Mac OS X では以下を最初に実行すること:

brew install openssl socat
pip3 install cryptography

export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

# libtpms had to use --prefix=/usr/local

swtpmを実行

mkdir -p /tmp/myvtpm
swtpm socket --tpmstate dir=/tmp/myvtpm --tpm2 --ctrl type=tcp,port=2322 --server type=tcp,port=2321 --flags not-need-init

サンプルプログラムを実行

./examples/pcr/extend
./examples/wrap/wrap_test

Windows TBS API 向けにビルド

wolfTPMは Windows ネイティブTBS(TPM Base Services)を使用するようにビルドできます。

Windows TBS インターフェイスを使用する際にはNVアクセスは既定でブロックされます。TPM NVストレージ空間は非常に制限されていてデータ書き込みにより鍵ハンドルのロードに失敗するなどの未定義のふるまいを引き起こす可能性があります。このようなNVストレージ空間への書き込みはTBSによっては管理されていません。

TPMは"TPM2_Create"を使って鍵を生成した場合には、ディスク上に格納したり必要に応じたロードが安全にできるように暗号化した秘密鍵ブロブを返すように設計されています。秘密鍵ブロブを保護するのに使用されるのは対称暗号化鍵だけです。"TPM2_Load"を使って鍵をロードする場合には一時的なハンドルを得て署名や暗号化/復号に使用します。

"TPM2_CreatePrimary"を使って生成した鍵はハンドルで返されます。暗号化された鍵データが返されるわけではありません。このハンドルは"TPM2_FlushContext"が呼び出されるまでロードされた状態が保たれます。

制限事項

wolfTPM はTPM 2.0デバイスを搭載したWindows 10でテストされています。 WindowsがTPM1.2の機能をサポートしている場合はwolfTPMではサポートされません。TPM 2.0が搭載されていることを確認する場合には、PowerShellを開き"Get-PnpDevice -Class SecurityDevices"を実行してください。

Status     Class           FriendlyName
------     -----           ------------
OK         SecurityDevices Trusted Platform Module 2.0
Unknown    SecurityDevices Trusted Platform Module 2.0

MSYS2上でビルド

MSYS2を使ってテスト済み

export PREFIX=$PWD/tmp_install

cd wolfssl
./autogen.sh
./configure --prefix="$PREFIX" --enable-wolftpm
make
make install

cd ../wolftpm/
./autogen.sh
./configure --prefix="$PREFIX" --enable-winapi
make

linux上でのビルド

mingw-w32-bin_x86_64-linux_20131221.tar.bz2 を使ってテスト済み。 ソースはこちら。

ツールを抽出してPATH変数に追加します。

mkdir mingw_tools
cd mingw_tools
tar xjvf ../mingw-w32-bin_x86_64-linux_20131221.tar.bz2
export PATH=$PWD/bin/:$PWD/i686-w64-mingw32/bin:$PATH
cd ..

以下でビルドします。

export PREFIX=$PWD/tmp_install
export CFLAGS="-DWIN32 -DMINGW -D_WIN32_WINNT=0x0600 -DUSE_WOLF_STRTOK"
export LIBS="-lws2_32"

cd wolfssl
./autogen.sh
./configure --host=i686 CC=i686-w64-mingw32-gcc --prefix="$PREFIX" --enable-wolftpm
make
make install

cd ../wolftpm/
./autogen.sh
./configure --host=i686 CC=i686-w64-mingw32-gcc --prefix="$PREFIX" --enable-winapi
make
cd ..

Windows上での実行

マシン上でのTPMの存在とその状態を確認する為には"tpm.msc"を実行してください。