blob: 7651608faae77f517ba8eaf9e848c30e056a649b [file] [log] [blame]
/*
*
* Copyright 2019-2020 NXP
* SPDX-License-Identifier: Apache-2.0
*/
/** @file
*
* ex_sss_scp03_auth.c: *The purpose and scope of this file*
*
* Project: sss-doc-upstream
*
* $Date: Dec 12, 2019 $
* $Author: nxf42670 $
* $Revision$
*/
/* *****************************************************************************************************************
* Includes
* ***************************************************************************************************************** */
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "ex_sss_auth.h"
#include "ex_sss_boot_int.h"
#include "ex_sss_scp03_keys.h"
#include "nxLog_App.h"
#include "nxScp03_Types.h"
/* *****************************************************************************************************************
* Internal Definitions
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* Type Definitions
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* Global and Static Variables
* Total Size: NNNbytes
* ***************************************************************************************************************** */
/* *****************************************************************************************************************
* Private Functions Prototypes
* ***************************************************************************************************************** */
#ifdef EX_SSS_SCP03_FILE_PATH
static sss_status_t Scp03_KeyString_to_Keybuffer(bool hasAuthKey, char *inputKey, uint8_t *auth_key, size_t key_size);
static sss_status_t read_platfscp03_keys_from_file(const char *scp03_file_path,
uint8_t *enc,
size_t enc_len,
uint8_t *mac,
size_t mac_len,
uint8_t *dek,
size_t dek_len);
#define UNSECURE_LOGGING_OF_SCP_KEYS 0
/* *****************************************************************************************************************
* Public Functions
* ***************************************************************************************************************** */
sss_status_t scp03_keys_from_path(
uint8_t *penc, size_t enc_len, uint8_t *pmac, size_t mac_len, uint8_t *pdek, size_t dek_len)
{
sss_status_t status = kStatus_SSS_Fail;
const char *filename = EX_SSS_SCP03_FILE_PATH;
FILE *fp = NULL;
LOG_D("Using File: %s", filename);
fp = fopen(filename, "rb");
if (fp != NULL) {
// File exists. Get keys from file
LOG_W("Using SCP03 keys from:'%s' (FILE=%s)", filename, EX_SSS_SCP03_FILE_PATH);
fclose(fp);
status = read_platfscp03_keys_from_file(filename, penc, enc_len, pmac, mac_len, pdek, dek_len);
}
else {
// File does not exist. Check env variable
const char *scp03_path_env = getenv(EX_SSS_BOOT_SCP03_PATH_ENV);
if (scp03_path_env != NULL) {
LOG_W("Using SCP03 keys from:'%s' (ENV=%s)", scp03_path_env, EX_SSS_BOOT_SCP03_PATH_ENV);
status = read_platfscp03_keys_from_file(scp03_path_env, penc, enc_len, pmac, mac_len, pdek, dek_len);
}
else {
LOG_I(
"Using default PlatfSCP03 keys. "
"You can use keys from file using ENV=%s",
EX_SSS_BOOT_SCP03_PATH_ENV);
}
}
if (status != kStatus_SSS_Success) {
LOG_D("Using default keys");
}
return status;
}
static sss_status_t read_platfscp03_keys_from_file(const char *scp03_file_path,
uint8_t *enc,
size_t enc_len,
uint8_t *mac,
size_t mac_len,
uint8_t *dek,
size_t dek_len)
{
sss_status_t status = kStatus_SSS_Fail;
FILE *scp_file = fopen(scp03_file_path, "r");
if (scp_file == NULL) {
LOG_E("Cannot open SCP file");
status = kStatus_SSS_Fail;
return status;
}
char file_data[1024];
char *pdata = &file_data[0];
bool hasEnc = false;
bool hasMac = false;
bool hasDek = false;
while (fgets(pdata, sizeof(file_data), scp_file)) {
size_t i = 0, j = 0;
/*Don't need leading spaces*/
for (i = 0; i < strlen(pdata); i++) {
int charac = (int)pdata[i];
if (!isspace(charac)) {
break;
}
}
/*Lines beginning with '#' are comments*/
if (pdata[i] == '#') {
continue;
}
/*Remove trailing comments*/
for (j = 0; j < strlen(pdata); j++) {
if (pdata[j] == '#') {
pdata[j] = '\0';
break;
}
}
if (strncmp(&pdata[i], "ENC ", strlen("ENC ")) == 0) {
#if UNSECURE_LOGGING_OF_SCP_KEYS
LOG_I("%s", &pdata[i]);
#endif
status = Scp03_KeyString_to_Keybuffer(hasEnc, &pdata[i], enc, enc_len);
if (status != kStatus_SSS_Success) {
fclose(scp_file);
return status;
}
hasEnc = true;
}
else if (!strncmp(&pdata[i], "MAC ", strlen("MAC "))) {
#if UNSECURE_LOGGING_OF_SCP_KEYS
LOG_I("%s", &pdata[i]);
#endif
status = Scp03_KeyString_to_Keybuffer(hasMac, &pdata[i], mac, mac_len);
if (status != kStatus_SSS_Success) {
fclose(scp_file);
return status;
}
hasMac = true;
}
else if (!strncmp(&pdata[i], "DEK ", strlen("DEK "))) {
#if UNSECURE_LOGGING_OF_SCP_KEYS
LOG_I("%s", &pdata[i]);
#endif
status = Scp03_KeyString_to_Keybuffer(hasDek, &pdata[i], dek, dek_len);
if (status != kStatus_SSS_Success) {
fclose(scp_file);
return status;
}
hasDek = true;
}
else {
LOG_E("Unknown key type %s", &pdata[i]);
status = kStatus_SSS_Fail;
fclose(scp_file);
return status;
}
}
fclose(scp_file);
return kStatus_SSS_Success;
}
static sss_status_t Scp03_KeyString_to_Keybuffer(bool hasAuthKey, char *inputKey, uint8_t *auth_key, size_t key_size)
{
sss_status_t status = kStatus_SSS_Success;
size_t j = 0;
int charac = (int)inputKey[j];
if (hasAuthKey) {
LOG_E("Duplicate Auth key value");
status = kStatus_SSS_Fail;
return status;
}
while (!isspace(charac)) {
j++;
charac = (int)inputKey[j];
}
while (isspace(charac)) {
j++;
charac = (int)inputKey[j];
}
if (inputKey[j] == '\0') {
LOG_E("Invalid Key");
status = kStatus_SSS_Fail;
return status;
}
for (size_t count = 0; count < key_size; count++) {
if (sscanf(&inputKey[j], "%2hhx", &auth_key[count]) != 1) {
LOG_E("Cannot copy data");
status = kStatus_SSS_Fail;
return status;
}
j = j + 2;
}
return status;
}
#endif //EX_SSS_SCP03_FILE_PATH