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の環境がインストール済みだったため、変な依存関係が生まれないように念のため退避しておきます。

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

install.sh の実行で dirname: illegal option -- b のエラーが出たため、install.shを修正。
こちらを参考に、以下のように -- を $0の前に追加。

export IDF_PATH=$(cd $(dirname -- $0); pwd)
#(中略)
basedir="$(dirname -- $0)"

ターミナルを再起動する必要が出た場合は、再度、

conda activate edukit

する必要があります。


python registration_helper.py -p <<DEVICE_PORT>>

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

{
   "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)

  3. upload_manifest()

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

3. Smart Thermostat

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

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

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

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して見ていくと分かりそうです。

#ifdef CONFIG_AWS_IOT_USE_HARDWARE_SECURE_ELEMENT

以降は後ほど…