/* test_ecc_dh.c - TinyCrypt implementation of some EC-DH tests */

/* Copyright (c) 2014, Kenneth MacKay
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *  * Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

/*
 *  Copyright (C) 2017 by Intel Corporation, All Rights Reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions are met:
 *
 *    - Redistributions of source code must retain the above copyright notice,
 *     this list of conditions and the following disclaimer.
 *
 *    - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 *    - Neither the name of Intel Corporation nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *  POSSIBILITY OF SUCH DAMAGE.
 *
 *  test_ecc_ecdh.c -- Implementation of some EC-DH tests
 *
 */
#include <tinycrypt/ecc.h>
#include <tinycrypt/ecc_dh.h>
#include <tinycrypt/ecc_platform_specific.h>
#include "test_ecc_utils.h"
#include <zephyr/test_utils.h>
#include <tinycrypt/constants.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <zephyr/ztest.h>

int ecdh_vectors(char **qx_vec, char **qy_vec, char **d_vec, char **z_vec,
		 int tests, int verbose)
{

	unsigned int pub[2 * NUM_ECC_WORDS];
	unsigned int prv[NUM_ECC_WORDS];
	unsigned int z[NUM_ECC_WORDS];
	unsigned int result = TC_PASS;

	int rc;
	unsigned int exp_z[NUM_ECC_WORDS];

	const struct uECC_Curve_t *curve = uECC_secp256r1();

	for (int i = 0; i < tests; i++) {

		string2scalar(pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qx_vec[i]);
		string2scalar(pub, NUM_ECC_WORDS, qy_vec[i]);
		string2scalar(exp_z, NUM_ECC_WORDS, z_vec[i]);
		string2scalar(prv, NUM_ECC_WORDS, d_vec[i]);

		uint8_t pub_bytes[2 * NUM_ECC_BYTES];
		uECC_vli_nativeToBytes(pub_bytes, 2 * NUM_ECC_BYTES, pub);
		uint8_t private_bytes[NUM_ECC_BYTES];
		uECC_vli_nativeToBytes(private_bytes, NUM_ECC_BYTES, prv);
		uint8_t z_bytes[NUM_ECC_BYTES];
		uECC_vli_nativeToBytes(z_bytes, NUM_ECC_BYTES, exp_z);

		rc = uECC_shared_secret(pub_bytes, private_bytes, z_bytes, curve);

		/**TESTPOINT: Check for ECDH failure*/
		zassert_equal(rc, TC_CRYPTO_SUCCESS, "ECDH failure, exit");

		uECC_vli_bytesToNative(z, z_bytes, NUM_ECC_BYTES);

		result = check_ecc_result(i, "Z", exp_z, z, NUM_ECC_WORDS, verbose);

		/**TESTPOINT: Check result*/
		zassert_false(result, "ECDH test failed");
	}
	return result;
}

int cavp_ecdh(bool verbose)
{
	unsigned int result = TC_PASS;
	/*
	 * P-256
	 */
	char *d[] = {
		"7d7dc5f71eb29ddaf80d6214632eeae03d9058af1fb6d22ed80badb62bc1a534",
		"38f65d6dce47676044d58ce5139582d568f64bb16098d179dbab07741dd5caf5",
		"1accfaf1b97712b85a6f54b148985a1bdc4c9bec0bd258cad4b3d603f49f32c8",
		"207c43a79bfee03db6f4b944f53d2fb76cc49ef1c9c4d34d51b6c65c4db6932d",
		"59137e38152350b195c9718d39673d519838055ad908dd4757152fd8255c09bf",
		"f5f8e0174610a661277979b58ce5c90fee6c9b3bb346a90a7196255e40b132ef",
		"3b589af7db03459c23068b64f63f28d3c3c6bc25b5bf76ac05f35482888b5190",
		"d8bf929a20ea7436b2461b541a11c80e61d826c0a4c9d322b31dd54e7f58b9c8",
		"0f9883ba0ef32ee75ded0d8bda39a5146a29f1f2507b3bd458dbea0b2bb05b4d",
		"2beedb04b05c6988f6a67500bb813faf2cae0d580c9253b6339e4a3337bb6c08",
		"77c15dcf44610e41696bab758943eff1409333e4d5a11bbe72c8f6c395e9f848",
		"42a83b985011d12303db1a800f2610f74aa71cdf19c67d54ce6c9ed951e9093e",
		"ceed35507b5c93ead5989119b9ba342cfe38e6e638ba6eea343a55475de2800b",
		"43e0e9d95af4dc36483cdd1968d2b7eeb8611fcce77f3a4e7d059ae43e509604",
		"b2f3600df3368ef8a0bb85ab22f41fc0e5f4fdd54be8167a5c3cd4b08db04903",
		"4002534307f8b62a9bf67ff641ddc60fef593b17c3341239e95bdb3e579bfdc8",
		"4dfa12defc60319021b681b3ff84a10a511958c850939ed45635934ba4979147",
		"1331f6d874a4ed3bc4a2c6e9c74331d3039796314beee3b7152fcdba5556304e",
		"dd5e9f70ae740073ca0204df60763fb6036c45709bf4a7bb4e671412fad65da3",
		"5ae026cfc060d55600717e55b8a12e116d1d0df34af831979057607c2d9c2f76",
		"b601ac425d5dbf9e1735c5e2d5bdb79ca98b3d5be4a2cfd6f2273f150e064d9d",
		"fefb1dda1845312b5fce6b81b2be205af2f3a274f5a212f66c0d9fc33d7ae535",
		"334ae0c4693d23935a7e8e043ebbde21e168a7cba3fa507c9be41d7681e049ce",
		"2c4bde40214fcc3bfc47d4cf434b629acbe9157f8fd0282540331de7942cf09d",
		"85a268f9d7772f990c36b42b0a331adc92b5941de0b862d5d89a347cbf8faab0",
	};

	char *x[] = {
		"700c48f77f56584c5cc632ca65640db91b6bacce3a4df6b42ce7cc838833d287",
		"809f04289c64348c01515eb03d5ce7ac1a8cb9498f5caa50197e58d43a86a7ae",
		"a2339c12d4a03c33546de533268b4ad667debf458b464d77443636440ee7fec3",
		"df3989b9fa55495719b3cf46dccd28b5153f7808191dd518eff0c3cff2b705ed",
		"41192d2813e79561e6a1d6f53c8bc1a433a199c835e141b05a74a97b0faeb922",
		"33e82092a0f1fb38f5649d5867fba28b503172b7035574bf8e5b7100a3052792",
		"6a9e0c3f916e4e315c91147be571686d90464e8bf981d34a90b6353bca6eeba7",
		"a9c0acade55c2a73ead1a86fb0a9713223c82475791cd0e210b046412ce224bb",
		"94e94f16a98255fff2b9ac0c9598aac35487b3232d3231bd93b7db7df36f9eb9",
		"e099bf2a4d557460b5544430bbf6da11004d127cb5d67f64ab07c94fcdf5274f",
		"f75a5fe56bda34f3c1396296626ef012dc07e4825838778a645c8248cff01658",
		"2db4540d50230756158abf61d9835712b6486c74312183ccefcaef2797b7674d",
		"cd94fc9497e8990750309e9a8534fd114b0a6e54da89c4796101897041d14ecb",
		"15b9e467af4d290c417402e040426fe4cf236bae72baa392ed89780dfccdb471",
		"49c503ba6c4fa605182e186b5e81113f075bc11dcfd51c932fb21e951eee2fa1",
		"19b38de39fdd2f70f7091631a4f75d1993740ba9429162c2a45312401636b29c",
		"2c91c61f33adfe9311c942fdbff6ba47020feff416b7bb63cec13faf9b099954",
		"a28a2edf58025668f724aaf83a50956b7ac1cfbbff79b08c3bf87dfd2828d767",
		"a2ef857a081f9d6eb206a81c4cf78a802bdf598ae380c8886ecd85fdc1ed7644",
		"ccd8a2d86bc92f2e01bce4d6922cf7fe1626aed044685e95e2eebd464505f01f",
		"c188ffc8947f7301fb7b53e36746097c2134bf9cc981ba74b4e9c4361f595e4e",
		"317e1020ff53fccef18bf47bb7f2dd7707fb7b7a7578e04f35b3beed222a0eb6",
		"45fb02b2ceb9d7c79d9c2fa93e9c7967c2fa4df5789f9640b24264b1e524fcb1",
		"a19ef7bff98ada781842fbfc51a47aff39b5935a1c7d9625c8d323d511c92de6",
		"356c5a444c049a52fee0adeb7e5d82ae5aa83030bfff31bbf8ce2096cf161c4b",
	};

	char *y[] = {
		"db71e509e3fd9b060ddb20ba5c51dcc5948d46fbf640dfe0441782cab85fa4ac",
		"b29d84e811197f25eba8f5194092cb6ff440e26d4421011372461f579271cda3",
		"ef48a3ab26e20220bcda2c1851076839dae88eae962869a497bf73cb66faf536",
		"422294ff46003429d739a33206c8752552c8ba54a270defc06e221e0feaf6ac4",
		"1af98cc45e98a7e041b01cf35f462b7562281351c8ebf3ffa02e33a0722a1328",
		"f2cf6b601e0a05945e335550bf648d782f46186c772c0f20d3cd0d6b8ca14b2f",
		"40f9bead39c2f2bcc2602f75b8a73ec7bdffcbcead159d0174c6c4d3c5357f05",
		"f6de0afa20e93e078467c053d241903edad734c6b403ba758c2b5ff04c9d4229",
		"d8049a43579cfa90b8093a94416cbefbf93386f15b3f6e190b6e3455fedfe69a",
		"d9c50dbe70d714edb5e221f4e020610eeb6270517e688ca64fb0e98c7ef8c1c5",
		"33bbdf1b1772d8059df568b061f3f1122f28a8d819167c97be448e3dc3fb0c3c",
		"62f57f314e3f3495dc4e099012f5e0ba71770f9660a1eada54104cdfde77243e",
		"c3def4b5fe04faee0a11932229fff563637bfdee0e79c6deeaf449f85401c5c4",
		"cdf4e9170fb904302b8fd93a820ba8cc7ed4efd3a6f2d6b05b80b2ff2aee4e77",
		"8af706ff0922d87b3f0c5e4e31d8b259aeb260a9269643ed520a13bb25da5924",
		"09aed7232b28e060941741b6828bcdfa2bc49cc844f3773611504f82a390a5ae",
		"6cab31b06419e5221fca014fb84ec870622a1b12bab5ae43682aa7ea73ea08d0",
		"dfa7bfffd4c766b86abeaf5c99b6e50cb9ccc9d9d00b7ffc7804b0491b67bc03",
		"563c4c20419f07bc17d0539fade1855e34839515b892c0f5d26561f97fa04d1a",
		"e9ddd583a9635a667777d5b8a8f31b0f79eba12c75023410b54b8567dddc0f38",
		"bf7d2f2056e72421ef393f0c0f2b0e00130e3cac4abbcc00286168e85ec55051",
		"09420ce5a19d77c6fe1ee587e6a49fbaf8f280e8df033d75403302e5a27db2ae",
		"5c6e8ecf1f7d3023893b7b1ca1e4d178972ee2a230757ddc564ffe37f5c5a321",
		"e9c184df75c955e02e02e400ffe45f78f339e1afe6d056fb3245f4700ce606ef",
		"57d128de8b2a57a094d1a001e572173f96e8866ae352bf29cddaf92fc85b2f92",
	};

	char *Z[] = {
		"46fc62106420ff012e54a434fbdd2d25ccc5852060561e68040dd7778997bd7b",
		"057d636096cb80b67a8c038c890e887d1adfa4195e9b3ce241c8a778c59cda67",
		"2d457b78b4614132477618a5b077965ec90730a8c81a1c75d6d4ec68005d67ec",
		"96441259534b80f6aee3d287a6bb17b5094dd4277d9e294f8fe73e48bf2a0024",
		"19d44c8d63e8e8dd12c22a87b8cd4ece27acdde04dbf47f7f27537a6999a8e62",
		"664e45d5bba4ac931cd65d52017e4be9b19a515f669bea4703542a2c525cd3d3",
		"ca342daa50dc09d61be7c196c85e60a80c5cb04931746820be548cdde055679d",
		"35aa9b52536a461bfde4e85fc756be928c7de97923f0416c7a3ac8f88b3d4489",
		"605c16178a9bc875dcbff54d63fe00df699c03e8a888e9e94dfbab90b25f39b4",
		"f96e40a1b72840854bb62bc13c40cc2795e373d4e715980b261476835a092e0b",
		"8388fa79c4babdca02a8e8a34f9e43554976e420a4ad273c81b26e4228e9d3a3",
		"72877cea33ccc4715038d4bcbdfe0e43f42a9e2c0c3b017fc2370f4b9acbda4a",
		"e4e7408d85ff0e0e9c838003f28cdbd5247cdce31f32f62494b70e5f1bc36307",
		"ed56bcf695b734142c24ecb1fc1bb64d08f175eb243a31f37b3d9bb4407f3b96",
		"bc5c7055089fc9d6c89f83c1ea1ada879d9934b2ea28fcf4e4a7e984b28ad2cf",
		"9a4e8e657f6b0e097f47954a63c75d74fcba71a30d83651e3e5a91aa7ccd8343",
		"3ca1fc7ad858fb1a6aba232542f3e2a749ffc7203a2374a3f3d3267f1fc97b78",
		"1aaabe7ee6e4a6fa732291202433a237df1b49bc53866bfbe00db96a0f58224f",
		"430e6a4fba4449d700d2733e557f66a3bf3d50517c1271b1ddae1161b7ac798c",
		"1ce9e6740529499f98d1f1d71329147a33df1d05e4765b539b11cf615d6974d3",
		"4690e3743c07d643f1bc183636ab2a9cb936a60a802113c49bb1b3f2d0661660",
		"30c2261bd0004e61feda2c16aa5e21ffa8d7e7f7dbf6ec379a43b48e4b36aeb0",
		"2adae4a138a239dcd93c243a3803c3e4cf96e37fe14e6a9b717be9599959b11c",
		"2e277ec30f5ea07d6ce513149b9479b96e07f4b6913b1b5c11305c1444a1bc0b",
		"1e51373bd2c6044c129c436e742a55be2a668a85ae08441b6756445df5493857",
	};

	TC_PRINT("Test #1: ECDH");
	TC_PRINT("NIST-p256\n");

	result = ecdh_vectors(x, y, d, Z, 25, verbose);

	/**TESTPOINT: Check result*/
	zassert_false(result, "ECDH test failed");
	return result;
}

int cavp_keygen(bool verbose)
{
	unsigned int result = TC_PASS;
	/*
	 * [P-256, B.4.2 Key Pair Generation by Testing Candidates]
	 */
	char *d[] = {
		"c9806898a0334916c860748880a541f093b579a9b1f32934d86c363c39800357",
		"710735c8388f48c684a97bd66751cc5f5a122d6b9a96a2dbe73662f78217446d",
		"78d5d8b7b3e2c16b3e37e7e63becd8ceff61e2ce618757f514620ada8a11f6e4",
		"2a61a0703860585fe17420c244e1de5a6ac8c25146b208ef88ad51ae34c8cb8c",
		"01b965b45ff386f28c121c077f1d7b2710acc6b0cb58d8662d549391dcf5a883",
		"fac92c13d374c53a085376fe4101618e1e181b5a63816a84a0648f3bdc24e519",
		"f257a192dde44227b3568008ff73bcf599a5c45b32ab523b5b21ca582fef5a0a",
		"add67e57c42a3d28708f0235eb86885a4ea68e0d8cfd76eb46134c596522abfd",
		"4494860fd2c805c5c0d277e58f802cff6d731f76314eb1554142a637a9bc5538",
		"d40b07b1ea7b86d4709ef9dc634c61229feb71abd63dc7fc85ef46711a87b210",
	};

	char *x[] = {
		"d0720dc691aa80096ba32fed1cb97c2b620690d06de0317b8618d5ce65eb728f",
		"f6836a8add91cb182d8d258dda6680690eb724a66dc3bb60d2322565c39e4ab9",
		"76711126cbb2af4f6a5fe5665dad4c88d27b6cb018879e03e54f779f203a854e",
		"e1aa7196ceeac088aaddeeba037abb18f67e1b55c0a5c4e71ec70ad666fcddc8",
		"1f038c5422e88eec9e88b815e8f6b3e50852333fc423134348fc7d79ef8e8a10",
		"7258f2ab96fc84ef6ccb33e308cd392d8b568ea635730ceb4ebd72fa870583b9",
		"d2e01411817b5512b79bbbe14d606040a4c90deb09e827d25b9f2fc068997872",
		"55bed2d9c029b7f230bde934c7124ed52b1330856f13cbac65a746f9175f85d7",
		"5190277a0c14d8a3d289292f8a544ce6ea9183200e51aec08440e0c1a463a4e4",
		"fbcea7c2827e0e8085d7707b23a3728823ea6f4878b24747fb4fd2842d406c73",
	};

	char *y[] = {
		"9681b517b1cda17d0d83d335d9c4a8a9a9b0b1b3c7106d8f3c72bc5093dc275f",
		"1f837aa32864870cb8e8d0ac2ff31f824e7beddc4bb7ad72c173ad974b289dc2",
		"a26df39960ab5248fd3620fd018398e788bd89a3cea509b352452b69811e6856",
		"d7d35bdce6dedc5de98a7ecb27a9cd066a08f586a733b59f5a2cdb54f971d5c8",
		"43a047cb20e94b4ffb361ef68952b004c0700b2962e0c0635a70269bc789b849",
		"489807ca55bdc29ca5c8fe69b94f227b0345cccdbe89975e75d385cc2f6bb1e2",
		"503f138f8bab1df2c4507ff663a1fdf7f710e7adb8e7841eaa902703e314e793",
		"32805e311d583b4e007c40668185e85323948e21912b6b0d2cda8557389ae7b0",
		"ecd98514821bd5aaf3419ab79b71780569470e4fed3da3c1353b28fe137f36eb",
		"2393c85f1f710c5afc115a39ba7e18abe03f19c9d4bb3d47d19468b818efa535",
	};

	TC_PRINT("Test #2: ECC KeyGen ");
	TC_PRINT("NIST-p256\n");

	result = keygen_vectors(d, x, y, 10, verbose);

	/**TESTPOINT: Check result*/
	zassert_false(result, "ECC KeyGen test failed");
	return result;
}

/* Test ecc_make_keys, and also as keygen part of other tests */
int pkv_vectors(char **qx_vec, char **qy_vec, int res_vec[], int tests,
		bool verbose)
{

	unsigned int pub[2 * NUM_ECC_WORDS];
	uint8_t _public[2 * NUM_ECC_BYTES];
	int rc;
	int exp_rc;
	unsigned int result = TC_PASS;
	const struct uECC_Curve_t *curve = uECC_secp256r1();

	for (int i = 0; i < tests; i++) {
		exp_rc = res_vec[i];

		if (strlen(qx_vec[i]) > 2 * NUM_ECC_BYTES ||
		    strlen(qy_vec[i]) > 2 * NUM_ECC_BYTES) {
			/* invalid input to ECC digit conversion (string2native()) */
			rc = -2;
		} else {
			string2scalar(pub, NUM_ECC_WORDS, qx_vec[i]);
			string2scalar(pub + NUM_ECC_WORDS, NUM_ECC_WORDS, qy_vec[i]);

			uECC_vli_nativeToBytes(_public, NUM_ECC_BYTES, pub);
			uECC_vli_nativeToBytes(_public + NUM_ECC_BYTES,
					       NUM_ECC_BYTES, pub + NUM_ECC_WORDS);

			rc = uECC_valid_public_key(_public, curve);
		}

		/*
		 * map to CAVP error codes
		 *  0 => 0 - success
		 * -1 => ? - (x,y) = (0,0) (not covered)
		 * -2 => 1 - out of bounds (pubverify or ecc import)
		 * -3 => 2 - not on curve
		 * -4 => ? - public key is the group generator
		 */

		if (rc == -3) {
			rc = 2;
		}
		if (rc == -2) {
			rc = 1;
		}

		result = check_code(i, exp_rc, rc, verbose);

		/**TESTPOINT: Check result*/
		zassert_false(result, "PubKey verification failed");
	}
		return result;
}

int cavp_pkv(bool verbose)
{
	/*
	 * [P-256]
	 */
	char *x[] = {
		"e0f7449c5588f24492c338f2bc8f7865f755b958d48edb0f2d0056e50c3fd5b7",
		"d17c446237d9df87266ba3a91ff27f45abfdcb77bfd83536e92903efb861a9a9",
		"17875397ae87369365656d490e8ce956911bd97607f2aff41b56f6f3a61989826",
		"f2d1c0dc0852c3d8a2a2500a23a44813ccce1ac4e58444175b440469ffc12273",
		"10b0ca230fff7c04768f4b3d5c75fa9f6c539bea644dffbec5dc796a213061b58",
		"2c1052f25360a15062d204a056274e93cbe8fc4c4e9b9561134ad5c15ce525da",
		"a40d077a87dae157d93dcccf3fe3aca9c6479a75aa2669509d2ef05c7de6782f",
		"2633d398a3807b1895548adbb0ea2495ef4b930f91054891030817df87d4ac0a",
		"14bf57f76c260b51ec6bbc72dbd49f02a56eaed070b774dc4bad75a54653c3d56",
		"2fa74931ae816b426f484180e517f5050c92decfc8daf756cd91f54d51b302f1",
		"f8c6dd3181a76aa0e36c2790bba47041acbe7b1e473ff71eee39a824dc595ff0",
		"7a81a7e0b015252928d8b36e4ca37e92fdc328eb25c774b4f872693028c4be38",
	};

	char *y[] = {
		"86d7e9255d0f4b6f44fa2cd6f8ba3c0aa828321d6d8cc430ca6284ce1d5b43a0",
		"1eabb6a349ce2cd447d777b6739c5fc066add2002d2029052c408d0701066231c",
		"980a3c4f61b9692633fbba5ef04c9cb546dd05cdec9fa8428b8849670e2fba92",
		"32bfe992831b305d8c37b9672df5d29fcb5c29b4a40534683e3ace23d24647dd",
		"f5edf37c11052b75f771b7f9fa050e353e464221fec916684ed45b6fead38205",
		"ced9783713a8a2a09eff366987639c625753295d9a85d0f5325e32dedbcada0b",
		"503d86b87d743ba20804fd7e7884aa017414a7b5b5963e0d46e3a9611419ddf3",
		"d6b2f738e3873cc8364a2d364038ce7d0798bb092e3dd77cbdae7c263ba618d2",
		"7a231a23bf8b3aa31d9600d888a0678677a30e573decd3dc56b33f365cc11236",
		"5b994346137988c58c14ae2152ac2f6ad96d97decb33099bd8a0210114cd1141",
		"9c965f227f281b3072b95b8daf29e88b35284f3574462e268e529bbdc50e9e52",
		"08862f7335147261e7b1c3d055f9a316e4cab7daf99cc09d1c647f5dd6e7d5bb",
	};

	int results[] = { 0, 1, 1, 2, 1, 0, 2, 0, 1, 0, 2, 2 };

	TC_PRINT("Test #3: PubKeyVerify ");
	TC_PRINT("NIST-p256-SHA2-256\n");

	return pkv_vectors(x, y, results, 12, verbose);
}

int montecarlo_ecdh(int num_tests, bool verbose)
{
	int i;
	uint8_t private1[NUM_ECC_BYTES] = { 0 };
	uint8_t private2[NUM_ECC_BYTES] = { 0 };
	uint8_t public1[2 * NUM_ECC_BYTES] = { 0 };
	uint8_t public2[2 * NUM_ECC_BYTES] = { 0 };
	uint8_t secret1[NUM_ECC_BYTES] = { 0 };
	uint8_t secret2[NUM_ECC_BYTES] = { 0 };

	const struct uECC_Curve_t *curve = uECC_secp256r1();

	TC_PRINT("Test #4: Monte Carlo (%d Randomized EC-DH key-exchange) ", num_tests);
	TC_PRINT("NIST-p256\n  ");

	for (i = 0; i < num_tests; ++i) {
		if (verbose) {
			TC_PRINT(".");
		}

		if (!uECC_make_key(public1, private1, curve) ||
		    !uECC_make_key(public2, private2, curve)) {
			zassert_true(0, "uECC_make_key() failed");
		}

		if (!uECC_shared_secret(public2, private1, secret1, curve)) {
			zassert_true(0, "shared_secret() failed (1)");
		}

		if (!uECC_shared_secret(public1, private2, secret2, curve)) {
			zassert_true(0, "shared_secret() failed (2)");
		}

		if (memcmp(secret1, secret2, sizeof(secret1)) != 0) {
			TC_PRINT("Shared secrets are not identical!\n");
			TC_PRINT("Private key 1 = ");
			vli_print_bytes(private1, 32);
			TC_PRINT("\nPrivate key 2 = ");
			vli_print_bytes(private2, 32);
			TC_PRINT("\nPublic key 1 = ");
			vli_print_bytes(public1, 64);
			TC_PRINT("\nPublic key 2 = ");
			vli_print_bytes(public2, 64);
			TC_PRINT("\nShared secret 1 = ");
			vli_print_bytes(secret1, 32);
			TC_PRINT("\nShared secret 2 = ");
			vli_print_bytes(secret2, 32);
			TC_PRINT("\n");
		}
	}

	TC_PRINT("\n");
	return TC_PASS;
}

ZTEST(tinycrypt, test_ecc_dh)
{
	unsigned int result = TC_PASS;

	TC_START("Performing ECC-DH tests:");

	/* Setup of the Cryptographically Secure PRNG. */
	uECC_set_rng(&default_CSPRNG);

	bool verbose = true;

	TC_PRINT("Performing cavp_ecdh test:\n");
	result = cavp_ecdh(verbose);

	/**TESTPOINT: Check cavp_ecdh*/
	zassert_false(result, "cavp_ecdh test failed");

	TC_PRINT("Performing cavp_keygen test:\n");
	result = cavp_keygen(verbose);

	/**TESTPOINT: Check cavp_keygen*/
	zassert_false(result, "cavp_keygen test failed");

	TC_PRINT("Performing cavp_pkv test:\n");
	result = cavp_pkv(verbose);

	/**TESTPOINT: Check cavp_pkv*/
	zassert_false(result, "cavp_pkv test failed");

	TC_PRINT("Performing montecarlo_ecdh test:\n");
	result = montecarlo_ecdh(10, verbose);

	/**TESTPOINT: Check cavp_ecdh*/
	zassert_false(result, "montecarlo_ecdh test failed");

	TC_PRINT("All EC-DH tests succeeded!\n");
}
