From 5b80a58953075ad1a955defb01bafb697e655384 Mon Sep 17 00:00:00 2001 From: Laukik Hase Date: Fri, 26 Sep 2025 17:24:01 +0530 Subject: [PATCH] ci(esp_tee): Enable the TEE test-apps for ESP32-C61 --- .../esp_tee/test_apps/.build-test-rules.yml | 8 +- .../esp_tee/test_apps/tee_cli_app/README.md | 4 +- .../test_apps/tee_cli_app/pytest_tee_cli.py | 2 +- .../esp_tee/test_apps/tee_test_fw/README.md | 4 +- .../esp_tee/test_apps/tee_test_fw/conftest.py | 81 ++++++++++++++----- .../tee_test_fw/pytest_esp_tee_ut.py | 22 +++-- 6 files changed, 86 insertions(+), 35 deletions(-) diff --git a/components/esp_tee/test_apps/.build-test-rules.yml b/components/esp_tee/test_apps/.build-test-rules.yml index 906c6b73c3b..081d926e83a 100644 --- a/components/esp_tee/test_apps/.build-test-rules.yml +++ b/components/esp_tee/test_apps/.build-test-rules.yml @@ -2,10 +2,10 @@ components/esp_tee/test_apps/tee_cli_app: disable: - - if: IDF_TARGET not in ["esp32c6", "esp32c5"] - reason: only supported with c6 and c5 + - if: IDF_TARGET not in ["esp32c6", "esp32c5", "esp32c61"] + reason: only supported with c6, c5 and c61 components/esp_tee/test_apps/tee_test_fw: disable: - - if: IDF_TARGET not in ["esp32c6", "esp32h2", "esp32c5"] - reason: only supported with c6, h2 and c5 + - if: IDF_TARGET not in ["esp32c6", "esp32h2", "esp32c5", "esp32c61"] + reason: only supported with c6, h2, c5 and c61 diff --git a/components/esp_tee/test_apps/tee_cli_app/README.md b/components/esp_tee/test_apps/tee_cli_app/README.md index 13b75c25d50..cc2ad5bfb21 100644 --- a/components/esp_tee/test_apps/tee_cli_app/README.md +++ b/components/esp_tee/test_apps/tee_cli_app/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C5 | ESP32-C6 | -| ----------------- | -------- | -------- | +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-C61 | +| ----------------- | -------- | -------- | --------- | # TEE CLI Application: Secure Services Demonstration diff --git a/components/esp_tee/test_apps/tee_cli_app/pytest_tee_cli.py b/components/esp_tee/test_apps/tee_cli_app/pytest_tee_cli.py index c06816cfebd..440ed5ec1ef 100644 --- a/components/esp_tee/test_apps/tee_cli_app/pytest_tee_cli.py +++ b/components/esp_tee/test_apps/tee_cli_app/pytest_tee_cli.py @@ -21,7 +21,7 @@ from ecdsa.util import sigdecode_der from pytest_embedded import Dut from pytest_embedded_idf.utils import idf_parametrize -SUPPORTED_TARGETS = ['esp32c6', 'esp32c5'] +SUPPORTED_TARGETS = ['esp32c6', 'esp32c5', 'esp32c61'] TEST_MSG = 'hello world' diff --git a/components/esp_tee/test_apps/tee_test_fw/README.md b/components/esp_tee/test_apps/tee_test_fw/README.md index 1488da3165a..cb7b6f84890 100644 --- a/components/esp_tee/test_apps/tee_test_fw/README.md +++ b/components/esp_tee/test_apps/tee_test_fw/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-H2 | -| ----------------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | +| ----------------- | -------- | -------- | --------- | -------- | ## ESP-TEE: Test Suite diff --git a/components/esp_tee/test_apps/tee_test_fw/conftest.py b/components/esp_tee/test_apps/tee_test_fw/conftest.py index 8b365947b50..a7d8d713b55 100644 --- a/components/esp_tee/test_apps/tee_test_fw/conftest.py +++ b/components/esp_tee/test_apps/tee_test_fw/conftest.py @@ -28,11 +28,12 @@ esp_tee_empty_bin = { 0x20, 0x00, 0x00, 0x42, 0x00, 0x02, 0x00, 0x00, # esp_app_desc structure 0x32, 0x54, 0xCD, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x30, 0x2E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x73, 0x70, 0x5F, 0x74, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x76, 0x20, 0x31, 0x31, 0x20, 0x32, 0x30, 0x32, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, @@ -41,7 +42,7 @@ esp_tee_empty_bin = { 0x00, 0x00, 0x00, 0x00, 0x2D, 0x63, 0x66, 0x8B, 0x75, 0xFA, 0x59, 0x05, 0x53, 0x34, 0x91, 0x71, 0x51, 0x33, 0x91, 0xDD, 0xF8, 0xB1, 0xFE, 0x83, 0x06, 0xEB, 0x03, 0x80, 0x45, 0xC9, 0x18, 0x20, 0x83, 0x7E, 0x2E, 0x43, - *([0x00] * 0x58), + *([0x00] * 0x50), # Padding *([0x00] * 0x100), # IRAM segment @@ -56,11 +57,11 @@ esp_tee_empty_bin = { # Padding *([0x00] * 0x0F), # CRC8 checksum - 0x56, + 0x3F, # Image SHA256 - 0xF4, 0xA4, 0xCF, 0x06, 0xAE, 0x94, 0x75, 0x47, 0xBC, 0x88, 0xA2, 0xCA, - 0x52, 0x97, 0x7A, 0x5C, 0x55, 0x43, 0xD9, 0xF5, 0xD3, 0x45, 0xD1, 0x34, - 0xFC, 0x74, 0xB2, 0xB9, 0x34, 0x72, 0xC3, 0x00 + 0x2B, 0xF4, 0x49, 0x65, 0x93, 0xDD, 0xA6, 0x65, 0xE4, 0x31, 0xEA, 0xC5, + 0x42, 0x40, 0xA0, 0x96, 0x8B, 0x70, 0x48, 0xFE, 0xD9, 0x7E, 0x6F, 0x21, + 0x0B, 0xC1, 0xA5, 0xD4, 0x43, 0x87, 0x52, 0x2A ], 'esp32h2': [ 0xE9, 0x04, 0x02, 0x1F, 0x00, 0x00, 0x80, 0x40, 0xEE, 0x00, 0x00, 0x00, @@ -69,11 +70,12 @@ esp_tee_empty_bin = { 0x20, 0x00, 0x00, 0x42, 0x00, 0x02, 0x00, 0x00, # esp_app_desc structure 0x32, 0x54, 0xCD, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x30, 0x2E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x73, 0x70, 0x5F, 0x74, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x76, 0x20, 0x31, 0x31, 0x20, 0x32, 0x30, 0x32, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, @@ -82,7 +84,7 @@ esp_tee_empty_bin = { 0x00, 0x00, 0x00, 0x00, 0x2D, 0x63, 0x66, 0x8B, 0x75, 0xFA, 0x59, 0x05, 0x53, 0x34, 0x91, 0x71, 0x51, 0x33, 0x91, 0xDD, 0xF8, 0xB1, 0xFE, 0x83, 0x06, 0xEB, 0x03, 0x80, 0x45, 0xC9, 0x18, 0x20, 0x83, 0x7E, 0x2E, 0x43, - *([0x00] * 0x58), + *([0x00] * 0x50), # Padding *([0x00] * 0x100), # IRAM segment @@ -97,11 +99,11 @@ esp_tee_empty_bin = { # Padding *([0x00] * 0x0F), # CRC8 checksum - 0x56, + 0x3F, # Image SHA256 - 0xDC, 0x60, 0x86, 0x6C, 0x37, 0x76, 0xAA, 0x30, 0x1F, 0x61, 0x48, 0x23, - 0xEA, 0x34, 0xAA, 0x19, 0xE8, 0xDE, 0x04, 0x7D, 0x2A, 0x30, 0xC1, 0xDD, - 0x61, 0x38, 0x9D, 0xB5, 0xCA, 0x13, 0x5A, 0x79 + 0x9B, 0x83, 0x45, 0x5A, 0xCD, 0x07, 0xC2, 0x4D, 0x54, 0x29, 0xA9, 0x2B, + 0xA3, 0xB0, 0xFA, 0x97, 0x62, 0x95, 0xDA, 0x5C, 0xAD, 0xEF, 0xAC, 0x9D, + 0xB6, 0xF7, 0x09, 0x95, 0xC2, 0x33, 0x8E, 0x36 ], 'esp32c5': [ 0xE9, 0x04, 0x02, 0x1F, 0x00, 0x00, 0x80, 0x40, 0xEE, 0x00, 0x00, 0x00, @@ -110,11 +112,12 @@ esp_tee_empty_bin = { 0x20, 0x00, 0x00, 0x42, 0x00, 0x02, 0x00, 0x00, # esp_app_desc structure 0x32, 0x54, 0xCD, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x30, 0x2E, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x73, 0x70, 0x5F, 0x74, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x76, 0x20, 0x31, 0x31, 0x20, 0x32, 0x30, 0x32, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, @@ -123,7 +126,7 @@ esp_tee_empty_bin = { 0x00, 0x00, 0x00, 0x00, 0x2D, 0x63, 0x66, 0x8B, 0x75, 0xFA, 0x59, 0x05, 0x53, 0x34, 0x91, 0x71, 0x51, 0x33, 0x91, 0xDD, 0xF8, 0xB1, 0xFE, 0x83, 0x06, 0xEB, 0x03, 0x80, 0x45, 0xC9, 0x18, 0x20, 0x83, 0x7E, 0x2E, 0x43, - *([0x00] * 0x58), + *([0x00] * 0x50), # Padding *([0x00] * 0x100), # IRAM segment @@ -138,11 +141,53 @@ esp_tee_empty_bin = { # Padding *([0x00] * 0x0F), # CRC8 checksum - 0x56, + 0x3F, # Image SHA256 - 0xCD, 0xCC, 0xF2, 0xE3, 0x52, 0x76, 0xE5, 0x6D, 0xF6, 0x32, 0x95, 0x27, - 0x5F, 0xF3, 0xD8, 0x90, 0xD7, 0x95, 0xA0, 0x95, 0xD5, 0xDA, 0xE7, 0xA4, - 0x58, 0x08, 0x84, 0xBB, 0x8F, 0x29, 0xAB, 0xE4 + 0x1C, 0x25, 0x32, 0xD0, 0x99, 0xBD, 0xA4, 0xE8, 0x20, 0x8E, 0x43, 0x61, + 0xDA, 0xCD, 0x47, 0x3B, 0x2A, 0x1C, 0xCE, 0x38, 0x0F, 0x74, 0xA5, 0x7E, + 0xAA, 0x05, 0xA3, 0x8F, 0x6A, 0x22, 0xAE, 0x0B + ], + 'esp32c61': [ + 0xE9, 0x04, 0x02, 0x1F, 0x00, 0x00, 0x80, 0x40, 0xEE, 0x00, 0x00, 0x00, + 0x14, 0x00, 0x00, 0x64, 0x00, 0xC7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + # DROM segment + 0x20, 0x00, 0x00, 0x42, 0x00, 0x02, 0x00, 0x00, + # esp_app_desc structure + 0x32, 0x54, 0xCD, 0xAB, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x31, 0x2E, 0x30, 0x2E, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x73, 0x70, 0x5F, 0x74, 0x65, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x30, 0x3A, 0x30, 0x30, 0x3A, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4E, 0x6F, 0x76, 0x20, 0x31, 0x31, 0x20, 0x32, + 0x30, 0x32, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x35, 0x2E, 0x35, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2D, 0x63, 0x66, 0x8B, 0x75, 0xFA, 0x59, 0x05, + 0x53, 0x34, 0x91, 0x71, 0x51, 0x33, 0x91, 0xDD, 0xF8, 0xB1, 0xFE, 0x83, + 0x06, 0xEB, 0x03, 0x80, 0x45, 0xC9, 0x18, 0x20, 0x83, 0x7E, 0x2E, 0x43, + *([0x00] * 0x50), + # Padding + *([0x00] * 0x100), + # IRAM segment + 0x00, 0x00, 0x80, 0x40, 0x20, 0x00, 0x00, 0x00, + *([0x00] * 0x20), + # PADDING segment + 0x00, 0x00, 0x00, 0x00, 0xC8, 0x7D, 0x00, 0x00, + *([0x00] * 0x7DC8), + # IROM segment + 0x20, 0x80, 0x00, 0x42, 0x00, 0x01, 0x00, 0x00, + *([0x00] * 0x100), + # Padding + *([0x00] * 0x0F), + # CRC8 checksum + 0x3F, + # Image SHA256 + 0x3F, 0xD4, 0x9C, 0xF4, 0xBC, 0x38, 0xA3, 0x6A, 0xB9, 0xCA, 0x09, 0x3A, + 0x79, 0xFD, 0x9C, 0x20, 0xE2, 0x74, 0x89, 0xA5, 0x04, 0xAD, 0x7C, 0x45, + 0xB7, 0xB7, 0x56, 0xCD, 0x55, 0x8F, 0xD5, 0x6D ], } # fmt: on diff --git a/components/esp_tee/test_apps/tee_test_fw/pytest_esp_tee_ut.py b/components/esp_tee/test_apps/tee_test_fw/pytest_esp_tee_ut.py index 379b626b5be..71b48221646 100644 --- a/components/esp_tee/test_apps/tee_test_fw/pytest_esp_tee_ut.py +++ b/components/esp_tee/test_apps/tee_test_fw/pytest_esp_tee_ut.py @@ -9,7 +9,7 @@ from pytest_embedded_idf.utils import idf_parametrize # ---------------- Pytest build parameters ---------------- -SUPPORTED_TARGETS = ['esp32c6', 'esp32h2', 'esp32c5'] +SUPPORTED_TARGETS = ['esp32c6', 'esp32h2', 'esp32c5', 'esp32c61'] CONFIG_DEFAULT = [ # 'config, target, markers', @@ -53,7 +53,7 @@ REE_ISOLATION_TEST_EXC_RSN: dict[str, str] = { ('MMU-spillover'): 'Cache error', } -TEE_APM_VIOLATION_EXC_CHK = ['eFuse', 'MMU', 'AES', 'HMAC', 'DS', 'SHA PCR', 'ECC PCR', 'SWDT/BOD'] +TEE_APM_VIOLATION_EXC_CHK = ['eFuse', 'MMU', 'SWDT/BOD', 'AES', 'HMAC', 'DS', 'SHA PCR', 'ECC PCR'] # ---------------- TEE default tests ---------------- @@ -74,6 +74,8 @@ def test_esp_tee(dut: IdfDut) -> None: indirect=['config', 'target'], ) def test_esp_tee_crypto_aes(dut: IdfDut) -> None: + if dut.target == 'esp32c61': + pytest.skip(f'AES not supported on {dut.target}') dut.run_all_single_board_cases(group='aes') dut.run_all_single_board_cases(group='aes-gcm') @@ -95,7 +97,8 @@ def test_esp_tee_crypto_sha(dut: IdfDut) -> None: indirect=['config', 'target'], ) def test_esp_tee_aes_perf(dut: IdfDut) -> None: - # start test + if dut.target == 'esp32c61': + pytest.skip(f'AES not supported on {dut.target}') for i in range(24): dut.run_all_single_board_cases(name=['mbedtls AES performance']) @@ -110,10 +113,12 @@ def test_esp_tee_aes_perf(dut: IdfDut) -> None: ) def test_esp_tee_apm_violation(dut: IdfDut) -> None: for check in TEE_APM_VIOLATION_EXC_CHK: + if dut.target == 'esp32c61' and check in ('AES', 'HMAC', 'DS'): + continue dut.expect_exact('Press ENTER to see the list of tests') dut.write(f'"Test APM violation: {check}"') exc = dut.expect(r'Core ([01]) panic\'ed \(([^)]+)\)', timeout=30).group(2).decode() - if dut.target == 'esp32c5' or (dut.target == 'esp32h2' and check == 'eFuse'): + if dut.target in ('esp32c5', 'esp32c61') or (dut.target == 'esp32h2' and check == 'eFuse'): exp_str = 'APM - Space exception' elif check == 'SWDT/BOD': exp_str = 'Store access fault' @@ -144,8 +149,9 @@ def test_esp_tee_illegal_instruction(dut: IdfDut) -> None: def test_esp_tee_violation_checks(dut: IdfDut) -> None: checks_list = TEE_VIOLATION_TEST_EXC_RSN for test, expected_exc in checks_list.items(): - if expected_exc is None or dut.target == 'esp32c5': - # TODO: Enable when TEE SRAM is partitioned as IRAM (RX) and DRAM (RW) + # NOTE: For ESP32-C5, access to the region before the SRAM does + # not generate exceptions due to TEE PMA configuration + if expected_exc is None or (dut.target == 'esp32c5' and test == 'IRAM-W1'): continue dut.expect_exact('Press ENTER to see the list of tests') dut.write(f'"Test TEE-TEE violation: {test}"') @@ -166,8 +172,8 @@ def test_esp_tee_isolation_checks(dut: IdfDut) -> None: continue dut.expect_exact('Press ENTER to see the list of tests') dut.write(f'"Test REE-TEE isolation: {test}"') - # NOTE: For ESP32-C5, the MMU-spillover test fails gracefully without raising panic - if dut.target == 'esp32c5' and test == 'MMU-spillover': + # NOTE: For ESP32-C5 and C61, the MMU-spillover test fails gracefully without raising panic + if dut.target in {'esp32c5', 'esp32c61'} and test == 'MMU-spillover': dut.expect_exact('Failed MMU operation, rebooting!') continue else: