/* Copyright 2020 The Chromium OS Authors. All rights reserved.
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 *
 * Tests for generic crypto algorithm helper stuff.
 */

#include <stdio.h>

#include "2crypto.h"
#include "2return_codes.h"
#include "2rsa.h"
#include "2sha.h"
#include "2sysincludes.h"
#include "test_common.h"
#include "vboot_host.h"

static void hash_algorithm_name_tests(void)
{
	enum vb2_hash_algorithm alg;
	char test_name[256];

	for (alg = 0; alg < VB2_HASH_ALG_COUNT; alg++) {
		sprintf(test_name, "%s (alg=%d)",
			vb2_get_hash_algorithm_name(alg), alg);
		TEST_STR_NEQ(vb2_get_hash_algorithm_name(alg),
			     VB2_INVALID_ALG_NAME, test_name);
	}

	TEST_STR_EQ(vb2_get_hash_algorithm_name(VB2_HASH_ALG_COUNT),
		    VB2_INVALID_ALG_NAME, "hash alg name out of range");
}

static void sig_algorithm_name_tests(void)
{
	enum vb2_signature_algorithm alg;
	char test_name[256];

	for (alg = 1; alg < VB2_SIG_ALG_COUNT; alg++) {
		sprintf(test_name, "%s (alg=%d)",
			vb2_get_sig_algorithm_name(alg), alg);
		TEST_STR_NEQ(vb2_get_sig_algorithm_name(alg),
			     VB2_INVALID_ALG_NAME, test_name);
	}

	TEST_STR_EQ(vb2_get_sig_algorithm_name(VB2_SIG_INVALID),
		    VB2_INVALID_ALG_NAME, "sig alg name invalid");
	TEST_STR_EQ(vb2_get_sig_algorithm_name(VB2_SIG_ALG_COUNT),
		    VB2_INVALID_ALG_NAME, "sig alg name out of range");
}

static void hash_algorithm_lookup_tests(void)
{
	enum vb2_hash_algorithm alg, out;
	char test_name[256];

	for (alg = 1; alg < VB2_HASH_ALG_COUNT; alg++) {
		sprintf(test_name, "%s (alg=%d)",
			vb2_get_hash_algorithm_name(alg), alg);
		TEST_EQ(vb2_lookup_hash_alg(vb2_get_hash_algorithm_name(alg),
			&out), 1, test_name);
		TEST_EQ(out, alg, "  algorithm correct");
	}

	TEST_EQ(vb2_lookup_hash_alg(VB2_INVALID_ALG_NAME, &out), 0,
		"invalid algorithm cannot be parsed");
	TEST_EQ(vb2_lookup_hash_alg("RSA1024", &out), 0,
		"cannot parse hash  as signature");
	TEST_EQ(vb2_lookup_hash_alg("shA512", &out), 1,
		"case insensitivity spot check");
	TEST_EQ(out, VB2_HASH_SHA512, "  algorithm correct");
}

static void sig_algorithm_lookup_tests(void)
{
	enum vb2_signature_algorithm alg, out;
	char test_name[256];

	for (alg = 1; alg < VB2_SIG_ALG_COUNT; alg++) {
		sprintf(test_name, "%s (alg=%d)",
			vb2_get_sig_algorithm_name(alg), alg);
		TEST_EQ(vb2_lookup_sig_alg(vb2_get_sig_algorithm_name(alg),
			&out), 1, test_name);
		TEST_EQ(out, alg, "  algorithm correct");
	}

	TEST_EQ(vb2_lookup_sig_alg(VB2_INVALID_ALG_NAME, &out), 0,
		"invalid algorithm cannot be parsed");
	TEST_EQ(vb2_lookup_sig_alg("SHA256", &out), 0,
		"cannot parse signature as hash");
	TEST_EQ(vb2_lookup_sig_alg("rSa2048", &out), 1,
		"case insensitivity spot check");
	TEST_EQ(out, VB2_SIG_RSA2048, "  algorithm correct");
}

int main(int argc, char *argv[])
{
	hash_algorithm_name_tests();
	sig_algorithm_name_tests();
	hash_algorithm_lookup_tests();
	sig_algorithm_lookup_tests();

	return gTestSuccess ? 0 : 255;
}
