【３０分でできる】TEE（Trusted Execution Environment） をAzureで作成し、HelloWorldしてみた。

**@kenmaro**です。
普段は主に**秘密計算、準同型暗号などの記事について投稿しています**。
秘密計算に関連するまとめの記事に関しては以下をご覧ください。

> - [秘密計算エンジニアを始めて２年半が経った。](https://qiita.com/kenmaro/items/48059dd60f79e80f5ef8)
> - [秘密計算エンジニアを始めて3年が経った。](https://qiita.com/kenmaro/items/a1d90a074d552b7bf886)

#### 勝手に秘密計算アドベントカレンダーについて

この記事は

https://qiita.com/kenmaro/items/3e8a124ce4306fe040dc

の「６日目」の記事
としようかと思っています。
興味のある方はアドベントカレンダー参加してみませんか？
ご連絡お待ちしております。


## 概要

新しいことを吸収したいという一心でムチを打ち、
TEE（Trusted Execution Environment）
で使ってみようと思います。

なにも知識がないので、

https://docs.microsoft.com/ja-jp/azure/confidential-computing/quick-create-portal

これを愚直に追ってみようと思っています。

TEEとはなんぞや、というところに関してはいろいろ記事がありますのでそちらをご覧ください。
例えば

https://www.intec.co.jp/company/itj/itj17/contents/itj17_54-61.pdf

これとかです。

## 忙しい人へ

- TEE(Trusted Execution Environment)のチュートリアルを実際に動かしてみたよ
- Azure でSGXに対応したインスタンスを作ったよ
- 無事Hello,Worldできたよ
- 1 + 2 = 3 も秘密領域で実行できたよ
- 情報が散らばっているけど、本記事に沿えば３０分もあればチュートリアル完了できるよ

早速やっていきます。


## Azureからインスタンスを作成

```
Virtual machine name
test-sgx

Region
West US


Security type
Standard

Image
Ubuntu Server 20.04 LTS - Gen2

Size
Standard DC1s v2 (1 vcpu, 4 GiB memory)
```

とりあえずこんな感じで
`DC1s`
を用意してみました。

コストは１時間１０円くらいです。


ssh したら、

```bash
azureuser@test-sgx:~/openenclave/samples/helloworld$ cat /proc/cpuinfo | grep sgx
flags		: sgx sgx_lc
```

これをみて、
「なんかSGX入ってそうやなぁ」
くらい思っときます。


## いざチュートリアルへ

https://github.com/openenclave/openenclave/blob/master/samples/README.md

ここをフォローしていきます。

フォローしていくのですが、最終的に私は

https://lepidum.co.jp/blog/2020-04-07/intel-sgx/

この記事を大いに参考にさせていただきました。
このようにまとめている人がいることに感謝いたします。


#### レポジトリの準備

ssh したら、

```bash
git clone https://github.com/openenclave/openenclave.git
git submodule update --init --recursive
cd openenclave/samples/helloworld
```

を行います。


#### openenclave SDKのインストール

なにはともあれ、helloworld を実行するために、

https://github.com/openenclave/openenclave/blob/master/docs/GettingStartedDocs/install_host_verify_Ubuntu_20.04.md

ここをフォローする必要があります。

ひととおり実行すると、

```
/opt/openenclave
```

が出現しているはずです。

その下に存在しているフォルダ構成の簡単な説明は、

https://github.com/openenclave/openenclave/blob/master/docs/GettingStartedDocs/Linux_using_host_verify.md

ここをフォローします。
上記リンクの最後の、

```
source /opt/openenclave/share/openenclave/openenclaverc
```

を実行することで、必要な環境変数を設定できるようです。
念の為どんなものが設定されているかみてみると、

```
# Copyright (c) Open Enclave SDK contributors.
# Licensed under the MIT License.

# Update PKG_CONFIG_PATH.
export PKG_CONFIG_PATH=${PKG_CONFIG_PATH}:/opt/openenclave/share/pkgconfig

# Set CMake Config-package path
export CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}:/opt/openenclave/lib/openenclave/cmake

# Update PATH.
export PATH=${PATH}:/opt/openenclave/bin
```

らが設定されているようですね。なにも考えず次に進みます。

### openenclaveのビルド

openenclave 直下にて、

```bash
mkdir build
cd build
cmake -DHAS_QUOTE_PROVIDER=OFF ..
```

を実行します。私の場合ここでdoxygenがないと怒られたので、

```bash
sudo apt install doxygen -y
```

を実行したところ cmake が通ったので、

```bash
make
```

を実行しました。５〜１０分くらいビルドに時間がかかります。


ビルドが完了した段階で、

```bash
cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX=~/openenclave-install ..
make install
```

を実行してインストールしました。



### helloworld の実行

```bash
source ~/openenclave-install/share/openenclave/openenclaverc
```

で環境変数などを設定した後、


```bash
cd ~/openenclave/samples/helloworld
make
make run
```

を実行します。すると

```bash
host/helloworldhost ./enclave/helloworldenc.signed
Hello world from the enclave
Enclave called into host to print: Hello World!
```

となり、enclave（セキュア領域）からのHello,Worldが出力されます。

お疲れ様でした。


#### enclave 内で簡単な計算をやってみる

先ほどの　`helloworld/enclave/enc.c`

で、

```c++
void enclave_helloworld()
{
    int tmp1 = 1;
    int tmp2 = 2;
    int tmp3 = tmp1 + tmp2;
    fprintf(stdout, "%d + %d = %d\n", tmp1, tmp2, tmp3);


    // Call back into the host
    oe_result_t result = host_helloworld();
    if (result != OE_OK)
    {
        fprintf(
            stderr,
            "Call to host_helloworld failed: result=%u (%s)\n",
            result,
            oe_result_str(result));
    }
}
```

を実行すると、問題なく

```bash
host/helloworldhost ./enclave/helloworldenc.signed
Hello world from the enclave
1 + 2 = 3
Enclave called into host to print: Hello World!
```

となりました。（当たり前か、、）


というだけです。



## まとめ

TEE、なんとなく聞いたことある
という状態からチュートリアルコードを動かすところまでをやってみました。

Azureのアカウントさえあれば、１０円あれば再現できます。
この記事に沿って実行すれば、１時間もあれば十分なはずです。

私は、次のステップとして

host から　enclave にデータを渡して、
enclave 内で保持しているデータと何か計算をして、
host に返す

つまり enclave に計算に必要な情報が入っていて、
enclaveで計算した結果のみをhostが取得

みたいなシナリオでサンプルコードを走らせてみようと思っています。

そこまでできたらまた記事にしようかと思います。

TEEはまだ全然理解していないので勉強頑張ります。！



今回はこの辺で。


@kenmaro