openmv/tools/alif/utils/cert_sb_content_util.py
iabdalkader 0366f67fdd tools/alif: Update SE tools to release 104.
Signed-off-by: iabdalkader <i.abdalkader@gmail.com>
2025-03-08 09:09:22 +01:00

119 lines
5.0 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python3
#
# Copyright (c) 2001-2020, Arm Limited and Contributors. All rights reserved.
#
# SPDX-License-Identifier: BSD-3-Clause OR Arms non-OSI source license
#
# Content certificate structure is :
# FIELD NAME SIZE (words)
# ---------- ------------
# Header token 1
# version number 1
# size in words (offset to signature) 1
# Flags 1
# N Pub key 96
# Np 5
# active SW version 1
# NONCE 2
# signed S/W records(hash + load address + max size + flag) N * (8+3)
# RSA Signature 96
# none-signed S/W records(storage address + actual size) N * (2)
#
import optparse
import configparser
import sys
import os
file_path = os.getcwd()
sys.path.insert(0, os.path.join(file_path, "utils"))
sys.path.append(os.path.join(file_path, "..", ".."))
from common import util_logger
from common import global_defines
from common import certificates
from utils.common_cert_lib.contentcertificateconfig import ContentCertificateConfig
from printInfo import *
# Util's log file
LOG_FILENAME = "sb_content_cert.log"
# find proj.cfg
if "proj.cfg" in os.listdir(sys.path[0]):
PROJ_CONFIG_PATH = os.path.join(sys.path[0], "proj.cfg")
elif "proj.cfg" in os.listdir(sys.path[-1]):
PROJ_CONFIG_PATH = os.path.join(sys.path[-1], "proj.cfg")
else:
PROJ_CONFIG_PATH = os.path.join(os.getcwd(), "proj.cfg")
class ArgumentParser:
def __init__(self):
self.cfg_filename = None
self.log_filename = LOG_FILENAME
self.parser = optparse.OptionParser()
self.parser.add_option("-c")
self.parser.add_option("-l")
def parse_arguments(self, args):
args = self.parser.parse_args(args)
if len(args) > 2 or len(args) < 1:
self.parser.error("incorrect number of positional arguments")
elif len(args) == 2:
self.log_filename = args[0].l
self.cfg_filename = args[0].c
class ContentCertificateGenerator:
def __init__(self, logger, content_cfg, certificate_version):
self.config = content_cfg
self.logger = logger
self.cert_version = certificate_version
self._certificate = None
def create_certificate(self):
if verboseModeGet():
self.logger.info("**** Creating Content Certificate ****")
self._certificate = certificates.ContentArmCertificate(self.config, self.cert_version, self.logger)
serialized_cert_data = self._certificate.certificate_data
with open(self.config.cert_pkg, "wb") as bin_output_file:
bin_output_file.write(serialized_cert_data)
hex_formatted_cert = ["0x%02x" % i for i in list(self._certificate.certificate_data)]
txt_filename = self.config.cert_pkg[:-4] + '_' + global_defines.Cert_FileName + global_defines.Cert_FileExtTxt
with open(txt_filename, "w") as txt_output_file:
txt_output_file.write("char cert_bin_image[] = {\n")
txt_content = "".join([item + ',\n' if ind % 4 == 3 else item + ','
for ind, item in enumerate(hex_formatted_cert)])
txt_output_file.write(txt_content)
txt_output_file.write("}")
def main(args):
if not (sys.version_info.major == 3 and sys.version_info.minor >= 5):
print("The script requires Python3.5 or later!")
sys.exit(-1)
# parse arguments
the_argument_parser = ArgumentParser()
the_argument_parser.parse_arguments(args)
# get logging up and running
the_logger = util_logger.UtilLogger(the_argument_parser.log_filename, "Content Certificate Generation")
# Get the project configuration values
project_config = configparser.ConfigParser()
with open(PROJ_CONFIG_PATH, 'r') as project_config_file:
config_string = '[PROJ-CFG]\n' + project_config_file.read()
project_config.read_string(config_string)
cert_version = [project_config.getint("PROJ-CFG", "CERT_VERSION_MAJOR"),
project_config.getint("PROJ-CFG", "CERT_VERSION_MINOR")]
# get util configuration parameters
content_certificate_config = ContentCertificateConfig(the_argument_parser.cfg_filename, the_logger)
# create certificate
cert_creator = ContentCertificateGenerator(the_logger, content_certificate_config, cert_version)
cert_creator.create_certificate()
if verboseModeGet():
the_logger.info("**** Certificate file creation has been completed successfully ****")