/*
 * Copyright (c) 2019,2020 Linaro Limited
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <logging/log_ctrl.h>
#include <logging/log.h>

#include "psa/crypto.h"
#include "psa_crypto.h"
#include "util_app_log.h"
#include "util_sformat.h"

/** Declare a reference to the application logging interface. */
LOG_MODULE_DECLARE(app, CONFIG_LOG_DEFAULT_LEVEL);

/**
 * @brief Generates random values using the TF-M crypto service.
 */
void crp_test_rng(void)
{
	psa_status_t status;
	u8_t outbuf[256] = { 0 };
	struct sf_hex_tbl_fmt fmt = {
		.ascii = true,
		.addr_label = true,
		.addr = 0
	};

	status = al_psa_status(psa_generate_random(outbuf, 256), __func__);
	LOG_INF("Generating 256 bytes of random data.");
	al_dump_log();
	sf_hex_tabulate_16(&fmt, outbuf, 256);
}

/**
 * @brief Demonstrates how to calcute the SHA-256 hash of a value in chunks.
 */
void crp_test_sha256(void)
{
	const psa_algorithm_t alg = PSA_ALG_SHA_256;
	static const char *const msg[] = { "This is my test message, ",
					   "please generate a hash for this." };
	const size_t msg_size[] = { 25, 32 };
	u8_t hash_val[PSA_HASH_SIZE(PSA_ALG_SHA_256)] = { 0 };
	size_t hash_len;
	const u32_t msg_num = ARRAY_SIZE(msg) / sizeof(msg[0]);
	u32_t idx;
	psa_status_t status;
	psa_hash_operation_t handle = psa_hash_operation_init();

	LOG_INF("Calculating SHA-256 hash of value.");
	al_dump_log();

	/* Setup the hash object. */
	status = al_psa_status(psa_hash_setup(&handle, alg), __func__);
	if (status != PSA_SUCCESS) {
		goto err;
	}

	/* Update object with all the message chunks. */
	for (idx = 0; idx < msg_num; idx++) {
		status = al_psa_status(
			psa_hash_update(
				&handle,
				(const u8_t *)msg[idx], msg_size[idx]),
			__func__);
		if (status != PSA_SUCCESS) {
			goto err;
		}
	}

	/* Finalize the hash calculation. */
	status = al_psa_status(
		psa_hash_finish(&handle,
				hash_val,
				sizeof(hash_val),
				&hash_len),
		__func__);
	if (status != PSA_SUCCESS) {
		goto err;
	}

	/* Display the SHA-256 hash for debug purposes */
	struct sf_hex_tbl_fmt fmt = {
		.ascii = false,
		.addr_label = true,
		.addr = 0
	};
	sf_hex_tabulate_16(&fmt, hash_val, (size_t)(PSA_HASH_SIZE(alg)));

	return;
err:
	psa_hash_abort(&handle);
	al_dump_log();
}
