blob: 71c31b4dc6d5fc9b2b2907b4f0556f9783178880 [file] [log] [blame]
#
# Copyright 2019 NXP
# SPDX-License-Identifier: Apache-2.0
#
"""
Provision attached secure element with RSA keys
This example generates a complete set of RSA key files (*.pem) (existing ones overwritten).
Performs debug reset the attached secure element.
Attached secure element provisioned with RSA key.
Creates reference key from the injected RSA key.
"""
import argparse
import sss.sss_api as apis
from func_timeout import *
from openssl_util import *
example_text = '''
Example invocation::
python %s --key_type rsa1024
python %s --key_type rsa2048 --connection_data 169.254.0.1:8050
python %s --key_type rsa2048 --connection_data 127.0.0.1:8050 --connection_type jrcpv2
python %s --key_type rsa2048 --connection_data COM3
''' % (__file__, __file__, __file__, __file__,)
def parse_in_args():
parser = argparse.ArgumentParser(
description=__doc__, epilog=example_text,
formatter_class=argparse.RawTextHelpFormatter)
required = parser.add_argument_group('required arguments')
optional = parser.add_argument_group('optional arguments')
required.add_argument(
'--key_type',
default="",
help='Supported key types => ``%s``' % ("``, ``".join(SUPPORTED_RSA_KEY_TYPES)), required=True)
optional.add_argument(
'--connection_type',
default="t1oi2c",
help='Supported connection types => ``%s``. Default: ``t1oi2c``' % ("``, ``".join(SUPPORTED_CONNECTION_TYPES)))
optional.add_argument(
'--connection_data',
default="none",
help='Parameter to connect to SE => eg. ``COM3``, ``127.0.0.1:8050``, ``none``. Default: ``none``')
optional.add_argument(
'--subsystem',
default="se05x",
help='Supported subsystem => ``se05x``, ``mbedtls``. Default: ``se05x``')
optional.add_argument(
'--auth_type',
default="None",
help='Supported subsystem => ``None``, ``PlatformSCP``, ``UserID``, ``ECKey``, ``AESKey``, '
'``UserID_PlatformSCP``, ``ECKey_PlatformSCP``, ``AESKey_PlatformSCP``. Default: ``None``')
optional.add_argument(
'--scpkey',
default="None",
help='')
optional.add_argument(
'--no_reset',
action="store_true",
help="do not reset contents of attached secure element")
if len(sys.argv) == 1:
parser.print_help(sys.stderr)
return None
args = parser.parse_args()
if args.key_type not in SUPPORTED_RSA_KEY_TYPES:
parser.print_help(sys.stderr)
return None
if args.auth_type not in ["None", "PlatformSCP", "UserID", "ECKey", "AESKey", "UserID_PlatformSCP", "ECKey_PlatformSCP", "AESKey_PlatformSCP"]:
parser.print_help(sys.stderr)
return None
if args.connection_data.find(':') >= 0:
port_data = args.connection_data.split(':')
jrcp_host_name = port_data[0]
jrcp_port = port_data[1]
os.environ['JRCP_HOSTNAME'] = jrcp_host_name
os.environ['JRCP_PORT'] = jrcp_port
log.info("JRCP_HOSTNAME: %s" % jrcp_host_name)
log.info("JRCP_PORT: %s" % jrcp_port)
if args.connection_type == "t1oi2c":
args.connection_type = "jrcpv1"
elif args.connection_data.find('COM') >= 0:
if args.connection_type == "t1oi2c":
args.connection_type = "vcom"
elif args.connection_data.find('none') >= 0:
pass
else:
parser.print_help(sys.stderr)
return None
if args.connection_type not in SUPPORTED_CONNECTION_TYPES:
parser.print_help(sys.stderr)
return None
if args.subsystem not in ["se05x", "mbedtls"]:
parser.print_help(sys.stderr)
return None
return args
def main():
key_id = 0x6DCCBB11
args = parse_in_args()
if args is None:
return
keys_dir = os.path.join(cur_dir, '..', 'keys', args.key_type)
key_size = args.key_type.replace("rsa", "")
if not os.path.exists(keys_dir):
os.mkdir(keys_dir)
rsa_key_pair = keys_dir + os.sep + "rsa_" + key_size + "_1_prv.pem"
rsa_ref_key_pair = keys_dir + os.sep + "rsa_" + key_size + "_ref_prv.pem"
run("%s genrsa -out %s %d" % (openssl, rsa_key_pair, int(key_size)))
session_close(None)
session = session_open(args.subsystem, args.connection_data, args.connection_type, args.auth_type, args.scpkey)
if session is None:
return
if not args.no_reset:
reset(session)
# Inject rsa key pair into the Secure Element
status = set_rsa_pair(session, key_id, rsa_key_pair)
if status != apis.kStatus_SSS_Success:
return
# Generate Reference key from the key injected. Store it in file referred by "rsa_ref_key_pair" variable.
status = refpem_rsa(session, key_id, rsa_ref_key_pair)
if status != apis.kStatus_SSS_Success:
return
session_close(session)
log.info("##############################################################")
log.info("# #")
log.info("# Program completed successfully #")
log.info("# #")
log.info("##############################################################")
if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG)
func_timeout(180, main, None) # Time out set to 3 minutes.