บทเรียน 5.3 — PSoC Edge E84 กับ OPTIGA™ Trust M: กุญแจที่ไม่ออกจากชิป

PSoC Edge E84 กับ OPTIGA™ Trust M: กุญแจที่ไม่ออกจากชิป

Eva Kit (PSoC Edge E84 Eval) · PSoC Edge E84 · ภาษา C

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เป้าหมาย

เมื่อจบบทเรียนนี้ คุณจะ

  1. อธิบาย workflow การ provision อุปกรณ์ที่สร้างและเก็บ private key ใน OPTIGA Trust M
  2. เชื่อมต่อ MQTT over TLS ด้วย certificate ที่เก็บใน OPTIGA ตามตัวอย่าง
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนเริ่ม

  • ผ่านบทเรียนก่อนหน้ามาแล้ว: fw-stack.m02.l07
  • บอร์ด: Eva Kit (PSoC Edge E84 Eval)
  • แพลตฟอร์ม: PSoC Edge E84
  • เวลาโดยประมาณ: เนื้อหา 15 + แล็บ 45 + เช็กความเข้าใจ 5 = 65 นาที
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ดูของจริงก่อน

รันบนบอร์ด PSoC Edge E84 พร้อม OPTIGA™ Trust M (โปรเจกต์นี้มี BSP ของ Eva Kit: APP_KIT_PSE84_EVAL_EPC2)

README ของตัวอย่าง · โฟลเดอร์โค้ด · commit d2ed42c

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — OPTIGA Trust M คืออะไร

secure element แยกต่างหาก (CC EAL6+) เชื่อมผ่าน I2C — สร้างและเก็บคู่กุญแจ ECC P-256 ในตัวเอง

เฟิร์มแวร์สั่งให้ชิป "เซ็น" ได้ แต่อ่านกุญแจส่วนตัวออกมาไม่ได้เลย เพราะไม่เคยเข้า RAM ของ MCU

งานเข้ารหัสอื่นของ TLS ยังทำโดย mbedTLS บน MCU ตามปกติ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — OID: แผนที่กุญแจและใบรับรองในชิป

0xE0C2 Factory UID (อ่านอย่างเดียว) · 0xE0E0+0xE0F0 Factory cert+key

0xE0E1+0xE0F1 Device cert+key (ออกผ่าน Protected Update) · 0xE0E3 trust anchor (ROOT_CA)

ใบรับรองต้องคู่กับกุญแจที่ OID ตรงกันเสมอ ใช้ผิดคู่ = เซ็นไม่ตรงกับใบรับรองที่ยื่น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — อ่านกุญแจไม่ได้ แต่สั่งเซ็นได้

0xE0F0/0xE0F1: Read = Never, Execute = Always (เซ็นได้เสมอ)

0xE0E0: Change = Never (แก้ไม่ได้หลัง provision) · 0xE0E1: เขียนใหม่ได้

หัวใจของ hardware root of trust — debug เข้าไปอ่านหน่วยความจำก็คัดลอกกุญแจออกมาไม่ได้

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — Two-Certificate PKI และ SAFE MODE

Factory cert (0xE0E0+0xE0F0) สำหรับ bootstrap/กู้ระบบ vs Device cert (0xE0E1+0xE0F1) ใช้งานจริง

ทุกครั้งที่ boot/reset: g_force_factory_cert = true (SAFE MODE) — บังคับใช้ Factory cert ก่อนเสมอ

เหตุผล: Device cert/key อาจไม่ตรงกันหลัง reset แต่ Factory cert/key จับคู่ถูกต้องเสมอ

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ลำดับขั้นตอน Protected Update

(1) OPTIGA สร้างคู่กุญแจในชิป (ที่ 0xE0F1) → (2) สร้าง CSR ลงนามด้วยกุญแจนั้น

(3) ต่อ MQTT ด้วย Factory cert → ส่ง CSR ขึ้นแพลตฟอร์ม → (4) รับ manifest ที่ลงนามแล้วกลับมา

(5) OPTIGA ตรวจลายเซ็น manifest กับ trust anchor (0xE0E3) ก่อน แล้วจึงเขียนใบรับรองใหม่ลง 0xE0E1

private key ไม่เคยออกจากชิปตลอดกระบวนการ — มีแต่ CSR (public key) และใบรับรองที่เดินทาง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — เชื่อมต่อ MQTT ด้วยกุญแจใน OPTIGA

boot: อ่าน cert จาก OPTIGA → optiga_psa_register() + psa_crypto_init() → ผูก PSA key handle ที่ PSA_KEY_LOCATION_OPTIGA

"generate" ในที่นี้คือผูก handle เข้ากับ OID ที่มีกุญแจอยู่แล้ว ไม่ได้สร้างกุญแจใหม่

cy_tls_set_optiga_key_id() + cy_tls_set_client_cert() — TLS handshake ขั้น CertificateVerify เรียกกลับให้ OPTIGA เซ็นแฮช ไม่มีไบต์กุญแจไหลผ่าน RAM ของ MCU เลย

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

แนวคิด — ทักษะที่ฝึกในบทเรียนนี้

บทเรียนนี้พัฒนาทักษะต่อไปนี้ (ตามระดับ 1–5 ของหลักสูตร)

  • sec.secure-element (ระดับ 2)
  • sec.tls (ระดับ 3)
  • sec.fundamentals (ระดับ 2)
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ก่อนรันตัวอย่าง — ตั้งโฮสต์เป็น tesaiot.dev

mqtt_client_config.h ของตัวอย่างที่ commit นี้ยังตั้ง MQTT_BROKER_ADDRESS และ MQTT_SNI_HOSTNAME เป็นชื่อ MQTT เดิมของแพลตฟอร์มที่ลงท้ายด้วย .com
ชื่อนี้ยังใช้ได้ชั่วคราว แต่แพลตฟอร์มย้ายไปเป็น tesaiot.dev แล้ว ให้ตั้งทั้งสองค่าเป็น mqtt.tesaiot.dev (บันทึกไว้ที่ developer-hub issue #3)

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — ไล่โค้ดตามลำดับนี้

โค้ดอยู่ใน tesaiot/developer-hub · commit d2ed42c (อ้างอิงด้วยลิงก์เท่านั้น ดูหัวข้อถัดไป)

  • main.c#L491-L536 — ลำดับตอน boot: อ่าน cert, ลงทะเบียน PSA driver, ผูก TLS เข้ากับกุญแจ
  • optiga_psa_se.c#L285-L323 — optiga_psa_sign() ที่ mbedTLS เรียกระหว่าง handshake
  • optiga_trust_helpers.c#L768-L824 — trustm_gen_ecc_keypair() กับ export_private=false
  • mqtt_task.c#L824-L834 — เลือกใบรับรองแล้วสลับ OID ของกุญแจให้ตรงกัน
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ตัวอย่างสมบูรณ์ — credential และลิขสิทธิ์

ต้องมี credential ของอุปกรณ์จาก TESAIoT Platform ตามขั้นตอนใน README ห้ามนำ credential จริงขึ้น repo สาธารณะ

ตัวอย่างบน Developer Hub

โค้ดชุดนี้อยู่ภายใต้ Cypress (Infineon) EULA จึงอ้างอิงด้วยลิงก์เท่านั้น

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

จุดที่มักพลาด

  • คิดว่าโค้ดนี้ generate กุญแจใหม่ทุกครั้งที่ boot — จริงแค่ผูก PSA handle เข้ากับ OID ที่มีกุญแจอยู่แล้ว (OPTIGA_TLS_ATTACH_ONLY)
  • ใช้ใบรับรองกับกุญแจคนละ OID กัน — ต้องสลับ optiga_psa_set_signing_key_oid() ให้ตรงกับใบรับรองที่เลือกทุกครั้ง
  • คิดว่า reset แล้วจะได้ Device Certificate ทันที — ทุก reset กลับไป SAFE MODE (Factory cert) ก่อนเสมอ
  • รัน make getlibs ใหม่แล้วลืม ./apply_patches.sh — patch หายไปพร้อม library, ใช้กุญแจใน OPTIGA ไม่ได้อีก
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ฝึกเติม / แล็บ

  1. ทาย ก่อนแก้: เลือกค่าหนึ่งค่าที่ README ของตัวอย่างอธิบายไว้ในส่วน How แล้วเขียนว่าจะเห็นอะไรเปลี่ยนบนจอหรือใน log
  2. แก้และรัน build + flash แล้วเทียบกับที่ทายไว้ ถ้าไม่ตรง ให้หาว่าเข้าใจส่วนไหนผิด
  3. ทำเพิ่ม ต่อยอดหนึ่งอย่างที่ตัวอย่างยังไม่มี แล้วเก็บภาพหรือวิดีโอไว้ใน portfolio
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เช็กความเข้าใจ

  • ทำไม private key ที่อยู่ใน secure element ปลอดภัยกว่าใน flash
  • Protected Update ใช้ทำอะไรกับ certificate

คำตอบอยู่ใน README ของตัวอย่างและในโค้ด ถ้าตอบข้อใดไม่ได้ ให้กลับไปอ่านส่วน Why / What / How อีกครั้ง

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

ไปต่อ

  • ทบทวนเป้าหมายทั้ง 2 ข้อของบทเรียนนี้ก่อนไปต่อ
  • ถ้าตอบคำถามหน้าที่แล้วไม่ได้ครบ กลับไปอ่าน README ของตัวอย่างส่วน Why / What / How อีกครั้ง
  • พร้อมแล้วไปเปิดบทเรียนถัดไปในโมดูลเดียวกัน
TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0

เครดิต

"TESAIoT Firmware Stack: เฟิร์มแวร์ภาษา C บน TESAIoT Dev Kit" จาก TESA Open Knowledge โดยสมาคมสมองกลฝังตัวไทย (Thai Embedded Systems Association: TESA) https://github.com/tesaiot/tesa-qualification-program สัญญาอนุญาต CC BY-NC 4.0

ตัวอย่างโค้ดเป็นผลงานของ TESAIoT Firmware Stack โดยสมาคมสมองกลฝังตัวไทย (TESA) ใน tesaiot/developer-hub รายละเอียดการให้เครดิตอยู่ที่ ATTRIBUTION.md

TESA Open Knowledge · © 2026 สมาคมสมองกลฝังตัวไทย (TESA) · CC BY-NC 4.0