/**
 * @file       pa_certificate.h
 * @brief      PA certificate module
 * @author     Ivan Vorobiov (i.vorobiov@samsung.com)
 * @version    1.0
 * @date       Created Sep 12, 2016
 * @copyright  In Samsung Ukraine R&D Center (SURC) under a contract between
 * @copyright  LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine) and
 * @copyright  "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 * @copyright  Copyright: (c) Samsung Electronics Co, Ltd 2016. All rights reserved.
**/

#ifndef PA_TZ_DRV_SRC_PA_CERTIFICATE_H_
#define PA_TZ_DRV_SRC_PA_CERTIFICATE_H_

#include "pa_tz_api.h"
#include "PaCertificate.h"
#include "PaFlagBits.h"

enum {
  kPaAppNameMaxLength = 1024  //!< Max length of PA app name
};

/**
 * @brief Create new PA certificate object and populate it.
 * @param [in] id,id_size PA ID
 * @param [in] five_signature,five_signature_size FIVE signature
 * @param [in] pa_app_name,pa_app_name_size PA application name and its length
 * @param [in] flags Flags field
 * @param [out] certificate PA certificate
 * @warning To destroy object use ::PaCertificateDestroy
 * @return ::PA_TZ_SUCCESS, ::PA_TZ_AUTHENTICATION_FAILED
 */
PaTzResult PaCertificateCreate(const uint8_t *id, size_t id_size,
                               const uint8_t *five_signature, size_t five_signature_size,
                               const uint8_t *pa_app_name, size_t pa_app_name_size,
                               int flags,
                               PaCertificate_t **certificate);

/**
 * @brief Destroy PA certificate object
 * @param certificate PA certificate
 */
void PaCertificateDestroy(PaCertificate_t *certificate);

/**
 * @brief Validate PA signature
 * @param [in] command Pointer of certificate data structure
 * @return ::PA_TZ_SUCCESS, ::PA_TZ_AUTHENTICATION_FAILED
 */
PaTzResult PaCertificateValidate(const PaCertificate_t *certificate);

#endif // PA_TZ_DRV_SRC_PA_CERTIFICATE_H_
