blob: 6ad43c1abb107d2d99f158cf67562587dca31b7f [file] [log] [blame]
/* Copyright 2019,2020 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 "ex_se05x_WiFiKDF.h"
#define WIFI_DERIVED_KEY_SIZE 32
#define WIFI_COUNT 4096
static ex_sss_boot_ctx_t gex_sss_wifi_kdf;
#define EX_SSS_BOOT_PCONTEXT (&gex_sss_wifi_kdf)
#define EX_SSS_BOOT_DO_ERASE 0
#define EX_SSS_BOOT_EXPOSE_ARGC_ARGV 1
#include <ex_sss_main_inc.h>
sss_status_t ex_sss_entry(ex_sss_boot_ctx_t *pCtx)
{
sss_status_t sss_status = kStatus_SSS_Fail;
smStatus_t status;
sss_se05x_session_t *pSession = (sss_se05x_session_t *)&pCtx->session;
SE05x_Result_t pExists = 0;
uint8_t wifi_ssid[100] = "some-wifi-ssid";
size_t ssid_size = 0;
uint8_t wifi_derivedKey[WIFI_DERIVED_KEY_SIZE] = {0};
size_t wifi_derivedKeyLen = WIFI_DERIVED_KEY_SIZE;
size_t i;
int argc = gex_sss_argc;
const char **argv = gex_sss_argv;
ssid_size = strlen((const char *)wifi_ssid);
for (int j = 1; j < argc; j++) {
if (strcmp(argv[j], "-s") == 0) {
j++;
ssid_size = strlen(argv[j]);
if (ssid_size >= sizeof(wifi_ssid)) {
LOG_E("SSID Size too big. Exit!");
break;
}
memcpy(wifi_ssid, argv[j], ssid_size);
break;
}
}
status = Se05x_API_CheckObjectExists(&pSession->s_ctx, WIFI_OBJ_ID, &pExists);
if (status == SM_OK && pExists != kSE05x_Result_SUCCESS) {
LOG_E("WiFi Object does not exist");
LOG_E(
"Did you run 'ex_se05x_WiFiKDF_inject' before running this "
"example?");
goto cleanup;
}
LOG_I("Deriving PBKDF2 for wifi_ssid='%s', WIFI_COUNT='%d'", wifi_ssid, WIFI_COUNT);
status = Se05x_API_PBKDF2(&pSession->s_ctx,
WIFI_OBJ_ID,
wifi_ssid,
ssid_size,
WIFI_COUNT,
WIFI_DERIVED_KEY_SIZE,
wifi_derivedKey,
&wifi_derivedKeyLen);
if (status != SM_OK) {
LOG_E("Se05x_API_PBKDF2 Failed");
goto cleanup;
}
LOG_AU8_I(wifi_derivedKey, wifi_derivedKeyLen);
printf("\n# Data for /etc/wpa_supplicant/wpa_supplicant.conf");
printf("\nnetwork={");
printf("\n ssid=\"");
for (i = 0; i < ssid_size; i++) {
printf("%c", wifi_ssid[i]);
}
printf("\"\n psk=");
for (i = 0; i < wifi_derivedKeyLen; i++) {
printf("%x", wifi_derivedKey[i]);
}
printf("\n}");
printf("\n");
sss_status = kStatus_SSS_Success;
cleanup:
LOG_I("Done");
return sss_status;
}