【１５分で解説】TEE（Trusted Execution Environment） のチュートリアルでどんなことをやっているかまず理解しよう。

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

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

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

この記事は

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

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


## 概要

**１５分もあれば本記事の内容は理解できるようになっていますので、気軽に読んでみてください。**

#### 前回やったこと


前回の記事で、

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

をやってみました。


このチュートリアルでは、enclave application を作り、

- **host からenclave を作成**
- **host から　ECALL （host からenclave 内で関数を呼ぶ）**
- **enclave から　OCALL （enclave から　host 内で関数を呼ぶ）**

を行いました。
実際には、host からの　ECALLで、
enclave 内から `Hello, world`

と表示しました。


#### 実際８つのチュートリアル書いてあるね

しかしながら、このチュートリアルは

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

ここに用意されている計８つのチュートリアルのうち、１個目のチュートリアルであったため、


**他のチュートリアルって何をやっているんだろう？**

と思った方も多いと思います。

ですので、今回は、**残りの７つのチュートリアルについて、
どのようなことをやっているのか、なるべく簡潔にまとめたいと思います。**


#### 本記事は各チュートリアルのシナリオ理解に努める

前回の記事をフォローすれば、チュートリアルHello, world の実際のビルド、実行
はできているはずです。

私が他の７つのチュートリアルについても試したところ、同じ環境下で全てのチュートリアルをビルドし
実行することはできたため、
どんなチュートリアルかをまずは理解することで、実際に動かしてみることができます。

#### 本記事の後はぜひチュートリアル自体を読んでみるべき
ぜひ本記事を読んだ後は自分で実行を行い、ログなども並行で見ながらなにをやっているのか確かめてみると面白いです。
今回は、中身の具体的なコードを追うというよりは、各チュートリアルでやっていることを言葉でまとめようと思います。
内容は実際に各チュートリアルを読み解く以上のことにはなりませんので、実際に読んでみたい人は上のリンクからぜひチャレンジしてみてください。

１５分もあれば本記事の内容は理解できるようになっていますので、気軽に読んでみてください。


## 忙しい人へのまとめ
- エンクレーブアプリケーションでは、ホスト（非信頼領域）と、エンクレーブ（信頼領域）に実行したいプログラムを分けるよ
- Open Enclave SDK のチュートリアルは、全部で８つあるよ
- １つ目のチュートリアルでは、hello, world をやったよ
- ２つ目のチュートリアルでは、エンクレーブ 内で使用できる暗号ライブラリ「AES Mbed TLS」の使い方のチュートリアルだよ
- ３つ目のチュートリアルでは、エンクレーブ内でのデータをシール（暗号化）して取り出してホスト内に保存し、ホスト内で保管するよ、その後、別エンクレーブ内でアンシール（復号）して秘密情報をロードするよ
- ４つ目のチュートリアルでは、エンクレーブ１からエンクレーブ２に秘密情報を渡したい時に、エンクレーブ２が信頼できるか確かめる、アテステーションと呼ばれるプロトコルを実行するよ
- ５つ目のチュートリアルでは、協力しながら動いている２つのエンクレーブが、実行中にお互いを信頼し合うために繋いでおく、Attested TLS チャンネルを実装するよ
- ６つ目のチュートリアルでは、ホストからエンクレーブにプログラムを実行するときにかかるオーバーヘッド（実行時間の遅延）を小さくする、Switchless callを実装するよ
- ７つ目のチュートリアルでは、ホストが別ホストで実行されているエンクレーブを信頼できるか確かめるための、Host-side Enclave Verification　をやるよ
- ８つ目のチュートリアルでは、Pluggable Allocatorsといって、エンクレーブ内でマルチスレッドする時のプログラムを解説するよ、正直私もよくわかっていないよ

上のことを理解するだけでだいぶお腹いっぱいなのですが、
もう少しだけ詳しく以下に書いていければと思います。

それではやっていきましょう。


## だいぶ簡潔に詳細を書きます

### チュートリアル１　Hello, world

なんてことはない、我々が最初に書くエンクレーブアプリケーションです。
ホストがエンクレーブを生成し、エンクレーブ内で関数を呼びます。（ECALL）
また、エンクレーブ内から、ホストサイドの関数を呼びます（OCALL)

### チュートリアル2　File-Encryptor

シナリオとしては、エンクレーブ内で暗号化、復号化を行い、
ファイルをAESで暗号化します。
ファイルには普通のテキストが書かれており、それを１６バイト毎にわけ、普通のブロック暗号として暗号化を行いますが、
このチュートリアルでは「エンクレーブ内で」暗号化と復号を行います。

暗号化されたファイルはファイルシステムに普通に書き出され、
復号時に読み出されます。復号された結果は、元のテキストファイルと比較され、同じであることを確認します。


実際このシナリオに特に意味はありません。
あくまでこのチュートリアルは、エンクレーブ内でAES暗号化を行うことのできるライブラリ
「AES Mbed TLS API」をどう使うか、ということを学ぶためのチュートリアルです。

### チュートリアル３　Data-Sealing

データシーリングは、どのようなシナリオで使われるかというと、
エンクレーブ内で持っていた「秘密情報」を「安全に」取り出し、保存するような場合です。
この保存された秘密情報は、後に他のエンクレーブに取り込まれ、アンシールされます。
アンシールはロードと考えて大丈夫です。アンシールされたデータは、エンクレーブ内で処理することができます。つまり、エンクレーブ１でシールしたデータを、エンクレーブ２でアンシールして使えたりします。

このとき、どのエンクレーブがアンシールできるかというのはポリシーによって決まりますが、
２つのポリシーが選べます。
ポリシー１だと、シールをした同一エンクレーブでないとアンシールできないですが、
ポリシー２だと、エンクレーブを生成する際のサインが同じものであれば、別のエンクレーブでもアンシールできます。


### チュートリアル４　Attestation

みんな大好きアテステーションです。
これはどのようなシナリオで使われるかというと、
エンクレーブ１とエンクレーブ２を用いて処理を実行したい時に、
エンクレーブ１は、エンクレーブ２が本当に信頼できる領域なのか、
また逆も、つまりエンクレーブ２から、エンクレーブ１は本当に信頼できる領域なのか、
を確かめるときです。


### チュートリアル５　Attested TLS


チュートリアル４のシナリオと似ているのですが、
Attested TLSというコネクションを例えば２つのエンクレーブが確立しているとします。
この時、このコネクションがつながっていれば、２つのエンクレーブはお互いを常に信頼し合いながらデータのやり取りを行なったり、演算を実行したりすることができます。
そのコネクションを、Attested TLSと呼びます。


### チュートリアル６　Switchless Calls

Switchless Callsがどのようなシナリオで使われるかというと、
エンクレーブアプリケーションにおいて、ホストとエンクレーブの処理を行ったり来たりする際に出てくる
オーバーヘッド（処理時の遅延）を小さくしたい時です。
実際のこのオーバーヘッドは大きい（処理が行ったり来たりするたびに認証のような操作が入るため）
ので、これらのオーバーヘッドを短縮することで、全体の実行時間をかなり短くすることができます。


### チュートリアル７　Host-side Enclave Verification

Host-side Enclave Verificationはどのようなシナリオで使われるかというと、
先ほどの、エンクレーブ同士で信頼できるか確認し合うアテステーションとは違い、
ホストが、別領域にあるエンクレーブが信頼できるかを判断するときです。


### チュートリアル８　Pluggable Allocators

多分結構アドバンスドな内容だと思いますが、エンクレーブ内でマルチスレッドで演算を実行したい時、
Pluggable Allocatorsを用いる必要があります。
応用的な内容だと思ったため、あまり詳しく読んでいないです。必要に応じて戻ってこようと思います。





## まとめ

今回は短い内容でしたが、
Open Enclave SDK というTEEを用いたエンクレーブアプリケーションを実装する時のSDKの
チュートリアルに、

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

計８個の内容が書いてあり、それらをまずは「文字で理解する」
ということをやってみようと思い、解説を書いてみました。


コードに最初から踏み込もうとするとかなり難解であるため、
まずはそれぞれのチュートリアルが

- なにをしようとしているのか
- どんな時に使われるのか


などを把握し、必要に応じて中身のコードに踏み込めればいいのではないかと思い、今回まとめてみた次第です。


ふわっとですが、なんとなくどんな内容がチュートリアルに書いてあるかわかったというのであれば、とても嬉しいです。

私もこれからTEEの勉強を続けていこうと思っています。




今回はこの辺で。



@kenmaro