NXP SE050検証(ESP32へのポーティング編)(Porting NXP SE050 to ESP32)

#はじめに#
2019/12/14に開かれた　IoTSecJPにてお時間をいただき
[セキュアエレメントとIoTデバイスセキュリティ](https://www.slideshare.net/KentaroMitsuyasu1/secure-element-for-iot-device)
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。

#ESP32での動作検討#
SE050はNXP社のプロセッサー、マイコンで動作させるためのドキュメントがそろっている。
[SE050 Documentation内のQuick Start Guide](https://www.nxp.com/products/security-and-authentication/authentication/edgelock-se050-plug-trust-secure-element-family-enhanced-iot-security-with-maximum-flexibility:SE050?tab=Documentation_Tab)には、
ARM Cortex-M4Fコアを採用したマイコンボード「FRDM-K64F」
ARM Cortex-M33コアを採用した「LPC55S69」
ARM Cortex-M7コアを採用した「i.MXRT1050」
ARM Cortex-A7コアを採用した「i.MXUltraLight」
Raspberry Piでの動作の事例もある。
これ以外のマイコンは基本的にポーティングが必要となる。

ポーティングの情報は、[SE050 Plug & Trust middleware porting guidelines](https://www.nxp.com/docs/en/application-note/AN12488-SE050_middleware_porting_guidelines.pdf)を確認する。

それによると、以下のレイヤーで構成されているうち、I2C_Platform部分のポーティングが必要とのこと。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/387653/27248d28-67c5-c196-03c2-eaf9286324d4.png)

上記から、ESP32向けにHALを実装するためには最低限
I2C、タイマー部分を実装する必要がある。

I2Cで定義が必要な関数は、i2c_a7.hにある定義のうち、

i2c_error_t axI2CInit( void );　I2C初期化

void axI2CTerm(int mode);　I2C開放

i2c_error_t axI2CWrite(unsigned char bus, unsigned char addr, unsigned char * pTx, unsigned short txLen);
I2C書き込み

i2c_error_t axI2CRead(unsigned char bus, unsigned char addr, unsigned char * pRx, unsigned short rxLen);
I2C読み込み

上記の4つ。



タイマーは、sm_timer.h内の

uint32_t sm_initSleep(void);
タイマー初期化

void sm_sleep(uint32_t msec);
msecスリープ

void sm_usleep(uint32_t microsec);
マイクロsecスリープ

上記の3つ。

I2Cは、ESP32のi2c_master　コマンドで実装。
タイマーは、msecはFreeRTOSのvTaskDelay、
マイクロsecはESP32のets_delay_us(microsec)を実装。

ポーティングを実装して、テストプログラムを走らせてみる。

#テストプログラム#
[Quick start guide with Raspberry Pi](https://www.nxp.com/docs/en/application-note/AN12570.pdf)で行われている流れを参考にしながら、テストプログラムのse05x_Get_Infoを実行してみる。
ソースコードを参考までに[github](https://github.com/kmwebnet/NXP-SE050-Test-Get-Info)にて公開。

```
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:6300
load:0x40078000,len:10112
load:0x40080400,len:6492
entry 0x40080750
I (29) boot: ESP-IDF 3.30300.190916 2nd stage bootloader
I (29) boot: compile time 08:53:35
I (29) boot: Enabling RNG early entropy source...
I (34) boot: SPI Speed      : 40MHz
I (38) boot: SPI Mode       : DIO
I (42) boot: SPI Flash Size : 4MB
I (46) boot: Partition Table:
I (50) boot: ## Label            Usage          Type ST Offset   Length
I (57) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (65) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (72) boot:  2 factory          factory app      00 00 00010000 00100000
I (80) boot: End of partition table
I (84) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x0c214 ( 49684) map
I (109) esp_image: segment 1: paddr=0x0001c23c vaddr=0x3ffbdb60 size=0x01ee8 (  7912) load
I (113) esp_image: segment 2: paddr=0x0001e12c vaddr=0x40080000 size=0x00400 (  1024) load
I (117) esp_image: segment 3: paddr=0x0001e534 vaddr=0x40080400 size=0x01adc (  6876) load
I (128) esp_image: segment 4: paddr=0x00020018 vaddr=0x400d0018 size=0x1a5c0 (107968) map
I (170) esp_image: segment 5: paddr=0x0003a5e0 vaddr=0x40081edc size=0x06af0 ( 27376) load
I (186) boot: Loaded app from partition at offset 0x10000
I (187) boot: Disabling RNG early entropy source...
I (187) cpu_start: Pro cpu up.
I (191) cpu_start: Application information:
I (195) cpu_start: App version:      1.0.0
I (200) cpu_start: Compile time:     Feb 10 2020 08:53:41
I (206) cpu_start: ELF file SHA256:  0000000000000000...
I (212) cpu_start: ESP-IDF:          3.30300.190916
I (218) cpu_start: Starting app cpu, entry point is 0x40081b50
I (0) cpu_start: App cpu up.
I (228) heap_init: Initializing. RAM available for dynamic allocation:
I (235) heap_init: At 3FFAE6E0 len 0000F480 (61 KiB): DRAM
I (241) heap_init: At 3FFC1608 len 0001E9F8 (122 KiB): DRAM
I (248) heap_init: At 3FFE0440 len 00003AE0 (14 KiB): D/IRAM
I (254) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (260) heap_init: At 400889CC len 00017634 (93 KiB): IRAM
I (267) cpu_start: Pro cpu start user code
I (285) cpu_start: Chip Revision: 1
W (285) cpu_start: Chip revision is higher than the one configured in menuconfig. Suggest to upgrade it.
I (289) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
       App:INFO :PlugAndTrust_v02.12.00_20191122
       App:INFO :If you want to over-ride the selection, use ENV=EX_SSS_BOOT_SSS_PORT or pass in command line arguments.
       sss:INFO :atr (Len=35)
      00 A0 00 00    03 96 04 03    E8 00 FE 02    0B 03 E8 08
      01 00 00 00    00 64 00 00    0A 4A 43 4F    50 34 20 41
      54 50 4F
       sss:WARN :Communication channel is Plain.
       sss:WARN :!!!Not recommended for production use.!!!
       App:WARN :#####################################################
       App:INFO :uid (Len=18)
      04 00 50 01    XX XX XX XX    XX XX XX XX    XX XX XX XX
      XX XX
       App:WARN :#####################################################
       App:INFO :Applet Major = 3
       App:INFO :Applet Minor = 1
       App:INFO :Applet patch = 0
       App:INFO :AppletConfig = 6FFF
       App:INFO :With    ECDAA
       App:INFO :With    ECDSA_ECDH_ECDHE
       App:INFO :With    EDDSA
       App:INFO :With    DH_MONT
       App:INFO :With    HMAC
       App:INFO :With    RSA_PLAIN
       App:INFO :With    RSA_CRT
       App:INFO :With    AES
       App:INFO :With    DES
       App:INFO :With    PBKDF
       App:INFO :With    TLS
       App:INFO :With    MIFARE
       App:INFO :With    I2CM
       App:INFO :SecureBox = 010B
       App:WARN :#####################################################
       App:INFO :Tag value - proprietary data 0xFE = 0xFE
       App:INFO :Length of following data 0x45 = 0x45
       App:INFO :Tag card identification data (Len=2)
      DF 28
       App:INFO :Length of card identification data 0x46 = 0x42
       App:INFO :Tag configuration ID 0x01 = 0x01
       App:INFO :Length configuration ID 0x0C = 0x0C
       App:INFO :Configuration ID (Len=12)
      00 02 A2 00    79 86 75 49    DC 85 18 48
       App:INFO :OEF ID (Len=2)
      A2 00
       App:INFO :Tag patch ID 0x02 = 0x02
       App:INFO :Length patch ID 0x08 = 0x08
       App:INFO :Patch ID (Len=8)
      00 00 00 00    00 00 00 01
       App:INFO :Tag platform build ID1 0x03 = 0x03
       App:INFO :Length platform build ID 0x18 = 0x18
       App:INFO :Platform build ID (Len=24)
      4A 33 52 33    35 31 30 32    31 45 45 45    30 34 30 30
      BC 03 04 79    33 8D 18 10
       App:INFO :JCOP Platform ID = J3RXXXXXXEEE0400
       App:INFO :Tag FIPS mode 0x05 = 0x05
       App:INFO :Length FIPS mode 0x01 = 0x01
       App:INFO :FIPS mode var = 0x00
       App:INFO :Tag pre-perso state 0x07 = 0x07
       App:INFO :Length pre-perso state 0x01 = 0x01
       App:INFO :Bit mask of pre-perso state var = 0x00
       App:INFO :Tag ROM ID 0x08 = 0x08
       App:INFO :Length ROM ID 0x08 = 0x08
       App:INFO :ROM ID (Len=8)
      2E 5A D8 84    09 C9 BA DB
       App:INFO :Status Word (SW) (Len=2)
      90 00
       App:INFO :ex_sss Finished
```
問題なく動作した。