| # |
| # 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 |