MinnowBoard TurbotのfTPMを使う

MinnowBoard Turbot でTPMを使うには、I2CをかSPIで外部にDiscrete TPMチップを接続する方法と、fTPM（ファームウェア実装のTPM2.0、Intelの場合はPTTとも呼ぶ）を使う方法があります。UEFI BIOSではFirmwareとDiscrete選べるようだが TPMチップの方の設定（おそらくNationz製のI2C TPM）について詳細な情報は公開されていないようです。ここではfTPMを有効化する方法についてまとめます。

## 1. 準備

- MinnowBoard Turbot 本体
    - https://minnowboard.org/get-a-board
    - Mouser
    - Netgate （決済でエラーになる場合がある）
- ACアダプター (5V,2.5A(min) 4A(推奨), 5.5x21.mm)
    - 5V4A,900円 http://akizukidenshi.com/catalog/g/gM-10660/
    - 5V4A，1000円 http://akizukidenshi.com/catalog/g/gM-06238/
    - 5V4A，1280円 http://akizukidenshi.com/catalog/g/gM-09594/
    - 5V6.2A,1200円 http://akizukidenshi.com/catalog/g/gM-11105/
- HDMIケーブル
- HDMIモニター
- MicroSDカード（Class10、16GB以上）もしくは SATA SSD、 M.2 SSD 等
- USBメモリ（OS導入用）
- USBキーボード、マウス

## 2. セットアップ

### 2-1. 前置き

- 購入したボードのUEFIのVersion 0.95でした。
    - BIOSの設定画面でTPMの選択が可能。
    - ただし、BIOSでせってしてもOSからはTPMが認識できない状態。
    - どうも付いてくるBIOSではFTPMをサポートしていないにもかかわらずメニューだけサポートしているフリをする困ったやつの可能性が高いです。そのため、OSでTPMを認識できない場合は、（どこにも書いてませんが）最新のFTPM対応のUEFIイメージにファームウェアをアップデートしておくひつようがありそうです。
- UEFIをアップデートすると設定をすべて消すので、UEFIをアップデートしてからOSをインストールしたほうが良いでしょう。
- ファームウェアは8種類（32/64BIT, Debug/Release、FTPMの有無）あります。Debugのファームウェアは動作がかなり遅いので64-bit/Release/FTPMを利用するのがココでは無難だと思われます。
- SDカードにOSインストールすると、動作が非常に遅いです。M.2 SSDなどを使ったほうがよいかもしれません（未確認）。

### 2-1. UEFI の更新

TeddyさんのBlog[1]にFTPMの有効化の方法が書かれていますが、最新のファームウェアではFTPMに対応済みのようです。インテルのファームウェアのサイト[2]から最新版ダウンロードしてアップデートします。

- https://firmware.intel.com/projects/minnowboard-max から最新UEFIファームウェアをダウンロード（これを書いた時点では 0.96が最新）。
- 解凍し、下記の２つをUSBドライブにコピー
    - MinnowBoard.MAX.FirmwareUpdateX64.efi
    - FTPM/MNW2MAX1.X64.0096.R01.1707030938.bin
- ボード起動、しばらくしてUEFIシェル起動
    - "fs0:" でUSBドライブ選択 
    - "MinnowBoard.MAX.FirmwareUpdateX64.efi MNW2MAX1.X64.0096.R01.1707030938.bin" でアップデート実行
    - 勝手に再起動

### 2-3. UEFIのメニューでTPMの有効化

- ボード起動、F2もしくはDELでメニューに
- Device Manager
    - System Setop
        - Security Configulation
            - PTT <Disable> -> <Enable>
            - Discrete TPM
            - Measured Boot <Enable>
− 以上でPTT（=fTPM）が有効化される


### 2-4. OSの設定、確認

以下は Ubuntu16.04 をインストールしたあとの作業です。 ftPM(PTT)は自動で認識されるため設定作業は不要です。以下は動作確認のメモです。

    $ lsmod | grep tpm
    tpm_crb                16384  0

CRBが読み込み済み。（のはず）


    $ stat /dev/tpm0
      File: '/dev/tpm0'
      Size: 0           Blocks: 0          IO Block: 4096   character special file
    Device: 6h/6d Inode: 417         Links: 1     Device type: a,e0
    Access: (0600/crw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2017-07-22 07:27:09.062223303 +0900
    Modify: 2017-07-22 07:27:09.062223303 +0900
    Change: 2017-07-22 07:27:09.062223303 +0900
     Birth: -

デバイスファイルも作成済み（のはず）

    $ sudo  acpidump -s
    [sudo] password for sage: 
    ACPI: APIC 0x0000000000000000 000084 (v03 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: CSRT 0x0000000000000000 00014C (v00 INTEL  EDK2     00000005 INTL 20120624)
    ACPI: DSDT 0x0000000000000000 007B07 (v02 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: FACP 0x0000000000000000 00010C (v05 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: FACS 0x0000000000000000 000040
    ACPI: FPDT 0x0000000000000000 000044 (v01 INTEL  EDK2     00000002      01000013)
    ACPI: HPET 0x0000000000000000 000038 (v01 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: MCFG 0x0000000000000000 00003C (v01 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: LPIT 0x0000000000000000 000104 (v01 INTEL  EDK2     00000003 VLV2 0100000D)
    ACPI: TCPA 0x0000000000000000 000032 (v02 INTEL  EDK2     00000002      01000013)
    ACPI: UEFI 0x0000000000000000 000042 (v01 INTEL  EDK2     00000002      01000013)
    ACPI: TPM2 0x0000000000000000 000034 (v03                 00000000      00000000)
    ACPI: SSDT 0x0000000000000000 0004AC (v01 INTEL  RHPROXY  00000003 VLV2 0100000D)
    ACPI: SSDT 0x0000000000000000 00043A (v01 Intel_ Tpm2Tabl 00001000 INTL 20120518)
    ACPI: SSDT 0x0000000000000000 000763 (v01 PmRef  CpuPm    00003000 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 000261 (v01 PmRef  Cpu0Tst  00003000 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 00017A (v01 PmRef  ApTst    00003000 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 000395 (v01 PmRef  Cpu0Ist  00003000 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 000233 (v01 PmRef  Cpu0Cst  00003001 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 00015F (v01 PmRef  ApIst    00003000 INTL 20141107)
    ACPI: SSDT 0x0000000000000000 00008D (v01 PmRef  ApCst    00003000 INTL 20141107)

ACPIテーブルにエントリがある（のはず）

    $ dmesg | grep TPM
    [    0.000000] ACPI: TPM2 0x0000000078679000 000034 (v03                 00000000      00000000)
    [    0.189472] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    0.189483] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
    [    0.189521] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    0.189530] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
    [    0.218213] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    0.218225] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
    [    0.237639] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    0.237650] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
    [    2.422114] ima: No TPM chip found, activating TPM-bypass!
    [    7.378722] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    7.378736] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)
    [    7.389216] ACPI Error: [TPME] Namespace lookup failure, AE_NOT_FOUND (20150930/psargs-359)
    [    7.389231] ACPI Error: Method parse/execution failed [\_SB.TPM._STA] (Node ffff880076cb95f0), AE_NOT_FOUND (20150930/psparse-542)

このボードに限らずPTTの場合は、IMAの初期化時にTPMの動作確認が出来ないため IMAがTPM-bypassモードになるようです。


### 2-5. IBM TSS2.0 での動作確認

（ざっくり）インストール

    $ sudo apt-get install -y libssl-dev
    $ mkdir -p sandbox/ibmtpm20tss
    $ cd sandbox/ibmtpm20tss
    $ wget https://sourceforge.net/projects/ibmtpm20tss/files/ibmtss996.tar.gz
    $ tar xvfz ibmtss996.tar.gz
    $ cd utils
    $ make
    $ export TPM_INTERFACE_TYPE=dev
    $ sudo chmod a+rwx /dev/tpm0
    $ ./getcapability -cap 6
    TPM_PT 00000100 value 322e3000 TPM_PT_FAMILY_INDICATOR - a 4-octet character string containing the TPM Family value (TPM_SPEC_FAMILY)
    <SNIP>
    TPM_PT 00000105 value 494e5443 TPM_PT_MANUFACTURER - the vendor ID unique to each TPM manufacturer 
    <SNIP>
    TPM_PT 0000010b value 00010000 TPM_PT_FIRMWARE_VERSION_1 - the most-significant 32 bits of a TPM vendor-specific value indicating the version number of the firmware
    TPM_PT 0000010c value 0003048c TPM_PT_FIRMWARE_VERSION_2 - the least-significant 32 bits of a TPM vendor-specific value indicating the version number of the firmware
    <SNIP>
    $ ./pcrread -ha 0 -halg sha1 -ns
    dfaa319c2ee33b4efc4edb4eb9ec057801bec1bb


PCR0-7に値が書き込まれているので、Trusted Boot (Measured Boot)も動作している模様。

以上で MinnowBoard Turbot（MAXも同じはず）でfTPMが使えるようになりました。

## 3. 参照

- [1] Teddy Reed V, Minnowboard Max: Enable the firmware (TXE) TPM 2.0, January 11, 2016
    - https://prosauce.org/blog/2016/1/11/minnowboard-max-enable-and-test-the-firmware-txe-tpm-20
- [2] MinnowBoard Max/Turbot - UEFI Firmware
     - https://firmware.intel.com/projects/minnowboard-max
- [3] Minnowboard 本家
    - https://minnowboard.org 

その他（ググッてみつけた）関連情報

- Davide Guerri, TPM2.0 practical usage, Using a firmware TPM 2.0 on an embedded device, FOSDEM2017
    - https://fosdem.org/2017/schedule/event/tpm2/attachments/slides/1517/export/events/attachments/tpm2/slides/1517/FOSDEM___TPM2_0_practical_usage.pdf
- Security technologies and the Minnowboard Max
    - https://firmware.intel.com/blog/security-technologies-and-minnowboard-max
- TPM how to enable?
    - https://social.msdn.microsoft.com/Forums/en-US/5e04e461-768e-4e79-88ec-56e3ceb4c68f/tpm-how-to-enable?forum=WindowsIoT
- Detection and Mitigation of Malicious Modifications on the Minnowboard Turbot
    - http://repositorio.educacionsuperior.gob.ec/bitstream/28000/4298/1/T-SENESCYT-01582.pdf
- https://trustedcomputinggroup.org/wp-content/uploads/TCG_RSA_Booklet_2016_WebRevC.pdf
- https://www.linuxfestnorthwest.org/sites/default/files/slides/linfwsec_0.pdf
- http://events.linuxfoundation.org/sites/events/files/slides/ELC2017_TPM2-and-TSS_Tricca_0.pdf
- http://www.uefi.org/sites/default/files/resources/FINAL%20Pres5%20UEFI%20Development-Open%20Source%20Ecosystem.pdf


以上