OpenWeave फ़ैक्ट्री प्रॉविज़निंग टूल

GitHub पर सोर्स देखना

OpenWeave फ़ैक्ट्री प्रोविज़निंग टूल, Weave की सुविधा वाले डिवाइसों पर, हर डिवाइस के कॉन्फ़िगरेशन की जानकारी को लगातार उपलब्ध कराने का एक आसान तरीका उपलब्ध कराता है. फ़ैक्ट्री प्रोविज़निंग टूल का इस्तेमाल, मैन्युफ़ैक्चरिंग लाइन की प्रोसेस के हिस्से के तौर पर किया जाता है. इस प्रोसेस में, ग्राहकों को डिवाइस शिप करने से पहले, हर डिवाइस पर यूनीक आइडेंटिटी और क्रेडेंशियल की जानकारी स्टैंप की जाती है. डेवलपर इसका इस्तेमाल, डेवलपमेंट प्रोसेस के दौरान इस्तेमाल किए जाने वाले प्री-प्रोडक्शन हार्डवेयर को पसंद के मुताबिक बनाने के लिए भी कर सकते हैं.

काम करने का तरीका

OpenWeave फ़ैक्ट्री प्रोविज़निंग टूल का मकसद, डिवाइस के पर्सिस्टेंट कॉन्फ़िगरेशन स्टोर में चुनिंदा कॉन्फ़िगरेशन की जानकारी डालना है. डिवाइस के फ़र्मवेयर में, इसे रनटाइम के दौरान उठाया और इस्तेमाल किया जा सकता है. स्थायी डिवाइस कॉन्फ़िगरेशन आम तौर पर डिवाइस के इंटरनल फ़्लैश में सेव किया जाता है. हालांकि, हर प्लैटफ़ॉर्म के हिसाब से डेटा की जानकारी अलग-अलग होती है. जैसे, डेटा को कैसे और किस फ़ॉर्मैट में सेव किया जाता है. फ़ैक्ट्री प्रोविज़निंग टूल, स्टोरेज के फ़ाइनल फ़ॉर्मैट से अलग होता है. साथ ही, डेटा को सही तरीके से लिखने के लिए, डिवाइस के फ़र्मवेयर में मौजूद कोड पर निर्भर करता है. टूल का उपयोगकर्ता इंटरफ़ेस, कॉन्फ़िगर किए जा रहे हार्डवेयर के टाइप पर भी काफ़ी हद तक निर्भर नहीं करता. इसका मतलब है कि अलग-अलग हार्डवेयर प्लैटफ़ॉर्म पर आधारित प्रॉडक्ट लाइन में, मैन्युफ़ैक्चरिंग की मिलती-जुलती प्रोसेस का इस्तेमाल किया जा सकता है.

फ़ैक्ट्री प्रोविज़निंग टूल को किसी होस्ट मशीन पर चलाने के लिए डिज़ाइन किया गया है. यह मशीन, डिबग या कंट्रोल इंटरफ़ेस के ज़रिए टारगेट डिवाइस से कनेक्ट होती है. उदाहरण के लिए, JTAG या SWD पोर्ट. यह टूल, डिवाइस की रैम में खास तौर पर कोड किए गए फ़ॉर्मैट में, डिवाइस को कॉन्फ़िगर करने की जानकारी डालकर काम करता है. इसके बाद, डिवाइस को रीस्टार्ट करने का निर्देश दिया जाता है. इसके बाद, डिवाइस के फ़र्मवेयर में पहले से मौजूद पॉइंट कोड, कोड में बदले गए डेटा का पता लगाता है, उसकी इंटिग्रिटी की पुष्टि करता है, और उसमें मौजूद वैल्यू को प्लैटफ़ॉर्म के हिसाब से स्थायी स्टोरेज में लिखता है.

डिवाइस पर मौजूद कोड, इंजेक्ट किए गए प्रोविज़निंग डेटा का पता लगाता है और उसे प्रोसेस करता है. यह कोड, OpenWeave डिवाइस लेयर में पहले से मौजूद होता है. साथ ही, इसे इस सुविधा के साथ काम करने वाले किसी भी प्लैटफ़ॉर्म पर चालू किया जा सकता है. इसे चालू करने के बाद, डिवाइस के बूट होने पर हर बार कोड अपने-आप चलता है. ऐसा डिवाइस के शुरू होने की प्रोसेस के शुरुआती चरण में होता है. इस कोड का इस्तेमाल, किसी खास प्लैटफ़ॉर्म के लिए तय रैम से जुड़े इलाके को स्कैन करके किया जाता है. कम मेमोरी वाले प्लैटफ़ॉर्म (उदाहरण के लिए, <1M) पर, स्कैन में उपलब्ध सभी रैम शामिल होती है.

जब रैम में रखा जाता है, तो प्रावधान करने वाले डेटा को आसानी से पहचाने जा सकने वाले प्रीफ़िक्स से एन्कोड किया जाता है. इससे स्कैन की प्रोसेस के दौरान इसे तुरंत ढूंढा जा सकता है. क्रिप्टोग्राफ़िक हैश के आधार पर इंटिग्रिटी जांच की वैल्यू का इस्तेमाल, डेटा को प्रोसेस करने से पहले उसकी पुष्टि करने के लिए किया जाता है.

डिफ़ॉल्ट रूप से, प्रोविज़निंग टूल, टारगेट डिवाइस के प्लैटफ़ॉर्म के आधार पर, प्रोविज़निंग डेटा को इंजेक्ट करने के लिए रैम की जगह चुनता है. इस विकल्प को टूल के लिए दिए गए आर्ग्युमेंट की मदद से बदला जा सकता है. आम तौर पर, यह ज़रूरी नहीं है कि डिवाइस फ़र्मवेयर, खास तौर पर प्रावधान का डेटा पाने के लिए रैम की जगह तय करे. आम तौर पर, प्रोविज़निंग डेटा को उस रैम में लिखा जाता है जिसे अन्य कामों के लिए एलोकेट किया गया है. हालांकि, आम तौर पर डिवाइस के बूट होने की प्रोसेस के शुरुआती चरणों में इसका इस्तेमाल नहीं किया जाता. आम तौर पर, शुरुआती सिस्टम स्टैक के सबसे ऊपर या हेप एरेना के सबसे आखिर में, रीडायरेक्ट किया जाता है.

फ़ैक्ट्री प्रॉविज़निंग टूल, टारगेट डिवाइस से इंटरफ़ेस करने के लिए एक्सटर्नल डेवलपमेंट टूल के एक सेट का इस्तेमाल करता है. कौनसे टूल इस्तेमाल किए जा सकते हैं, यह इस बात से तय होता है कि टारगेट डिवाइस किस तरह का है. फ़िलहाल, डिवाइस के दो इंटरफ़ेस काम करते हैं:

  • किसी डिवाइस के JTAG या SWD पोर्ट से कनेक्ट किया गया SEGGER J-Link डीबग प्रोब
  • Espressif ESP32 से कनेक्ट किया गया यूएसबी सीरियल पोर्ट

J-Link इंटरफ़ेस, SEGGER J-Link Commander टूल (JLinkExe) पर निर्भर करता है. इसे होस्ट मशीन पर अलग से इंस्टॉल करना होगा.

ESP32 इंटरफ़ेस, Espressif esptool.py कमांड पर निर्भर करता है. यह कमांड, Espressif के ESP-IDF SDK टूल के हिस्से के तौर पर उपलब्ध कराया जाता है.

किस तरह की जानकारी को प्रोविज़न किया जा सकता है

OpenWeave फ़ैक्ट्री प्रोविज़निंग टूल, इस तरह की जानकारी प्रोविज़न कर सकता है:

  • डिवाइस का सीरियल नंबर
  • मैन्युफ़ैक्चरर का असाइन किया हुआ Weave डिवाइस आईडी
  • मैन्युफ़ैक्चरर से असाइन किया गया Weave सर्टिफ़िकेट और निजी पासकोड
  • Weave से जोड़ने के लिए कोड
  • प्रॉडक्ट के बदलाव का नंबर
  • बनने की तारीख

आम तौर पर, किसी डिवाइस को सही तरीके से काम करने के लिए ऊपर दी गई सभी जानकारी की ज़रूरत होती है. हालांकि, यह ज़रूरी नहीं है कि सभी जानकारी एक ही समय पर दी जाए. इसलिए, मैन्युफ़ैक्चरिंग की प्रोसेस के अलग-अलग पॉइंट पर, अलग-अलग तरह की जानकारी दी जा सकती है. इसके अलावा, प्रावधान करने के अगले चरण में, पहले से प्रावधान की गई वैल्यू को नई वैल्यू से बदला जा सकता है.

प्रोवाइज़न करने की जानकारी के सोर्स

डिवाइस की प्रोविज़निंग की जानकारी, फ़ैक्ट्री प्रोविज़निंग टूल को इन तरीकों से दी जा सकती है:

  • कमांड लाइन के आर्ग्युमेंट
  • प्रोविज़न करने के लिए CSV फ़ाइल का इस्तेमाल करना
  • Nest के प्रावधान करने वाले सर्वर से वैल्यू फ़ेच करके

कमांड लाइन

सबसे आसान तरीके से, डिवाइस की प्रोविज़निंग की जानकारी सीधे तौर पर OpenWeave फ़ैक्ट्री प्रोविज़निंग टूल की कमांड लाइन पर दी जाती है. उदाहरण के लिए:

./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

सीएसवी फ़ाइल में ये कॉलम इस्तेमाल किए जा सकते हैं:

नाम फ़ॉर्मैट ब्यौरा
Device_Id 16 हेक्स अंक Weave डिवाइस आईडी. यह मौजूद होना चाहिए.
Serial_Num स्ट्रिंग डिवाइस का सीरियल नंबर.
Certificate base-64 स्ट्रिंग डिवाइस बनाने वाली कंपनी का असाइन किया गया Weave डिवाइस सर्टिफ़िकेट.
Private_Key base-64 स्ट्रिंग मैन्युफ़ैक्चरर की ओर से असाइन की गई Weave निजी कुंजी.
Pairing_Code स्ट्रिंग Weave जोड़ने के लिए कोड.
Product_Rev पूर्णांक प्रॉडक्ट रिविज़न नंबर.
Mfg_Date DD-MM-YYYY डिवाइस बनाने की तारीख.

कॉलम, CSV फ़ाइल में किसी भी क्रम में दिख सकते हैं. Device_Id को छोड़कर, सभी कॉलम वैकल्पिक हैं. CSV फ़ाइल में मौजूद वैल्यू नहीं होने पर, उन्हें डिवाइस पर प्रोवाइड नहीं किया जाता.

उपयोगकर्ता, CSV फ़ाइल के अलावा कमांड-लाइन पर भी अलग-अलग प्रॉविज़निंग वैल्यू डाल सकता है. ऐसे में, कमांड-लाइन की वैल्यू, फ़ाइल में मौजूद वैल्यू से ज़्यादा प्राथमिकता पाती है.

फ़ैक्ट्री प्रॉविज़निंग टूल में CSV फ़ाइल फ़ॉर्मैट इस्तेमाल करने की सुविधा, weave टूल के gen-provisioning-data कमांड के आउटपुट के साथ काम करती है.

Nest के प्रॉविज़निंग सर्वर

फ़ैक्ट्री प्रावधान टूल, एचटीटीपीएस प्रोटोकॉल का इस्तेमाल करके, Nest प्रावधान सर्वर से प्रावधान की चुनिंदा जानकारी फ़ेच करता है. प्रोवाइज़न सर्वर प्रोटोकॉल का इस्तेमाल, प्रोवाइज़न सर्वर से मैन्युफ़ैक्चरर से असाइन किया गया Weave डिवाइस सर्टिफ़िकेट, उससे जुड़ी निजी कुंजी, और Weave पेयरिंग कोड फ़ेच करने के लिए किया जा सकता है.

प्रोवाइज़निंग टूल की कमांड लाइन पर बेस यूआरएल डालकर, प्रोवाइज़निंग सर्वर की नेटवर्क लोकेशन तय की जाती है. प्रावधान की जो जानकारी चाहिए उसे कमांड लाइन पर Weave डिवाइस आईडी बताकर चुना जाता है. उदाहरण के लिए:

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

उपयोगकर्ता, प्रोवाइज़निंग सर्वर के यूआरएल के अलावा, कमांड लाइन पर अलग-अलग प्रोवाइज़निंग वैल्यू भी तय कर सकता है. इस मामले में, कमांड लाइन पर दी गई वैल्यू, सर्वर से दिए गए वैल्यू की जगह लागू होती हैं.

फ़ैक्ट्री प्रावधान करने की सुविधा को चालू या बंद करना

डिवाइस फ़र्मवेयर में OpenWeave फ़ैक्ट्री प्रोविज़निंग की सुविधा को WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING कंपाइल-टाइम कॉन्फ़िगरेशन विकल्प से कंट्रोल किया जाता है. यह विकल्प डिफ़ॉल्ट रूप से चालू होता है. इस सुविधा को बंद करने के लिए, ऐप्लिकेशन की WeaveProjectConfig.h फ़ाइल में मौजूद विकल्प को बदलें. उदाहरण के लिए:

#define WEAVE_DEVICE_CONFIG_ENABLE_FACTORY_PROVISIONING 0

आम तौर पर, प्रोडक्शन डिवाइस के फ़र्मवेयर में फ़ैक्ट्री प्रोविज़निंग की सुविधा चालू करना सुरक्षित होता है. हालांकि, इसके लिए ज़रूरी है कि प्रोडक्शन डिवाइसों पर डिवाइस डीबग इंटरफ़ेस को सही तरीके से बंद किया गया हो. ऐसा हार्डवेयर के ज़रिए (उदाहरण के लिए, SoC में फ़्यूज़ ब्लो करके) किया जा सकता है या सॉफ़्टवेयर में (उदाहरण के लिए, किसी सुरक्षित बूट लोडर के ज़रिए जो बूट प्रोसेस के हिस्से के तौर पर डीबग ऐक्सेस को ब्लॉक करता है).

फ़ैक्ट्री प्रॉविज़निंग टूल चलाना

OpenWeave फ़ैक्ट्री प्रॉविज़निंग टूल, इन कमांड लाइन विकल्पों के साथ काम करता है:

विकल्प ब्यौरा
--target <string> टारगेट किए जाने वाले डिवाइस का टाइप. विकल्प: nrf52840, esp32
--load-addr <hex-digits> डिवाइस की मेमोरी में वह पता जहां प्रोविज़निंग डेटा लिखा जाएगा.
--verbose, -v कितने शब्दों में जानकारी दी जाए, इसे सेट करें. ज़्यादा जानकारी देने के लिए, एक से ज़्यादा आर्ग्युमेंट का इस्तेमाल करें.
--serial-num <string> डिवाइस का सीरियल नंबर सेट करें.
--device-id <hex-digits> मैन्युफ़ैक्चरर का दिया गया डिवाइस आईडी सेट करें.
--device-सर्टिफ़िकेट <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> | adaptive | auto J-Link इंटरफ़ेस की स्पीड.
--jlink-sn <string> J-Link प्रोब का सीरियल नंबर.
--esptool-cmd <path-name> esptool कमांड का पाथ. डिफ़ॉल्ट रूप से, 'esptool.py' पर सेट होता है.
--port <path-name> ESP32 के लिए COM पोर्ट डिवाइस का नाम. डिफ़ॉल्ट रूप से, /tty/USB0 पर सेट होता है.
--स्पीड <integer> COM पोर्ट के लिए बॉड रेट. डिफ़ॉल्ट रूप से, यह 115200 पर सेट होती है.
--prov-csv-file <file-name> डिवाइस की जानकारी देने वाली CSV फ़ाइल से, डिवाइस की जानकारी का डेटा पढ़ें.
--prov-server <url> डिवाइस के प्रावधान का डेटा, प्रावधान करने वाले सर्वर से पढ़ना.
--disable-server-validation एचटीटीपीएस का इस्तेमाल करते समय, प्रोवाइज़निंग सर्वर से मिले सर्टिफ़िकेट की पुष्टि करने की सुविधा बंद करें.

उदाहरण

यह कमांड, डिवाइस आईडी, सीरियल नंबर, प्रॉडक्ट रिविज़न, और पेयरिंग कोड को खास वैल्यू पर सेट करता है. मैन्युफ़ैक्चर की तारीख, मौजूदा तारीख पर सेट है. साथ ही, डिवाइस सर्टिफ़िकेट और निजी पासकोड, openweave-core सोर्स रिपॉज़िटरी के साथ दी गई CSV फ़ाइल में दी गई वैल्यू की जांच करने के लिए सेट किए जाते हैं.

./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