Skip to content

Commit 38ac973

Browse files
committed
Added the wrapper cmake script
1 parent a6b515d commit 38ac973

File tree

3 files changed

+69
-113
lines changed

3 files changed

+69
-113
lines changed

config/esp32/components/chip/factory.cmake

+38-45
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
# limitations under the License.
1515
#
1616

17+
include(${CMAKE_CURRENT_LIST_DIR}/factory_wrapper.cmake)
18+
1719
function(generate_build_time_partition fctry_partition esp_secure_cert_partition chip_root)
1820
set(options FLASH_IN_PROJECT)
1921
set(multi DEPENDS)
@@ -34,31 +36,19 @@ function(generate_build_time_partition fctry_partition esp_secure_cert_partition
3436
message(STATUS "secure_cert_partition_offset : ${secure_cert_partition_offset}")
3537

3638
if("${fctry_partition_size}" AND "${fctry_partition_offset}")
37-
set(DEFAULT_DEVICE_NAME "My bulb")
38-
set(DEFAULT_VENDOR_NAME "Test-vendor")
39-
set(DEFAULT_HARDWARE_VERSION 1)
40-
set(DEFAULT_HARDWARE_VERSION_STR "Devkit")
41-
set(DEFAULT_VENDOR_ID 0xFFF2)
42-
set(DEFAULT_PRODUCT_ID 0x8001)
43-
set(DEFAULT_DAC_CERT "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Cert.der")
44-
set(DEFAULT_DAC_KEY "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Key.der")
45-
set(DEFAULT_PAI_CERT "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-PAI-FFF2-8001-Cert.der")
46-
set(DEFAULT_CERT_DCLRN "${chip_root_abs_path}/credentials/test/certification-declaration/Chip-Test-CD-FFF2-8001.der")
47-
set(DEFAULT_PASSCODE 20202020)
48-
set(DEFAULT_DISCRIMINATOR 3841)
49-
50-
set(DEVICE_NAME ${DEFAULT_DEVICE_NAME} CACHE STRING "My bulb")
51-
set(VENDOR_NAME ${DEFAULT_VENDOR_NAME} CACHE STRING "Test-vendor")
52-
set(HARDWARE_VERSION ${DEFAULT_HARDWARE_VERSION} CACHE STRING 1)
53-
set(HARDWARE_VERSION_STR ${DEFAULT_HARDWARE_VERSION_STR} CACHE STRING "Devkit")
54-
set(VENDOR_ID ${DEFAULT_VENDOR_ID} CACHE STRING 0xFFF2)
55-
set(PRODUCT_ID ${DEFAULT_PRODUCT_ID} CACHE STRING 0x8001)
56-
set(DAC_CERT ${DEFAULT_DAC_CERT} CACHE STRING "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Cert.der")
57-
set(DAC_KEY ${DEFAULT_DAC_KEY} CACHE STRING "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Key.der")
58-
set(PAI_CERT ${DEFAULT_PAI_CERT} CACHE STRING "${chip_root_abs_path}/credentials/test/attestation/Chip-Test-PAI-FFF2-8001-Cert.der")
59-
set(CERT_DCLRN ${DEFAULT_CERT_DCLRN} CACHE STRING "${chip_root_abs_path}/credentials/test/certification-declaration/Chip-Test-CD-FFF2-8001.der")
60-
set(PASSCODE ${DEFAULT_PASSCODE} CACHE STRING 20202020)
61-
set(DISCRIMINATOR ${DEFAULT_DISCRIMINATOR} CACHE STRING 3841)
39+
40+
set_values()
41+
42+
set(PREVIOUS_VALUES_FILE "${CMAKE_BINARY_DIR}/previous_values.txt")
43+
44+
if (NOT EXISTS ${PREVIOUS_VALUES_FILE})
45+
file(WRITE ${PREVIOUS_VALUES_FILE} "")
46+
endif()
47+
48+
file(READ ${PREVIOUS_VALUES_FILE} PREVIOUS_VALUES)
49+
50+
set(CURRENT_VALUES_STRING
51+
"${DEVICE_NAME}${VENDOR_NAME}${DISCRIMINATOR}${PASSCODE}${VENDOR_ID}${PRODUCT_ID}${HARDWARE_VERSION}${HARDWARE_VERSION_STR}${DAC_CERT}${DAC_KEY}${PAI_CERT}${CERT_DCLRN}")
6252

6353
message(STATUS "Bulb Name: ${DEVICE_NAME}")
6454
message(STATUS "Vendor Name: ${VENDOR_NAME}")
@@ -73,26 +63,29 @@ function(generate_build_time_partition fctry_partition esp_secure_cert_partition
7363
message(STATUS "Passcode: ${PASSCODE}")
7464
message(STATUS "Discriminator: ${DISCRIMINATOR}")
7565

76-
77-
# Execute Factory partition image generation; this always executes as there is no way to specify for CMake to watch for
78-
# contents of the base dir changing.
79-
add_custom_target(build_time_partition ALL
80-
COMMAND ${generate_esp32_chip_factory_bin.py} -d ${DISCRIMINATOR}
81-
-p ${PASSCODE}
82-
--product-name "${DEVICE_NAME}"
83-
--vendor-name "${VENDOR_NAME}"
84-
--vendor-id ${VENDOR_ID}
85-
--product-id ${PRODUCT_ID}
86-
--hw-ver ${HARDWARE_VERSION}
87-
--hw-ver-str "${HARDWARE_VERSION_STR}"
88-
--dac-cert ${DAC_CERT}
89-
--dac-key ${DAC_KEY}
90-
--pai-cert ${PAI_CERT}
91-
--cd ${CERT_DCLRN}
92-
--dac-in-secure-cert
93-
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
94-
)
95-
66+
if (NOT "${CURRENT_VALUES_STRING}" STREQUAL "${PREVIOUS_VALUES}")
67+
message(STATUS "Values have changed. Triggering add_custom_target.")
68+
add_custom_target(build_time_partition ALL
69+
COMMAND ${generate_esp32_chip_factory_bin.py} -d ${DISCRIMINATOR}
70+
-p ${PASSCODE}
71+
--product-name "${DEVICE_NAME}"
72+
--vendor-name "${VENDOR_NAME}"
73+
--vendor-id ${VENDOR_ID}
74+
--product-id ${PRODUCT_ID}
75+
--hw-ver ${HARDWARE_VERSION}
76+
--hw-ver-str "${HARDWARE_VERSION_STR}"
77+
--dac-cert ${DAC_CERT}
78+
--dac-key ${DAC_KEY}
79+
--pai-cert ${PAI_CERT}
80+
--cd ${CERT_DCLRN}
81+
--dac-in-secure-cert
82+
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
83+
)
84+
file(WRITE ${PREVIOUS_VALUES_FILE} ${CURRENT_VALUES_STRING})
85+
else()
86+
add_custom_target(build_time_partition)
87+
message(STATUS "Values have not changed. Skipping add_custom_target.")
88+
endif()
9689

9790
set(factory_partition_bin ${CMAKE_BINARY_DIR}/bin/factory_partition.bin)
9891
set(esp_secure_cert_partition_bin ${CMAKE_BINARY_DIR}/bin/esp_secure_cert_partititon.bin)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Function to set variable with default value if not defined
2+
3+
4+
function(set_default_value VAR DEFAULT_VALUE)
5+
if (NOT DEFINED ${VAR})
6+
set(${VAR} ${DEFAULT_VALUE} CACHE STRING ${VAR})
7+
endif()
8+
endfunction()
9+
10+
11+
function(set_values)
12+
# Set variables with default values if not defined
13+
set_default_value(DEVICE_NAME "My bulb")
14+
set_default_value(VENDOR_NAME "Test-vendor")
15+
set_default_value(DISCRIMINATOR 3841)
16+
set_default_value(PASSCODE 20202020)
17+
set_default_value(VENDOR_ID 0xFFF2)
18+
set_default_value(PRODUCT_ID 0x8001)
19+
set_default_value(HARDWARE_VERSION 1)
20+
set_default_value(HARDWARE_VERSION_STR "Devkit")
21+
set_default_value(DAC_CERT "${CHIP_ROOT}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Cert.der")
22+
set_default_value(DAC_KEY "${CHIP_ROOT}/credentials/test/attestation/Chip-Test-DAC-FFF2-8001-0008-Key.der")
23+
set_default_value(PAI_CERT "${CHIP_ROOT}/credentials/test/attestation/Chip-Test-PAI-FFF2-8001-Cert.der")
24+
set_default_value(CERT_DCLRN "${CHIP_ROOT}/credentials/test/certification-declaration/Chip-Test-CD-FFF2-8001.der")
25+
endfunction()

scripts/tools/generate_esp32_chip_factory_bin.py

+6-68
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,12 @@
1818

1919
import argparse
2020
import base64
21-
import csv
2221
import enum
23-
import hashlib
24-
import json
2522
import logging
2623
import os
27-
import pyqrcode
2824
import sys
29-
3025
from types import SimpleNamespace
26+
3127
import cryptography.x509
3228
from bitarray import bitarray
3329
from bitarray.util import ba2int
@@ -36,8 +32,6 @@
3632
CHIP_TOPDIR = os.path.dirname(os.path.realpath(__file__))[:-len(os.path.join('scripts', 'tools'))]
3733
sys.path.insert(0, os.path.join(CHIP_TOPDIR, 'scripts', 'tools', 'spake2p'))
3834
from spake2p import generate_verifier # noqa: E402 isort:skip
39-
sys.path.insert(0,os.path.join(CHIP_TOPDIR, 'src', 'setup_payload','python'))
40-
from generate_setup_payload import SetupPayload, CommissioningFlow
4135

4236
if os.getenv('IDF_PATH'):
4337
sys.path.insert(0, os.path.join(os.getenv('IDF_PATH'),
@@ -54,13 +48,11 @@
5448

5549
TOOLS = {}
5650

51+
5752
FACTORY_PARTITION_CSV = 'nvs_partition.csv'
5853
FACTORY_PARTITION_BIN = 'factory_partition.bin'
5954
NVS_KEY_PARTITION_BIN = 'nvs_key_partition.bin'
6055
ESP_SECURE_CERT_PARTITION_BIN = 'esp_secure_cert_partititon.bin'
61-
CONFIG_FILE = 'config.json'
62-
ONBOARDING_DATA_FILE = 'onboarding_codes.csv'
63-
QROCDE_FILE = 'qrcode.png'
6456

6557
FACTORY_DATA = {
6658
# CommissionableDataProvider
@@ -175,25 +167,6 @@
175167
}
176168

177169

178-
def save_config(args):
179-
with open(CONFIG_FILE, 'w') as config_file:
180-
json.dump(vars(args), config_file)
181-
182-
def load_config():
183-
try:
184-
with open(CONFIG_FILE, 'r') as config_file:
185-
return json.load(config_file)
186-
except FileNotFoundError:
187-
return None
188-
189-
def calculate_hash(data):
190-
return hashlib.sha256(data.encode('utf-8')).hexdigest()
191-
192-
193-
def args_changed(current_args, saved_args):
194-
return calculate_hash(json.dumps(vars(current_args))) != calculate_hash(json.dumps(saved_args))
195-
196-
197170
class CalendarTypes(enum.Enum):
198171
Buddhist = 0
199172
Chinese = 1
@@ -629,12 +602,6 @@ def any_base_int(s): return int(s, 0)
629602
help='Do not generate the factory partition binary')
630603
parser.add_argument('--output_dir', type=str, default='bin', help='Created image output file path')
631604

632-
parser.add_argument('-cf', '--commissioning-flow', type=any_base_int, default=0,
633-
help='Device commissioning flow, 0:Standard, 1:User-Intent, 2:Custom. \
634-
Default is 0.', choices=[0, 1, 2])
635-
parser.add_argument('-dm', '--discovery-mode', type=any_base_int, default=1,
636-
help='Commissionable device discovery networking technology. \
637-
0:WiFi-SoftAP, 1:BLE, 2:On-network. Default is BLE.', choices=[0, 1, 2])
638605
parser.set_defaults(generate_bin=True)
639606

640607
return parser.parse_args()
@@ -665,42 +632,13 @@ def generate_factory_partiton_binary(args):
665632
def set_up_out_dirs(args):
666633
os.makedirs(args.output_dir, exist_ok=True)
667634

668-
def generate_onboarding_data(args):
669-
payloads = SetupPayload(args.discriminator, args.passcode, args.discovery_mode, CommissioningFlow(args.commissioning_flow),
670-
args.vendor_id, args.product_id)
671-
logging.info('Discovery mode' + str(args.discovery_mode))
672-
chip_qrcode = payloads.generate_qrcode()
673-
chip_manualcode = payloads.generate_manualcode()
674-
# ToDo: remove this if qrcode tool can handle the standard manual code format
675-
if args.commissioning_flow == CommissioningFlow.Standard:
676-
chip_manualcode = chip_manualcode[:4] + '-' + chip_manualcode[4:7] + '-' + chip_manualcode[7:]
677-
else:
678-
chip_manualcode = '"' + chip_manualcode[:4] + '-' + chip_manualcode[4:7] + '-' + chip_manualcode[7:11] + '\n' + chip_manualcode[11:15] + '-' + chip_manualcode[15:18] + '-' + chip_manualcode[18:20] + '-' + chip_manualcode[20:21] + '"'
679-
680-
logging.info('Generated QR code: ' + chip_qrcode)
681-
logging.info('Generated manual code: ' + chip_manualcode)
682-
683-
csv_data = 'qrcode,manualcode,discriminator,passcode\n'
684-
csv_data += chip_qrcode + ',' + chip_manualcode + ',' + str(args.discriminator) + ',' + str(args.passcode) + '\n'
685-
686-
with open(os.path.join(args.output_dir,ONBOARDING_DATA_FILE), 'w') as f:
687-
f.write(csv_data)
688-
689-
chip_qr = pyqrcode.create(chip_qrcode, version=2, error='M')
690-
chip_qr.png(os.path.join(args.output_dir,QROCDE_FILE), scale=6)
691-
692635

693636
def main():
694-
saved_args = load_config()
695637
args = get_args()
696-
if saved_args is None or args_changed(args, saved_args):
697-
set_up_out_dirs(args)
698-
set_up_factory_data(args)
699-
generate_factory_partiton_binary(args)
700-
generate_onboarding_data(args)
701-
save_config(args)
702-
else:
703-
logging.info("No changes in arguments. Skipping partition generation.")
638+
set_up_out_dirs(args)
639+
set_up_factory_data(args)
640+
generate_factory_partiton_binary(args)
641+
704642

705643
if __name__ == "__main__":
706644
logging.basicConfig(format='[%(asctime)s] [%(levelname)7s] - %(message)s', level=logging.INFO)

0 commit comments

Comments
 (0)