/*
 * =====================================================================================
 *
 *       Filename:  taConfig.c
 *
 *    Description:  TA configuration.
 *
 *        Version:  1.0
 *        Created:  03/27/2017 11:10:00 AM
 *       Compiler:  armcc
 *
 *         Author:  Dongwook Shim (), dw.shim@samsung.com
 *        Company:  Samsung Electronics
 *
 *        Copyright (c) 2017 by Samsung Electronics, All rights reserved.
 *
 * =====================================================================================
 */
#include <string.h>
#include <stdio.h>
#include "commonConfig.h"
#include "systemConfig.h"
#include "taConfig.h"
#include "log.h"


#define MAX_UUID_SIZE             16

#if (defined USE_QSEE)
#include "qsee_cfg_prop.h"
#define UID_PROV                  "prov"
#define UID_SKM                   "skm"
#define UID_KEYMASTER             "skeymast"
#define MAX_DISTNAME_PREFIX_SZ 120
#define MAX_TANAME_SZ 8
#define MAX_FULLNAME_SZ 128
#define ALT_ROT_DOMAIN_NAME "alt_rot_domain_name_dot"

#elif (defined USE_MOBICORE)
#define UID_PROV                   {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c}
#define UID_SKM                    {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d}
#define UID_KEYMASTER              {0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e}
#elif (defined USE_BLOWFISH)
#define UID_PROV                   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x52, 0x56, 0x54, 0x45, 0x45}
#define UID_SKM                    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x4b, 0x4d}
#define UID_KEYMASTER              {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4b, 0x45, 0x59, 0x4d, 0x53, 0x54}
#endif

#define SKM_SAVE_FILE_PATH         COMMON_DIR"/prov_data/dev_root/dev_root.dat"
#define SKM_PRE_GEN_KEY_PATH       COMMON_DIR"/prov_data/dev_root/dev_root_key.dat"
#define KEYMASTER_SAVE_FILE_PATH   COMMON_DIR"/keymaster/keymaster.dat"

// Trustzone App data structure.
typedef struct {
    const uint8_t teeUid[MAX_UUID_SIZE];
    const size_t teeUidLen;
    const size_t maxBufferSize;
    const char preGenKeyPath[MAX_FILE_PATH_LEN];
    const char saveKeyPath[MAX_FILE_PATH_LEN];
} TeeAppData_t;

const TeeAppData_t gTeeAppData[] =
{
    {   // TA_PROV
        UID_PROV,
#if (defined USE_QSEE)
        sizeof(UID_PROV) - 1,
#else
        MAX_UUID_SIZE,
#endif  // End of USE_QSEE
        MAX_PROV_BUF_SIZE,
        "",
        ""
    },
    {   // TA_SKM
        UID_SKM,
#if (defined USE_QSEE)
        sizeof(UID_SKM) - 1,
#else
        MAX_UUID_SIZE,
#endif  // End of USE_QSEE
        MAX_SKM_BUF_SIZE,
        SKM_PRE_GEN_KEY_PATH,
        SKM_SAVE_FILE_PATH
    },
    {   // TA_KEYMASTER
        UID_KEYMASTER,
#if (defined USE_QSEE)
        sizeof(UID_KEYMASTER) - 1,
#else
        MAX_UUID_SIZE,
#endif  // End of USE_QSEE
        MAX_PROV_BUF_SIZE,
        "",
        KEYMASTER_SAVE_FILE_PATH
    },
};

#if (defined USE_QSEE)
char gTargetTid[MAX_FULLNAME_SZ];

//Qualcomm provided get_alt_rot_distname API.
static uint8_t * get_alt_rot_distname(TeeAppId_t teeAppId)
{
    const char *prop_name= ALT_ROT_DOMAIN_NAME;
    uint32_t ret_size = 0;
    size_t len = 0;
    qsee_cfg_propvar_t *ptr = NULL;
    uint32_t prop[2 + (MAX_DISTNAME_PREFIX_SZ / sizeof(uint32_t))] = {0};
    char distname_prefix[MAX_DISTNAME_PREFIX_SZ] = {0};
    int i = 0;

    LOGI("%s start... - UID : %s ", __func__ , gTeeAppData[teeAppId].teeUid);
    memset(gTargetTid, 0, sizeof(gTargetTid));

    if (QSEE_CFG_SUCCESS != qsee_cfg_getpropval(prop_name, strlen(prop_name) + 1, 0,(qsee_cfg_propvar_t *)&prop,sizeof(prop), &ret_size)) {
        LOGE("'alt_rot_domain_name_dot' read failed, using legacy appname");
        strlcpy(gTargetTid,(char *)gTeeAppData[teeAppId].teeUid, MAX_FULLNAME_SZ);
        LOGE("%s / %s / %d", gTargetTid, (char *)gTeeAppData[teeAppId].teeUid, (int)gTeeAppData[teeAppId].teeUidLen);
        return (uint8_t *)gTargetTid;
    }

    ptr = (qsee_cfg_propvar_t *)prop;

    /* len = ret_size - sizeof(qsee_cfg_propvar_t) + padding */
    len = ret_size - sizeof(*ptr) + 2 * sizeof(ptr->val) + 1;

    if (len >= sizeof(distname_prefix)) {
        LOGE("'alt_rot_domain_name_dot' len invalid, using legacy appname");
        strlcpy(gTargetTid,(char *)gTeeAppData[teeAppId].teeUid, MAX_FULLNAME_SZ);
        return (uint8_t *)gTargetTid;
    }

    /* remove the quotes only when read from devcfg */
    memcpy(distname_prefix, &ptr->val[1], len - 1);
    distname_prefix[len] = '\0';

    /* finalize fully qualified distname */
    snprintf(gTargetTid,MAX_FULLNAME_SZ,"%s%s", distname_prefix,(char *)gTeeAppData[teeAppId].teeUid);
    LOGI("%s end... - UID : %s ", __func__ , gTargetTid);
    return (uint8_t *)gTargetTid;
}

#endif

uint8_t *getTaUid(TeeAppId_t teeAppId)
{
#if (defined USE_QSEE)
    return get_alt_rot_distname(teeAppId);
#else
    return (uint8_t *)gTeeAppData[teeAppId].teeUid;
#endif
}

size_t getTaUidLen(TeeAppId_t teeAppId)
{
#if (defined USE_QSEE)
    return strlen(gTargetTid);
#else
    return gTeeAppData[teeAppId].teeUidLen;
#endif
}

size_t getTaTotalBufferSize(TeeAppId_t teeAppId)
{
    return gTeeAppData[teeAppId].maxBufferSize + TA_BUFFER_HEADER_LEN;
}

size_t getTaMaxDataSize(TeeAppId_t teeAppId)
{
    return gTeeAppData[teeAppId].maxBufferSize;
}

char *getPreGenKeyPath(TeeAppId_t teeAppId)
{
    return (char *)gTeeAppData[teeAppId].preGenKeyPath;
}

char *getSaveKeyPath(TeeAppId_t teeAppId)
{
    return (char *)gTeeAppData[teeAppId].saveKeyPath;
}
