Blame lib/nettle/int/ecdsa-compute-k.c

Packit Service 991b93
/*
Packit Service 991b93
 * Copyright (C) 2019 Red Hat, Inc.
Packit Service 991b93
 *
Packit Service 991b93
 * Author: Daiki Ueno
Packit Service 991b93
 *
Packit Service 991b93
 * This file is part of GNUTLS.
Packit Service 991b93
 *
Packit Service 991b93
 * The GNUTLS library is free software; you can redistribute it and/or
Packit Service 991b93
 * modify it under the terms of the GNU Lesser General Public License
Packit Service 991b93
 * as published by the Free Software Foundation; either version 2.1 of
Packit Service 991b93
 * the License, or (at your option) any later version.
Packit Service 991b93
 *
Packit Service 991b93
 * This library is distributed in the hope that it will be useful, but
Packit Service 991b93
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 991b93
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 991b93
 * Lesser General Public License for more details.
Packit Service 991b93
 *
Packit Service 991b93
 * You should have received a copy of the GNU Lesser General Public License
Packit Service 991b93
 * along with this program.  If not, see <https://www.gnu.org/licenses/>
Packit Service 991b93
 *
Packit Service 991b93
 */
Packit Service 991b93
Packit Service 991b93
#if HAVE_CONFIG_H
Packit Service 991b93
# include "config.h"
Packit Service 991b93
#endif
Packit Service 991b93
Packit Service 991b93
#include "ecdsa-compute-k.h"
Packit Service 991b93
Packit Service 991b93
#include "dsa-compute-k.h"
Packit Service 991b93
#include "gnutls_int.h"
Packit Service 991b93
Packit Service 991b93
static inline int
Packit Service 991b93
_gnutls_ecc_curve_to_dsa_q(mpz_t *q, gnutls_ecc_curve_t curve)
Packit Service 991b93
{
Packit Service 991b93
	switch (curve) {
Packit Service 991b93
#ifdef ENABLE_NON_SUITEB_CURVES
Packit Service 991b93
	case GNUTLS_ECC_CURVE_SECP192R1:
Packit Service 991b93
		mpz_init_set_str(*q,
Packit Service 991b93
				 "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836"
Packit Service 991b93
				 "146BC9B1B4D22831",
Packit Service 991b93
				 16);
Packit Service 991b93
		return 0;
Packit Service 991b93
	case GNUTLS_ECC_CURVE_SECP224R1:
Packit Service 991b93
		mpz_init_set_str(*q,
Packit Service 991b93
				 "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2"
Packit Service 991b93
				 "E0B8F03E13DD29455C5C2A3D",
Packit Service 991b93
				 16);
Packit Service 991b93
		return 0;
Packit Service 991b93
#endif
Packit Service 991b93
	case GNUTLS_ECC_CURVE_SECP256R1:
Packit Service 991b93
		mpz_init_set_str(*q,
Packit Service 991b93
				 "FFFFFFFF00000000FFFFFFFFFFFFFFFF"
Packit Service 991b93
				 "BCE6FAADA7179E84F3B9CAC2FC632551",
Packit Service 991b93
				 16);
Packit Service 991b93
		return 0;
Packit Service 991b93
	case GNUTLS_ECC_CURVE_SECP384R1:
Packit Service 991b93
		mpz_init_set_str(*q,
Packit Service 991b93
				 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 991b93
				 "FFFFFFFFFFFFFFFFC7634D81F4372DDF"
Packit Service 991b93
				 "581A0DB248B0A77AECEC196ACCC52973",
Packit Service 991b93
				 16);
Packit Service 991b93
		return 0;
Packit Service 991b93
	case GNUTLS_ECC_CURVE_SECP521R1:
Packit Service 991b93
		mpz_init_set_str(*q,
Packit Service 991b93
				 "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 991b93
				 "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
Packit Service 991b93
				 "FFA51868783BF2F966B7FCC0148F709A"
Packit Service 991b93
				 "5D03BB5C9B8899C47AEBB6FB71E91386"
Packit Service 991b93
				 "409",
Packit Service 991b93
				 16);
Packit Service 991b93
		return 0;
Packit Service 991b93
	default:
Packit Service 991b93
		return gnutls_assert_val(GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM);
Packit Service 991b93
	}
Packit Service 991b93
}
Packit Service 991b93
Packit Service 991b93
int
Packit Service 991b93
_gnutls_ecdsa_compute_k (mpz_t k,
Packit Service 991b93
			 gnutls_ecc_curve_t curve,
Packit Service 991b93
			 const mpz_t x,
Packit Service 991b93
			 gnutls_mac_algorithm_t mac,
Packit Service 991b93
			 const uint8_t *digest,
Packit Service 991b93
			 size_t length)
Packit Service 991b93
{
Packit Service 991b93
	mpz_t q;
Packit Service 991b93
	int ret;
Packit Service 991b93
Packit Service 991b93
	ret = _gnutls_ecc_curve_to_dsa_q(&q, curve);
Packit Service 991b93
	if (ret < 0)
Packit Service 991b93
		return gnutls_assert_val(ret);
Packit Service 991b93
Packit Service 991b93
	ret = _gnutls_dsa_compute_k (k, q, x, mac, digest, length);
Packit Service 991b93
	mpz_clear(q);
Packit Service 991b93
	return ret;
Packit Service 991b93
}