blob: c6182a9d1395d4733aece8cbe4bba66e26cf4e29 [file] [log] [blame]
/****************************************************************************
*
* Copyright 2017 NXP
* SPDX-License-Identifier: Apache-2.0
*
* Name: mainA71chConfig.c
*
* Description:
* This file contains main entry for the A71CH configuration application.
*
****************************************************************************/
#include <string.h>
#include <stdint.h>
#include <stdio.h>
#include <assert.h>
#ifdef _WIN32
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#endif
#include "app_boot.h"
#include "ax_api.h"
#include "sm_apdu.h"
#include "configCli.h"
#include "configState.h"
#include "axHostCrypto.h"
#include "sm_timer.h"
#include "sm_printf.h"
#include "global_platf.h"
#define EX_APP_VERSION "1.20"
/*******************************************************************************
** Main Function main()
*******************************************************************************/
int main(int argc, char ** argv)
{
U16 connectStatus = 0;
// U8 Atr[64];
// U16 AtrLen = sizeof(Atr);
SmCommState_t commState;
int expectedMinArg = 0;
int nRet = 0;
#ifdef TDA8029_UART
Scp03SessionState_t sessionState;
#endif
nRet = app_boot_Init();
sm_initSleep();
sm_printf(DBGOUT, "a71chConfig (Rev %s) .. ", EX_APP_VERSION);
#if defined(SMCOM_JRCP_V1) || defined(SMCOM_JRCP_V2)
expectedMinArg = 3;
#elif defined(RJCT_VCOM)
expectedMinArg = 3;
#else
expectedMinArg = 2;
#endif
// <Begin-Hack: Commands that don't require any interaction with the secure element can be preceded with 'nc' (not connected)>
if (argc >= expectedMinArg)
{
char *cmdName;
char **cmdArg;
int argcReduction = 0;
cmdName = argv[0];
#if defined(SMCOM_JRCP_V1) || defined(SMCOM_JRCP_V2)
argcReduction = 2;
#elif defined(RJCT_VCOM)
argcReduction = 2;
#else
argcReduction = 1;
#endif
cmdArg = &argv[argcReduction];
if ( (strcmp(cmdArg[0], "nc") == 0 ) )
{
argc -= argcReduction;
if (argc > 0)
{
a7xConfigSetConnectString(argv[1]);
sm_printf(DBGOUT, "NOT connecting to A71CH.\n");
// Strip "nc"
cmdArg = &argv[argcReduction+1];
argc -= 1;
nRet = a7xConfigCli(cmdName, argc, cmdArg);
return nRet;
}
else
{
sm_printf(DBGOUT, "No command is following \'nc\' directive.\n");
return AX_CLI_CHECK_USAGE;
}
}
}
// <End-Hack: Commands that don't require any interaction with the secure element>
sm_printf(DBGOUT, "connect to A71CH. Chunksize at link layer = %d.\n", MAX_CHUNK_LENGTH_LINK);
connectStatus = app_boot_Connect(&commState, argv[1]);
if ( connectStatus == SW_FILE_NOT_FOUND )
{
sm_printf(CONSOLE, "SM_Connect failed with status 0x%04X\n", connectStatus);
// <Begin-Hack: In case an identify or cplc is requested, don't return with an error>
if (argc >= expectedMinArg)
{
char *cmdName;
char **cmdArg;
cmdName = argv[0];
#if defined(SMCOM_JRCP_V1) || defined(SMCOM_JRCP_V2)
cmdArg = &argv[2];
argc -= 2;
#elif defined(RJCT_VCOM)
cmdArg = &argv[2];
argc -= 2;
#else
cmdArg = &argv[1];
argc -= 1;
#endif
if ( (strcmp(cmdArg[0], "identify") == 0 ) || (strcmp(cmdArg[0], "cplc") == 0 ) )
{
nRet = a7xConfigCli(cmdName, argc, cmdArg);
return nRet;
}
}
// <End-Hack: In case an identify is requested, don't return with an error>
return AX_CLI_ERR_SELECT_FAILS;
}
else if (connectStatus != 0)
{
sm_printf(CONSOLE, "Select failed. SW = 0x%04X\n", connectStatus);
return AX_CLI_ERR_SELECT_FAILS;
}
else
{
// int i=0;
#if defined(SCI2C)
sm_printf(CONSOLE, "SCI2C_"); // To highlight the ATR format for SCI2C deviates from ISO7816-3
#endif
sm_printf(CONSOLE, "HostLib Version : 0x%04X\n", commState.hostLibVersion);
sm_printf(CONSOLE, "Applet-Rev:SecureBox-Rev : 0x%04X:0x%04X\n",
commState.appletVersion, commState.sbVersion);
}
// Deal with extra argument when going through card server
if (argc >= expectedMinArg)
{
char *cmdName;
char **cmdArg;
cmdName = argv[0];
#if defined(SMCOM_JRCP_V1) || defined(SMCOM_JRCP_V2)
cmdArg = &argv[2];
argc -= 2;
#elif defined(RJCT_VCOM)
cmdArg = &argv[2];
argc -= 2;
#else
cmdArg = &argv[1];
argc -= 1;
#endif
nRet = a7xConfigCli(cmdName, argc, cmdArg);
}
else
{
nRet = a7xConfigCliHelp("a71chConfig");
}
return nRet;
}