SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
Loading...
Searching...
No Matches
การตรวจสอบด้วย OPTIGA

มีฟังก์ชันเดียว ถูก export ออกมาจาก libbento_mpy.a ในฐานะ symbol ชนิด WEAK (template/lib/mpy_secure/overridable.txt) ส่วนเทมเพลตส่งมอบ strong definition มาเป็นซอร์ส ที่ template/bento_libs/claw/kit-pse84-ai/modules/tesaiot/optiga_trust_helpers.c ซึ่งเป็นฝ่ายชนะในตอน link mpy_secure ไม่ได้ส่งมอบคำประกาศของฟังก์ชันนี้มาให้ (bento_secure_undeclared.h); prototype อยู่ใน optiga_trust_helpers.h ของโมดูล tesaiot_hsm

variant ที่ใช้ได้
mtb-mpy เท่านั้น (ไม่มีการลิงก์ libbento_mpy.a เมื่อ BENTO_HAS_MPY=0)

optiga_verify_staged_model

/* Prototype: template/lib/tesaiot_hsm/include/optiga_trust_helpers.h */
int optiga_verify_staged_model(const uint8_t *blob, uint32_t blob_len);
int optiga_verify_staged_model(const uint8_t *blob, uint32_t blob_len)

ข้อกำหนดการเรียกใช้ ตรวจลายเซ็นดิจิทัลบนพื้นที่ของโมเดลที่ staged ไว้ ก่อนที่โมเดลนั้นจะถูกส่งต่อให้ registry ของโมเดล ค่าที่คืนเป็น 1 หมายความว่าลายเซ็นถูกต้อง; รหัสที่ติดลบ แยกจากกันโดยเจตนา — ไม่มีลายเซ็น, รูปแบบผิด, ถูกชิปปฏิเสธ และถามชิปไม่ได้ ล้วนต้องการการตอบสนองที่ต่างกัน และห้ามยุบรวมให้เหลือเพียง "failed" ค่าเดียว ให้บันทึกค่าที่คืนมาทุกเส้นทาง รวมทั้งเส้นทางที่สำเร็จ ฟังก์ชันนี้คุยกับ secure element (ชิปนิรภัยแยกส่วน): เรียกได้จาก task context เท่านั้น ห้ามเรียกจาก ISR; OPTIGA manager ต้องทำงานอยู่ และ strong definition จะกัน touch ของ CM55 ออกจากบัส SCB5 ที่ใช้ร่วมกันตลอดทั้ง transaction ไม่มี call site ในเทมเพลตเลย: ผู้เรียกรายเดียวที่มีอยู่คือเส้นทาง staging โมเดลใน modedgeai.c ที่เก็บไว้ใน archive ซึ่งไม่ได้ส่งมอบมาเป็นซอร์ส

ตรวจสอบ แต่ยังไม่บังคับใช้ ในเฟิร์มแวร์ที่ build ด้วยค่าตั้งต้น การตรวจนี้ทำงานจริงและให้คำตัดสินจริง — strong definition ปรากฏใน ELF ของ CM33_NS ที่ optiga_verify_staged_model (ตรวจด้วย arm-none-eabi-nm บน proj_cm33_ns/build/KIT_PSE84_AI/Release/proj_cm33_ns.elf เมื่อ 2026-08-29 ส่วน CM33_S และ CM55 ไม่มี symbol นี้) แต่คำตัดสินนั้นถูกบันทึก ไม่ได้ถูกใช้ปฏิเสธ

ผู้เรียกใน archive จะ raise ข้อผิดพลาดก็ต่อเมื่อ EDGE_AI_REQUIRE_SIGNED == 1 เท่านั้น และแมโครนั้นไม่ได้ถูกนิยามไว้ที่ใดเลยในแพ็กเกจนี้ ข้อความปฏิเสธทั้งสามข้อความจึงไม่ปรากฏใน ELF ของ core ใดเลย ผลคือโมเดลที่ไม่มีลายเซ็นหรือมีลายเซ็นที่ผิด ยังคงถูก stage และถูกโหลด โดยผลการตรวจไปปรากฏที่ stage_info()['sig_rc'] และ stage_info()['signed'] เท่านั้น

ผู้ใช้ไลบรารีที่ต้องการให้เป็นการบังคับใช้จริงต้องอ่านสองฟิลด์นั้นแล้วปฏิเสธเอง ตามรูปแบบในตัวอย่างด้านล่าง หรือ build ด้วย EDGE_AI_REQUIRE_SIGNED=1 การเปิดค่านี้เป็นค่าตั้งต้นและการนำแฟล็กออกมาให้ตั้งได้จาก Makefile เป็นงานที่ยังไม่ได้ทำ

ตัวอย่าง (เขียนขึ้นเอง — ไม่มี call site ในของที่ส่งมอบจริง)
/* Hand-written extern — mpy_secure ships no declaration for this symbol.
* Prototype copied from optiga_trust_helpers.h:179. */
extern int optiga_verify_staged_model(const uint8_t *blob, uint32_t blob_len);
static int32_t s_stage_sig_rc; /* last verify rc — kept ALWAYS */
static bool s_stage_signed;
static void bento_ex_optiga_verify_staged_model(void)
{
const uint8_t *staged_base = (const uint8_t *)0x60800000u; /* staging */
uint32_t staged_total = 4096u; /* bytes */
const int sv = optiga_verify_staged_model(staged_base, staged_total);
/* Record the rc always, including on success — two fields about two
* different uploads must never be read as one. */
s_stage_sig_rc = sv;
s_stage_signed = (sv == 1);
if (!s_stage_signed) {
/* Refuse to register the model. Surface sv verbatim: a bus
* failure must not be reported as an attack. */
return;
}
/* Only now hand the region to the model registry. */
}