blob: 1f45b10cef3415d3b4fb4d58c254f1b75d9b75ae [file] [log] [blame]
/*
*
* Copyright 2018,2019 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 <string.h>
/* ************************************************************************** */
/* Local Defines */
/* ************************************************************************** */
#define ECC_KEY_BIT_LENGTH 256
/* ************************************************************************** */
/* Structures and Typedefs */
/* ************************************************************************** */
/* ************************************************************************** */
/* Global Variables */
/* ************************************************************************** */
static ex_sss_boot_ctx_t gex_sss_ecdh_boot_ctx;
/* ************************************************************************** */
/* Static function declarations */
/* ************************************************************************** */
/* ************************************************************************** */
/* Private Functions */
/* ************************************************************************** */
/* ************************************************************************** */
/* Public Functions */
/* ************************************************************************** */
#define EX_SSS_BOOT_PCONTEXT (&gex_sss_ecdh_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_Success;
sss_algorithm_t algorithm = kAlgorithm_SSS_ECDH;
sss_mode_t mode = kMode_SSS_ComputeSharedSecret;
uint8_t ecdhKey[32] = {0};
size_t ecdhKeyLen = sizeof(ecdhKey);
size_t ecdhKeyBitLen = sizeof(ecdhKey) * 8;
sss_derive_key_t ctx_derive_key = {0};
sss_object_t deriveKey = {0};
sss_object_t keyPair = {0};
sss_object_t public_key = {0};
uint8_t publicKey[128] = {0};
size_t publicKeyLen = sizeof(publicKey);
size_t publicKeyBitLen = sizeof(publicKey) * 8;
LOG_I("Running ECDH Example ex_sss_ecdh.c");
status = sss_key_object_init(&keyPair, &pCtx->ks);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_object_allocate_handle(&keyPair,
MAKE_TEST_ID(__LINE__),
kSSS_KeyPart_Pair,
kSSS_CipherType_EC_NIST_P,
256,
kKeyObject_Mode_Persistent);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_store_generate_key(&pCtx->ks, &keyPair, ECC_KEY_BIT_LENGTH, 0);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_store_get_key(&pCtx->ks, &keyPair, publicKey, &publicKeyLen, &publicKeyBitLen);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_object_init(&public_key, &pCtx->ks);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_object_allocate_handle(&public_key,
MAKE_TEST_ID(__LINE__),
kSSS_KeyPart_Public,
kSSS_CipherType_EC_NIST_P,
256,
kKeyObject_Mode_Persistent);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_store_set_key(&pCtx->ks, &public_key, publicKey, publicKeyLen, ECC_KEY_BIT_LENGTH, NULL, 0);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_object_init(&deriveKey, &pCtx->host_ks);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_object_allocate_handle(&deriveKey,
MAKE_TEST_ID(__LINE__),
kSSS_KeyPart_Default,
kSSS_CipherType_AES,
ecdhKeyLen,
kKeyObject_Mode_Transient);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_derive_key_context_init(&ctx_derive_key, &pCtx->session, &keyPair, algorithm, mode);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_derive_key_dh(&ctx_derive_key, &public_key, &deriveKey);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
status = sss_key_store_get_key(&pCtx->host_ks, &deriveKey, ecdhKey, &ecdhKeyLen, &ecdhKeyBitLen);
ENSURE_OR_GO_CLEANUP(status == kStatus_SSS_Success);
LOG_I("ECDH successful !!!");
LOG_MAU8_I("ECDH derive Key", ecdhKey, ecdhKeyLen);
cleanup:
if (kStatus_SSS_Success == status) {
LOG_I("ex_sss_ecdh Example Success !!!...");
}
else {
LOG_E("ex_sss_ecdh Example Failed !!!...");
}
if (ctx_derive_key.session != NULL)
sss_derive_key_context_free(&ctx_derive_key);
if (deriveKey.keyStore != NULL)
sss_key_object_free(&deriveKey);
if (keyPair.keyStore != NULL)
sss_key_object_free(&keyPair);
if (public_key.keyStore != NULL)
sss_key_object_free(&public_key);
return status;
}