1 /* LibTomCrypt, modular cryptographic library -- Tom St Denis
3 * LibTomCrypt is a library that provides various cryptographic
4 * algorithms in a highly modular and flexible manner.
6 * The library is free for all purposes without any express
10 /* Implements ECC over Z/pZ for curve y^2 = x^3 - 3x + b
12 * All curves taken from NIST recommendation paper of July 1999
13 * Available at http://csrc.nist.gov/cryptval/dss.htm
18 @file ltc_ecc_projective_dbl_point.c
19 ECC Crypto, Tom St Denis
22 #if defined(LTC_MECC) && (!defined(LTC_MECC_ACCEL) || defined(LTM_DESC))
26 @param P The point to double
27 @param R [out] The destination of the double
28 @param modulus The modulus of the field the ECC curve is in
29 @param mp The "b" value from montgomery_setup()
30 @return CRYPT_OK on success
32 int ltc_ecc_projective_dbl_point(ecc_point *P, ecc_point *R, void *modulus, void *mp)
37 LTC_ARGCHK(P != NULL);
38 LTC_ARGCHK(R != NULL);
39 LTC_ARGCHK(modulus != NULL);
40 LTC_ARGCHK(mp != NULL);
42 if ((err = mp_init_multi(&t1, &t2, NULL)) != CRYPT_OK) {
47 if ((err = mp_copy(P->x, R->x)) != CRYPT_OK) { goto done; }
48 if ((err = mp_copy(P->y, R->y)) != CRYPT_OK) { goto done; }
49 if ((err = mp_copy(P->z, R->z)) != CRYPT_OK) { goto done; }
53 if ((err = mp_sqr(R->z, t1)) != CRYPT_OK) { goto done; }
54 if ((err = mp_montgomery_reduce(t1, modulus, mp)) != CRYPT_OK) { goto done; }
56 if ((err = mp_mul(R->z, R->y, R->z)) != CRYPT_OK) { goto done; }
57 if ((err = mp_montgomery_reduce(R->z, modulus, mp)) != CRYPT_OK) { goto done; }
59 if ((err = mp_add(R->z, R->z, R->z)) != CRYPT_OK) { goto done; }
60 if (mp_cmp(R->z, modulus) != LTC_MP_LT) {
61 if ((err = mp_sub(R->z, modulus, R->z)) != CRYPT_OK) { goto done; }
65 if ((err = mp_sub(R->x, t1, t2)) != CRYPT_OK) { goto done; }
66 if (mp_cmp_d(t2, 0) == LTC_MP_LT) {
67 if ((err = mp_add(t2, modulus, t2)) != CRYPT_OK) { goto done; }
70 if ((err = mp_add(t1, R->x, t1)) != CRYPT_OK) { goto done; }
71 if (mp_cmp(t1, modulus) != LTC_MP_LT) {
72 if ((err = mp_sub(t1, modulus, t1)) != CRYPT_OK) { goto done; }
75 if ((err = mp_mul(t1, t2, t2)) != CRYPT_OK) { goto done; }
76 if ((err = mp_montgomery_reduce(t2, modulus, mp)) != CRYPT_OK) { goto done; }
78 if ((err = mp_add(t2, t2, t1)) != CRYPT_OK) { goto done; }
79 if (mp_cmp(t1, modulus) != LTC_MP_LT) {
80 if ((err = mp_sub(t1, modulus, t1)) != CRYPT_OK) { goto done; }
83 if ((err = mp_add(t1, t2, t1)) != CRYPT_OK) { goto done; }
84 if (mp_cmp(t1, modulus) != LTC_MP_LT) {
85 if ((err = mp_sub(t1, modulus, t1)) != CRYPT_OK) { goto done; }
89 if ((err = mp_add(R->y, R->y, R->y)) != CRYPT_OK) { goto done; }
90 if (mp_cmp(R->y, modulus) != LTC_MP_LT) {
91 if ((err = mp_sub(R->y, modulus, R->y)) != CRYPT_OK) { goto done; }
94 if ((err = mp_sqr(R->y, R->y)) != CRYPT_OK) { goto done; }
95 if ((err = mp_montgomery_reduce(R->y, modulus, mp)) != CRYPT_OK) { goto done; }
97 if ((err = mp_sqr(R->y, t2)) != CRYPT_OK) { goto done; }
98 if ((err = mp_montgomery_reduce(t2, modulus, mp)) != CRYPT_OK) { goto done; }
101 if ((err = mp_add(t2, modulus, t2)) != CRYPT_OK) { goto done; }
103 if ((err = mp_div_2(t2, t2)) != CRYPT_OK) { goto done; }
105 if ((err = mp_mul(R->y, R->x, R->y)) != CRYPT_OK) { goto done; }
106 if ((err = mp_montgomery_reduce(R->y, modulus, mp)) != CRYPT_OK) { goto done; }
109 if ((err = mp_sqr(t1, R->x)) != CRYPT_OK) { goto done; }
110 if ((err = mp_montgomery_reduce(R->x, modulus, mp)) != CRYPT_OK) { goto done; }
112 if ((err = mp_sub(R->x, R->y, R->x)) != CRYPT_OK) { goto done; }
113 if (mp_cmp_d(R->x, 0) == LTC_MP_LT) {
114 if ((err = mp_add(R->x, modulus, R->x)) != CRYPT_OK) { goto done; }
117 if ((err = mp_sub(R->x, R->y, R->x)) != CRYPT_OK) { goto done; }
118 if (mp_cmp_d(R->x, 0) == LTC_MP_LT) {
119 if ((err = mp_add(R->x, modulus, R->x)) != CRYPT_OK) { goto done; }
123 if ((err = mp_sub(R->y, R->x, R->y)) != CRYPT_OK) { goto done; }
124 if (mp_cmp_d(R->y, 0) == LTC_MP_LT) {
125 if ((err = mp_add(R->y, modulus, R->y)) != CRYPT_OK) { goto done; }
128 if ((err = mp_mul(R->y, t1, R->y)) != CRYPT_OK) { goto done; }
129 if ((err = mp_montgomery_reduce(R->y, modulus, mp)) != CRYPT_OK) { goto done; }
131 if ((err = mp_sub(R->y, t2, R->y)) != CRYPT_OK) { goto done; }
132 if (mp_cmp_d(R->y, 0) == LTC_MP_LT) {
133 if ((err = mp_add(R->y, modulus, R->y)) != CRYPT_OK) { goto done; }
138 mp_clear_multi(t1, t2, NULL);
142 /* ref: $Format:%D$ */
143 /* git commit: $Format:%H$ */
144 /* commit time: $Format:%ai$ */