FactoryDataProvider
for EFR32 Matter device#
Introduction#
The python FactoryDataProvider.py
script allows a user to store a set of
commissionable data in the matter nvm3 section of an EFR32 device. This script
can handle writing to any MCU EFR32MG12 or EFR32MG24 family.
Prerequisites#
The users need to have in their hands a valid and matching set of spake2p+ credentials:
Setup Discriminator
Setup Passcode
Spake2p Iteration count
Spake2p Salt
and one of the following:
Spake2p Verifier
or
path to spake2p generator binary
You can use this same spake2p generator to randomly generate a set of credentials or generate your a verifier based on the given Passcode, Iteration count and Salt.
More info on the Spake2p generator and how to build it can be found here Spake2p
How to use FactoryDataProvider.py
#
Using Python 3 call the FactoryDataProvider
script and provide the needed
arguments. The script will validate the received data and if the device is
connected to the host, write the data in the right nvm3 location.
If the device is not connected, The script will generate an image that can be flashed to your device at a later time but you must provide the MCU family name. (EFR32MG12 or EFR32MG24).
If you have more than one device connected to the host. Provide the J-tag serial number to ensure you are writing to the right device.
Arguments |
Conformance |
Type |
Description |
---|---|---|---|
–discriminator |
Required |
dec/hex |
Provide BLE pairing discriminator. e.g: 3840 or 0xF00. |
–passcode |
Required |
dec/hex |
Provide the default PASE session passcode used to generate the spake2p verifier. |
–spake2_iteration |
Required |
dec/hex |
Provide Spake2+ iteration count used to generate the spake2p verifier. |
–spake2_salt |
Required |
string1 |
Provide Spake2+ salt used to generate the spake2p verifier. |
–spake2_verifier |
optional2 |
string1 |
Provide The pre-generated Spake2+ verifier. |
–gen_spake2p_path |
optional2 |
string |
Provide the absolute path to spake2p generator. |
–mcu_family |
optional |
string |
MCU Family target. Only needed if your board isn’t plugged in (EFR32MG12 or EFR32MG24). |
–jtag_serial |
optional |
string |
Provide the serial number of the jtag if you have more than one board connected. |
–product_id |
optional |
dec/hex |
Provide the product ID. e.g: 32773 or 0x8005 (Max 2 bytes). |
–vendor_id |
optional |
dec/hex |
Provide the vendor ID. e.g: 65521 or 0xFFF1 (Max 2 bytes). |
–product_name |
optional |
string |
Provide the product name (Max 32 char). |
–vendor_name |
optional |
string |
Provide the vendor name (Max 32 char). |
–hw_version |
optional |
dec/hex |
Provide the hardware version value (Max 2 bytes). |
–hw_version_str |
optional |
string |
Provide the hardware version string (Max 64 char). |
–unique_id |
optional |
Hex string |
A 128 bits hex string unique id (without 0x). |
–serial_number |
optional |
string |
Provide serial number of the device (Max 32 char). |
–commissioning_flow |
optional |
dec/hex |
Provide Commissioning Flow 0=Standard, 1=User Action, 2=Custom. |
–rendezvous_flag |
optional |
dec/hex |
Provide Rendez-vous flag: 1=SoftAP, 2=BLE 4=OnNetwork (Can be combined). |
1 Salt and verifier must be provided as base64 string
2 You need to provide either a pre-generated spake2_verifier or path to the spake2p generator to generate the verifier
For the hex type, provide the value with the 0x
prefix. For hex string type,
do not add the 0x
prefix.
e.g:
# With spake2_verifier
python3 FactoryDataProvider.py --passcode 20202021 --discriminator 0xf00 --spake2_iteration 1000 --spake2_salt U1BBS0UyUCBLZXkgU2FsdA== --spake2_verifier uWFwqugDNGiEck/po7KHwwMwwqZgN10XuyBajPGuyzUEV/iree4lOrao5GuwnlQ65CJzbeUB49s31EH+NEkg0JVI5MGCQGMMT/SRPFNRODm3wH/MBiehuFc6FJ/NH6Rmzw==
# With gen_spake2p_path
python3 FactoryDataProvider.py --passcode 62034001 --discriminator 0xf01 --spake2_iteration 15000 --spake2_salt 95834coRGvFhCB69IdmJyr5qYIzFgSirw6Ja7g5ySYA= --gen_spake2p_path /Users/GitHub/connectedhomeip/src/tools/spake2p/out/spake2p