Skip to content

Commit 0f49014

Browse files
committed
Merge branch 'task/claim_workflow_update' into 'master'
cli: Maintain same host driven claiming workflow for all platforms See merge request app-frameworks/esp-rainmaker!156
2 parents 04adf40 + 1c18b08 commit 0f49014

File tree

3 files changed

+31
-144
lines changed

3 files changed

+31
-144
lines changed

cli/rainmaker.py

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,10 +145,6 @@ def main():
145145
type=str,
146146
help='Node MAC address in the format AABBCC112233.')
147147

148-
claim_parser.add_argument("--secret-key", metavar='<secret-key>',
149-
type=str,
150-
help='Unique secret key read from the efuse in the format 009b77a8a38d989e9e5c3ddd790cc619.\nRequired for esp32s2 only.')
151-
152148
claim_parser.add_argument("--addr", metavar='<flash-address>',
153149
help='Address in the flash memory where the claim data will be written.\nDefault: 0x340000')
154150
claim_parser.set_defaults(func=claim_node, parser=claim_parser)

cli/rmaker_cmd/node.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -287,15 +287,13 @@ def claim_node(vars=None):
287287
:rtype: None
288288
"""
289289
try:
290-
if not vars['port'] and not vars['mac'] and not vars['platform'] and not vars['secret_key'] and not vars['addr']:
290+
if not vars['port'] and not vars['mac'] and not vars['addr'] and not vars['platform']:
291291
sys.exit(vars['parser'].print_help())
292292
if vars['addr'] and not vars['port'] and not vars['platform']:
293293
sys.exit('Invalid. <port> or --platform argument is needed.')
294-
if (vars['secret_key']) and not vars['platform']:
295-
sys.exit('Invalid. --platform argument is missing.')
296294
if vars['port']:
297-
if not vars['mac'] and not vars['platform'] and not vars['secret_key']:
298-
claim(port=vars['port'], node_platform=vars['platform'], mac_addr=vars['mac'], secret_key=vars['secret_key'], flash_address=vars['addr'])
295+
if not vars['mac'] and not vars['platform']:
296+
claim(port=vars['port'], node_platform=vars['platform'], mac_addr=vars['mac'], flash_address=vars['addr'])
299297
return
300298
if (vars['mac'] and not vars['platform']):
301299
sys.exit("Invalid. --platform argument needed.")
@@ -304,9 +302,7 @@ def claim_node(vars=None):
304302
if vars['mac']:
305303
if not re.match(r'([0-9A-F]:?){12}', vars['mac']):
306304
sys.exit('Invalid MAC address.')
307-
if vars['platform'].lower() == "esp32" and vars['secret_key']:
308-
sys.exit("Invalid. --secret-key argument not applicable for esp32 platform")
309-
claim(port=vars['port'], node_platform=vars['platform'], mac_addr=vars['mac'], secret_key=vars['secret_key'], flash_address=vars['addr'])
305+
claim(port=vars['port'], node_platform=vars['platform'], mac_addr=vars['mac'], flash_address=vars['addr'])
310306
except Exception as claim_err:
311307
log.error(claim_err)
312308
return

cli/rmaker_tools/rmaker_claim/claim.py

Lines changed: 27 additions & 132 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,15 @@ def get_node_platform_and_mac(port):
9494
:param port: Serial Port
9595
:type port: str
9696
97-
:return: Node Platform and Mac Address on Success
97+
:return: Node Platform and MAC Address on Success
9898
:rtype: str
9999
"""
100100
if not port:
101-
sys.exit("<port> argument not provided. Cannot read platform and MAC address from node.")
101+
sys.exit("<port> argument not provided. Cannot read MAC address from node.")
102102
sys.stdout = mystdout = StringIO()
103103
command = ['--port', port, 'chip_id']
104104
log.info("Running esptool command to get node\
105-
platform and mac from device")
105+
platform and mac from device")
106106
esptool.main(command)
107107
sys.stdout = sys.__stdout__
108108
# Finding chip type from output.
@@ -120,57 +120,6 @@ def get_node_platform_and_mac(port):
120120
log.debug("Node platform is: " + platform)
121121
return platform, mac_addr
122122

123-
def get_secret_key(port):
124-
"""
125-
Generate Secret Key
126-
127-
:param port: Serial Port
128-
:type port: str
129-
130-
:param esptool: esptool module
131-
:type esptool: module
132-
133-
:return: Secret Key on Success
134-
:rtype: str
135-
"""
136-
if not port:
137-
sys.exit("<port> argument not provided. Cannot read secret_key from node.")
138-
esp = esptool.ESP32S2ROM(port)
139-
esp.connect('default_reset')
140-
for (name, idx, read_addr, _, _) in BLOCKS:
141-
addrs = range(read_addr, read_addr + 32, 4)
142-
secret = "".join(["%08x" % esp.read_reg(addr) for addr in addrs[0:4]])
143-
secret = secret[6:8]+secret[4:6]+secret[2:4]+secret[0:2] +\
144-
secret[14:16]+secret[12:14]+secret[10:12]+secret[8:10] +\
145-
secret[22:24]+secret[20:22]+secret[18:20]+secret[16:18] +\
146-
secret[30:32]+secret[28:30]+secret[26:28]+secret[24:26]
147-
# Verify secret key exists
148-
secret_key_tmp = secret.strip('0')
149-
if not secret_key_tmp:
150-
return False
151-
return secret
152-
153-
def gen_hmac_challenge_resp(secret_key, hmac_challenge):
154-
"""
155-
Generate HMAC Challenge Response
156-
157-
:param secret_key: Secret Key to generate HMAC Challenge Response
158-
:type secret_key: str
159-
160-
:param hmac_challenge: HMAC Challenge received in
161-
esp32s2 claim initate response
162-
:type hmac_challenge: str
163-
164-
:return: HMAC Challenge Response on Success
165-
:rtype: str
166-
"""
167-
h = hmac.HMAC(bytes.fromhex(secret_key),
168-
hashes.SHA512(),
169-
backend=default_backend())
170-
h.update(bytes(hmac_challenge, 'utf-8'))
171-
hmac_challenge_response = binascii.hexlify(h.finalize()).decode()
172-
return hmac_challenge_response
173-
174123
def gen_host_csr(private_key, common_name=None):
175124
"""
176125
Generate Host CSR
@@ -328,51 +277,20 @@ def gen_nvs_partition_bin(dest_filedir, output_bin_filename):
328277
dest_filedir + output_bin_filename)
329278
nvs_partition_gen.generate(nvs_args)
330279

331-
def set_claim_verify_data(claim_init_resp, private_key, mac_addr=None, secret_key=None):
332-
# set claim verify data for node_platform = esp32
333-
if not mac_addr and not secret_key:
334-
# Generate CSR with common_name=node_id received in response
335-
node_id = str(json.loads(
336-
claim_init_resp.text)['node_id'])
337-
print("Generating CSR")
338-
log.info("Generating CSR")
339-
csr = gen_host_csr(private_key, common_name=node_id)
340-
if not csr:
341-
raise Exception("CSR Not Generated. Claiming Failed")
342-
log.info("CSR generated")
343-
claim_verify_data = {"csr": csr}
344-
# Save node id as node info to use while saving claim data
345-
# in csv file
346-
node_info = node_id
347-
else:
348-
# set claim verify data for node_platform = esp32s2
349-
auth_id = str(json.loads(
350-
claim_init_resp.text)['auth_id'])
351-
hmac_challenge = str(json.loads(
352-
claim_init_resp.text)['challenge'])
353-
print("Generating CSR")
354-
log.info("Generating CSR")
355-
csr = gen_host_csr(private_key, common_name=mac_addr)
356-
if not csr:
357-
raise Exception("CSR Not Generated. Claiming Failed")
358-
log.info("CSR generated")
359-
log.info("Generating hmac challenge response")
360-
hmac_challenge_response = gen_hmac_challenge_resp(
361-
secret_key,
362-
hmac_challenge)
363-
hmac_challenge_response = hmac_challenge_response.strip('\n')
364-
log.debug("Secret Key: " + secret_key)
365-
log.debug("HMAC Challenge Response: " +
366-
hmac_challenge_response)
367-
claim_verify_data = {"auth_id":
368-
auth_id,
369-
"challenge_response":
370-
hmac_challenge_response,
371-
"csr":
372-
csr}
373-
# Save mac addr as node info to use while saving claim data
374-
# in csv file
375-
node_info = mac_addr
280+
def set_claim_verify_data(claim_init_resp, private_key):
281+
# Generate CSR with common_name=node_id received in response
282+
node_id = str(json.loads(
283+
claim_init_resp.text)['node_id'])
284+
print("Generating CSR")
285+
log.info("Generating CSR")
286+
csr = gen_host_csr(private_key, common_name=node_id)
287+
if not csr:
288+
raise Exception("CSR Not Generated. Claiming Failed")
289+
log.info("CSR generated")
290+
claim_verify_data = {"csr": csr}
291+
# Save node id as node info to use while saving claim data
292+
# in csv file
293+
node_info = node_id
376294
return claim_verify_data, node_info
377295

378296
def set_claim_initiate_data(mac_addr, node_platform):
@@ -448,7 +366,7 @@ def claim_initiate(claim_init_data, header):
448366
log.error("Please check the Internet connection.")
449367
exit(0)
450368

451-
def start_claim_process(node_platform, mac_addr, private_key, secret_key=None):
369+
def start_claim_process(mac_addr, node_platform, private_key):
452370
log.info("Creating session")
453371
curr_session = session.Session()
454372
header = curr_session.request_header
@@ -460,10 +378,7 @@ def start_claim_process(node_platform, mac_addr, private_key, secret_key=None):
460378
claim_init_resp = claim_initiate(claim_init_data, header)
461379

462380
# Set claim verify data
463-
if node_platform == "esp32":
464-
claim_verify_data, node_info = set_claim_verify_data(claim_init_resp, private_key)
465-
else:
466-
claim_verify_data, node_info = set_claim_verify_data(claim_init_resp, private_key, mac_addr=mac_addr, secret_key=secret_key)
381+
claim_verify_data, node_info = set_claim_verify_data(claim_init_resp, private_key)
467382

468383
# Perform claim verify request
469384
claim_verify_resp = claim_verify(claim_verify_data, header)
@@ -497,12 +412,6 @@ def generate_private_key():
497412
encryption_algorithm=serialization.NoEncryption())
498413
return private_key, private_key_bytes
499414

500-
def verify_secret_key_exists(secret_key):
501-
secret_key_tmp = secret_key.strip('0')
502-
if not secret_key_tmp:
503-
return False
504-
return True
505-
506415
def verify_mac_dir_exists(creds_dir, mac_addr):
507416
mac_dir = Path(path.expanduser(str(creds_dir) + '/' + mac_addr))
508417
if mac_dir.exists():
@@ -622,18 +531,19 @@ def set_csv_file_data(dest_filedir):
622531
]
623532
return node_info_csv
624533

625-
def validate_secret_key(secret_key):
626-
if not re.match(r'([0-9a-f]){32}', secret_key):
627-
return False
628-
return True
629-
630-
def claim(port=None, node_platform=None, mac_addr=None, secret_key=None, flash_address=None):
534+
def claim(port=None, node_platform=None, mac_addr=None, flash_address=None):
631535
"""
632536
Claim the node connected to the given serial port
633537
(Get cloud credentials)
634538
635539
:param port: Serial Port
636540
:type port: str
541+
542+
:param mac_addr: MAC Addr
543+
:type mac_addr: str
544+
545+
:param flash_address: Flash Address
546+
:type flash_address: str
637547
638548
:raises Exception: If there is an HTTP issue while claiming
639549
SSLError: If there is an issue in SSL certificate validation
@@ -646,7 +556,6 @@ def claim(port=None, node_platform=None, mac_addr=None, secret_key=None, flash_a
646556
node_info = None
647557
private_key = None
648558
hex_str = None
649-
secret_key_valid = None
650559
claim_data_binary_exists = False
651560
dest_filedir = None
652561
output_bin_filename = None
@@ -660,13 +569,6 @@ def claim(port=None, node_platform=None, mac_addr=None, secret_key=None, flash_a
660569
# Get node platform and mac addr if not provided
661570
if not node_platform and not mac_addr:
662571
node_platform, mac_addr = get_node_platform_and_mac(port)
663-
# Node platform detected is esp32s2
664-
if node_platform not in ["esp32"]:
665-
# Get secret key
666-
secret_key = get_secret_key(port)
667-
# Set platform to esp32 if node does not have secret key
668-
if not secret_key:
669-
node_platform="esp32"
670572

671573
# Verify mac directory exists
672574
dest_filedir, output_bin_filename = verify_mac_dir_exists(creds_dir, mac_addr)
@@ -698,13 +600,6 @@ def claim(port=None, node_platform=None, mac_addr=None, secret_key=None, flash_a
698600
flash_existing_data(port, nvs_bin_filename, flash_address)
699601
return
700602

701-
if node_platform not in ["esp32"]:
702-
if not secret_key:
703-
sys.exit("Invalid. --secret-key argument needed for platform {}.".format(node_platform))
704-
secret_key_valid = validate_secret_key(secret_key)
705-
if not secret_key_valid:
706-
sys.exit('Invalid Secret Key.')
707-
708603
start = time.time()
709604

710605
# Generate private key
@@ -714,7 +609,7 @@ def claim(port=None, node_platform=None, mac_addr=None, secret_key=None, flash_a
714609
log.info("Claiming process started. This may take time.")
715610

716611
# Start claim process
717-
node_info, node_cert = start_claim_process(node_platform, mac_addr, private_key, secret_key=secret_key)
612+
node_info, node_cert = start_claim_process(mac_addr, node_platform, private_key)
718613

719614
# Get MQTT endpoint
720615
endpointinfo = get_mqtt_endpoint()

0 commit comments

Comments
 (0)