/**
 *  \file MS_prov_api.h
 *
 *  \brief This file defines the Mesh Provisioning Application Interface - includes
 *  Data Structures and Methods.
 */

/*
 *  Copyright (C) 2017. Mindtree Ltd.
 *  All rights reserved.
 */

#ifndef _H_MS_PROV_API_
#define _H_MS_PROV_API_


/* --------------------------------------------- Header File Inclusion */
/* Bearer Layer */
#include "MS_brr_api.h"

/* --------------------------------------------- Global Definitions */

/**
 * \defgroup prov_module PROVISIONING (Mesh Provisioning Layer)
 * \{
 *  This section describes the interfaces & APIs offered by the EtherMind
 *  Mesh Provisioning module to the Application and other upper
 *  layers of the stack.
 */

/**
 * \defgroup prov_defines Defines
 * \{
 * Describes defines for the module.
 */

/**
 * \defgroup prov_constants Constants
 * \{
 * Describes Constants defined by the module.
 */

/** Provisiong Roles */
#define PROV_ROLE_DEVICE                    0x01
#define PROV_ROLE_PROVISIONER               0x02

/** Provisioning Bearer Types */
#define PROV_BRR_ADV                        0x01
#define PROV_BRR_GATT                       0x02

/** Provisioning PDU Types */
#define PROV_PDU_TYPE_INVITE                0x00
#define PROV_PDU_TYPE_CAPAB                 0x01
#define PROV_PDU_TYPE_START                 0x02
#define PROV_PDU_TYPE_PUBKEY                0x03
#define PROV_PDU_TYPE_INPUT_CMPLT           0x04
#define PROV_PDU_TYPE_CONF                  0x05
#define PROV_PDU_TYPE_RAND                  0x06
#define PROV_PDU_TYPE_DATA                  0x07
#define PROV_PDU_TYPE_COMPLETE              0x08
#define PROV_PDU_TYPE_FAILED                0x09

/** Provisioning algorithm values */
#define PROV_ALGO_EC_FIPS_P256              0x00

/** Provisioning public key values */
#define PROV_PUBKEY_NO_OOB                  0x00
#define PROV_PUBKEY_OOB                     0x01

/** Provisioning authentication method values */
#define PROV_AUTH_OOB_NONE                  0x00
#define PROV_AUTH_OOB_STATIC                0x01
#define PROV_AUTH_OOB_OUTPUT                0x02
#define PROV_AUTH_OOB_INPUT                 0x03

/** Provisioning Output OOB action values */
#define PROV_OOOB_ACTION_BLINK              0x00
#define PROV_OOOB_ACTION_BEEP               0x01
#define PROV_OOOB_ACTION_VIBRATE            0x02
#define PROV_OOOB_ACTION_NUMERIC            0x03
#define PROV_OOOB_ACTION_ALPHANUMERIC       0x04

/** Provisioning Input OOB action values */
#define PROV_IOOB_ACTION_PUSH               0x00
#define PROV_IOOB_ACTION_TWIST              0x01
#define PROV_IOOB_ACTION_NUMERIC            0x02
#define PROV_IOOB_ACTION_ALPHANUMERIC       0x03

/** Provisioning algorithm support masks */
#define PROV_MASK_ALGO_EC_FIPS_P256         (1 << 0)

/** Provisioning public key supported type masks */
#define PROV_MASK_PUBKEY_OOBINFO            (1 << 0)

/** Provisioning static oob supported type masks */
#define PROV_MASK_STATIC_OOBINFO            (1 << 0)

/** Output OOB actions supported masks */
#define PROV_MASK_OOOB_ACTION_BLINK         (1 << 0)
#define PROV_MASK_OOOB_ACTION_BEEP          (1 << 1)
#define PROV_MASK_OOOB_ACTION_VIBRATE       (1 << 2)
#define PROV_MASK_OOOB_ACTION_NUMERIC       (1 << 3)
#define PROV_MASK_OOOB_ACTION_ALPHANUMERIC  (1 << 4)

/** Input OOB actions supported masks */
#define PROV_MASK_IOOB_ACTION_PUSH          (1 << 0)
#define PROV_MASK_IOOB_ACTION_TWIST         (1 << 1)
#define PROV_MASK_IOOB_ACTION_NUMERIC       (1 << 2)
#define PROV_MASK_IOOB_ACTION_ALPHANUMERIC  (1 << 3)

/**
 * \defgroup prov_control Control Constants
 * \{
 * Control constants defined by the specification.
 */

/** Number of Fragments - Start of New Transaction */
#define PROV_PCF_NUM_FRGMNTS                0x00

/** Control Message */
#define PROV_PCF_CTRL_MSG                   0x01

/** Fragment Index - Continuation of a transaction */
#define PROV_PCF_CONTINU_FRGMNT             0x02

/** Transport Specific Messaging (only used by PB ADV) */
#define PROV_PCF_TX_SPECIFIC                0x03

/** \} */

/**
 * \defgroup prov_advtxopcodes ADV Transport Opcodes
 * \{
 * Specification defined transport Opcodes for PB-ADV bearer.
 */

/* Link Open Request */
#define PROV_PB_ADV_OPEN_REQ                0x00

/* Link Open Confirm */
#define PROV_PB_ADV_OPEN_CNF                0x01

/* Link Close Indication */
#define PROV_PB_ADV_CLOSE_IND               0x02

/** \} */

/**
* \defgroup prov_gatttxopcodes GATT Transport Opcodes
* \{
* Implementation specific transport Opcodes for PB-GATT bearer.
*/

/* Link Open Indication */
#define PROV_PB_GATT_OPEN_IND               0xF1

/* Link Close Indication */
#define PROV_PB_GATT_CLOSE_IND              0xF0

/** \} */

/**
 * \defgroup prov_errorcode Error Codes
 * \{
 * Describes Error Codes defined by the specification.
 */

/** Provisioning Failure Error Codes */
#define PROV_ERR_PROHIBITED                 0x00
#define PROV_ERR_INVALID_PDU                0x01
#define PROV_ERR_INVALID_FORMAT             0x02
#define PROV_ERR_UNEXPECTED_PDU             0x03
#define PROV_ERR_CONFIRMATION_FAILED        0x04
#define PROV_ERR_OUT_OF_RESOURCES           0x05
#define PROV_ERR_DECRYPTION_FAILED          0x06
#define PROV_ERR_UNEXPECTED_ERROR           0x07
#define PROV_ERR_CANNOT_ASSIGN_ADDRESS      0x08

/** Provisioning LinkClose Error codes */
#define PROV_CLOSE_REASON_SUCCESS           0x00
#define PROV_CLOSE_REASON_TIMEOUT           0x01
#define PROV_CLOSE_REASON_FAIL              0x02
/** \} */

/** Provisioning array size requirements */
#define PROV_KEY_NETKEY_SIZE                16
#define PROV_OOB_VALUE_SIZE                 16
#define PROV_URI_HASH_SIZE                  4

/** Provisioning OOB type masks for ADV data */
#define PROV_OOB_TYPE_OTHER                 (1 << 0)
#define PROV_OOB_TYPE_URI                   (1 << 1)
#define PROV_OOB_TYPE_2DMRC                 (1 << 2)
#define PROV_OOB_TYPE_BARCODE               (1 << 3)
#define PROV_OOB_TYPE_NFC                   (1 << 4)
#define PROV_OOB_TYPE_NUMBER                (1 << 5)
#define PROV_OOB_TYPE_STRING                (1 << 6)
#define PROV_OOB_TYPE_ONBOX                 (1 << 11)
#define PROV_OOB_TYPE_INSIDEBOX             (1 << 12)
#define PROV_OOB_TYPE_ONPIECEOFPAPER        (1 << 13)
#define PROV_OOB_TYPE_INSIDEMANUAL          (1 << 14)
#define PROV_OOB_TYPE_ONDEVICE              (1 << 15)

/** Invalid Provisioning Handle */
#define PROV_HANDLE_INVALID                 0xFF

/** \} */

/**
 *  \defgroup prov_events Events
 *  \{
 *  This section lists the Asynchronous Events notified to Application by the
 *  Module.
 */

/**
 * This event indicates the availability of an unprovisioned device beacon,
 * with the following values as parameters in the
 * \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_UNPROVISIONED_BEACON.
 * \param [in] event_result  \ref API_SUCCESS.
 * \param [in] event_data Pointer to the array with the UUID of the device.
 * \param [in] event_datalen MS_DEVICE_UUID_SIZE
 *
 * \note This event is received by the Provisioner application. On reception of
 * this event, the application shall make use of the MS_prov_bind() to initiate
 * the provisioning procedure.
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_UNPROVISIONED_BEACON           0x01

/**
 * This event indicates that the provisioning procedure capability exchange is
 * complete, with the following values as parameters in the
 * \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_PROVISIONING_SETUP.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data When local provisioner, this contains peer device
 * capabilities and when local device, this contains the attention timeout
 * value.
 * \param [in] event_datalen When local provisioner, sizeof(\ref
 * PROV_CAPABILITIES_S) and when local device, sizeof(UINT32).
 *
 * \note When local provisioner, the appliation shall select the required
 * capability from the received capabilities and choose to start the procedure
 * by calling \ref MS_prov_start().
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_PROVISIONING_SETUP             0x02

/**
 * This event indicates to the application the OOB random data that is to be
 * displayed on the UI via the \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_OOB_DISPLAY.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data Pointer to OOB information as in \ref PROV_OOB_TYPE_S.
 * \param [in] event_datalen sizeof (\ref PROV_OOB_TYPE_S).
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_OOB_DISPLAY                    0x03

/**
 * This event indicates to the application requesting for OOB random data that
 * is to be used in the procedure via the \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_OOB_ENTRY.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data \ref Pointer to OOB information as in \ref PROV_OOB_TYPE_S.
 * \param [in] event_datalen sizeof (\ref PROV_OOB_TYPE_S).
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_OOB_ENTRY                      0x04

/**
 * This event indicates to the application that the peer device has completed the
 * Input of OOB when this capability is negotiated via the
 * \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_DEVINPUT_COMPLETE.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data NULL.
 * \param [in] event_datalen 0.
 *
 * \note This event is generated only for the provisioner application.
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_DEVINPUT_COMPLETE              0x05

/**
 * This event indicates to the application requesting for Provisional data to be
 * sent to the peer device via the \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_PROVDATA_INFO_REQ.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data NULL.
 * \param [in] event_datalen 0.
 *
 * \note This event is generated only for the provisioner application.
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_PROVDATA_INFO_REQ              0x06

/**
 * This event indicates to the application the Provisional data received
 * from the Provisioner via the \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_PROVDATA_INFO.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data Pointer to the provisioning data \ref PROV_DATA_S.
 * \param [in] event_datalen sizeof(\ref PROV_DATA_S).
 *
 * \note This event is generated only for the device application.
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_PROVDATA_INFO                  0x07

/**
 * This event indicates to the application that the provisioning procedure
 * is complete via the \ref PROV_UI_NOTIFY_CB callback.
 *
 * \param [in] phandle Pointer to the Provisioning context handle
 * \param [in] event_type \ref PROV_EVT_PROVISIONING_COMPLETE.
 * \param [in] event_result  \ref API_SUCCESS on successful procedure completion, else
 * an Error Code.
 * \param [in] event_data NULL.
 * \param [in] event_datalen 0.
 *
 * \return \ref API_SUCCESS (always)
 */
#define PROV_EVT_PROVISIONING_COMPLETE          0x08

/** \} */

/** \} */

/* --------------------------------------------- Structures/Data Types */

/**
 *  \addtogroup prov_defines Defines
 *  \{
 */

/**
 *  \defgroup prov_structures Structures
 *  \{
 */

/** Role of the device */
typedef UCHAR       PROV_ROLE;

/** Bearer for the provisioning session */
typedef UCHAR       PROV_BRR;

/** Handle to reference the active provisioning context */
typedef UCHAR       PROV_HANDLE;

/** Device Information used for Provisioning */
typedef struct _PROV_DEVICE_S
{
    /**
     * Device UUID -
     * Used in unprovisioned device beacon and Provisioning Invite
     */
    UCHAR uuid[MS_DEVICE_UUID_SIZE];

    /** OOB Information */
    UINT16 oob;

    /** URI if any, to be given in encoded form */
    MS_BUFFER * uri;

} PROV_DEVICE_S;

/** OOB type for provisioning */
typedef struct _PROV_OOB_TYPE_S
{
    /** OOB Action information */
    UINT16 action;

    /** OOB Size information */
    UCHAR size;

} PROV_OOB_TYPE_S;

/** Device capabilities used for Provisioning */
typedef struct _PROV_CAPABILITIES_S
{
    /** Number of Elements */
    UCHAR num_elements;

    /** Supported algorithms */
    UINT16 supp_algorithms;

    /** Public key type */
    UCHAR supp_pubkey;

    /** Static OOB type */
    UCHAR supp_soob;

    /** Output OOB information */
    PROV_OOB_TYPE_S ooob;

    /** Input OOB information */
    PROV_OOB_TYPE_S ioob;

} PROV_CAPABILITIES_S;

/** Provisioning method information */
typedef struct _PROV_METHOD_S
{
    /** Algorithm selected */
    UCHAR algorithm;

    /** Public key usage */
    UCHAR pubkey;

    /** Authentication type */
    UCHAR auth;

    /** OOB type */
    PROV_OOB_TYPE_S oob;

} PROV_METHOD_S;

/** Data exchanged during Provisiong procedure */
typedef struct _PROV_DATA_S
{
    /** NetKey */
    UCHAR netkey[PROV_KEY_NETKEY_SIZE];

    /** Index of the NetKey */
    UINT16 keyid;

    /**
     * Flags bitmask
     * bit 0: Key Refresh Flag.
     *        0: Not-In-Phase2
     *        1: In-Phase2
     * bit 1: IV Update Flag
     *        0: Normal operation
     *        1: IV Update active
     *
     * bits 2-7: RFU
     */
    UCHAR flags;

    /** Current value of the IV index */
    UINT32 ivindex;

    /** Unicast address of the primary element */
    UINT16 uaddr;

} PROV_DATA_S;

/** \} */
/** \} */

/**
 *  \defgroup prov_cb Application Callback
 *  \{
 *  This Section Describes the module Notification Callback interface offered
 *  to the application
 */

/**
 * Provisioning Application Asynchronous Notification Callback.
 *
 * Provisioning calls the registered callback to indicate events occurred to the
 * application.
 *
 * \param phandle Handle that identifies the provisioning context.
 * \param event_type Event type from any of the events in \ref prov_events.
 * \param event_result API_SUCCESS or any error code.
 * \param event_data Data associated with the event if any or NULL.
 * \param event_datalen Size of the event data. 0 if event data is NULL.
 */
typedef API_RESULT (* PROV_UI_NOTIFY_CB)
        (
            PROV_HANDLE * phandle,
            UCHAR         event_type,
            API_RESULT    event_result,
            void        * event_data,
            UINT16        event_datalen
        );

/** \} */

/* --------------------------------------------- Macros */
/**
 *  \defgroup prov_marcos Utility Macros
 *  \{
 *  Initialization and other Utility Macros offered by the module.
 */

/**
 *  \brief Setup the Device for provisioning
 *
 *  \par Description This function configures the application as an Unprovisioned
 *  device over Advertising channel bearer and sets it ready for provisioning.
 *
 *  \param [in]  pdev  Pointer to the device strcuture \ref PROV_DEVICE_S.
 *  \param [in]  tmo   The setup timeout value
 *  \param [out] phdl  The handle to the context setup on successful allocation
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_setup_device_pbadv(pdev, tmo, phdl) \
        MS_prov_setup (PROV_ROLE_DEVICE, PROV_BRR_ADV, (pdev), (tmo), (phdl))

/**
 *  \brief Setup the Provisioner for provisioning
 *
 *  \par Description This function configures the application as a Provisioner
 *  over Advertising channel bearer and sets it ready for provisioning.
 *
 *  \param [in]  tmo   The setup timeout value
 *  \param [out] phdl  The handle to the context setup on successful allocation
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_setup_provisioner_pbadv(tmo, phdl) \
        MS_prov_setup (PROV_ROLE_PROVISIONER, PROV_BRR_ADV, NULL, (tmo), (phdl))

/**
 *  \brief Setup the device for provisioning
 *
 *  \par Description This function configures the application as an Unprovisioned
 *  device over GATT channel bearer and sets it ready for provisioning.
 *
 *  \param [in]  pdev  Pointer to the device strcuture \ref PROV_DEVICE_S.
 *  \param [in]  tmo   The setup timeout value
 *  \param [out] phdl  The handle to the context setup on successful allocation
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_setup_device_pbgatt(pdev, tmo, phdl) \
        MS_prov_setup (PROV_ROLE_DEVICE, PROV_BRR_GATT, (pdev), (tmo), (phdl))

/**
 *  \brief Setup the Provisioner for provisioning
 *
 *  \par Description This function configures the application as a Provisioner
 *  over GATT channel bearer and sets it ready for provisioning.
 *
 *  \param [in]  tmo   The setup timeout value
 *  \param [out] phdl  The handle to the context setup on successful allocation
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_setup_provisioner_pbgatt(tmo, phdl) \
        MS_prov_setup (PROV_ROLE_PROVISIONER, PROV_BRR_GATT, NULL, (tmo), (phdl))

/**
 *  \brief Start Provisioning on the select set of device capabilities.
 *
 *  \par Description This function is used by the provisioner application to start
 *  the procedure using the selected set of capabilities of the unprovisioned
 *  device.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] pmethod Pointer to the structure with selected method.
 *
 *  \note This API will be used by the provisioner only, in response to the
 *  \ref PROV_EVT_PROVISIONING_SETUP event
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_start(phandle, pmethod) \
        MS_prov_send_pdu ((phandle), PROV_PDU_TYPE_START, (pmethod), sizeof(PROV_METHOD_S))

/**
 *  \brief Input Authentication value from Device/Provisioner application.
 *
 *  \par Description This function is used to receive the Authval from the
 *  application and use it for the algorithm. When the application is that of a
 *  device, it also sends the input complete message to the provisioner in the
 *  given context.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] pauth Authentication Value (UINT32 *) or (UCHAR *)
 *  \param [in] size Size of pauth
 *
 *  \note This API will be used in response to the
 *  \ref PROV_EVT_OOB_ENTRY event
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_input_authval(phandle, pauth, size) \
        MS_prov_send_pdu ((phandle), PROV_PDU_TYPE_INPUT_CMPLT, (pauth), (size))

/**
 *  \brief Send provisioning data to the device.
 *
 *  \par Description This function is used by the provisioning application to send
 *  the provisioning data to the device after authentication is complete.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] pdata Pointer to the Provisioning data structre as in \ref
 *  PROV_DATA_S
 *
 *  \note This API will be used by the provisioner only, in response to the
 *  \ref PROV_EVT_PROVDATA_INFO_REQ event
 *
 *  \return API_SUCCESS or Error Code on failure
 */
#define MS_prov_data(phandle, pdata) \
        MS_prov_send_pdu ((phandle), PROV_PDU_TYPE_DATA, (pdata), sizeof (PROV_DATA_S))

/** \} */

/* --------------------------------------------- API Declarations */

/**
 * \defgroup prvsng_api_defs API Definitions
 * \{
 * This section describes the EtherMind Mesh Provisioning Layer APIs.
 */

#ifdef __cplusplus
extern "C" {
#endif

/**
 *  \brief Register provisioning capabilities and callback
 *
 *  \par Description This function registers the provisioning capabilities of the
 *  application along with the application callback to notify events during the
 *  provisioning procedure.
 *
 *  \param [in] pcapab Pointer to the provisioning capabilities structure \ref PROV_CAPABILITIES_S
 *  \param [in] cb Application callback function pointer
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_register
           (
               /* IN */ PROV_CAPABILITIES_S * pcapab,
               /* IN */ PROV_UI_NOTIFY_CB     cb
           );

API_RESULT MS_prov_stop_interleave_timer
          (
              void
          );


/**
 *  \brief Setup the device for provisioning
 *
 *  \par Description This function configures the device to get in a provisionable
 *  state by specifying the role, bearer and creating a context.
 *
 *  \param [in] role Provisioniong role to be setup - Device or Provisioner.
 *  \param [in] bearer Provisioning bearer to be setup - PB-ADV or PB-GATT
 *  \param [in] pdevice Pointer to the device strcuture \ref PROV_DEVICE_S
 *  containing the UUID to be beaconed. This parameter is used only when the
 *  role is PROV_ROLE_DEVICE and ignored otherwise.
 *  \param [in] timeout The time period for which the setup shall be active.
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_setup
           (
               /* IN */  PROV_ROLE       role,
               /* IN */  PROV_BRR        bearer,
               /* IN */  PROV_DEVICE_S * pdevice,
               /* IN */  UINT16          gatt_timeout,
               /* IN */  UINT16          adv_timeout
           );

/**
 *  \brief Bind to the peer device for provisioning
 *
 *  \par Description This function establishes a provisioning link with the peer device
 *  and exchanges the capabilities for provisioning.
 *
 *  \param [in] bearer Provisioning bearer on which to be bound - PB-ADV or PB-GATT
 *  \param [in] pdevice Pointer to the device strcuture \ref PROV_DEVICE_S.
 *  \param [in] attention The attention duration in seconds to be configured by the
 *  device. This parameter is dont care if the role is PROV_ROLE_DEVICE.
 *  \param [out] phandle The handle to the context setup on successful allocation.
 *
 *  \note This API is for use by the Provisioner application only upon
 *  reception of an Unprovisioned Device Beacon.
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_bind
           (
               /* IN */  PROV_BRR        bearer,
               /* IN */  PROV_DEVICE_S * pdevice,
               /* IN */  UCHAR           attention,
               /* OUT */ PROV_HANDLE   * phandle
           );

/**
 *  \brief Send provisioning PDUs to the peer.
 *
 *  \par Description This function is used by the provisioning application to send
 *  the provisioning PDUs to the peer device during the procedure.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] pdu Following PDU types are handled -
 *                  PROV_PDU_TYPE_START
 *                  PROV_PDU_TYPE_INPUT_CMPLT
 *                  PROV_PDU_TYPE_DATA
 *  \param [in] pdata Pointer to the data corresponding to the above PDUs
 *  \param [in] datalen Size of the pdata
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_send_pdu
           (
               /* IN */ PROV_HANDLE * phandle,
               /* IN */ UCHAR         pdu,
               /* IN */ void        * pdata,
               /* IN */ UINT16        datalen
           );

/**
 *  \brief Set the display authval.
 *
 *  \par Description This function shall be used by the provisioning application
 *  to set the authval being displayed to the user on receiving \ref
 *  PROV_EVT_OOB_DISPLAY event with the respective OOB Action and Size.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] pdata Pointer to the Authval (UINT32 *) or (UCHAR *)
 *  \param [in] datalen Size of the pdata
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_set_authval
           (
               /* IN */ PROV_HANDLE * phandle,
               /* IN */ void        * pdata,
               /* IN */ UINT16        datalen
           );

/**
 *  \brief Abort the provisioning procedure
 *
 *  \par Description
 *  This API can be used by the application to abort the ongoing provisioning
 *  procedure. This routine closes the provisioning link with the reason as
 *  specified.
 *
 *  \param [in] phandle Provisioning context to be used.
 *  \param [in] reason Reason for termination.
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_abort
           (
               PROV_HANDLE * phandle,
               UCHAR reason
           );

/**
 *  \brief Utility API to fetch current ECDH Public Key to be used for
 *         Provisioning
 *
 *  \par Description
 *  This API can be used by the application to fetch the current ECDH P256
 *  Public Key which is to be used for the Provisioning Procedure.
 *
 *  \param [out] public_key to a pointer of \ref UCHAR array of length
 *               \ref PROV_PUBKEY_SIZE
 *
 *  \return API_SUCCESS or Error Code on failure
 */
API_RESULT MS_prov_get_local_public_key
           (
               /* OUT */ UCHAR  * public_key
           );

#ifdef __cplusplus
};
#endif

/** \} */

/** \} */

#endif /* _H_MS_PROV_API_ */