You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Raw SHA-256 KDF, zeroed nonce, SRK warm-reset cache, firmware-update data lock, QSPI manipulation, unauthenticated IPC, unpatchable ELE, fault injection on memcmp, JTAG not enforced
MEDIUM
8
Chosen-ciphertext oracle, data key in SRAM, timing side-channel, no seal migration, key group exhaustion, no lifecycle transition, ELE key opacity, FW version not in IKM
LOW
2
Variable ELE timing, HAB4 hash vs full regs in wrap
Bottom line: The cryptographic primitives (AES-256-GCM, ELE enclave) are sound, but the implementation has critical flaws in key derivation (raw hash instead of HKDF, zeroed nonce), the HAB4 binding is too rigid for production firmware updates, and the M7-to-M33 IPC lacks authentication. Address all HIGH findings before production deployment.
AGREE / ACCEPT / PRODUCTION PLANNING — Split binding: only enforce HAB4 reg0 (SPL) + reg1 (bootloader). Add version field to blob header; implement seal_migrate() for v1-to-v2 transition.
#defineSEAL_BIND_ROOT_OF_TRUST_REGS 2
/* Compare only reg0+reg1 on unseal; reg2/3 logged but not enforced */
H4: SRK Cached as VolatilePermanent
AGREE / ACCEPT / IMMEDIATE — Add SRK age tracking; force re-derive after configurable timeout (e.g. 1h); clear on security violation via watchdog callback.
AGREE / ACCEPT AS DESIGN CONSTRAINT / ONGOING — Mitigate: call ELE_DeleteKey() for every ephemeral key; run ELE_SelfTest() on boot; track NXP advisories; plan HW upgrade path.
H8: JTAG Disable Not Enforced at Runtime
AGREE / ACCEPT / IMMEDIATE — Check fuse in seal_init():
uint32_tjtag_fuse=OCOTP_ReadFuseWord(OCOTP, kOCOTP_JTAG_DISABLE_INDEX);
if (!(jtag_fuse&kOCOTP_JTAG_DISABLED_MASK))
returnkStatus_SecurityViolation; /* refuse to operate */
H9: QSPI NOR Flash Accessible
AGREE / ACCEPT / PRODUCTION PLANNING — Append HMAC-SHA256 MAC to every blob; maintain replay-prevention counter in internal flash; store high-value blobs (OTA sigs, MAC keys) in internal flash only.
Covered by H6 fix (hash-then-compare replaces all HAB4 memcmp).
M4: Key Group Exhaustion — AGREE / ACCEPT / IMMEDIATE
Call ELE_DeleteKey() for every ephemeral data key after seal/unseal; monitor key count, warn at 90/100.
M5: No Seal Versioning/Migration — AGREE / ACCEPT / PRODUCTION
Covered by H3 fix (version field + seal_migrate() API).
M6: No Graceful Lifecycle Transition — AGREE / ACCEPT / PRODUCTION
Use kKeylifecycle_Closed_Locked; add seal_prepare_lifecycle_transition() to migrate data before lifecycle change.
M7: ELE FW Version / Silicon Rev Not in IKM — AGREE / ACCEPT / IMMEDIATE
Covered by H1 fix (extend IKM to include silicon_rev || firmware_version).
M8: Opaque Key Material — AGREE / ACCEPT AS DESIGN CONSTRAINT / ONGOING
Run ELE_SelfTest() on boot; verify attestation signatures; monitor NXP advisories.
LOW SEVERITY
L1: Variable ELE Timing — AGREE / ACCEPT AS DESIGN CONSTRAINT
Add fixed delay padding to equalize paths; document in threat model. Low priority.
L2: HAB4 Hash vs Full Regs in Wrap — AGREE / ACCEPT AS DESIGN CONSTRAINT
AEAD AAD already covers full 128B HAB4 registers. Hash in wrap payload is secondary. No action needed.
Summary
Priority
Findings
Count
IMMEDIATE
H1,H2,H4,H5,H6 + M1,M2,M3,M4,M7
10
PRODUCTION PLANNING
H3,H9 + M5,M6
4
DESIGN CONSTRAINT
H7,M8,L1,L2
4
Bottom line: All 9 HIGH findings are valid. 8 fixable via code changes; 1 (ELE firmware) accepted as HW constraint. Immediate fixes have no blockers. Split binding (H3) requires migration tooling for production.
RT1180 Sealing Architecture — SGX-Style Data Sealing for Embedded MCU
Overview
Sealing architecture for the NXP i.MX RT1180 (M33 Secure / M7 Non-Secure, EdgeLock Enclave v0.1.1, HAB4) that binds persistent data encryption keys to HAB4 boot measurements + ELE device identity. Sealed data decrypts only on the exact device with the exact boot chain; any boot image change permanently locks the data.
1. Key Derivation Hierarchy
ELE Internal Root (NRK) — never leaves ELE ROM
│
ELE_DeriveKey(kKeyType_DERIVE, context)
context = HAB4_reg0‖reg1‖reg2‖reg3‖attest_resp‖purpose
│
Seal Root Key (SRK) — AES-256, PersistentPermanent,
usage: Encrypt|Decrypt|Derive
│
Data Keys — AES-128/256, Volatile, from SRK + store_id
SRK derivation uses ELE_DeriveKey() with kKeyType_DERIVE (256-bit). Context concatenates all four HAB4 measurement registers (128 B), attestation response (272 B), a policy version constant, and "RT1180_SEAL" purpose string. Data keys are transient — never leave ELE.
2. Sealing Flow
Seal (Write)
M33 calls HAB4_GetStatus() — must return success, else abort.
Hosts Sealing Service; owns SRK derivation, all ELE calls
ELE (via S3MU)
All crypto: derive, encrypt, decrypt, attestation. Keys never leave ELE.
M7 Non-Secure
Sends SEAL_REQ/UNSEAL_REQ via S3MU IPC. Never touches keys/plaintext.
S3MU IPC
Trusted mailbox. M33 serializes requests to prevent key-derivation races.
SRK cached as VolatilePermanent — re-derived only on cold boot.
4. Sealed Data and Storage
Data Type
Example
Size
Storage
Device config
WiFi creds, calibration
128–2 KB
QSPI flash
Secure elements
OTA sigs, MAC keys
256 B
Internal flash
User profiles
Encrypted prefs
Up to 16 KB
External NVM
Blob format:
┌─ Header (288 B): policy_ver(4) ‖ nonce(16) ‖ attest_resp(272)
├─ AAD (128 B): HAB4 reg0–3 (32 B each)
└─ Ciphertext + IV + MAC (variable, AES-CCM/GCM)
5. Lifecycle Considerations
Lifecycle
Seal
Unseal
OEM Open
✅
✅ — keys with kKeylifecycle_Open
OEM Closed
✅
✅ — keys need kKeylifecycle_Closed flag
Field Return
❌
❌ — ELE keystore inaccessible
Best practice: generate SRK with kKeylifecycle_Closed_Locked for cross-lifecycle compatibility, then lock the keystore group.
6. JTAG Disable
JTAG can expose SRK in SRAM or trigger arbitrary ELE ops. Protection:
Fuse JTAG_DIS before production lifecycle — permanent debug disable.
Secure debug authentication — only authorized certificates can halt core.
CAAM security violation — ELE FW sets Sec_vio0 on JTAG connection, preventing key release.
Fuse JTAG disable during EL2GO provisioning, before sealing production data.
7. EL2GO Provisioning Integration
SRKH burn: OEM SRKH burned into OCOTP fuses via EL2GO self-signed TLV blob.
KEK import: Pre-shared KEKs imported via ELE_ImportKey() using EL2GO-signed TLV.
Encrypted data storage: ELE FW v1.1.0 RT1180 B0 supports EL2GO encrypted data storage API.
Sequence: EL2GO SRKH → EL2GO KEK → Seal Service init → First seal
EL2GO ensures only authorized OEM partners provision keys.
8. Error Handling
Error
Source
Response
HAB4 fail
Boot measurement
Abort immediately
AAD mismatch
Boot chain changed
Return error; log violation
Attest fail
ELE HW fault
Retry once; disable if persistent
SRK derive fail
Corrupted context
Fatal — halt sealing
AEAD decrypt fail
Tampered blob
Return zeroed buffer
Key group full
>100 keys
Return error; implement rotation
Lifecycle mismatch
Key/device lifecycle
Return error
After 5 consecutive unseal failures, trigger secure watchdog reset.
9. Performance
Operation
Time
ELE_Attest()
~2–5 ms
ELE_DeriveKey() (SRK)
~1–3 ms
AES-CCM encrypt/decrypt (1 KB)
~0.5–1 ms
Full seal (cold SRK)
~5–10 ms
Full unseal (cold SRK)
~5–10 ms
Repeated seal/unseal (cached SRK)
~1–2 ms
SRK caching as VolatilePermanent eliminates attestation/derivation overhead after first call. ELE key group caching (FW v0.0.10+) further accelerates repeated ops.
v1.0 — ELE Crypto API v2.10.0, ELE FW v0.1.1 (RT1180 B0), HAB4, MCUX SDK.