blob: c71bd97b05139dc44653b1279c7f794f72816169 [file] [log] [blame]
#
# Copyright 2019,2020 NXP
# SPDX-License-Identifier: Apache-2.0
#
import os
import sys
from . import Provision_config
import sss.sss_api as apis
import sss.const as const
import sss.connect as connect
import sss.session as session
import sss.util as util
import sss.setkey as setkey
from sss.refkey import RefPem
from sss.se05x import Se05x
from sss.a71ch import A71CH
import logging
log = logging.getLogger(__name__)
logging.basicConfig(format='%(message)s', level=logging.INFO)
STATUS_SUCCESS = 0
STATUS_FAIL = -1
def session_open():
''' Open session '''
if Provision_config.CONNECTION_METHOD == 't1oi2c' or Provision_config.CONNECTION_METHOD == 'sci2c':
port_data = "none"
else:
if len(sys.argv) >= 2:
port_data = sys.argv[1]
else:
log.info('Please provide <COM_PORT>')
log.info('Usage Example:\n %s COM5' % sys.argv[0])
return None
log.info("###############################################################")
log.info("#")
log.info("# SUBSYSTEM : %s" % Provision_config.SUBSYSTEM)
log.info("# CONNECTION_TYPE : %s" % Provision_config.CONNECTION_METHOD)
log.info("# CONNECTION_PARAMETER : %s" % port_data)
log.info("#")
log.info("###############################################################")
if os.path.isfile(util.get_session_pkl_path()):
connect.do_close_session()
connect.do_open_session(const.SUBSYSTEM_TYPE[Provision_config.SUBSYSTEM],
const.CONNECTION_TYPE[Provision_config.CONNECTION_METHOD], port_data)
session_obj = session.Session()
session_obj.session_open()
return session_obj
def session_close(session):
''' Close opened session. '''
if session:
session.session_close()
if os.path.isfile(util.get_session_pkl_path()):
connect.do_close_session()
def get_unique_id(session_obj):
''' get Device UID'''
if session_obj.subsystem == apis.kType_SSS_SE_SE05x:
se05x_obj = Se05x(session_obj)
unique_id = se05x_obj.get_cert_unique_id()
elif session_obj.subsystem == apis.kType_SSS_SE_A71CH:
a71ch_obj = A71CH(session_obj)
unique_id = a71ch_obj.get_unique_id()
else:
log.error("Unsupported Subsystem.!!")
unique_id = 0
return int(unique_id, 16)
def reset(session):
''' Reset the Secure Module to the initial state. '''
if session.subsystem == apis.kType_SSS_SE_SE05x:
se05x_obj = Se05x(session)
se05x_obj.debug_reset()
elif session.subsystem == apis.kType_SSS_SE_A71CH:
a71ch_obj = A71CH(session)
a71ch_obj.debug_reset()
def refpem_ecc(session, keyid, file_name):
''' Creates reference PEM file for ECC Pair.
keyid = 32bit Key ID. Should be in hex format. Example: 20E8A001 \n
filename = File name to store reference key. Can be in PEM or DER or PKCS12 format based on file extension.
By default filename with extension .pem in PEM format, .pfx or .p12 in PKCS12 format and others in DER format.
'''
log.info("Creating ECC Reference key from key ID: 0x%x" % (keyid,))
refpem_obj = RefPem(session)
status = refpem_obj.do_ecc_refpem_pair(keyid, file_name)
if status != apis.kStatus_SSS_Success:
log.error("Refpem creation failed..!")
session_close(session)
return status
log.info("Successfully Created reference key at: %s" % (file_name, ))
return status
def set_ecc_pair(session, keyid, client_key):
''' Set ECC Key pair to the Secure Module \n
keyid = 32bit Key ID. Should be in hex format. Example: 20E8A001 \n
key = Can be raw key (DER format) or in file.
For file, by default filename with extension .pem considered as PEM format and others as DER format.\n
'''
log.info("key pair file: %s" % (client_key,))
log.info("Injecting ECC key pair at key ID: 0x%x" % (keyid,))
set_obj = setkey.Set(session)
status = set_obj.do_set_ecc_key_pair(keyid, client_key, None)
if status != apis.kStatus_SSS_Success:
log.error("Injecting ECC key pair failed..!")
session_close(session)
return status
log.info("Successfully Injected ECC key pair.")
return status
def set_cert(session, keyid, cert):
''' Inject Certificate to the Secure Module
keyid = 32bit Key ID. Should be in hex format. Example: 20E8A001 \n
key = Can be raw certificate (DER format) or in file.
For file, by default filename with extension .pem and .cer considered as PEM format and others as DER format.\n
'''
log.info("certificate file: %s" % (cert,))
log.info("Injecting certificate at key ID: 0x%x" % (keyid,))
set_obj = setkey.Set(session)
status = set_obj.do_set_cert(keyid, cert, None)
if status != apis.kStatus_SSS_Success:
log.error("Injecting certificate failed..!")
session_close(session)
return status
log.info("Successfully Injected certificate.")
return status