/**
 * @file a71ch_ex.h
 * @author NXP Semiconductors
 * @version 1.0
 * @par License
 *
 * Copyright 2016 NXP
 * SPDX-License-Identifier: Apache-2.0
 *
 * @par Description
 * This file implements the host API examples for the A71CH secure module.
 *
 * @par History
 * 1.0   2016-08-01 : Initial version
 *
 *****************************************************************************/
#ifndef _A71CH_EX_
#define _A71CH_EX_

#include "sm_types.h"
#include "a71ch_api.h"
#include "sm_const.h"

#ifdef __cplusplus
extern "C" {
#endif

/// @cond
#define REDUCED_PACKETSIZE_FALSE (0x00)
#define REDUCED_PACKETSIZE_TRUE  (0x01)

// When A71CH_ALLOW_DISABLE_DEBUG_MODE is defined, the example code
// will permanently disable the DEBUG_MODE in case exDebugPermanentlyDisableDebugMode() is invoked.
//
// #define A71CH_ALLOW_DISABLE_DEBUG_MODE
/// @endcond


#define PLAIN_PSK 0x00 //!< Select RFC4279 example mode
#define ECDH_PSK  0x01 //!< Select RFC5489 example mode


#define DURATION_TEST      (0x01)   //!< Bit pattern to request a duration test (valid on some example functions)
#define MEASURE_EXEC_TIME  (0x02)   //!< Bit pattern to trigger the measurement of execution time (valid on some example functions)
#define EXTENDED_TEST      (0x04)   //!< Bit pattern to trigger an extended test (valid on some example functions)

/// @cond A71CH Example Utility functions
U8 axExAuthenticate(U8 *keyEnc, U8 *keyMac, U8 *keyDek);
U8 axExCreateAndSetInitialHostScpKeys(U8 *keyEnc, U8 *keyMac, U8 *keyDek);
/// @endcond

/** \name Example functions illustrating usage of A71CH functionality
   @{ */
U8 exAes(void);

U8 exAesRfc3394(U8 initMode);
U8 exAesRfc3394Precooked(U8 initMode);
U8 exSymHkdf(U8 initMode);
U8 exSymHmacSha256(U8 initMode);

U8 exConfig(void);
U8 exEccNohc(void);
U8 exGPStorage(U8 tstMode);
U8 exMisc(void);
U8 exPsk(void);
U8 exScp(void);
U8 exSst(void);
U8 exSstKp(void);
U8 exSstKeyPair(U8 initMode);

U8 exPskTls1_2(U8 initMode, U8 pskMode);
/** @}*/

/** \name Walkthrough example (illustrating typical product use)
  @{ */
U8 exWalkthrough(void);
/** @}*/

/** \name Example functions illustrating specific Debug Mode functions (only available in case the Applet is in Debug Mode)
   @{ */
U8 exDebugMode(U8 testMode);
U8 exDbgReflect(int nLower, int nUpper);
U8 exDbgInternalMemory(U8 initMode);

U8 exPermanentlyDisableDebugMode(void);
/** @}*/

/** \name Example function illustrating system boot in combination with SCP03 session key handover
   @{ */
U8 exBoot(U8 bootMode);
/** @}*/

#ifdef __cplusplus
}
#endif
#endif //_A71CH_EX_
