#ifndef _KNOXAI_UTIL_H_
#define _KNOXAI_UTIL_H_

#include "knoxai_io_datatypes.h"
#include "knoxai_drk.h"

// VENDOR SPECIFIC CONFIG
#if defined(CONFIG_QSEE)
 #include <qsee_log.h>
 #define VENDOR_PRINTF(a)    qsee_log(QSEE_LOG_MSG_ERROR, a)
 
 #define PROV_NAME                    "skm"
 #define SELF_NAME                    "tz_knoxai"
 #define MAX_DISTNAME_PREFIX_SZ       128
 #define MAX_TANAME_SZ                32
 #define MAX_FULLNAME_SZ              160
 #define SO_LOCAL_HEADERSIZE          144

#elif defined(CONFIG_KINIBI)
 #include "taStd.h"
 #include "mcSo.h"
 #include "TlApi/TlApi.h"
 #define VENDOR_PRINTF(a)    tlApiLogPrintf(a);    \
                             tlApiLogPrintf("\n");
//actually sizeof(mcSoHeader_t) + 48 = 92
 #define SO_LOCAL_HEADERSIZE      (MC_SO_SIZE(0,0))
 #ifndef strnlen
    #define strnlen(a,b)     kinibi_strnlen(a,b)
    
    size_t kinibi_strnlen(const char *s, size_t count);
 #endif
#else // CONFIG_TEEGRIS
 #include <tees_secure_object.h>
 #define VENDOR_PRINTF(a)    printf(a);            \
                             printf("\n");
 
 #define TA_SNAP_TA_AUTH_CRYPTOSUITE    "samsung_ta"
 #undef SO_LOCAL_HEADERSIZE
 #if defined(SEC_SDK30)
  #define SO_LOCAL_HEADERSIZE SO_HEADER_SIZE(true)
 #elif defined(SEC_SDK40)
  #define SO_LOCAL_HEADERSIZE SO_OUT_BUF_SIZE(0, true)
 #else
  #define SO_LOCAL_HEADERSIZE 0x48
 #endif

#endif
// END VENDOR SPECIFIC

// Scrypto - deprecated api
#include <openssl/asn1.h>
#ifndef ASN1_STRING_get0_data
   #define ASN1_STRING_get0_data(a) ASN1_STRING_data(a)
#endif

#include <tee_internal_api.h> // for TEE_UUID

#define FAC_UUID                     {0,0,0,{0,0,0x4b,0x61,0x69,0x66,0x61,0x63}}
#define SELF_UUID                    {0,0,0,{0,0,0x73,0x6e,0x61,0x70,0x73,0x70}}
#define PROV_UUID                    {0,0,0,{0,0,0,0,0,0x53,0x4b,0x4d}}

#define byte2longBig(ref, buf) ((uint32_t)(buf[ref+0]<<24) + (uint32_t)(buf[ref+1]<<16) + (uint32_t)(buf[ref+2]<<8)  + (uint32_t)(buf[ref+3]));
#define byte2longLittle(ref, buf) ((uint32_t)(buf[ref+3]<<24) + (uint32_t)(buf[ref+2]<<16) + (uint32_t)(buf[ref+1]<<8)  + (uint32_t)(buf[ref+0]));

uint32_t knoxai_unwrap(TEE_UUID target_uuid, uint8_t *blob_ptr, uint32_t blob_len, uint8_t *dest_ptr, uint32_t* dest_len);
uint32_t knoxai_wrap(TEE_UUID target_uuid, uint8_t *blob_ptr, uint32_t blob_len, uint8_t *dest_ptr, uint32_t* dest_len);

tz_knoxai_return_type convert_der_to_b64(drk_cert_chain_t *cert_chain, uint32_t num_certs);

#endif // _KNOXAI_UTIL_H_
