2 * Copyright (C) 2011-2012 Free Software Foundation, Inc.
4 * This file is part of GNUTLS.
6 * The GNUTLS library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public License
8 * as published by the Free Software Foundation; either version 3 of
9 * the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful, but
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>
21 /* Based on public domain code of LibTomCrypt by Tom St Denis.
22 * Adapted to gmp and nettle by Nikos Mavrogiannopoulos.
29 ECC Crypto, Tom St Denis
33 Map a projective jacobian point back to affine space
34 @param P [in/out] The point to map
35 @param modulus The modulus of the field the ECC curve is in
36 @param mp The "b" value from montgomery_setup()
40 ecc_map (ecc_point
* P
, mpz_t modulus
)
48 if ((err
= mp_init_multi (&t1
, &t2
, NULL
)) != 0)
53 mpz_mod (P
->z
, P
->z
, modulus
);
56 mpz_invert (t1
, P
->z
, modulus
);
58 /* get 1/z^2 and 1/z^3 */
60 mpz_mod (t2
, t2
, modulus
);
62 mpz_mod (t1
, t1
, modulus
);
64 /* multiply against x/y */
65 mpz_mul (P
->x
, P
->x
, t2
);
66 mpz_mod (P
->x
, P
->x
, modulus
);
67 mpz_mul (P
->y
, P
->y
, t1
);
68 mpz_mod (P
->y
, P
->y
, modulus
);
73 mp_clear_multi (&t1
, &t2
, NULL
);
77 /* $Source: /cvs/libtom/libtomcrypt/src/pk/ecc/ecc_map.c,v $ */
78 /* $Revision: 1.7 $ */
79 /* $Date: 2007/05/12 14:32:35 $ */