/* Copyright 2019 NXP
 * SPDX-License-Identifier: Apache-2.0
 */

#include <ex_sss_boot.h>
#include <fsl_sss_se05x_apis.h>
#include <nxLog_App.h>
#include <se05x_APDU.h>
#include <se05x_const.h>
#include <se05x_ecc_curves.h>
#include <se05x_ecc_curves_values.h>
#include <se05x_tlv.h>
#include <stdio.h>
#include <string.h>

#include "certificate.h"

static ex_sss_boot_ctx_t gex_sss_gen_cert;

#define EX_SSS_BOOT_PCONTEXT (&gex_sss_gen_cert)
#define EX_SSS_BOOT_DO_ERASE 1
#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 0

#include <ex_sss_main_inc.h>

#define ECC_KEY_BIT_LEN 256

sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx)
{
    sss_status_t status          = kStatus_SSS_Fail;
    uint32_t keyId               = CERTIFICATE_KEY_ID;
    size_t keyBitLen             = ECC_KEY_BIT_LEN;
    size_t keyLen                = keyBitLen * 8;
    sss_key_part_t keyPart       = kSSS_KeyPart_Pair;
    sss_cipher_type_t cipherType = kSSS_CipherType_EC_NIST_P;
    sss_object_t obj             = {0};

    status = sss_key_object_init(&obj, &pCtx->ks);
    if (status != kStatus_SSS_Success) {
        LOG_E("sss_key_object_init Failed!!!");
        return status;
    }

    status = sss_key_object_allocate_handle(&obj, keyId, keyPart, cipherType, keyLen, kKeyObject_Mode_Persistent);
    if (status != kStatus_SSS_Success) {
        LOG_E("Object allocate handle failed");
        return status;
    }
    status = sss_key_store_generate_key(&pCtx->ks, &obj, keyBitLen, NULL);
    if (status != kStatus_SSS_Success)
        LOG_E("Failed to inject key");
    else
        LOG_I("Success");

    return status;
}
