/* ec_dsa.c - TinyCrypt implementation of EC-DSA */

/*
 *  Copyright (c) 2019, Arm Limited (or its affiliates), All Rights Reserved.
 *  SPDX-License-Identifier: BSD-3-Clause
 */

/* 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.
 */

#if !defined(MBEDTLS_CONFIG_FILE)
#include "mbedtls/config.h"
#else
#include MBEDTLS_CONFIG_FILE
#endif

#include <tinycrypt/ecc.h>
#include <tinycrypt/ecc_dsa.h>
#include "mbedtls/platform_util.h"

static void bits2int(uECC_word_t *native, const uint8_t *bits,
		     unsigned bits_size)
{
	unsigned num_n_bytes = BITS_TO_BYTES(NUM_ECC_BITS);

	if (bits_size > num_n_bytes) {
		bits_size = num_n_bytes;
	}

	uECC_vli_clear(native);
	uECC_vli_bytesToNative(native, bits, bits_size);
}

int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash,
		     unsigned hash_size, uECC_word_t *k, uint8_t *signature)
{

	uECC_word_t tmp[NUM_ECC_WORDS];
	uECC_word_t s[NUM_ECC_WORDS];
	uECC_word_t p[NUM_ECC_WORDS * 2];
	wordcount_t num_n_words = BITS_TO_WORDS(NUM_ECC_BITS);
	int r;


	/* Make sure 0 < k < curve_n */
  	if (uECC_vli_isZero(k) ||
	    uECC_vli_cmp(curve_n, k) != 1) {
		return UECC_FAILURE;
	}

	r = EccPoint_mult_safer(p, curve_G, k);
        if (r != UECC_SUCCESS) {
		return r;
	}

	/* If an RNG function was specified, get a random number
	to prevent side channel analysis of k. */
	if (!uECC_get_rng()) {
		uECC_vli_clear(tmp);
		tmp[0] = 1;
	}
	else if (!uECC_generate_random_int(tmp, curve_n, num_n_words)) {
		return UECC_FAILURE;
	}

	/* Prevent side channel analysis of uECC_vli_modInv() to determine
	bits of k / the private key by premultiplying by a random number */
	uECC_vli_modMult(k, k, tmp, curve_n); /* k' = rand * k */
	uECC_vli_modInv(k, k, curve_n);       /* k = 1 / k' */
	uECC_vli_modMult(k, k, tmp, curve_n); /* k = 1 / k */

	uECC_vli_nativeToBytes(signature, NUM_ECC_BYTES, p); /* store r */

	/* tmp = d: */
	uECC_vli_bytesToNative(tmp, private_key, BITS_TO_BYTES(NUM_ECC_BITS));

	s[num_n_words - 1] = 0;
	uECC_vli_set(s, p);
	uECC_vli_modMult(s, tmp, s, curve_n); /* s = r*d */

	bits2int(tmp, message_hash, hash_size);
	uECC_vli_modAdd(s, tmp, s, curve_n); /* s = e + r*d */
	uECC_vli_modMult(s, s, k, curve_n);  /* s = (e + r*d) / k */
	if (uECC_vli_numBits(s) > (bitcount_t)NUM_ECC_BYTES * 8) {
		return UECC_FAILURE;
	}

	uECC_vli_nativeToBytes(signature + NUM_ECC_BYTES, NUM_ECC_BYTES, s);
	return UECC_SUCCESS;
}

int uECC_sign(const uint8_t *private_key, const uint8_t *message_hash,
	      unsigned hash_size, uint8_t *signature)
{
	int r;
	uECC_word_t _random[2*NUM_ECC_WORDS];
	uECC_word_t k[NUM_ECC_WORDS];
	uECC_word_t tries;

	for (tries = 0; tries < uECC_RNG_MAX_TRIES; ++tries) {
		/* Generating _random uniformly at random: */
		uECC_RNG_Function rng_function = uECC_get_rng();
		if (!rng_function ||
		    !rng_function((uint8_t *)_random, 2*NUM_ECC_WORDS*uECC_WORD_SIZE)) {
			return UECC_FAILURE;
		}

		// computing k as modular reduction of _random (see FIPS 186.4 B.5.1):
		uECC_vli_mmod(k, _random, curve_n);

		r = uECC_sign_with_k(private_key, message_hash, hash_size, k, signature);
		/* don't keep trying if a fault was detected */
		if (r == UECC_FAULT_DETECTED) {
			return r;
		}
		if (r == UECC_SUCCESS) {
			return UECC_SUCCESS;
		}
		/* else keep trying */
	}
	return UECC_FAILURE;
}

static bitcount_t smax(bitcount_t a, bitcount_t b)
{
	return (a > b ? a : b);
}

int uECC_verify(const uint8_t *public_key, const uint8_t *message_hash,
		unsigned hash_size, const uint8_t *signature)
{

	uECC_word_t u1[NUM_ECC_WORDS], u2[NUM_ECC_WORDS];
	uECC_word_t z[NUM_ECC_WORDS];
	uECC_word_t sum[NUM_ECC_WORDS * 2];
	uECC_word_t rx[NUM_ECC_WORDS];
	uECC_word_t ry[NUM_ECC_WORDS];
	uECC_word_t tx[NUM_ECC_WORDS];
	uECC_word_t ty[NUM_ECC_WORDS];
	uECC_word_t tz[NUM_ECC_WORDS];
	const uECC_word_t *points[4];
	const uECC_word_t *point;
	bitcount_t num_bits;
	bitcount_t i;
	volatile uECC_word_t diff;

	uECC_word_t _public[NUM_ECC_WORDS * 2];
	uECC_word_t r[NUM_ECC_WORDS], s[NUM_ECC_WORDS];
	wordcount_t num_words = NUM_ECC_WORDS;
	wordcount_t num_n_words = BITS_TO_WORDS(NUM_ECC_BITS);

	rx[num_n_words - 1] = 0;
	r[num_n_words - 1] = 0;
	s[num_n_words - 1] = 0;

	uECC_vli_bytesToNative(_public, public_key, NUM_ECC_BYTES);
	uECC_vli_bytesToNative(_public + num_words, public_key + NUM_ECC_BYTES,
			       NUM_ECC_BYTES);
	uECC_vli_bytesToNative(r, signature, NUM_ECC_BYTES);
	uECC_vli_bytesToNative(s, signature + NUM_ECC_BYTES, NUM_ECC_BYTES);

	/* r, s must not be 0. */
	if (uECC_vli_isZero(r) || uECC_vli_isZero(s)) {
		return UECC_FAILURE;
	}

	/* r, s must be < n. */
	if (uECC_vli_cmp_unsafe(curve_n, r) != 1 ||
	    uECC_vli_cmp_unsafe(curve_n, s) != 1) {
		return UECC_FAILURE;
	}

	/* Calculate u1 and u2. */
	uECC_vli_modInv(z, s, curve_n); /* z = 1/s */
	u1[num_n_words - 1] = 0;
	bits2int(u1, message_hash, hash_size);
	uECC_vli_modMult(u1, u1, z, curve_n); /* u1 = e/s */
	uECC_vli_modMult(u2, r, z, curve_n); /* u2 = r/s */

	/* Calculate sum = G + Q. */
	uECC_vli_set(sum, _public);
	uECC_vli_set(sum + num_words, _public + num_words);
	uECC_vli_set(tx, curve_G);
	uECC_vli_set(ty, curve_G + num_words);
	uECC_vli_modSub(z, sum, tx, curve_p); /* z = x2 - x1 */
	XYcZ_add(tx, ty, sum, sum + num_words);
	uECC_vli_modInv(z, z, curve_p); /* z = 1/z */
	apply_z(sum, sum + num_words, z);

	/* Use Shamir's trick to calculate u1*G + u2*Q */
	points[0] = 0;
	points[1] = curve_G;
	points[2] = _public;
	points[3] = sum;
	num_bits = smax(uECC_vli_numBits(u1),
	uECC_vli_numBits(u2));

	point = points[(!!uECC_vli_testBit(u1, num_bits - 1)) |
                       ((!!uECC_vli_testBit(u2, num_bits - 1)) << 1)];
	uECC_vli_set(rx, point);
	uECC_vli_set(ry, point + num_words);
	uECC_vli_clear(z);
	z[0] = 1;

	for (i = num_bits - 2; i >= 0; --i) {
		uECC_word_t index;
		double_jacobian_default(rx, ry, z);

		index = (!!uECC_vli_testBit(u1, i)) | ((!!uECC_vli_testBit(u2, i)) << 1);
		point = points[index];
		if (point) {
			uECC_vli_set(tx, point);
			uECC_vli_set(ty, point + num_words);
			apply_z(tx, ty, z);
			uECC_vli_modSub(tz, rx, tx, curve_p); /* Z = x2 - x1 */
			XYcZ_add(tx, ty, rx, ry);
			uECC_vli_modMult_fast(z, z, tz);
		}
  	}

	uECC_vli_modInv(z, z, curve_p); /* Z = 1/Z */
	apply_z(rx, ry, z);

	/* v = x1 (mod n) */
	if (uECC_vli_cmp_unsafe(curve_n, rx) != 1) {
		uECC_vli_sub(rx, rx, curve_n);
	}

	/* Accept only if v == r. */
	diff = uECC_vli_equal(rx, r);
	if (diff == 0) {
	    mbedtls_platform_random_delay();
		if (diff == 0) {
			return UECC_SUCCESS;
		}
		else {
			return UECC_FAULT_DETECTED;
		}
	}

	return UECC_FAILURE;
}
