Edukit を MacOS で試す

edukit を試したので、気になったところをメモしておきます。

EduKitについて
https://aws.amazon.com/jp/about-aws/whats-new/2020/12/introducing-aws-iot-edukit/

ハンズオン
https://edukit.workshop.aws/en/
こちらのハンズオンを試していきます。

# 1. getting started
特に気になるところは無し　PlatformIOは便利。

# 2. Blinky Hello World

ここではesp-idf のインストールを行うが、すでにv3の環境がインストール済みだったため、変な依存関係が生まれないように念のため退避しておきます。

```sh
cd ~/esp/
mv xtensa-esp32-elf ../(退避場所)
```

install.sh の実行で `dirname: illegal option -- b` のエラーが出たため、install.shを修正。
[こちら](https://unix.stackexchange.com/questions/341931/dirname-invalid-option-b)を参考に、以下のように `--` を $0の前に追加。

```sh 
export IDF_PATH=$(cd $(dirname -- $0); pwd)
#(中略)
basedir="$(dirname -- $0)"
```
ターミナルを再起動する必要が出た場合は、再度、

```sh
conda activate edukit
```
する必要があります。

```sh

python registration_helper.py -p <<DEVICE_PORT>>
```
これを実行すると、output_filesの下に {Serial Number}_manifest.jsonが作成されます。 
このPayloadはBase64でエンコードされているので、デコードしてみると以下のようになっています。

```json
{
   "version":1,
   "model":"ATECC608A",
   "partNumber":"ATECC608A-TNGTLS",
   "manufacturer":{
      "organizationName":"Microchip Technology Inc",
      "organizationalUnitName":"Secure Products Group"
   },
   "provisioner":{
      "organizationName":"Microchip Technology Inc",
      "organizationalUnitName":"Secure Products Group"
   },
   "distributor":{
      "organizationName":"Microchip Technology Inc",
      "organizationalUnitName":"Microchip Direct"
   },
   "provisioningTimestamp":"2020-11-18T05:00:00.000Z",
   "uniqueId":"0123b36c6270c2ad01",
   "publicKeySet":{
      "keys":[
         {
            "kid":"0",
            "kty":"EC",
            "crv":"P-256",
            "x":"6XU4nnOjw_vAS478YCCekvG0Lr-fwP86_ZA6NrG4mzI",
            "y":"D1W-rzC2iiFulsNhCF0c2n6HNcjnXgnenj7cXrY_j1A",
            "x5c":[
               "MIICIDCC...",
               "MIICBDCCAaqgAw..."
            ]
         },
         {
            "kid":"1",
            "kty":"EC",
            "crv":"P-256",
            "x":"r-9TSFq6DgCcxD1SXsCgW7YTax69RFo8zyaeiQEmfUA",
            "y":"nSjvVe50HKFkCVJJug5JN1BBkopzda1YCaUL0k4LykI"
         },
         {
            "kid":"2",
            "kty":"EC",
            "crv":"P-256",
            "x":"SaPyWQrM5T87ckFDZ1cn2iudiKdu5CAIBBh9a8BlVYY",
            "y":"awQz8k_GQ9RxizwyETo96UOz0Jnw9YmSIU7jlv-Q8pk"
         },
         {
            "kid":"3",
            "kty":"EC",
            "crv":"P-256",
            "x":"51JgkAj1O786jXR7pd2El8Vj08MIZENLdRqtCgRU4Vo",
            "y":"a0TsFt5VPoTCar59jr0hYNgZJb9S8lVEZepuUrG7EBk"
         },
         {
            "kid":"4",
            "kty":"EC",
            "crv":"P-256",
            "x":"5ujWNIjY7alftW-k-DrXPl-e2ZKFkuu9H2l9sVwHmk4",
            "y":"d0OhNeik3XLy-hd0LByWAfg97rnf6rFsQSCbFiPDHGA"
         }
      ]
   }
}
```

実際に何が行われているかを確認したいので、 `registration_helper.py ` の中を覗いてみます。

1. generate_signer_certificate()
  * ここでは、ECDSAの鍵を作成し、それを使って、 x.509の自己署名証明書を作成しています。Common NameとしてAWS IoT から取得した、registration code を入れています。（Edukitが採用している Microchip ATECC608 Trust&GO の仕組みでは、必ずしも Common Name に registration code を入れる必要が無いきがします…　量産時にはMicrochipから各ATECC608のManifestを取得可能です）とはいえ変える必要も無いのでそのままにしておきます。

2. esp_hs.generate_manifest_file(esp, args, init_mfg)
 * 予め書き込まれているデバイス証明書を取得して、device_cert.pemとして保存しているようです。
 * デバイスを登録するためのManifestを作成し、その中に、上記のデバイス証明書も含まれています。
 * このコードが呼ばれています。 https://github.com/espressif/esp-cryptoauthlib/blob/master/esp_cryptoauth_utility/helper_scripts/manifest.py#L108

3. upload_manifest()
  * 上記で作成したManifestの情報をもとに、AWS IoTに証明書の登録およびPolicyのアタッチ、Thingの作成とアタッチあたりを行っています。
  * このコードが呼ばれています：
    * https://github.com/MicrochipTech/cryptoauth_trustplatform_designsuite/blob/ab3ac33d0d69373b2cf4f89211e2df56e9071407/TrustnGO/05_cloud_connect/notebook/aws/Microchip_manifest_handler.py#L220

実際に、AWS IoTのマネコンで上記の設定が反映されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/68881bb2-6040-1df4-1493-fefd6fe92d21.png)


# 3. Smart Thermostat

このセクションに限りませんが、様々なドライバーが実装済みなので、色々遊べそうです。LicenseはApache2.0なので、この部品そのまま使える場合はソフト屋さんは楽かも…

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/102681/8ab1f944-0571-f511-918f-1156615562b7.png)

`xTaskCreatePinnedToCore` という関数でTaskを作っています。FreeRTOSのxTaskCreateと似ていますが、引数でコアが指定できるようになっています。タスクごとに異なるCoreを使って処理を効率化することもできそうです。
https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/freertos-smp.html

Trust&Goの証明書は、ここでセットされているようです。Portingレイヤーで処理されているので、アプリ開発時に気にすることが少なくなっています。

```c:port/network_mbedtls_wrapper.c
            ESP_LOGI(TAG, "Attempting to use device certificate from ATECC608");
            ret = atca_mbedtls_cert_add(&(tlsDataParams->clicert), cert_def);
```

その他のHSMを使用した場合の差分は、このDefineをGrepして見ていくと分かりそうです。

```c
#ifdef CONFIG_AWS_IOT_USE_HARDWARE_SECURE_ELEMENT
```

以降は後ほど…