|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
หกใน 18 ฟังก์ชันของ tesaiot_hsm ถูกประกาศเป็น weak โดยผู้เรียกทุกรายที่มีอยู่จริงในของที่ส่งมอบ และ ต้องตรวจ NULL ก่อนเรียกเสมอ บทนี้อธิบายว่าเหตุใดจึงเป็นเช่นนั้น ENABLE_OPTIGA_CLM ควบคุมอะไร archive เรียกร้องอะไร จาก ผู้ใช้ไลบรารี (consumer_must_provide.txt) และจะเห็นข้อผูกพันนี้บังคับใช้ตัวเองได้อย่างไรด้วยการ build โดยปิด CLM
proj_cm33_ns/Makefile:143-161:
และที่ :464-475: libbento_hsm.a อยู่บน LDLIBS โดยไม่มีเงื่อนไข — "an archive member is pulled only when something already references it, so with `ENABLE_OPTIGA_CLM` off nothing is extracted." เมื่อปิดแฟล็กนี้ ตัว ingest จะไม่ถูกคอมไพล์ ไม่มีอะไรอ้างถึงสมาชิกฝั่ง MQTT ของ archive และ symbol ทั้ง 6 ตัวด้านล่างจึงไม่มีอยู่ในการลิงก์เลย ผู้เรียกที่มีอยู่จริงในของที่ส่งมอบยังคอมไพล์ผ่านเพราะประกาศ symbol เหล่านั้นเป็น weak
dist/tesaiot_hsm/overridable.txt ว่างเปล่า ไม่มีอะไรใน archive ที่เป็น weak ความเป็น weak อยู่ที่ ฝั่งผู้ใช้ไลบรารี: ผู้เรียกที่มีอยู่จริงในของที่ส่งมอบประกาศทั้ง 6 ตัวนี้เป็น __attribute__((weak)) เพื่อให้ build ที่ไม่มีเส้นทางการลงทะเบียนผ่าน MQTT ยังลิงก์ผ่าน:
| Symbol | ประกาศ weak ที่ | จุดเรียกที่มีตัวกัน |
|---|---|---|
| publish_csr | ipc_hsm_handler.c:1691-1693 | ipc_hsm_handler.c if (publish_csr == NULL) |
| tesaiot_publish_protected_update | ipc_hsm_handler.c:1687-1689; modtesaiot.c | มีตัวกันทั้งสองที่ |
| trustm_reset_state | ipc_hsm_handler.c:1715 | if (trustm_reset_state != NULL) |
| trustm_current_correlation_id | ipc_hsm_handler.c:1721 | ตรวจ NULL 2 ชั้น — พอยน์เตอร์ก่อน แล้วจึงค่าที่คืนกลับมา |
| trustm_requested_target_oid | tesaiot_pu_ingest.c | ห่อไว้ใน pu_target_oid() โดยมีค่าปริยาย 0xE0E1 |
| trustm_requested_anchor_oid | tesaiot_pu_ingest.c | ห่อไว้ใน pu_anchor_oid() โดยมีค่าปริยาย 0xE0E8 |
การประกาศ:
รูปแบบตรวจ NULL สองชั้นสำหรับฟังก์ชันที่คืนค่าเป็นพอยน์เตอร์:
ชั้นแรกคือพอยน์เตอร์ของฟังก์ชัน (ลิงก์เข้ามาหรือไม่) ชั้นที่สองคือสตริงที่คืนกลับมา (มีคำขอค้างอยู่หรือไม่) การข้ามชั้นแรกทำให้เกิดการอ้างถึงที่อยู่ศูนย์บน build ที่ปิด CLM ส่วนการข้ามชั้นที่สองเปลี่ยน "ไม่มีคำขอค้างอยู่" ให้กลายเป็น replay (บท D2)
รูปแบบตัวเข้าถึงที่ห่อไว้พร้อมค่าปริยาย:
ให้ห่อตัวเข้าถึงชนิด weak ทุกตัวไว้ในฟังก์ชันภายในที่จัดหาค่าปริยายให้ ห้ามโปรย != NULL ? f() : default ไว้ตามจุดเรียกต่าง ๆ
binding ฝั่ง MicroPython ทำแบบเดียวกัน เพียงแต่ยกข้อผิดพลาดขึ้นแทนการคืนค่า — tesaiot_protected_update_py() ที่ modtesaiot.c:730-768 marker [hsm_publish_pu_mpy_binding] (มีเฉพาะใน zip ของ mtb-mpy — ไฟล์นี้ไม่อยู่ในแพ็กเกจ mtb-only):
template/lib/tesaiot_hsm/consumer_must_provide.txt คือรายการที่เครื่องสร้างขึ้นของ symbol ที่ archive อ้างถึงแต่ไม่ได้นิยามเอง แบ่งเป็นกลุ่มได้ดังนี้:
หากเปลี่ยน HSM handler หรือโมดูล MQTT ของเทมเพลต ทุกชื่อในรายการนั้นต้องยังคลี่ออกมาได้ และต้องมีความหมายเดิม โดยเฉพาะ 3 ตัวของ IPC ฝั่ง touch: การแทนที่ด้วย resume ที่ไม่นับจำนวนจะนำลายเซ็น 0x0102 ของบท D1 กลับมาอีกครั้ง
สิ่งที่ควรสังเกต symbol ชนิด T 6 ตัว (ให้ใช้ glob กับพาธของ ELF เพราะชื่อไดเรกทอรีของ TARGET ต่างกันไปตามคิต)
สิ่งที่ควรสังเกต build สำเร็จ ซึ่งคือผลของการประกาศแบบ weak ที่ทำงานถูกต้อง เมื่อรันบรรทัด nm เดิมซ้ำ จะไม่พบชื่อทั้งหกนั้น (อย่างมากได้ U/w ไม่มี T เลย) tesaiot_pu_ingest.o ไม่อยู่ในการลิงก์ และสตริง [PU-Ingest] หายไปจาก ELF
ตัดไฟแล้วจ่ายไฟใหม่หลังแฟลช จากนั้น Home → HSM Security → Enrol Certificate
สิ่งที่ควรสังเกต หน้าจอแสดงข้อความต่อไปนี้โดยไม่แตะชิปเลย:
(ipc_hsm_handler.c กิ่ง publish_csr == NULL ใน prov_run_locked) จากนั้นลอง Protected Update:
(กิ่ง tesaiot_publish_protected_update == NULL) บน mtb-mpy การเรียก tesaiot.protected_update(...) จาก REPL จะยกข้อผิดพลาด:
(modtesaiot.c:739-743) สามสตริงนั้น คือการตรวจสอบ ของบทนี้ แต่ละสตริงคือตัวกัน NULL ที่กำลังปฏิเสธ ณ ตำแหน่งที่ตารางด้านบนระบุไว้พอดี
สิ่งที่ ไม่ควร เห็น: HardFault หน้าจอดับ หรือการเชื่อมต่อ [MQTT] ใหม่ ตัวกันทำงานก่อนที่จะไปถึงแพลตฟอร์ม
ลองอ่าน slot ข้อมูลรับรอง (รายการที่บันทึกไว้บนหน้า WiFi หรือ optiga.read_metadata() บน mtb-mpy)
สิ่งที่ควรสังเกต ใช้งานได้ตามปกติ optiga_manager_*, optiga_chip_* และ IPC ฝั่งข้อมูลรับรองไม่ขึ้นกับแฟล็กนี้ — ฟังก์ชัน 10 ตัวของบท D1 ถูกดึงออกมาจาก archive เพราะ ipc_hsm_handler.c อ้างถึงโดยไม่มีเงื่อนไข สิ่งที่หายไปมีเพียงเส้นทางการลงทะเบียนฝั่ง MQTT เท่านั้น
แฟลช ตัดไฟแล้วจ่ายไฟใหม่ จากนั้นทำขั้นที่ 2 ของบท D2 เพื่อยืนยันว่า Enrol ผ่านตัวกันไปได้แล้ว
แฟล็กนี้ การประกาศ weak ทั้งหก ตัวกัน และสตริงปฏิเสธบนหน้าจอ เหมือนกันทั้งสอง variant ส่วนการปฏิเสธด้วย OSError มีเฉพาะบน mtb-mpy เพราะ modtesaiot.c เป็นหนึ่งใน 10 ไฟล์ที่แพ็กเกจ mtb-only ตัดออก ไฟล์ consumer_must_provide.txt เป็นไฟล์เดียวกันในทั้งสอง zip และบน mtb-only รายการ printf/scanf คลี่ไปที่ retarget-io เหมือนกับบน mtb-mpy ทุกประการ