blob: 7f8430946d7e2d7f629b94c1b900ae8dc1ec0662 [file] [log] [blame]
#
# Copyright 2018-2020 NXP
# SPDX-License-Identifier: Apache-2.0
#
#
"""License text"""
import ctypes
import logging
from .keystore import KeyStore
from .keyobject import KeyObject
from . import sss_api as apis
from .util import save_to_file
log = logging.getLogger(__name__)
class Get: # pylint: disable=too-few-public-methods
"""
Retrieve key operation
"""
def __init__(self, session_obj):
"""
Constructor
:param session_obj: Instance of session
"""
self._session = session_obj
self.key = None
self.curve_id = 0
# key size to support long length
self.key_size = 20000
self.key_type = None
self.ctx_ks = KeyStore(self._session)
self.ctx_key = KeyObject(self.ctx_ks)
def get_key(self, key_id, file_name=None, encode_format=""):
"""
Retrieve public key or certificate
:param key_id: Key index
:param file_name: File name to store key or certificate
:param encode_format: Encode format to store key
:return: Status
"""
status, self.key_type, cipher_type = self.ctx_key.get_handle(key_id) # pylint: disable=unused-variable
if status != apis.kStatus_SSS_Success:
return status
if self.key_type is None:
log.error("Received object type is None")
return apis.kStatus_SSS_Fail
if self._session.subsystem == apis.kType_SSS_SE_SE05x:
self.curve_id = self.ctx_key.keyobject.curve_id
else:
self.curve_id = 0
data_len = int(self.key_size / 8)
key = (ctypes.c_uint8 * data_len)(0)
data_len_ctype = ctypes.c_size_t(data_len)
key_size_ctype = ctypes.c_size_t(self.key_size)
status = self.ctx_ks.get_key(self.ctx_key, key, data_len_ctype, key_size_ctype)
key_list = list(key)
self.key = key_list[:int(data_len_ctype.value)]
self.key_size = data_len_ctype.value * 8
if file_name is not None and status == apis.kStatus_SSS_Success:
status = save_to_file(self.key, file_name, self.key_type, encode_format, cipher_type)
return status