blob: 1f42c744d6039fd18303e998204be89a35178f09 [file] [log] [blame]
/* Copyright 2020 NXP
*
* SPDX-License-Identifier: Apache-2.0
*/
/* ************************************************************************** */
/* Includes */
/* ************************************************************************** */
#include <ex_sss.h>
#include <ex_sss_boot.h>
#include <fsl_sss_se05x_apis.h>
#include <nxEnsure.h>
#include <nxLog_App.h>
#include <se05x_APDU.h>
#include <stdio.h>
/* ************************************************************************** */
/* Local Defines */
/* ************************************************************************** */
#define EC_KEY_BIT_LEN 256
#define EXAMPLE_TRANSIENT_EXPORT_IMPORT_KEY_ID (0xEF00004F)
/* ************************************************************************** */
/* Structures and Typedefs */
/* ************************************************************************** */
/* ************************************************************************** */
/* Global Variables */
/* ************************************************************************** */
static ex_sss_boot_ctx_t gex_sss_export_boot_ctx;
/* ************************************************************************** */
/* Static function declarations */
/* ************************************************************************** */
static const char *FileKeyExportdata = "export_serializedECKey.bin";
static const char *FileSignExportdata = "export_serializedSingedData.bin";
/* ************************************************************************** */
/* Private Functions */
/* ************************************************************************** */
/* ************************************************************************** */
/* Public Functions */
/* ************************************************************************** */
#define EX_SSS_BOOT_PCONTEXT (&gex_sss_export_boot_ctx)
#define EX_SSS_BOOT_DO_ERASE 1
#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0
#include <ex_sss_main_inc.h>
sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx)
{
sss_status_t status = kStatus_SSS_Fail;
sss_object_t keyPair;
sss_se05x_session_t *pSession = (sss_se05x_session_t *)&pCtx->session;
smStatus_t sw_status;
sss_asymmetric_t ctx_asymm = {0};
FILE *fpEcc = NULL;
uint8_t dataBlob[1024] = {0};
size_t dataBlobLen = sizeof(dataBlob);
const uint8_t dataToSign[EC_KEY_BIT_LEN / 8] = "RANDOM DATA";
size_t dataToSignLen = sizeof(dataToSign);
LOG_I("Running Example ex_sss_export.c");
status = sss_key_object_init(&keyPair, &pCtx->ks);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
/* Create EC object */
status = sss_key_object_allocate_handle(&keyPair,
EXAMPLE_TRANSIENT_EXPORT_IMPORT_KEY_ID,
kSSS_KeyPart_Pair,
kSSS_CipherType_EC_NIST_P,
EC_KEY_BIT_LEN / 8,
kKeyObject_Mode_Transient);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_store_generate_key(&pCtx->ks, &keyPair, EC_KEY_BIT_LEN, NULL);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
/* Export Object to Host */
sw_status =
Se05x_API_ExportObject(&pSession->s_ctx, keyPair.keyId, kSE05x_RSAKeyComponent_NA, dataBlob, &dataBlobLen);
if (SM_OK != sw_status) {
LOG_E("Failed Se05x_API_ExportObject!!!");
goto cleanup;
}
status = kStatus_SSS_Success;
LOG_AU8_D(dataBlob, dataBlobLen);
/* Create a file and store Serialized data in file */
LOG_I("Export ec key to '%s'!!!", FileKeyExportdata);
fpEcc = fopen(FileKeyExportdata, "wb+");
if (fpEcc == NULL) {
LOG_E("File open failed!!!");
return kStatus_SSS_Fail;
}
fwrite(dataBlob, 1, dataBlobLen, fpEcc);
fclose(fpEcc);
status = sss_asymmetric_context_init(&ctx_asymm, &pCtx->session, &keyPair, kAlgorithm_SSS_SHA256, kMode_SSS_Sign);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
dataBlobLen = sizeof(dataBlob);
/* Do Signing */
LOG_MAU8_D("Signing digest", dataToSign, dataToSignLen);
status = sss_asymmetric_sign_digest(&ctx_asymm, (uint8_t *)dataToSign, dataToSignLen, dataBlob, &dataBlobLen);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
LOG_MAU8_D("signature", dataBlob, dataBlobLen);
LOG_I("Signing Successful !!!");
sss_asymmetric_context_free(&ctx_asymm);
LOG_I("Export signature key to '%s'.", FileSignExportdata);
fpEcc = fopen(FileSignExportdata, "wb+");
if (fpEcc == NULL) {
LOG_E("File open failed!!!");
return kStatus_SSS_Fail;
}
fwrite(dataBlob, 1, dataBlobLen, fpEcc);
fclose(fpEcc);
cleanup:
if (kStatus_SSS_Success == status) {
LOG_I("ex_sss_export Example Success !!!...");
}
else {
LOG_E("ex_sss_export Example Failed !!!...");
}
return status;
}