summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortb <>2025-01-17 10:41:31 +0000
committertb <>2025-01-17 10:41:31 +0000
commit5f6cbb82de4f41896ca0b00942c7a2c7f8f3ed8f (patch)
treee7daf836450fad948feaac96937c8aa5615fe6b6
parent2b683d542e3fd3eddb68600c2c38c58c6341a332 (diff)
downloadopenbsd-5f6cbb82de4f41896ca0b00942c7a2c7f8f3ed8f.tar.gz
openbsd-5f6cbb82de4f41896ca0b00942c7a2c7f8f3ed8f.tar.bz2
openbsd-5f6cbb82de4f41896ca0b00942c7a2c7f8f3ed8f.zip
ecp_methods: rework field_{mul,sqr}() handling
Add wrapper functions that call the methods so that we can get rid of inconsistent use of ugly function pointers with massively overlong lines and other ways of reaching into the methods. ok jsing
-rw-r--r--src/lib/libcrypto/ec/ecp_methods.c176
1 files changed, 83 insertions, 93 deletions
diff --git a/src/lib/libcrypto/ec/ecp_methods.c b/src/lib/libcrypto/ec/ecp_methods.c
index 3809bf9928..69eab8120f 100644
--- a/src/lib/libcrypto/ec/ecp_methods.c
+++ b/src/lib/libcrypto/ec/ecp_methods.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_methods.c,v 1.36 2025/01/11 21:20:39 tb Exp $ */ 1/* $OpenBSD: ecp_methods.c,v 1.37 2025/01/17 10:41:31 tb Exp $ */
2/* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de> 2/* Includes code written by Lenka Fibikova <fibikova@exp-math.uni-essen.de>
3 * for the OpenSSL project. 3 * for the OpenSSL project.
4 * Includes code written by Bodo Moeller for the OpenSSL project. 4 * Includes code written by Bodo Moeller for the OpenSSL project.
@@ -84,6 +84,19 @@
84 * representation (i.e. 'encoding' means multiplying by some factor R). 84 * representation (i.e. 'encoding' means multiplying by some factor R).
85 */ 85 */
86 86
87static inline int
88ec_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
89 BN_CTX *ctx)
90{
91 return group->meth->field_mul(group, r, a, b, ctx);
92}
93
94static inline int
95ec_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, BN_CTX *ctx)
96{
97 return group->meth->field_sqr(group, r, a, ctx);
98}
99
87static int 100static int
88ec_decode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx) 101ec_decode_scalar(const EC_GROUP *group, BIGNUM *bn, const BIGNUM *x, BN_CTX *ctx)
89{ 102{
@@ -169,19 +182,13 @@ ec_group_get_curve(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b,
169static int 182static int
170ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx) 183ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx)
171{ 184{
172 int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); 185 const BIGNUM *p = group->p;
173 int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *);
174 const BIGNUM *p;
175 BIGNUM *rh, *tmp, *Z4, *Z6; 186 BIGNUM *rh, *tmp, *Z4, *Z6;
176 int ret = -1; 187 int ret = -1;
177 188
178 if (EC_POINT_is_at_infinity(group, point)) 189 if (EC_POINT_is_at_infinity(group, point))
179 return 1; 190 return 1;
180 191
181 field_mul = group->meth->field_mul;
182 field_sqr = group->meth->field_sqr;
183 p = group->p;
184
185 BN_CTX_start(ctx); 192 BN_CTX_start(ctx);
186 193
187 if ((rh = BN_CTX_get(ctx)) == NULL) 194 if ((rh = BN_CTX_get(ctx)) == NULL)
@@ -201,15 +208,15 @@ ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx)
201 */ 208 */
202 209
203 /* rh := X^2 */ 210 /* rh := X^2 */
204 if (!field_sqr(group, rh, point->X, ctx)) 211 if (!ec_field_sqr(group, rh, point->X, ctx))
205 goto err; 212 goto err;
206 213
207 if (!point->Z_is_one) { 214 if (!point->Z_is_one) {
208 if (!field_sqr(group, tmp, point->Z, ctx)) 215 if (!ec_field_sqr(group, tmp, point->Z, ctx))
209 goto err; 216 goto err;
210 if (!field_sqr(group, Z4, tmp, ctx)) 217 if (!ec_field_sqr(group, Z4, tmp, ctx))
211 goto err; 218 goto err;
212 if (!field_mul(group, Z6, Z4, tmp, ctx)) 219 if (!ec_field_mul(group, Z6, Z4, tmp, ctx))
213 goto err; 220 goto err;
214 221
215 /* rh := (rh + a*Z^4)*X */ 222 /* rh := (rh + a*Z^4)*X */
@@ -220,19 +227,19 @@ ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx)
220 goto err; 227 goto err;
221 if (!BN_mod_sub_quick(rh, rh, tmp, p)) 228 if (!BN_mod_sub_quick(rh, rh, tmp, p))
222 goto err; 229 goto err;
223 if (!field_mul(group, rh, rh, point->X, ctx)) 230 if (!ec_field_mul(group, rh, rh, point->X, ctx))
224 goto err; 231 goto err;
225 } else { 232 } else {
226 if (!field_mul(group, tmp, Z4, group->a, ctx)) 233 if (!ec_field_mul(group, tmp, Z4, group->a, ctx))
227 goto err; 234 goto err;
228 if (!BN_mod_add_quick(rh, rh, tmp, p)) 235 if (!BN_mod_add_quick(rh, rh, tmp, p))
229 goto err; 236 goto err;
230 if (!field_mul(group, rh, rh, point->X, ctx)) 237 if (!ec_field_mul(group, rh, rh, point->X, ctx))
231 goto err; 238 goto err;
232 } 239 }
233 240
234 /* rh := rh + b*Z^6 */ 241 /* rh := rh + b*Z^6 */
235 if (!field_mul(group, tmp, group->b, Z6, ctx)) 242 if (!ec_field_mul(group, tmp, group->b, Z6, ctx))
236 goto err; 243 goto err;
237 if (!BN_mod_add_quick(rh, rh, tmp, p)) 244 if (!BN_mod_add_quick(rh, rh, tmp, p))
238 goto err; 245 goto err;
@@ -242,7 +249,7 @@ ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx)
242 /* rh := (rh + a)*X */ 249 /* rh := (rh + a)*X */
243 if (!BN_mod_add_quick(rh, rh, group->a, p)) 250 if (!BN_mod_add_quick(rh, rh, group->a, p))
244 goto err; 251 goto err;
245 if (!field_mul(group, rh, rh, point->X, ctx)) 252 if (!ec_field_mul(group, rh, rh, point->X, ctx))
246 goto err; 253 goto err;
247 /* rh := rh + b */ 254 /* rh := rh + b */
248 if (!BN_mod_add_quick(rh, rh, group->b, p)) 255 if (!BN_mod_add_quick(rh, rh, group->b, p))
@@ -250,7 +257,7 @@ ec_point_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX *ctx)
250 } 257 }
251 258
252 /* 'lh' := Y^2 */ 259 /* 'lh' := Y^2 */
253 if (!field_sqr(group, tmp, point->Y, ctx)) 260 if (!ec_field_sqr(group, tmp, point->Y, ctx))
254 goto err; 261 goto err;
255 262
256 ret = (0 == BN_ucmp(tmp, rh)); 263 ret = (0 == BN_ucmp(tmp, rh));
@@ -269,8 +276,6 @@ static int
269ec_point_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b, 276ec_point_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,
270 BN_CTX *ctx) 277 BN_CTX *ctx)
271{ 278{
272 int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *);
273 int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *);
274 BIGNUM *tmp1, *tmp2, *Za23, *Zb23; 279 BIGNUM *tmp1, *tmp2, *Za23, *Zb23;
275 const BIGNUM *tmp1_, *tmp2_; 280 const BIGNUM *tmp1_, *tmp2_;
276 int ret = -1; 281 int ret = -1;
@@ -283,9 +288,6 @@ ec_point_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,
283 if (a->Z_is_one && b->Z_is_one) 288 if (a->Z_is_one && b->Z_is_one)
284 return BN_cmp(a->X, b->X) != 0 || BN_cmp(a->Y, b->Y) != 0; 289 return BN_cmp(a->X, b->X) != 0 || BN_cmp(a->Y, b->Y) != 0;
285 290
286 field_mul = group->meth->field_mul;
287 field_sqr = group->meth->field_sqr;
288
289 BN_CTX_start(ctx); 291 BN_CTX_start(ctx);
290 292
291 if ((tmp1 = BN_CTX_get(ctx)) == NULL) 293 if ((tmp1 = BN_CTX_get(ctx)) == NULL)
@@ -303,17 +305,17 @@ ec_point_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,
303 */ 305 */
304 306
305 if (!b->Z_is_one) { 307 if (!b->Z_is_one) {
306 if (!field_sqr(group, Zb23, b->Z, ctx)) 308 if (!ec_field_sqr(group, Zb23, b->Z, ctx))
307 goto end; 309 goto end;
308 if (!field_mul(group, tmp1, a->X, Zb23, ctx)) 310 if (!ec_field_mul(group, tmp1, a->X, Zb23, ctx))
309 goto end; 311 goto end;
310 tmp1_ = tmp1; 312 tmp1_ = tmp1;
311 } else 313 } else
312 tmp1_ = a->X; 314 tmp1_ = a->X;
313 if (!a->Z_is_one) { 315 if (!a->Z_is_one) {
314 if (!field_sqr(group, Za23, a->Z, ctx)) 316 if (!ec_field_sqr(group, Za23, a->Z, ctx))
315 goto end; 317 goto end;
316 if (!field_mul(group, tmp2, b->X, Za23, ctx)) 318 if (!ec_field_mul(group, tmp2, b->X, Za23, ctx))
317 goto end; 319 goto end;
318 tmp2_ = tmp2; 320 tmp2_ = tmp2;
319 } else 321 } else
@@ -325,17 +327,17 @@ ec_point_cmp(const EC_GROUP *group, const EC_POINT *a, const EC_POINT *b,
325 goto end; 327 goto end;
326 } 328 }
327 if (!b->Z_is_one) { 329 if (!b->Z_is_one) {
328 if (!field_mul(group, Zb23, Zb23, b->Z, ctx)) 330 if (!ec_field_mul(group, Zb23, Zb23, b->Z, ctx))
329 goto end; 331 goto end;
330 if (!field_mul(group, tmp1, a->Y, Zb23, ctx)) 332 if (!ec_field_mul(group, tmp1, a->Y, Zb23, ctx))
331 goto end; 333 goto end;
332 /* tmp1_ = tmp1 */ 334 /* tmp1_ = tmp1 */
333 } else 335 } else
334 tmp1_ = a->Y; 336 tmp1_ = a->Y;
335 if (!a->Z_is_one) { 337 if (!a->Z_is_one) {
336 if (!field_mul(group, Za23, Za23, a->Z, ctx)) 338 if (!ec_field_mul(group, Za23, Za23, a->Z, ctx))
337 goto end; 339 goto end;
338 if (!field_mul(group, tmp2, b->Y, Za23, ctx)) 340 if (!ec_field_mul(group, tmp2, b->Y, Za23, ctx))
339 goto end; 341 goto end;
340 /* tmp2_ = tmp2 */ 342 /* tmp2_ = tmp2 */
341 } else 343 } else
@@ -602,10 +604,8 @@ static int
602ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b, 604ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
603 BN_CTX *ctx) 605 BN_CTX *ctx)
604{ 606{
605 int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); 607 const BIGNUM *p = group->p;
606 int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *);
607 BIGNUM *n0, *n1, *n2, *n3, *n4, *n5, *n6; 608 BIGNUM *n0, *n1, *n2, *n3, *n4, *n5, *n6;
608 const BIGNUM *p;
609 int ret = 0; 609 int ret = 0;
610 610
611 if (a == b) 611 if (a == b)
@@ -615,10 +615,6 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
615 if (EC_POINT_is_at_infinity(group, b)) 615 if (EC_POINT_is_at_infinity(group, b))
616 return EC_POINT_copy(r, a); 616 return EC_POINT_copy(r, a);
617 617
618 field_mul = group->meth->field_mul;
619 field_sqr = group->meth->field_sqr;
620 p = group->p;
621
622 BN_CTX_start(ctx); 618 BN_CTX_start(ctx);
623 619
624 if ((n0 = BN_CTX_get(ctx)) == NULL) 620 if ((n0 = BN_CTX_get(ctx)) == NULL)
@@ -651,15 +647,15 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
651 /* n1 = X_a */ 647 /* n1 = X_a */
652 /* n2 = Y_a */ 648 /* n2 = Y_a */
653 } else { 649 } else {
654 if (!field_sqr(group, n0, b->Z, ctx)) 650 if (!ec_field_sqr(group, n0, b->Z, ctx))
655 goto end; 651 goto end;
656 if (!field_mul(group, n1, a->X, n0, ctx)) 652 if (!ec_field_mul(group, n1, a->X, n0, ctx))
657 goto end; 653 goto end;
658 /* n1 = X_a * Z_b^2 */ 654 /* n1 = X_a * Z_b^2 */
659 655
660 if (!field_mul(group, n0, n0, b->Z, ctx)) 656 if (!ec_field_mul(group, n0, n0, b->Z, ctx))
661 goto end; 657 goto end;
662 if (!field_mul(group, n2, a->Y, n0, ctx)) 658 if (!ec_field_mul(group, n2, a->Y, n0, ctx))
663 goto end; 659 goto end;
664 /* n2 = Y_a * Z_b^3 */ 660 /* n2 = Y_a * Z_b^3 */
665 } 661 }
@@ -673,15 +669,15 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
673 /* n3 = X_b */ 669 /* n3 = X_b */
674 /* n4 = Y_b */ 670 /* n4 = Y_b */
675 } else { 671 } else {
676 if (!field_sqr(group, n0, a->Z, ctx)) 672 if (!ec_field_sqr(group, n0, a->Z, ctx))
677 goto end; 673 goto end;
678 if (!field_mul(group, n3, b->X, n0, ctx)) 674 if (!ec_field_mul(group, n3, b->X, n0, ctx))
679 goto end; 675 goto end;
680 /* n3 = X_b * Z_a^2 */ 676 /* n3 = X_b * Z_a^2 */
681 677
682 if (!field_mul(group, n0, n0, a->Z, ctx)) 678 if (!ec_field_mul(group, n0, n0, a->Z, ctx))
683 goto end; 679 goto end;
684 if (!field_mul(group, n4, b->Y, n0, ctx)) 680 if (!ec_field_mul(group, n4, b->Y, n0, ctx))
685 goto end; 681 goto end;
686 /* n4 = Y_b * Z_a^3 */ 682 /* n4 = Y_b * Z_a^3 */
687 } 683 }
@@ -729,21 +725,21 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
729 if (!bn_copy(n0, a->Z)) 725 if (!bn_copy(n0, a->Z))
730 goto end; 726 goto end;
731 } else { 727 } else {
732 if (!field_mul(group, n0, a->Z, b->Z, ctx)) 728 if (!ec_field_mul(group, n0, a->Z, b->Z, ctx))
733 goto end; 729 goto end;
734 } 730 }
735 if (!field_mul(group, r->Z, n0, n5, ctx)) 731 if (!ec_field_mul(group, r->Z, n0, n5, ctx))
736 goto end; 732 goto end;
737 } 733 }
738 r->Z_is_one = 0; 734 r->Z_is_one = 0;
739 /* Z_r = Z_a * Z_b * n5 */ 735 /* Z_r = Z_a * Z_b * n5 */
740 736
741 /* X_r */ 737 /* X_r */
742 if (!field_sqr(group, n0, n6, ctx)) 738 if (!ec_field_sqr(group, n0, n6, ctx))
743 goto end; 739 goto end;
744 if (!field_sqr(group, n4, n5, ctx)) 740 if (!ec_field_sqr(group, n4, n5, ctx))
745 goto end; 741 goto end;
746 if (!field_mul(group, n3, n1, n4, ctx)) 742 if (!ec_field_mul(group, n3, n1, n4, ctx))
747 goto end; 743 goto end;
748 if (!BN_mod_sub_quick(r->X, n0, n3, p)) 744 if (!BN_mod_sub_quick(r->X, n0, n3, p))
749 goto end; 745 goto end;
@@ -757,11 +753,11 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
757 /* n9 = n5^2 * 'n7' - 2 * X_r */ 753 /* n9 = n5^2 * 'n7' - 2 * X_r */
758 754
759 /* Y_r */ 755 /* Y_r */
760 if (!field_mul(group, n0, n0, n6, ctx)) 756 if (!ec_field_mul(group, n0, n0, n6, ctx))
761 goto end; 757 goto end;
762 if (!field_mul(group, n5, n4, n5, ctx)) 758 if (!ec_field_mul(group, n5, n4, n5, ctx))
763 goto end; /* now n5 is n5^3 */ 759 goto end; /* now n5 is n5^3 */
764 if (!field_mul(group, n1, n2, n5, ctx)) 760 if (!ec_field_mul(group, n1, n2, n5, ctx))
765 goto end; 761 goto end;
766 if (!BN_mod_sub_quick(n0, n0, n1, p)) 762 if (!BN_mod_sub_quick(n0, n0, n1, p))
767 goto end; 763 goto end;
@@ -784,19 +780,13 @@ ec_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, const EC_POINT *b,
784static int 780static int
785ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx) 781ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
786{ 782{
787 int (*field_mul) (const EC_GROUP *, BIGNUM *, const BIGNUM *, const BIGNUM *, BN_CTX *); 783 const BIGNUM *p = group->p;
788 int (*field_sqr) (const EC_GROUP *, BIGNUM *, const BIGNUM *, BN_CTX *);
789 const BIGNUM *p;
790 BIGNUM *n0, *n1, *n2, *n3; 784 BIGNUM *n0, *n1, *n2, *n3;
791 int ret = 0; 785 int ret = 0;
792 786
793 if (EC_POINT_is_at_infinity(group, a)) 787 if (EC_POINT_is_at_infinity(group, a))
794 return EC_POINT_set_to_infinity(group, r); 788 return EC_POINT_set_to_infinity(group, r);
795 789
796 field_mul = group->meth->field_mul;
797 field_sqr = group->meth->field_sqr;
798 p = group->p;
799
800 BN_CTX_start(ctx); 790 BN_CTX_start(ctx);
801 791
802 if ((n0 = BN_CTX_get(ctx)) == NULL) 792 if ((n0 = BN_CTX_get(ctx)) == NULL)
@@ -816,7 +806,7 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
816 806
817 /* n1 */ 807 /* n1 */
818 if (a->Z_is_one) { 808 if (a->Z_is_one) {
819 if (!field_sqr(group, n0, a->X, ctx)) 809 if (!ec_field_sqr(group, n0, a->X, ctx))
820 goto err; 810 goto err;
821 if (!BN_mod_lshift1_quick(n1, n0, p)) 811 if (!BN_mod_lshift1_quick(n1, n0, p))
822 goto err; 812 goto err;
@@ -826,13 +816,13 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
826 goto err; 816 goto err;
827 /* n1 = 3 * X_a^2 + a_curve */ 817 /* n1 = 3 * X_a^2 + a_curve */
828 } else if (group->a_is_minus3) { 818 } else if (group->a_is_minus3) {
829 if (!field_sqr(group, n1, a->Z, ctx)) 819 if (!ec_field_sqr(group, n1, a->Z, ctx))
830 goto err; 820 goto err;
831 if (!BN_mod_add_quick(n0, a->X, n1, p)) 821 if (!BN_mod_add_quick(n0, a->X, n1, p))
832 goto err; 822 goto err;
833 if (!BN_mod_sub_quick(n2, a->X, n1, p)) 823 if (!BN_mod_sub_quick(n2, a->X, n1, p))
834 goto err; 824 goto err;
835 if (!field_mul(group, n1, n0, n2, ctx)) 825 if (!ec_field_mul(group, n1, n0, n2, ctx))
836 goto err; 826 goto err;
837 if (!BN_mod_lshift1_quick(n0, n1, p)) 827 if (!BN_mod_lshift1_quick(n0, n1, p))
838 goto err; 828 goto err;
@@ -843,17 +833,17 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
843 * Z_a^4 833 * Z_a^4
844 */ 834 */
845 } else { 835 } else {
846 if (!field_sqr(group, n0, a->X, ctx)) 836 if (!ec_field_sqr(group, n0, a->X, ctx))
847 goto err; 837 goto err;
848 if (!BN_mod_lshift1_quick(n1, n0, p)) 838 if (!BN_mod_lshift1_quick(n1, n0, p))
849 goto err; 839 goto err;
850 if (!BN_mod_add_quick(n0, n0, n1, p)) 840 if (!BN_mod_add_quick(n0, n0, n1, p))
851 goto err; 841 goto err;
852 if (!field_sqr(group, n1, a->Z, ctx)) 842 if (!ec_field_sqr(group, n1, a->Z, ctx))
853 goto err; 843 goto err;
854 if (!field_sqr(group, n1, n1, ctx)) 844 if (!ec_field_sqr(group, n1, n1, ctx))
855 goto err; 845 goto err;
856 if (!field_mul(group, n1, n1, group->a, ctx)) 846 if (!ec_field_mul(group, n1, n1, group->a, ctx))
857 goto err; 847 goto err;
858 if (!BN_mod_add_quick(n1, n1, n0, p)) 848 if (!BN_mod_add_quick(n1, n1, n0, p))
859 goto err; 849 goto err;
@@ -865,7 +855,7 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
865 if (!bn_copy(n0, a->Y)) 855 if (!bn_copy(n0, a->Y))
866 goto err; 856 goto err;
867 } else { 857 } else {
868 if (!field_mul(group, n0, a->Y, a->Z, ctx)) 858 if (!ec_field_mul(group, n0, a->Y, a->Z, ctx))
869 goto err; 859 goto err;
870 } 860 }
871 if (!BN_mod_lshift1_quick(r->Z, n0, p)) 861 if (!BN_mod_lshift1_quick(r->Z, n0, p))
@@ -874,9 +864,9 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
874 /* Z_r = 2 * Y_a * Z_a */ 864 /* Z_r = 2 * Y_a * Z_a */
875 865
876 /* n2 */ 866 /* n2 */
877 if (!field_sqr(group, n3, a->Y, ctx)) 867 if (!ec_field_sqr(group, n3, a->Y, ctx))
878 goto err; 868 goto err;
879 if (!field_mul(group, n2, a->X, n3, ctx)) 869 if (!ec_field_mul(group, n2, a->X, n3, ctx))
880 goto err; 870 goto err;
881 if (!BN_mod_lshift_quick(n2, n2, 2, p)) 871 if (!BN_mod_lshift_quick(n2, n2, 2, p))
882 goto err; 872 goto err;
@@ -885,14 +875,14 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
885 /* X_r */ 875 /* X_r */
886 if (!BN_mod_lshift1_quick(n0, n2, p)) 876 if (!BN_mod_lshift1_quick(n0, n2, p))
887 goto err; 877 goto err;
888 if (!field_sqr(group, r->X, n1, ctx)) 878 if (!ec_field_sqr(group, r->X, n1, ctx))
889 goto err; 879 goto err;
890 if (!BN_mod_sub_quick(r->X, r->X, n0, p)) 880 if (!BN_mod_sub_quick(r->X, r->X, n0, p))
891 goto err; 881 goto err;
892 /* X_r = n1^2 - 2 * n2 */ 882 /* X_r = n1^2 - 2 * n2 */
893 883
894 /* n3 */ 884 /* n3 */
895 if (!field_sqr(group, n0, n3, ctx)) 885 if (!ec_field_sqr(group, n0, n3, ctx))
896 goto err; 886 goto err;
897 if (!BN_mod_lshift_quick(n3, n0, 3, p)) 887 if (!BN_mod_lshift_quick(n3, n0, 3, p))
898 goto err; 888 goto err;
@@ -901,7 +891,7 @@ ec_dbl(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a, BN_CTX *ctx)
901 /* Y_r */ 891 /* Y_r */
902 if (!BN_mod_sub_quick(n0, n2, r->X, p)) 892 if (!BN_mod_sub_quick(n0, n2, r->X, p))
903 goto err; 893 goto err;
904 if (!field_mul(group, n0, n1, n0, ctx)) 894 if (!ec_field_mul(group, n0, n1, n0, ctx))
905 goto err; 895 goto err;
906 if (!BN_mod_sub_quick(r->Y, n0, n3, p)) 896 if (!BN_mod_sub_quick(r->Y, n0, n3, p))
907 goto err; 897 goto err;
@@ -925,19 +915,6 @@ ec_invert(const EC_GROUP *group, EC_POINT *point, BN_CTX *ctx)
925 return BN_usub(point->Y, group->p, point->Y); 915 return BN_usub(point->Y, group->p, point->Y);
926} 916}
927 917
928static int
929ec_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
930 BN_CTX *ctx)
931{
932 return BN_mod_mul(r, a, b, group->p, ctx);
933}
934
935static int
936ec_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, BN_CTX *ctx)
937{
938 return BN_mod_sqr(r, a, group->p, ctx);
939}
940
941/* 918/*
942 * Apply randomization of EC point Jacobian projective coordinates: 919 * Apply randomization of EC point Jacobian projective coordinates:
943 * 920 *
@@ -967,7 +944,7 @@ ec_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx)
967 goto err; 944 goto err;
968 945
969 /* Z = lambda * Z */ 946 /* Z = lambda * Z */
970 if (!group->meth->field_mul(group, p->Z, lambda, p->Z, ctx)) 947 if (!ec_field_mul(group, p->Z, lambda, p->Z, ctx))
971 goto err; 948 goto err;
972 949
973 /* tmp = lambda^2 */ 950 /* tmp = lambda^2 */
@@ -975,15 +952,15 @@ ec_blind_coordinates(const EC_GROUP *group, EC_POINT *p, BN_CTX *ctx)
975 goto err; 952 goto err;
976 953
977 /* X = lambda^2 * X */ 954 /* X = lambda^2 * X */
978 if (!group->meth->field_mul(group, p->X, tmp, p->X, ctx)) 955 if (!ec_field_mul(group, p->X, tmp, p->X, ctx))
979 goto err; 956 goto err;
980 957
981 /* tmp = lambda^3 */ 958 /* tmp = lambda^3 */
982 if (!group->meth->field_mul(group, tmp, tmp, lambda, ctx)) 959 if (!ec_field_mul(group, tmp, tmp, lambda, ctx))
983 goto err; 960 goto err;
984 961
985 /* Y = lambda^3 * Y */ 962 /* Y = lambda^3 * Y */
986 if (!group->meth->field_mul(group, p->Y, tmp, p->Y, ctx)) 963 if (!ec_field_mul(group, p->Y, tmp, p->Y, ctx))
987 goto err; 964 goto err;
988 965
989 /* Disable optimized arithmetics after replacing Z by lambda * Z. */ 966 /* Disable optimized arithmetics after replacing Z by lambda * Z. */
@@ -1242,6 +1219,19 @@ ec_mul_double_nonct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
1242} 1219}
1243 1220
1244static int 1221static int
1222ec_simple_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
1223 const BIGNUM *b, BN_CTX *ctx)
1224{
1225 return BN_mod_mul(r, a, b, group->p, ctx);
1226}
1227
1228static int
1229ec_simple_field_sqr(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a, BN_CTX *ctx)
1230{
1231 return BN_mod_sqr(r, a, group->p, ctx);
1232}
1233
1234static int
1245ec_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, 1235ec_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
1246 const BIGNUM *b, BN_CTX *ctx) 1236 const BIGNUM *b, BN_CTX *ctx)
1247{ 1237{
@@ -1333,8 +1323,8 @@ static const EC_METHOD ec_GFp_simple_method = {
1333 .mul_generator_ct = ec_mul_generator_ct, 1323 .mul_generator_ct = ec_mul_generator_ct,
1334 .mul_single_ct = ec_mul_single_ct, 1324 .mul_single_ct = ec_mul_single_ct,
1335 .mul_double_nonct = ec_mul_double_nonct, 1325 .mul_double_nonct = ec_mul_double_nonct,
1336 .field_mul = ec_field_mul, 1326 .field_mul = ec_simple_field_mul,
1337 .field_sqr = ec_field_sqr, 1327 .field_sqr = ec_simple_field_sqr,
1338}; 1328};
1339 1329
1340const EC_METHOD * 1330const EC_METHOD *