|
SDK สำหรับ TESAIoT Dev Kit
คู่มืออ้างอิง API และ Tutorial (MTB & µPython)
|
Functions | |
| void | bento_devmode_init (void) |
| เป็น idempotent สร้าง secret ขนาด 32 ไบต์ใน RAM จุดเข้าสาธารณะของ devmode ทุกจุดเรียกฟังก์ชันนี้เอง | |
| void | bento_devmode_nonce_issue (uint8_t nonce_out[BENTO_DEVMODE_NONCE_LEN]) |
| เติม nonce ใหม่ขนาด 16 ไบต์ ทับตัวที่ค้างอยู่ทิ้ง และเริ่มนับนาฬิกา TTL | |
| bool | bento_devmode_unlock (const char *hmac_hex, size_t hmac_hex_len) |
| ตรวจสอบ HMAC เทียบกับ nonce ที่ค้างอยู่ และทำให้ nonce ใช้ไม่ได้อีกทุกครั้งที่ถูกเรียก (ใช้ได้ครั้งเดียว) | |
| void | bento_devmode_lock (void) |
| ล้าง flag ปลดล็อก | |
| bool | bento_devmode_is_unlocked (void) |
| บอกว่า verb ที่มีสิทธิ์พิเศษ (bento.exec) ได้รับอนุญาตอยู่ในขณะนั้นหรือไม่ | |
| size_t | bento_devmode_secret_hex (char *out, size_t out_sz) |
| secret ในรูป hex 64 อักขระ + NUL หรือคืน 0 เมื่อบัฟเฟอร์เล็กเกินไป ห้ามพิมพ์ค่านี้ลง UART | |
| void | bento_devmode_emit_provision (void) |
| ส่ง event provision หนึ่งครั้งต่อการบูตหนึ่งรอบ ตอนเปลี่ยนสถานะเป็น CONNECTED การส่งที่ล้มเหลวจะลองใหม่ | |
| size_t | bento_devmode_secret_fp_hex (char *out, size_t out_sz) |
| 4 ไบต์แรกของ SHA-256(secret) ในรูป hex 8 อักขระ + NUL — พิมพ์ออกได้อย่างปลอดภัย | |
8 ฟังก์ชัน: การปลดล็อกโหมดสำหรับผู้พัฒนา ในกลุ่ม bento_devmode_* คอมไพล์เฉพาะเมื่อ ENABLE_PAGE_BENTO_BUDDY=1 (ค่าตั้งต้นคือ 0, proj_cm33_ns/Makefile:64, :305) ให้ build ใหม่หลังจาก make getlibs — ดู Flag gate (อ่านก่อน)
การประกาศ: bento_devmode.h ส่วนการนำไปสร้างจริงใน bento_devmode.c ถูกเก็บไว้ใน libbento_secure.a secret ที่ใช้ร่วมกันนั้น อยู่ใน RAM เท่านั้นและถูกสร้างใหม่ทุกครั้งที่บูต (การคงค่าไว้ใน slot 0xE120 ของ OPTIGA ถูกเลื่อนออกไป bento_devmode.c:96-97) — ฝั่ง desktop ต้องจัดเตรียมใหม่หลังการบูตใหม่ทุกครั้ง TTL ของ nonce คือ BENTO_DEVMODE_NONCE_TTL_MS (60000) และมี challenge ค้างได้ครั้งละหนึ่งรายการ
สิ่งที่ challenge/response นี้ปกป้องได้ และสิ่งที่ปกป้องไม่ได้ การจัดเตรียมค่าเริ่มต้นนั้นทำโดยส่ง secret ออกไปในรูป plaintext ให้ peer ตัวแรกที่เชื่อมต่อสำเร็จ (Devmode ที่ bento_devmode_emit_provision) ผ่าน TX ที่ไม่ได้ตั้งบิต GATTDB_PERM_AUTH_* และตัว secret มาจาก xorshift32 ที่มีเอนโทรปีต่ำกว่า 32 บิต ขั้นตอน HMAC เองถูกต้อง แต่ผลลัพธ์รวมคือ gate ที่กัน peer ซึ่งมาทีหลังได้เท่านั้น จึงเป็นเครื่องกีดขวาง ไม่ใช่ขอบเขตการบังคับใช้สิทธิ์
| void bento_devmode_init | ( | void | ) |
เป็น idempotent สร้าง secret ขนาด 32 ไบต์ใน RAM จุดเข้าสาธารณะของ devmode ทุกจุดเรียกฟังก์ชันนี้เอง
คุณภาพของ secret PRNG ที่ใช้คือ xorshift32 ซึ่ง seed จาก tick ของ FreeRTOS, แอดเดรสบน stack และค่าคงที่หนึ่งค่า (bento_devmode.c:54-66) เอนโทรปีจึงต่ำกว่า 32 บิต และคอมเมนต์ในซอร์สระบุไว้เองว่า "not cryptographically strong" ไม่ได้ใช้ RNG ของ OPTIGA การย้ายไปใช้ค่าจากชิปเป็นงานที่ยังไม่ได้ทำ
| void bento_devmode_nonce_issue | ( | uint8_t | nonce_out[BENTO_DEVMODE_NONCE_LEN] | ) |
เติม nonce ใหม่ขนาด 16 ไบต์ ทับตัวที่ค้างอยู่ทิ้ง และเริ่มนับนาฬิกา TTL
ผลด้านความปลอดภัยที่ต้องระบุให้ตรง ฟังก์ชันนี้ส่ง secret ออกไปในรูป plaintext ให้ peer ตัวแรกที่เชื่อมต่อสำเร็จหลังการบูต และ characteristic TX ไม่ได้ตั้งบิต GATTDB_PERM_AUTH_* (ดู ข้อมูล GATT) ดังนั้น peer ที่ยังไม่ได้จับคู่ก็รับค่านี้ได้ ขั้นตอน HMAC-SHA256 เองถูกต้อง แต่การครอบครองกุญแจไม่ได้ถูกจำกัดไว้กับเครื่องเดสก์ท็อปที่ได้รับอนุญาต gate นี้จึงกัน peer ที่มาทีหลังได้เท่านั้น ให้ถือเป็นเครื่องกีดขวาง ไม่ใช่ขอบเขตการบังคับใช้สิทธิ์
| bool bento_devmode_unlock | ( | const char * | hmac_hex, |
| size_t | hmac_hex_len ) |
ตรวจสอบ HMAC เทียบกับ nonce ที่ค้างอยู่ และทำให้ nonce ใช้ไม่ได้อีกทุกครั้งที่ถูกเรียก (ใช้ได้ครั้งเดียว)
| void bento_devmode_lock | ( | void | ) |
ล้าง flag ปลดล็อก
| bool bento_devmode_is_unlocked | ( | void | ) |
บอกว่า verb ที่มีสิทธิ์พิเศษ (bento.exec) ได้รับอนุญาตอยู่ในขณะนั้นหรือไม่
| size_t bento_devmode_secret_hex | ( | char * | out, |
| size_t | out_sz ) |
secret ในรูป hex 64 อักขระ + NUL หรือคืน 0 เมื่อบัฟเฟอร์เล็กเกินไป ห้ามพิมพ์ค่านี้ลง UART
| void bento_devmode_emit_provision | ( | void | ) |
ส่ง event provision หนึ่งครั้งต่อการบูตหนึ่งรอบ ตอนเปลี่ยนสถานะเป็น CONNECTED การส่งที่ล้มเหลวจะลองใหม่
| size_t bento_devmode_secret_fp_hex | ( | char * | out, |
| size_t | out_sz ) |
4 ไบต์แรกของ SHA-256(secret) ในรูป hex 8 อักขระ + NUL — พิมพ์ออกได้อย่างปลอดภัย