/*
 *  * @file qsee_trustedboot.c
 *   * @brief Contains test code for most of the QSEE fuse APIs.
 *    *
 *     * */
/*===========================================================================
 *  *    Copyright (c) 2011 by Qualcomm Technologies, Incorporated.  All Rights Reserved.
 *   *    ===========================================================================*/

/*===========================================================================
 *  *
 *   *  EDIT HISTORY FOR FILE
 *    *  $Header: 
 *     *  $DateTime: 
 *      *  $Author: pwbldsvc $
 *       *  # when       who     what, where, why
 *        *  # 2015-12-01 bogil.jang first implement
 *         * ===========================================================================*/

#include <stdbool.h>
#include <comdef.h>
#include <qsee_services.h>
#include "qsee_log.h"
#include "qsee_heap.h"
#include "qsee_oem_buffer.h"
#include "bksecapp_trustedboot.h"

/* SVB is not used 
#include "TZ_Vendor_tl.h"
int32 store_measure(trusted_boot_bl_status_t *hash_ptr)
{
	static int is_init;
	uint8  tima_magic[] ="TIMA 2.0";
	uint8 *measure_base_ptr = (uint8 *) TIMA_VPCR_ADDR;
	uint32 *num_hash_ptr = (uint32 *) (TIMA_VPCR_ADDR + 8);
	uint8 *kernel_hash_ptr = (uint8 *) (TIMA_VPCR_ADDR + 0xc0);
	uint32 ret = 0;
	uint32 num_hash = 0;
	uint8 trusted_boot_measure_buffer[TIMA_MSR_MAX_SIZE] = { 0 };
	uint8 trusted_measure_zero_buffer[TIMA_MSR_MAX_SIZE] = { 0 };

	qsee_log(QSEE_LOG_MSG_ERROR, "Store measure for Trusted boot");

	ret = TZ_phys_read((void *)measure_base_ptr, TIMA_MSR_MAX_SIZE, trusted_boot_measure_buffer);
	if (ret != TZ_API_OK)
	{
		qsee_log(QSEE_LOG_MSG_ERROR,"store_measure : p-address -> v-address mapping error!");
	}

	num_hash_ptr = (uint32 *)(trusted_boot_measure_buffer + 8);
	if ( *num_hash_ptr == 0 || *num_hash_ptr > TIMA_NUM_OF_MEASUREMENTS)
	{
		qsee_log(QSEE_LOG_MSG_ERROR, "Num of hash is zero or too large! : %x", *num_hash_ptr);
		return -1;
	}

	kernel_hash_ptr = (uint8 *)(trusted_boot_measure_buffer + 32 + (*num_hash_ptr * SHA256_SIZE));
	memcpy(kernel_hash_ptr, hash_ptr->hash, SHA256_SIZE);
	*num_hash_ptr += 1;

	qsee_log(QSEE_LOG_MSG_ERROR, "Num of hashes = %d", *num_hash_ptr);
	if(*num_hash_ptr != TIMA_NUM_OF_MEASUREMENTS)
	{
		qsee_log(QSEE_LOG_MSG_ERROR, "NUM OF MEASUREMENTS mismatch");
		return -1;
	}

	// Write boot measurements to OEM buffer 
	ret = qsee_write_oem_buffer(TIMA_VPCR_OFFSET,trusted_boot_measure_buffer,TIMA_MSR_MAX_SIZE);
	if(ret) {
		qsee_log(QSEE_LOG_MSG_ERROR, "%s: Failed to write boot msr, ret:%d", __func__, ret);
	}

	// zero out boot time measurement area in TIMA memory 
	ret = TZ_phys_write((void *)measure_base_ptr, TIMA_MSR_MAX_SIZE, trusted_measure_zero_buffer);
	if (ret != TZ_API_OK) 
	{
		qsee_log(QSEE_LOG_MSG_ERROR,"%s: p-address -> v-address mapping error!", __func__);
	}
	

	// Also, zero out golden measurement area in OEM buffer 
	ret = qsee_write_oem_buffer(TIMA_GOLDEN_MEASUREMENT_OFFSET,trusted_measure_zero_buffer,TIMA_MSR_MAX_SIZE);
	if(ret) {
		qsee_log(QSEE_LOG_MSG_ERROR, "%s: Failed to clear golden msr, ret:%d", __func__, ret);
	}

	qsee_log(QSEE_LOG_MSG_ERROR, "Finished store measure for Trusted boot");

	return ret;
}
*/
int32 store_vbmeta(trusted_boot_bl_status_t *hash_ptr)
{
	uint8  tima_magic[] ="TIMA 3.0";
	uint8 *measure_base_ptr = (uint8 *) TIMA_VPCR_ADDR;
	uint32 *num_hash_ptr;
	uint8 *vbmeta_digest_ptr;
	uint32 ret = 0;
	uint8 trusted_boot_measure_buffer[TIMA_MSR_MAX_SIZE] = { 0 };
	uint8 trusted_measure_zero_buffer[TIMA_MSR_MAX_SIZE] = { 0 };

	qsee_log(QSEE_LOG_MSG_ERROR, "Store measure for Trusted boot");

	ret = qsee_read_oem_buffer(TIMA_VPCR_OFFSET, trusted_boot_measure_buffer, TIMA_MSR_MAX_SIZE);
	if(ret) {
		qsee_log(QSEE_LOG_MSG_ERROR, "%s: Failed to write boot msr, ret:%d", __func__, ret);
	}

	//set tima magic
	memcpy(trusted_boot_measure_buffer, tima_magic, 8);
	//set num hash to 1
	num_hash_ptr = (uint32 *)(trusted_boot_measure_buffer + 8);
	*num_hash_ptr = 1;
	//set vbmeta digest
	vbmeta_digest_ptr = trusted_boot_measure_buffer + 32;
	memcpy(vbmeta_digest_ptr, hash_ptr->hash, SHA256_SIZE);

	/* Write boot measurements to OEM buffer */
	ret = qsee_write_oem_buffer(TIMA_VPCR_OFFSET, trusted_boot_measure_buffer, TIMA_MSR_MAX_SIZE);
	if(ret) {
		qsee_log(QSEE_LOG_MSG_ERROR, "%s: Failed to write boot msr, ret:%d", __func__, ret);
	}

	qsee_log(QSEE_LOG_MSG_ERROR, "Finished store vbmeta digest");

	return ret;
}
