#はじめに#
2019/12/14に開かれた IoTSecJPにてお時間をいただき
セキュアエレメントとIoTデバイスセキュリティ
と題してお話させていただきました。
その内容をベースにまとめていきたいと思います。
#ESP32での動作検討#
SE050はNXP社のプロセッサー、マイコンで動作させるためのドキュメントがそろっている。
SE050 Documentation内のQuick Start Guideには、
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を確認する。
それによると、以下のレイヤーで構成されているうち、I2C_Platform部分のポーティングが必要とのこと。
上記から、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で行われている流れを参考にしながら、テストプログラムのse05x_Get_Infoを実行してみる。
ソースコードを参考までにgithubにて公開。
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
問題なく動作した。