/*
 * Copyright (c) 2017 Samsung Electronics Co., Ltd. All rights reserved.
 *
 * Created in Samsung Ukraine R&D Center (SRK) under a contract between
 * LLC "Samsung Electronics Ukraine Company" (Kiev, Ukraine)
 * and "Samsung Electronics Co", Ltd (Seoul, Republic of Korea)
 */

/**
 * @file TzwSerialNumber.c
 * @brief Functionality to get public chip serial number, defined by each silicon provider.
 * @author Konstyantyn Volobuyev <k.volobuyev@samsung.com>
 * @date Created Jun 26, 2017
 */

#include "TzwSerialNumber.h"

#include "TigerMacroses.h"
#include "TzwString.h"

#if defined(TIGER_TZ_MODEL_BLOWFISH)
#include <driver/mem/phys.h>
#include <errno.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <uuid/uuid.h>
#endif

#if defined(TZ_MODEL_QCOM)
#include <qsee_core.h>
#endif

TzwErrorCode_t tzwReadSerialNumber(TzwSerialNumber_t* apSerialNumber) {
    TIGER_CHECK_FUNCTION_ARGUMENT_RETURN(apSerialNumber != NULL);

#if TIGER_TZ_MODEL_BLOWFISH
    const size_t regionSize = sizeof(TEE_UUID);
    char serials[48];
    TEE_UUID deviceId;
    TEE_GetPropertyAsUUID(TEE_PROPSET_TEE_IMPLEMENTATION, "gpd.tee.deviceID", &deviceId);
    tzwMemMove((uint8_t*)&apSerialNumber->uuid, (uint8_t*)&deviceId, regionSize);
    uuid_unparse(&apSerialNumber->uuid, serials);

    LOG_DEV("apSerialNumber->uuid: %s", serials);

    apSerialNumber->size = regionSize;

#else
    apSerialNumber->uuid = qsee_read_serial_num();
    apSerialNumber->size = 4;
#endif

#ifdef __DEV_DEBUG__
    logByteArrayHex((uint8_t*)apSerialNumber->serial,apSerialNumber->size , "Serial Number");
#endif

    return TEE_SUCCESS;
}
