diff options
author | Niels Möller <nisse@lysator.liu.se> | 2013-02-18 15:44:47 +0100 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2013-02-18 15:44:47 +0100 |
commit | 7f2c9f752da55f04d7e2a19f73cf5dfb97822c7e (patch) | |
tree | 09b306420a0114e7cd09b282b715ce8308fe1b91 /ecc-point.c | |
parent | c049b56db6af94feccdacb976ca4ed1710e00d0e (diff) | |
download | nettle-7f2c9f752da55f04d7e2a19f73cf5dfb97822c7e.tar.gz |
Integrated ECDSA sign and verify functions.
Diffstat (limited to 'ecc-point.c')
-rw-r--r-- | ecc-point.c | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/ecc-point.c b/ecc-point.c new file mode 100644 index 00000000..b26c192e --- /dev/null +++ b/ecc-point.c @@ -0,0 +1,90 @@ +/* ecc-point.c */ + +/* nettle, low-level cryptographics library + * + * Copyright (C) 2013 Niels Möller + * + * The nettle library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The nettle library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the nettle library; see the file COPYING.LIB. If not, write to + * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, + * MA 02111-1301, USA. + */ + +/* Development of Nettle's ECC support was funded by Internetfonden. */ + +#if HAVE_CONFIG_H +# include "config.h" +#endif + +#include "ecc.h" +#include "ecc-internal.h" +#include "gmp-glue.h" + +void +ecc_point_init (struct ecc_point *p, const struct ecc_curve *ecc) +{ + p->ecc = ecc; + p->p = _gmp_alloc_limbs (2*ecc->size); +} + +void +ecc_point_clear (struct ecc_point *p) +{ + _gmp_free_limbs (p->p, 2*p->ecc->size); +} + +int +ecc_point_set (struct ecc_point *p, const mpz_t x, const mpz_t y) +{ + mp_size_t size; + mpz_t lhs, rhs; + mpz_t t; + int res; + + size = p->ecc->size; + + if (mpz_sgn (x) < 0 || _mpz_cmp_limbs (x, p->ecc->p, size) >= 0 + || mpz_sgn (y) < 0 || _mpz_cmp_limbs (y, p->ecc->p, size) >= 0) + return 0; + + mpz_init (lhs); + mpz_init (rhs); + + /* Check that y^2 = x^3 - 3*x + b (mod p) */ + mpz_mul (lhs, y, y); + mpz_mul (rhs, x, x); + mpz_sub_ui (rhs, rhs, 3); + mpz_mul (rhs, rhs, x); + mpz_add (rhs, rhs, _mpz_init_mpn (t, p->ecc->b, size)); + + res = mpz_congruent_p (lhs, rhs, _mpz_init_mpn (t, p->ecc->p, size)); + + mpz_clear (lhs); + mpz_clear (rhs); + + if (!res) + return 0; + + _mpz_copy_limbs (p->p, x, size); + _mpz_copy_limbs (p->p + size, y, size); + + return 1; +} + +void +ecc_point_get (const struct ecc_point *p, mpz_t x, mpz_t y) +{ + mp_size_t size = p->ecc->size; + _mpz_set_mpn (x, p->p, size); + _mpz_set_mpn (y, p->p + size, size); +} |