เครื่องมือการจัดสรรของ OpenWeave Factory

ดูแหล่งที่มาใน GitHub

เครื่องมือการจัดสรรโรงงาน OpenWeave เป็นวิธีที่สะดวกในการจัดสรรข้อมูลการกําหนดค่าแบบต่ออุปกรณ์อย่างต่อเนื่องสําหรับอุปกรณ์ที่เปิดใช้ Weave เครื่องมือการจัดสรรเริ่มต้นมีไว้สําหรับใช้เป็นส่วนหนึ่งของกระบวนการผลิตที่ประทับตราอุปกรณ์ของแต่ละคน โดยมีข้อมูลประจําตัวและข้อมูลเข้าสู่ระบบที่ไม่ซ้ํากันก่อนการจัดส่งให้ลูกค้า นอกจากนี้ นักพัฒนาซอฟต์แวร์ยังใช้แอปดังกล่าวเพื่อปรับเปลี่ยนฮาร์ดแวร์รุ่นก่อนผลิตจริงที่ใช้ในขั้นตอนการพัฒนาซอฟต์แวร์ได้ด้วย

ทฤษฎีปฏิบัติการ

เป้าหมายของเครื่องมือการจัดสรร OpenOpenaa Factory คือการแทรกข้อมูลการกําหนดค่าที่เลือกลงในที่เก็บการกําหนดค่าถาวรของอุปกรณ์ ซึ่งอุปกรณ์จะเลือกรับและใช้ได้ขณะรันไทม์ด้วยเฟิร์มแวร์ของอุปกรณ์ โดยทั่วไปการกําหนดค่าอุปกรณ์ถาวรจะจัดเก็บไว้ในแฟลชภายในของอุปกรณ์ แม้ว่ารายละเอียดการจัดเก็บข้อมูลจะเป็นไปตามรูปแบบที่ปรากฏและในรูปแบบที่แตกต่างกันไปในแต่ละแพลตฟอร์ม เครื่องมือการจัดสรรเริ่มต้นจะไม่ขึ้นอยู่กับรูปแบบพื้นที่เก็บข้อมูลจริง และอาศัยโค้ดในเฟิร์มแวร์ของอุปกรณ์เพื่อเขียนข้อมูลอย่างถูกต้อง อินเทอร์เฟซผู้ใช้ของเครื่องมือส่วนใหญ่ก็จะไม่ขึ้นอยู่กับประเภทของฮาร์ดแวร์ที่กําหนดค่าไว้ ซึ่งหมายความว่าขั้นตอนการผลิตที่คล้ายกันจะใช้ในสายผลิตภัณฑ์ที่อิงตามแพลตฟอร์มฮาร์ดแวร์ที่แตกต่างกันได้

เครื่องมือการจัดสรรเริ่มต้นออกแบบมาเพื่อทํางานในเครื่องโฮสต์ที่เชื่อมต่อกับอุปกรณ์เป้าหมายผ่านอินเทอร์เฟซการแก้ไขข้อบกพร่องหรืออินเทอร์เฟซการควบคุมบางอย่าง เช่น พอร์ต JTAG หรือ SWD เครื่องมือจะทํางานโดยการแทรกข้อมูลการจัดสรรลงใน RAM ของอุปกรณ์ในรูปแบบที่เข้ารหัสเป็นพิเศษ จากนั้นอุปกรณ์จะแนะนําให้รีสตาร์ท ซึ่งโค้ด Point ในตัวของเฟิร์มแวร์ของอุปกรณ์จะค้นหาข้อมูลที่เข้ารหัส ตรวจสอบความสมบูรณ์ และเขียนค่าที่มีอยู่ในพื้นที่เก็บข้อมูลถาวรในรูปแบบที่เหมาะสมสําหรับแพลตฟอร์ม

โค้ดในอุปกรณ์ที่ตรวจจับและประมวลผลข้อมูลการจัดสรรที่แทรกเข้ามานั้นมีอยู่ในเลเยอร์ OpenWeave Device Layer และสามารถเปิดใช้บนแพลตฟอร์มที่รองรับ เมื่อเปิดใช้แล้ว โค้ดจะทํางานโดยอัตโนมัติทุกครั้งที่อุปกรณ์เปิดเครื่อง โดยอยู่ในจุดแรกของกระบวนการเริ่มต้นอุปกรณ์ โค้ดจะดําเนินการโดยการสแกนพื้นที่ RAM เฉพาะแพลตฟอร์ม ในแพลตฟอร์มที่มีหน่วยความจําว่างน้อย (เช่น <1M) การสแกนจะรวม RAM ที่มีอยู่ทั้งหมด

เมื่ออยู่ใน RAM ข้อมูลการจัดสรรจะเข้ารหัสด้วยคํานําหน้าที่ระบุตัวบุคคลได้ง่าย ทําให้ค้นหาได้อย่างรวดเร็วระหว่างกระบวนการสแกน ระบบจะใช้ค่าการตรวจสอบความสมบูรณ์ตามแฮชการเข้ารหัสลับเพื่อยืนยันความถูกต้องของข้อมูลก่อนประมวลผล

โดยค่าเริ่มต้น เครื่องมือการจัดสรรจะเลือกตําแหน่ง RAM ที่จะแทรกข้อมูลการจัดสรรตามแพลตฟอร์มอุปกรณ์เป้าหมาย ตัวเลือกนี้ลบล้างผ่านอาร์กิวเมนต์ไปยังเครื่องมือได้ โดยทั่วไปแล้ว เฟิร์มแวร์ของอุปกรณ์จะสงวนตําแหน่ง RAM ไว้โดยเฉพาะสําหรับการรับข้อมูลการจัดสรร โดยทั่วไป ข้อมูลการจัดสรรจะเขียนไปยังตําแหน่ง RAM ที่จัดสรรเพื่อวัตถุประสงค์อื่นๆ แต่โดยทั่วไปจะไม่ใช้ในช่วงต้นของกระบวนการเปิดเครื่องอุปกรณ์ ตัวเลือกที่พบบ่อยคือด้านบนของระบบสแต็กระบบเริ่มต้นหรือปลายทางสุดไกล

เครื่องมือการผลิตเริ่มต้นอาศัยชุดเครื่องมือพัฒนาภายนอกเพื่อเชื่อมต่อกับอุปกรณ์เป้าหมาย เครื่องมือที่ใช้จะขึ้นอยู่กับประเภทของอุปกรณ์เป้าหมาย ปัจจุบันระบบรองรับอินเทอร์เฟซอุปกรณ์ 2 แบบ ได้แก่

  • การตรวจสอบการแก้ไขข้อบกพร่อง SEGGER J-Link เชื่อมต่อกับพอร์ต JTAG หรือ SWD ของอุปกรณ์
  • พอร์ตอนุกรม USB ที่เชื่อมต่อกับ Espressif ESP32

อินเทอร์เฟซ J-Link จะอาศัยเครื่องมือ SEGGER J-Link Commander (JLinkExe) ซึ่งต้องติดตั้งแยกต่างหากในเครื่องโฮสต์

อินเทอร์เฟซ ESP32 อาศัยคําสั่ง Espressif esptool.py ซึ่งให้บริการเป็นส่วนหนึ่งของ ESP-IDF SDK ของ Espressif&#39

ประเภทของข้อมูลที่จะจัดสรรได้

เครื่องมือการจัดสรรของ OpenWeave สามารถจัดสรรข้อมูลประเภทต่อไปนี้ได้

  • หมายเลขซีเรียลของอุปกรณ์
  • รหัสอุปกรณ์ Weave ที่ผู้ผลิตกําหนด
  • ใบรับรอง Weave และคีย์ส่วนตัวที่ผู้ผลิตกําหนด
  • สร้างรหัสการจับคู่
  • หมายเลขแก้ไขผลิตภัณฑ์
  • วันที่ผลิต

แม้ว่าอุปกรณ์ทั่วไปจะต้องใช้ข้อมูลทั้งหมดข้างต้นจึงจะทํางานได้ถูกต้อง แต่ก็ไม่จําเป็นต้องจัดสรรข้อมูลทั้งหมดพร้อมกัน ดังนั้น การจัดสรรข้อมูลประเภทต่างๆ อาจเกิดขึ้นได้ในจุดที่แตกต่างกันในกระบวนการผลิต นอกจากนี้ คุณยังทดแทนค่าที่จัดสรรไว้ก่อนหน้านี้ซึ่งมีค่าใหม่ในขั้นตอนการจัดสรรที่ตามมาได้ด้วย

แหล่งที่มาของข้อมูลการจัดสรร

ทั้งนี้คุณจัดเตรียมข้อมูลการจัดสรรอุปกรณ์ให้แก่เครื่องมือการจัดสรรเริ่มต้นได้ด้วยวิธีดังต่อไปนี้

  • อาร์กิวเมนต์บรรทัดคําสั่ง
  • การใช้ไฟล์ CSV การจัดสรร
  • ด้วยการดึงข้อมูลค่าจากเซิร์ฟเวอร์การจัดสรร Nest

บรรทัดคำสั่ง

ข้อมูลที่เข้าใจง่ายที่สุดคือระบุข้อมูลการจัดสรรอุปกรณ์โดยตรงในบรรทัดคําสั่งไปยังเครื่องมือการจัดสรรของ OpenWeave Factory เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --pairing-code NESTUS --mfg-date 2019/04/01

ค่าข้อมูลไบนารี เช่น ใบรับรอง Weave และคีย์ส่วนตัวจะระบุเป็นสตริงฐาน 64 หรือชื่อไฟล์ที่มีข้อมูลที่ต้องการในรูปแบบข้อมูลดิบ (ไบนารี) ก็ได้

ดูรายการอาร์กิวเมนต์บรรทัดคําสั่งที่ใช้ได้ทั้งหมดด้านล่าง

ไฟล์ CSV การจัดเตรียมข้อมูล

เครื่องมือการจัดสรรจากโรงงานจะอ่านข้อมูลการจัดสรรได้จากไฟล์ข้อมูลการจัดสรรรูปแบบ CSV เพื่อรองรับการจัดสรรอุปกรณ์จํานวนมาก คอลัมน์ของไฟล์นี้ควรสอดคล้องกับประเภทข้อมูลการจัดสรรที่เฉพาะเจาะจง นั่นคือ Serial_Num, Certificate, Private_Key เป็นต้น แถวในไฟล์จะระบุค่าแต่ละค่าสําหรับอุปกรณ์ที่เจาะจง จัดทําดัชนีโดยรหัสอุปกรณ์ Weave (Device_Id) ต้องระบุรหัสของอุปกรณ์ที่ต้องการจัดสรรในบรรทัดคําสั่ง เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-csv-file ./dev-provisioning-data.csv

คอลัมน์ CSV ที่รองรับมีดังนี้

ชื่อ รูปแบบ คำอธิบาย
Device_Id เลขฐานสิบหก 16 หลัก สานรหัสอุปกรณ์ ต้องมีอยู่
Serial_Num สตริง หมายเลขซีเรียลของอุปกรณ์
Certificate สตริง base64 ใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกําหนด
Private_Key สตริง base64 คีย์ส่วนตัว Weave ที่ผู้ผลิตกําหนด
Pairing_Code สตริง เป็นรหัสการจับคู่
Product_Rev จำนวนเต็ม หมายเลขแก้ไขผลิตภัณฑ์
Mfg_Date ปปปป/ดด/วว วันที่ผลิตอุปกรณ์

คอลัมน์อาจปรากฏในไฟล์ CSV โดยเรียงลําดับอย่างไรก็ได้ คอลัมน์ทั้งหมดเป็นค่าที่ไม่บังคับ ยกเว้น Device_Id ค่าที่ไม่ได้มีอยู่ในไฟล์ CSV จะไม่ได้จัดสรรในอุปกรณ์

ผู้ใช้สามารถระบุค่าการจัดสรรแต่ละรายการในบรรทัดคําสั่งนอกเหนือจากไฟล์ CSV ซึ่งในกรณีนี้ ค่าบรรทัดคําสั่งจะมีผลเหนือค่าในไฟล์

การรองรับรูปแบบไฟล์ CSV ที่เครื่องมือการจัดสรรจากโรงงานรองรับเอาต์พุตของคําสั่ง weave ของเครื่องมือ gen-provisioning-data

เซิร์ฟเวอร์การจัดสรร Nest

เครื่องมือการจัดสรรเริ่มต้นรองรับการดึงข้อมูลการจัดสรรบางส่วนจากเซิร์ฟเวอร์การจัดสรร Nest โดยใช้โปรโตคอลแบบ HTTPS คุณใช้โปรโตคอลเซิร์ฟเวอร์การจัดสรรเพื่อดึงข้อมูลใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกําหนด, คีย์ส่วนตัวที่สอดคล้องกัน และโค้ดการจับคู่ Weave จากเซิร์ฟเวอร์การจัดสรรได้

ตําแหน่งเครือข่ายของเซิร์ฟเวอร์การจัดสรรจะระบุโดยใส่ URL พื้นฐานในบรรทัดคําสั่งเครื่องมือการจัดสรร ระบบจะเลือกข้อมูลการจัดสรรที่ต้องการโดยระบุรหัสอุปกรณ์ Weave ในบรรทัดคําสั่ง เช่น

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000001 \
    --prov-server https://192.168.172.2:8000/

ผู้ใช้สามารถระบุค่าการจัดสรรแต่ละรายการในบรรทัดคําสั่ง นอกเหนือจาก URL ของเซิร์ฟเวอร์การจัดสรร ในกรณีนี้ ค่าที่ระบุในบรรทัดคําสั่งจะมีค่าสูงกว่าค่าที่เซิร์ฟเวอร์ส่งกลับมา

การเปิด / ปิดใช้การรองรับการจัดสรรเริ่มต้น

ตัวเลือกการจัดสรร WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING ตัวเลือกนี้จะเปิดใช้โดยค่าเริ่มต้น คุณปิดใช้ฟีเจอร์นี้ได้โดยการลบล้างตัวเลือกในไฟล์ WeaveProjectConfig.h เช่น

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

โดยทั่วไปแล้ว วิธีเปิดใช้การจัดสรรจากโรงงานในเฟิร์มแวร์อุปกรณ์เวอร์ชันที่ใช้งานจริงนั้นปลอดภัยโดยหากอินเทอร์เฟซการแก้ไขข้อบกพร่องของอุปกรณ์ปิดอยู่ในอุปกรณ์ที่ใช้งานจริงอย่างเหมาะสม ซึ่งทําได้ผ่านฮาร์ดแวร์ (เช่น โดยการเป่าฟิวส์ใน SoC) หรือในซอฟต์แวร์ (เช่น ผ่านตัวโหลดการรักษาความปลอดภัยที่ปลอดภัยที่บล็อกการเข้าถึงการแก้ไขข้อบกพร่องซึ่งเป็นส่วนหนึ่งของกระบวนการเปิดเครื่อง)

การเรียกใช้เครื่องมือการจัดสรรเริ่มต้น

เครื่องมือการจัดสรรของ OpenWeave Factory รองรับตัวเลือกบรรทัดคําสั่งต่อไปนี้

ตัวเลือก คำอธิบาย
--target <string> ประเภทอุปกรณ์เป้าหมาย ตัวเลือกที่มีคือ nrf52840, esp32
--load-addr <hex-digits> ที่อยู่ในหน่วยความจําของอุปกรณ์ที่จะเขียนข้อมูลการจัดสรร
--verbose, -v ปรับระดับเสียงพูดรายละเอียด ใช้อาร์กิวเมนต์หลายรายการเพื่อเพิ่มการพูดรายละเอียด
--serial-num <string> ตั้งค่าหมายเลขซีเรียลของอุปกรณ์
--device-id <hex-digits> ตั้งรหัสอุปกรณ์ที่ผู้ผลิตกําหนด
--device-cert <base-64> | <file-name> ตั้งค่าใบรับรองอุปกรณ์ Weave ที่ผู้ผลิตกําหนด
--device-key <base-64> | <file-name> ตั้งค่าคีย์ส่วนตัวของอุปกรณ์ Weave ที่ผู้ผลิตกําหนด
--pairing-code <string> กําหนดรหัสการจับคู่อุปกรณ์
--product-rev <integer> ตั้งค่าการแก้ไขผลิตภัณฑ์สําหรับอุปกรณ์นี้
--mfg-date <YYYY/MM/DD> | วันนี้ | ตอนนี้ กําหนดวันที่ผลิตของอุปกรณ์
--jlink-cmd <path-name> เส้นทางไปยังคําสั่ง JLink ค่าเริ่มต้นเป็น 'JLinkExe'
--jlink-if SWD | JTAG ประเภทอินเทอร์เฟซ J-link ค่าเริ่มต้นคือ SWD
--jlink-speed <integer> | ปรับเปลี่ยนได้ | auto ความเร็วของอินเทอร์เฟซ J-link
--jlink-sn <string> หมายเลขซีเรียลของการตรวจสอบ J-Link
--esptool-cmd <path-name> เส้นทางไปยังคําสั่ง esptool ค่าเริ่มต้นจะเป็น 'esptool.py'
--port <path-name> ชื่ออุปกรณ์พอร์ต COM สําหรับ ESP32 ค่าเริ่มต้นคือ /tty/USB0
--speed <integer> อัตรารับส่งข้อมูลสําหรับพอร์ต COM ค่าเริ่มต้นคือ 115200
--prov-csv-file <file-name> อ่านข้อมูลการจัดสรรอุปกรณ์จากไฟล์ CSV การจัดสรร
--prov-server <url> อ่านข้อมูลการจัดสรรอุปกรณ์จากเซิร์ฟเวอร์การจัดสรร
--ปิดใช้การตรวจสอบเซิร์ฟเวอร์ เมื่อใช้ HTTPS ให้ปิดการตรวจสอบสิทธิ์ใบรับรองที่แสดงโดยเซิร์ฟเวอร์การจัดสรร

ตัวอย่าง

คําสั่งต่อไปนี้จะกําหนดรหัสอุปกรณ์ หมายเลขซีเรียล การแก้ไขผลิตภัณฑ์ และรหัสการจับคู่เป็นค่าที่ต้องการ ตั้งค่าวันที่ผลิตเป็นวันที่ปัจจุบัน และตั้งค่าใบรับรองอุปกรณ์และคีย์ส่วนตัวให้เป็นค่าการทดสอบที่ให้ไว้ในไฟล์ CSV ที่ให้ไว้กับที่เก็บแหล่งที่มา openweave-core

./weave-factory-prov-tool --target nrf52840 --device-id 18B4300000000042 \
    --serial-num JAYS_DEVICE_42 --product-rev 1 --pairing-code NESTUS --mfg-date today \
    --prov-csv-file ~/projects/openweave-core/certs/development/device/test-dev-provisioning-data.csv