summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec')
-rw-r--r--src/lib/libcrypto/ec/ec2_mult.c12
-rw-r--r--src/lib/libcrypto/ec/ec2_oct.c8
-rw-r--r--src/lib/libcrypto/ec/ec2_smpl.c30
-rw-r--r--src/lib/libcrypto/ec/ec_ameth.c14
-rw-r--r--src/lib/libcrypto/ec/ec_asn1.c18
-rw-r--r--src/lib/libcrypto/ec/ec_check.c4
-rw-r--r--src/lib/libcrypto/ec/ec_curve.c4
-rw-r--r--src/lib/libcrypto/ec/ec_key.c8
-rw-r--r--src/lib/libcrypto/ec/ec_lcl.h17
-rw-r--r--src/lib/libcrypto/ec/ec_lib.c101
-rw-r--r--src/lib/libcrypto/ec/ec_mult.c8
-rw-r--r--src/lib/libcrypto/ec/eck_prn.c4
-rw-r--r--src/lib/libcrypto/ec/ecp_mont.c9
-rw-r--r--src/lib/libcrypto/ec/ecp_nist.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp224.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp256.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_nistp521.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_nistz256.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_oct.c8
-rw-r--r--src/lib/libcrypto/ec/ecp_smpl.c274
20 files changed, 133 insertions, 426 deletions
diff --git a/src/lib/libcrypto/ec/ec2_mult.c b/src/lib/libcrypto/ec/ec2_mult.c
index 463802950d..10191d7916 100644
--- a/src/lib/libcrypto/ec/ec2_mult.c
+++ b/src/lib/libcrypto/ec/ec2_mult.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec2_mult.c,v 1.10 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec2_mult.c,v 1.11 2018/07/15 05:38:48 jsg Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -111,7 +111,7 @@ gf2m_Mdouble(const EC_GROUP *group, BIGNUM *x, BIGNUM *z, BN_CTX *ctx)
111 111
112 ret = 1; 112 ret = 1;
113 113
114 err: 114err:
115 BN_CTX_end(ctx); 115 BN_CTX_end(ctx);
116 return ret; 116 return ret;
117} 117}
@@ -155,7 +155,7 @@ gf2m_Madd(const EC_GROUP *group, const BIGNUM *x, BIGNUM *x1, BIGNUM *z1,
155 155
156 ret = 1; 156 ret = 1;
157 157
158 err: 158err:
159 BN_CTX_end(ctx); 159 BN_CTX_end(ctx);
160 return ret; 160 return ret;
161} 161}
@@ -243,7 +243,7 @@ gf2m_Mxy(const EC_GROUP *group, const BIGNUM *x, const BIGNUM *y, BIGNUM *x1,
243 243
244 ret = 2; 244 ret = 2;
245 245
246 err: 246err:
247 BN_CTX_end(ctx); 247 BN_CTX_end(ctx);
248 return ret; 248 return ret;
249} 249}
@@ -356,7 +356,7 @@ ec_GF2m_montgomery_point_multiply(const EC_GROUP *group, EC_POINT *r,
356 356
357 ret = 1; 357 ret = 1;
358 358
359 err: 359err:
360 BN_CTX_end(ctx); 360 BN_CTX_end(ctx);
361 return ret; 361 return ret;
362} 362}
@@ -424,7 +424,7 @@ ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
424 424
425 ret = 1; 425 ret = 1;
426 426
427 err: 427err:
428 EC_POINT_free(p); 428 EC_POINT_free(p);
429 EC_POINT_free(acc); 429 EC_POINT_free(acc);
430 BN_CTX_free(new_ctx); 430 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ec2_oct.c b/src/lib/libcrypto/ec/ec2_oct.c
index 1727f780a3..bb480c5016 100644
--- a/src/lib/libcrypto/ec/ec2_oct.c
+++ b/src/lib/libcrypto/ec/ec2_oct.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec2_oct.c,v 1.9 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec2_oct.c,v 1.10 2018/07/15 05:38:48 jsg Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -157,7 +157,7 @@ ec_GF2m_simple_set_compressed_coordinates(const EC_GROUP *group, EC_POINT *point
157 157
158 ret = 1; 158 ret = 1;
159 159
160 err: 160err:
161 BN_CTX_end(ctx); 161 BN_CTX_end(ctx);
162 BN_CTX_free(new_ctx); 162 BN_CTX_free(new_ctx);
163 return ret; 163 return ret;
@@ -272,7 +272,7 @@ ec_GF2m_simple_point2oct(const EC_GROUP *group, const EC_POINT *point,
272 BN_CTX_free(new_ctx); 272 BN_CTX_free(new_ctx);
273 return ret; 273 return ret;
274 274
275 err: 275err:
276 if (used_ctx) 276 if (used_ctx)
277 BN_CTX_end(ctx); 277 BN_CTX_end(ctx);
278 BN_CTX_free(new_ctx); 278 BN_CTX_free(new_ctx);
@@ -374,7 +374,7 @@ ec_GF2m_simple_oct2point(const EC_GROUP *group, EC_POINT *point,
374 } 374 }
375 ret = 1; 375 ret = 1;
376 376
377 err: 377err:
378 BN_CTX_end(ctx); 378 BN_CTX_end(ctx);
379 BN_CTX_free(new_ctx); 379 BN_CTX_free(new_ctx);
380 return ret; 380 return ret;
diff --git a/src/lib/libcrypto/ec/ec2_smpl.c b/src/lib/libcrypto/ec/ec2_smpl.c
index f1cbd3f3c4..c3fff56c44 100644
--- a/src/lib/libcrypto/ec/ec2_smpl.c
+++ b/src/lib/libcrypto/ec/ec2_smpl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec2_smpl.c,v 1.17 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec2_smpl.c,v 1.18 2018/07/15 05:38:48 jsg Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED. 3 * Copyright 2002 Sun Microsystems, Inc. ALL RIGHTS RESERVED.
4 * 4 *
@@ -107,11 +107,15 @@ EC_GF2m_simple_method(void)
107 .point_cmp = ec_GF2m_simple_cmp, 107 .point_cmp = ec_GF2m_simple_cmp,
108 .make_affine = ec_GF2m_simple_make_affine, 108 .make_affine = ec_GF2m_simple_make_affine,
109 .points_make_affine = ec_GF2m_simple_points_make_affine, 109 .points_make_affine = ec_GF2m_simple_points_make_affine,
110 .mul_generator_ct = ec_GFp_simple_mul_generator_ct, 110
111 .mul_single_ct = ec_GFp_simple_mul_single_ct, 111 /*
112 .mul_double_nonct = ec_GFp_simple_mul_double_nonct, 112 * the following three method functions are defined in
113 * ec2_mult.c
114 */
115 .mul = ec_GF2m_simple_mul,
113 .precompute_mult = ec_GF2m_precompute_mult, 116 .precompute_mult = ec_GF2m_precompute_mult,
114 .have_precompute_mult = ec_GF2m_have_precompute_mult, 117 .have_precompute_mult = ec_GF2m_have_precompute_mult,
118
115 .field_mul = ec_GF2m_simple_field_mul, 119 .field_mul = ec_GF2m_simple_field_mul,
116 .field_sqr = ec_GF2m_simple_field_sqr, 120 .field_sqr = ec_GF2m_simple_field_sqr,
117 .field_div = ec_GF2m_simple_field_div, 121 .field_div = ec_GF2m_simple_field_div,
@@ -228,7 +232,7 @@ ec_GF2m_simple_group_set_curve(EC_GROUP * group,
228 group->b.d[i] = 0; 232 group->b.d[i] = 0;
229 233
230 ret = 1; 234 ret = 1;
231 err: 235err:
232 return ret; 236 return ret;
233} 237}
234 238
@@ -256,7 +260,7 @@ ec_GF2m_simple_group_get_curve(const EC_GROUP *group,
256 } 260 }
257 ret = 1; 261 ret = 1;
258 262
259 err: 263err:
260 return ret; 264 return ret;
261} 265}
262 266
@@ -302,7 +306,7 @@ ec_GF2m_simple_group_check_discriminant(const EC_GROUP * group, BN_CTX * ctx)
302 306
303 ret = 1; 307 ret = 1;
304 308
305 err: 309err:
306 if (ctx != NULL) 310 if (ctx != NULL)
307 BN_CTX_end(ctx); 311 BN_CTX_end(ctx);
308 BN_CTX_free(new_ctx); 312 BN_CTX_free(new_ctx);
@@ -394,7 +398,7 @@ ec_GF2m_simple_point_set_affine_coordinates(const EC_GROUP * group, EC_POINT * p
394 point->Z_is_one = 1; 398 point->Z_is_one = 1;
395 ret = 1; 399 ret = 1;
396 400
397 err: 401err:
398 return ret; 402 return ret;
399} 403}
400 404
@@ -428,7 +432,7 @@ ec_GF2m_simple_point_get_affine_coordinates(const EC_GROUP *group,
428 } 432 }
429 ret = 1; 433 ret = 1;
430 434
431 err: 435err:
432 return ret; 436 return ret;
433} 437}
434 438
@@ -545,7 +549,7 @@ ec_GF2m_simple_add(const EC_GROUP *group, EC_POINT *r, const EC_POINT *a,
545 549
546 ret = 1; 550 ret = 1;
547 551
548 err: 552err:
549 BN_CTX_end(ctx); 553 BN_CTX_end(ctx);
550 BN_CTX_free(new_ctx); 554 BN_CTX_free(new_ctx);
551 return ret; 555 return ret;
@@ -637,7 +641,7 @@ ec_GF2m_simple_is_on_curve(const EC_GROUP *group, const EC_POINT *point, BN_CTX
637 if (!BN_GF2m_add(lh, lh, y2)) 641 if (!BN_GF2m_add(lh, lh, y2))
638 goto err; 642 goto err;
639 ret = BN_is_zero(lh); 643 ret = BN_is_zero(lh);
640 err: 644err:
641 if (ctx) 645 if (ctx)
642 BN_CTX_end(ctx); 646 BN_CTX_end(ctx);
643 BN_CTX_free(new_ctx); 647 BN_CTX_free(new_ctx);
@@ -689,7 +693,7 @@ ec_GF2m_simple_cmp(const EC_GROUP *group, const EC_POINT *a,
689 goto err; 693 goto err;
690 ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1; 694 ret = ((BN_cmp(aX, bX) == 0) && BN_cmp(aY, bY) == 0) ? 0 : 1;
691 695
692 err: 696err:
693 if (ctx) 697 if (ctx)
694 BN_CTX_end(ctx); 698 BN_CTX_end(ctx);
695 BN_CTX_free(new_ctx); 699 BN_CTX_free(new_ctx);
@@ -730,7 +734,7 @@ ec_GF2m_simple_make_affine(const EC_GROUP * group, EC_POINT * point, BN_CTX * ct
730 734
731 ret = 1; 735 ret = 1;
732 736
733 err: 737err:
734 if (ctx) 738 if (ctx)
735 BN_CTX_end(ctx); 739 BN_CTX_end(ctx);
736 BN_CTX_free(new_ctx); 740 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ec_ameth.c b/src/lib/libcrypto/ec/ec_ameth.c
index 21390aabd4..30f29ef545 100644
--- a/src/lib/libcrypto/ec/ec_ameth.c
+++ b/src/lib/libcrypto/ec/ec_ameth.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_ameth.c,v 1.21 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_ameth.c,v 1.22 2018/07/15 05:38:48 jsg Exp $ */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL 2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2006. 3 * project 2006.
4 */ 4 */
@@ -126,7 +126,7 @@ eckey_pub_encode(X509_PUBKEY * pk, const EVP_PKEY * pkey)
126 if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_EC), 126 if (X509_PUBKEY_set0_param(pk, OBJ_nid2obj(EVP_PKEY_EC),
127 ptype, pval, penc, penclen)) 127 ptype, pval, penc, penclen))
128 return 1; 128 return 1;
129 err: 129err:
130 if (ptype == V_ASN1_OBJECT) 130 if (ptype == V_ASN1_OBJECT)
131 ASN1_OBJECT_free(pval); 131 ASN1_OBJECT_free(pval);
132 else 132 else
@@ -177,7 +177,7 @@ eckey_type2param(int ptype, const void *pval)
177 177
178 return eckey; 178 return eckey;
179 179
180 ecerr: 180ecerr:
181 if (eckey) 181 if (eckey)
182 EC_KEY_free(eckey); 182 EC_KEY_free(eckey);
183 return NULL; 183 return NULL;
@@ -210,7 +210,7 @@ eckey_pub_decode(EVP_PKEY * pkey, X509_PUBKEY * pubkey)
210 EVP_PKEY_assign_EC_KEY(pkey, eckey); 210 EVP_PKEY_assign_EC_KEY(pkey, eckey);
211 return 1; 211 return 1;
212 212
213 ecerr: 213ecerr:
214 if (eckey) 214 if (eckey)
215 EC_KEY_free(eckey); 215 EC_KEY_free(eckey);
216 return 0; 216 return 0;
@@ -290,9 +290,9 @@ eckey_priv_decode(EVP_PKEY * pkey, PKCS8_PRIV_KEY_INFO * p8)
290 EVP_PKEY_assign_EC_KEY(pkey, eckey); 290 EVP_PKEY_assign_EC_KEY(pkey, eckey);
291 return 1; 291 return 1;
292 292
293 ecliberr: 293ecliberr:
294 ECerror(ERR_R_EC_LIB); 294 ECerror(ERR_R_EC_LIB);
295 ecerr: 295ecerr:
296 if (eckey) 296 if (eckey)
297 EC_KEY_free(eckey); 297 EC_KEY_free(eckey);
298 return 0; 298 return 0;
@@ -483,7 +483,7 @@ do_EC_KEY_print(BIO * bp, const EC_KEY * x, int off, int ktype)
483 if (!ECPKParameters_print(bp, group, off)) 483 if (!ECPKParameters_print(bp, group, off))
484 goto err; 484 goto err;
485 ret = 1; 485 ret = 1;
486 err: 486err:
487 if (!ret) 487 if (!ret)
488 ECerror(reason); 488 ECerror(reason);
489 BN_free(pub_key); 489 BN_free(pub_key);
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c
index 1fb0670efe..f5a1331ba3 100644
--- a/src/lib/libcrypto/ec/ec_asn1.c
+++ b/src/lib/libcrypto/ec/ec_asn1.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_asn1.c,v 1.28 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_asn1.c,v 1.29 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -793,7 +793,7 @@ ec_asn1_group2fieldid(const EC_GROUP * group, X9_62_FIELDID * field)
793 793
794 ok = 1; 794 ok = 1;
795 795
796 err: 796err:
797 BN_free(tmp); 797 BN_free(tmp);
798 return (ok); 798 return (ok);
799} 799}
@@ -896,7 +896,7 @@ ec_asn1_group2curve(const EC_GROUP * group, X9_62_CURVE * curve)
896 896
897 ok = 1; 897 ok = 1;
898 898
899 err: 899err:
900 free(buffer_1); 900 free(buffer_1);
901 free(buffer_2); 901 free(buffer_2);
902 BN_free(tmp_1); 902 BN_free(tmp_1);
@@ -988,8 +988,7 @@ ec_asn1_group2parameters(const EC_GROUP * group, ECPARAMETERS * param)
988 } 988 }
989 ok = 1; 989 ok = 1;
990 990
991 err: 991err: if (!ok) {
992 if (!ok) {
993 if (ret && !param) 992 if (ret && !param)
994 ECPARAMETERS_free(ret); 993 ECPARAMETERS_free(ret);
995 ret = NULL; 994 ret = NULL;
@@ -1245,8 +1244,7 @@ ec_asn1_parameters2group(const ECPARAMETERS * params)
1245 } 1244 }
1246 ok = 1; 1245 ok = 1;
1247 1246
1248 err: 1247err: if (!ok) {
1249 if (!ok) {
1250 EC_GROUP_clear_free(ret); 1248 EC_GROUP_clear_free(ret);
1251 ret = NULL; 1249 ret = NULL;
1252 } 1250 }
@@ -1314,7 +1312,7 @@ d2i_ECPKParameters(EC_GROUP ** a, const unsigned char **in, long len)
1314 *a = group; 1312 *a = group;
1315 } 1313 }
1316 1314
1317 err: 1315err:
1318 ECPKPARAMETERS_free(params); 1316 ECPKPARAMETERS_free(params);
1319 return (group); 1317 return (group);
1320} 1318}
@@ -1427,7 +1425,7 @@ d2i_ECPrivateKey(EC_KEY ** a, const unsigned char **in, long len)
1427 *a = ret; 1425 *a = ret;
1428 return (ret); 1426 return (ret);
1429 1427
1430 err: 1428err:
1431 if (a == NULL || *a != ret) 1429 if (a == NULL || *a != ret)
1432 EC_KEY_free(ret); 1430 EC_KEY_free(ret);
1433 if (priv_key) 1431 if (priv_key)
@@ -1512,7 +1510,7 @@ i2d_ECPrivateKey(EC_KEY * a, unsigned char **out)
1512 goto err; 1510 goto err;
1513 } 1511 }
1514 ok = 1; 1512 ok = 1;
1515 err: 1513err:
1516 free(buffer); 1514 free(buffer);
1517 if (priv_key) 1515 if (priv_key)
1518 EC_PRIVATEKEY_free(priv_key); 1516 EC_PRIVATEKEY_free(priv_key);
diff --git a/src/lib/libcrypto/ec/ec_check.c b/src/lib/libcrypto/ec/ec_check.c
index b0c63331c6..a76d21c1ff 100644
--- a/src/lib/libcrypto/ec/ec_check.c
+++ b/src/lib/libcrypto/ec/ec_check.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_check.c,v 1.7 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_check.c,v 1.8 2018/07/15 05:38:48 jsg Exp $ */
2/* ==================================================================== 2/* ====================================================================
3 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved. 3 * Copyright (c) 1998-2002 The OpenSSL Project. All rights reserved.
4 * 4 *
@@ -106,7 +106,7 @@ EC_GROUP_check(const EC_GROUP * group, BN_CTX * ctx)
106 } 106 }
107 ret = 1; 107 ret = 1;
108 108
109 err: 109err:
110 if (ctx != NULL) 110 if (ctx != NULL)
111 BN_CTX_end(ctx); 111 BN_CTX_end(ctx);
112 BN_CTX_free(new_ctx); 112 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ec_curve.c b/src/lib/libcrypto/ec/ec_curve.c
index 7bf85835dc..1808e7b65c 100644
--- a/src/lib/libcrypto/ec/ec_curve.c
+++ b/src/lib/libcrypto/ec/ec_curve.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_curve.c,v 1.17 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_curve.c,v 1.18 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -3235,7 +3235,7 @@ ec_group_new_from_data(const ec_list_element curve)
3235 } 3235 }
3236 } 3236 }
3237 ok = 1; 3237 ok = 1;
3238 err: 3238err:
3239 if (!ok) { 3239 if (!ok) {
3240 EC_GROUP_free(group); 3240 EC_GROUP_free(group);
3241 group = NULL; 3241 group = NULL;
diff --git a/src/lib/libcrypto/ec/ec_key.c b/src/lib/libcrypto/ec/ec_key.c
index 33c9acccd7..a9f03c4ac2 100644
--- a/src/lib/libcrypto/ec/ec_key.c
+++ b/src/lib/libcrypto/ec/ec_key.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_key.c,v 1.15 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_key.c,v 1.16 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -253,7 +253,7 @@ EC_KEY_generate_key(EC_KEY * eckey)
253 253
254 ok = 1; 254 ok = 1;
255 255
256 err: 256err:
257 BN_free(order); 257 BN_free(order);
258 if (pub_key != NULL && eckey->pub_key == NULL) 258 if (pub_key != NULL && eckey->pub_key == NULL)
259 EC_POINT_free(pub_key); 259 EC_POINT_free(pub_key);
@@ -324,7 +324,7 @@ EC_KEY_check_key(const EC_KEY * eckey)
324 } 324 }
325 } 325 }
326 ok = 1; 326 ok = 1;
327 err: 327err:
328 BN_CTX_free(ctx); 328 BN_CTX_free(ctx);
329 EC_POINT_free(point); 329 EC_POINT_free(point);
330 return (ok); 330 return (ok);
@@ -395,7 +395,7 @@ EC_KEY_set_public_key_affine_coordinates(EC_KEY * key, BIGNUM * x, BIGNUM * y)
395 395
396 ok = 1; 396 ok = 1;
397 397
398 err: 398err:
399 BN_CTX_free(ctx); 399 BN_CTX_free(ctx);
400 EC_POINT_free(point); 400 EC_POINT_free(point);
401 return ok; 401 return ok;
diff --git a/src/lib/libcrypto/ec/ec_lcl.h b/src/lib/libcrypto/ec/ec_lcl.h
index 4916d3a14a..bcfd817b70 100644
--- a/src/lib/libcrypto/ec/ec_lcl.h
+++ b/src/lib/libcrypto/ec/ec_lcl.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_lcl.h,v 1.8 2018/07/10 21:55:49 tb Exp $ */ 1/* $OpenBSD: ec_lcl.h,v 1.9 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller for the OpenSSL project. 3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */ 4 */
@@ -160,12 +160,10 @@ struct ec_method_st {
160 int (*make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *); 160 int (*make_affine)(const EC_GROUP *, EC_POINT *, BN_CTX *);
161 int (*points_make_affine)(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *); 161 int (*points_make_affine)(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
162 162
163 /* used by EC_POINTs_mul, EC_POINT_mul, EC_POINT_precompute_mult, EC_POINT_have_precompute_mult */ 163 /* used by EC_POINTs_mul, EC_POINT_mul, EC_POINT_precompute_mult, EC_POINT_have_precompute_mult
164 int (*mul_generator_ct)(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, BN_CTX *); 164 * (default implementations are used if the 'mul' pointer is 0): */
165 int (*mul_single_ct)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, 165 int (*mul)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
166 const EC_POINT *point, BN_CTX *); 166 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
167 int (*mul_double_nonct)(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
168 const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *);
169 int (*precompute_mult)(EC_GROUP *group, BN_CTX *); 167 int (*precompute_mult)(EC_GROUP *group, BN_CTX *);
170 int (*have_precompute_mult)(const EC_GROUP *group); 168 int (*have_precompute_mult)(const EC_GROUP *group);
171 169
@@ -339,11 +337,6 @@ int ec_GFp_simple_make_affine(const EC_GROUP *, EC_POINT *, BN_CTX *);
339int ec_GFp_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *); 337int ec_GFp_simple_points_make_affine(const EC_GROUP *, size_t num, EC_POINT *[], BN_CTX *);
340int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *); 338int ec_GFp_simple_field_mul(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *);
341int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *); 339int ec_GFp_simple_field_sqr(const EC_GROUP *, BIGNUM *r, const BIGNUM *a, BN_CTX *);
342int ec_GFp_simple_mul_generator_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar, BN_CTX *);
343int ec_GFp_simple_mul_single_ct(const EC_GROUP *, EC_POINT *r, const BIGNUM *scalar,
344 const EC_POINT *point, BN_CTX *);
345int ec_GFp_simple_mul_double_nonct(const EC_GROUP *, EC_POINT *r, const BIGNUM *g_scalar,
346 const BIGNUM *p_scalar, const EC_POINT *point, BN_CTX *);
347 340
348 341
349/* method functions in ecp_mont.c */ 342/* method functions in ecp_mont.c */
diff --git a/src/lib/libcrypto/ec/ec_lib.c b/src/lib/libcrypto/ec/ec_lib.c
index 1d1daca166..29207d6b48 100644
--- a/src/lib/libcrypto/ec/ec_lib.c
+++ b/src/lib/libcrypto/ec/ec_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_lib.c,v 1.26 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_lib.c,v 1.27 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller for the OpenSSL project. 3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */ 4 */
@@ -526,7 +526,7 @@ EC_GROUP_cmp(const EC_GROUP * a, const EC_GROUP * b, BN_CTX * ctx)
526 526
527 return r; 527 return r;
528 528
529 err: 529err:
530 BN_CTX_end(ctx); 530 BN_CTX_end(ctx);
531 if (ctx_new) 531 if (ctx_new)
532 BN_CTX_free(ctx); 532 BN_CTX_free(ctx);
@@ -1026,88 +1026,47 @@ EC_POINTs_make_affine(const EC_GROUP *group, size_t num, EC_POINT *points[],
1026} 1026}
1027 1027
1028 1028
1029/* Functions for point multiplication */ 1029/* Functions for point multiplication.
1030 *
1031 * If group->meth->mul is 0, we use the wNAF-based implementations in ec_mult.c;
1032 * otherwise we dispatch through methods.
1033 */
1034
1030int 1035int
1031EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar, 1036EC_POINTs_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
1032 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx) 1037 size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *ctx)
1033{ 1038{
1034 /* 1039 if (group->meth->mul == 0)
1035 * The function pointers must be set, and only support num == 0 and 1040 /* use default */
1036 * num == 1. 1041 return ec_wNAF_mul(group, r, scalar, num, points, scalars, ctx);
1037 */ 1042
1038 if (group->meth->mul_generator_ct == NULL || 1043 return group->meth->mul(group, r, scalar, num, points, scalars, ctx);
1039 group->meth->mul_single_ct == NULL ||
1040 group->meth->mul_double_nonct == NULL ||
1041 num > 1) {
1042 ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);
1043 return 0;
1044 }
1045
1046 /* Either bP or aG + bP, this is sane. */
1047 if (num == 1 && points != NULL && scalars != NULL)
1048 return EC_POINT_mul(group, r, scalar, points[0], scalars[0],
1049 ctx);
1050
1051 /* aG, this is sane */
1052 if (scalar != NULL && points == NULL && scalars == NULL)
1053 return EC_POINT_mul(group, r, scalar, NULL, NULL, ctx);
1054
1055 /* anything else is an error */
1056 ECerror(ERR_R_EC_LIB);
1057 return 0;
1058} 1044}
1059 1045
1060int 1046int
1061EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar, 1047EC_POINT_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *g_scalar,
1062 const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx) 1048 const EC_POINT *point, const BIGNUM *p_scalar, BN_CTX *ctx)
1063{ 1049{
1064 if (group->meth->mul_generator_ct == NULL || 1050 /* just a convenient interface to EC_POINTs_mul() */
1065 group->meth->mul_single_ct == NULL || 1051
1066 group->meth->mul_double_nonct == NULL) { 1052 const EC_POINT *points[1];
1067 ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); 1053 const BIGNUM *scalars[1];
1068 return 0; 1054
1069 } 1055 points[0] = point;
1070 if (g_scalar != NULL && point == NULL && p_scalar == NULL) { 1056 scalars[0] = p_scalar;
1071 /* 1057
1072 * In this case we want to compute g_scalar * GeneratorPoint: 1058 return EC_POINTs_mul(group, r, g_scalar,
1073 * this codepath is reached most prominently by (ephemeral) key 1059 (point != NULL && p_scalar != NULL),
1074 * generation of EC cryptosystems (i.e. ECDSA keygen and sign 1060 points, scalars, ctx);
1075 * setup, ECDH keygen/first half), where the scalar is always
1076 * secret. This is why we ignore if BN_FLG_CONSTTIME is actually
1077 * set and we always call the constant time version.
1078 */
1079 return group->meth->mul_generator_ct(group, r, g_scalar, ctx);
1080 }
1081 if (g_scalar == NULL && point != NULL && p_scalar != NULL) {
1082 /* In this case we want to compute p_scalar * GenericPoint:
1083 * this codepath is reached most prominently by the second half
1084 * of ECDH, where the secret scalar is multiplied by the peer's
1085 * public point. To protect the secret scalar, we ignore if
1086 * BN_FLG_CONSTTIME is actually set and we always call the
1087 * constant time version.
1088 */
1089 return group->meth->mul_single_ct(group, r, p_scalar, point,
1090 ctx);
1091 }
1092 if (g_scalar != NULL && point != NULL && p_scalar != NULL) {
1093 /*
1094 * In this case we want to compute
1095 * g_scalar * GeneratorPoint + p_scalar * GenericPoint:
1096 * this codepath is reached most prominently by ECDSA signature
1097 * verification. So we call the non-ct version.
1098 */
1099 return group->meth->mul_double_nonct(group, r, g_scalar,
1100 p_scalar, point, ctx);
1101 }
1102
1103 /* Anything else is an error. */
1104 ECerror(ERR_R_EC_LIB);
1105 return 0;
1106} 1061}
1107 1062
1108int 1063int
1109EC_GROUP_precompute_mult(EC_GROUP * group, BN_CTX * ctx) 1064EC_GROUP_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
1110{ 1065{
1066 if (group->meth->mul == 0)
1067 /* use default */
1068 return ec_wNAF_precompute_mult(group, ctx);
1069
1111 if (group->meth->precompute_mult != 0) 1070 if (group->meth->precompute_mult != 0)
1112 return group->meth->precompute_mult(group, ctx); 1071 return group->meth->precompute_mult(group, ctx);
1113 else 1072 else
@@ -1117,6 +1076,10 @@ EC_GROUP_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
1117int 1076int
1118EC_GROUP_have_precompute_mult(const EC_GROUP * group) 1077EC_GROUP_have_precompute_mult(const EC_GROUP * group)
1119{ 1078{
1079 if (group->meth->mul == 0)
1080 /* use default */
1081 return ec_wNAF_have_precompute_mult(group);
1082
1120 if (group->meth->have_precompute_mult != 0) 1083 if (group->meth->have_precompute_mult != 0)
1121 return group->meth->have_precompute_mult(group); 1084 return group->meth->have_precompute_mult(group);
1122 else 1085 else
diff --git a/src/lib/libcrypto/ec/ec_mult.c b/src/lib/libcrypto/ec/ec_mult.c
index 08bc8c380c..4f321d3f55 100644
--- a/src/lib/libcrypto/ec/ec_mult.c
+++ b/src/lib/libcrypto/ec/ec_mult.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ec_mult.c,v 1.22 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ec_mult.c,v 1.23 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project. 3 * Originally written by Bodo Moeller and Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -301,7 +301,7 @@ compute_wNAF(const BIGNUM * scalar, int w, size_t * ret_len)
301 len = j; 301 len = j;
302 ok = 1; 302 ok = 1;
303 303
304 err: 304err:
305 if (!ok) { 305 if (!ok) {
306 free(r); 306 free(r);
307 r = NULL; 307 r = NULL;
@@ -678,7 +678,7 @@ ec_wNAF_mul(const EC_GROUP * group, EC_POINT * r, const BIGNUM * scalar,
678 678
679 ret = 1; 679 ret = 1;
680 680
681 err: 681err:
682 BN_CTX_free(new_ctx); 682 BN_CTX_free(new_ctx);
683 EC_POINT_free(tmp); 683 EC_POINT_free(tmp);
684 free(wsize); 684 free(wsize);
@@ -857,7 +857,7 @@ ec_wNAF_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
857 pre_comp = NULL; 857 pre_comp = NULL;
858 858
859 ret = 1; 859 ret = 1;
860 err: 860err:
861 if (ctx != NULL) 861 if (ctx != NULL)
862 BN_CTX_end(ctx); 862 BN_CTX_end(ctx);
863 BN_CTX_free(new_ctx); 863 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/eck_prn.c b/src/lib/libcrypto/ec/eck_prn.c
index 0291de9613..7c0db42ef4 100644
--- a/src/lib/libcrypto/ec/eck_prn.c
+++ b/src/lib/libcrypto/ec/eck_prn.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: eck_prn.c,v 1.13 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: eck_prn.c,v 1.14 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -321,7 +321,7 @@ ECPKParameters_print(BIO * bp, const EC_GROUP * x, int off)
321 goto err; 321 goto err;
322 } 322 }
323 ret = 1; 323 ret = 1;
324 err: 324err:
325 if (!ret) 325 if (!ret)
326 ECerror(reason); 326 ECerror(reason);
327 BN_free(p); 327 BN_free(p);
diff --git a/src/lib/libcrypto/ec/ecp_mont.c b/src/lib/libcrypto/ec/ecp_mont.c
index 302f833306..03e594d38d 100644
--- a/src/lib/libcrypto/ec/ecp_mont.c
+++ b/src/lib/libcrypto/ec/ecp_mont.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_mont.c,v 1.13 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_mont.c,v 1.14 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Originally written by Bodo Moeller for the OpenSSL project. 3 * Originally written by Bodo Moeller for the OpenSSL project.
4 */ 4 */
@@ -102,9 +102,6 @@ EC_GFp_mont_method(void)
102 .point_cmp = ec_GFp_simple_cmp, 102 .point_cmp = ec_GFp_simple_cmp,
103 .make_affine = ec_GFp_simple_make_affine, 103 .make_affine = ec_GFp_simple_make_affine,
104 .points_make_affine = ec_GFp_simple_points_make_affine, 104 .points_make_affine = ec_GFp_simple_points_make_affine,
105 .mul_generator_ct = ec_GFp_simple_mul_generator_ct,
106 .mul_single_ct = ec_GFp_simple_mul_single_ct,
107 .mul_double_nonct = ec_GFp_simple_mul_double_nonct,
108 .field_mul = ec_GFp_mont_field_mul, 105 .field_mul = ec_GFp_mont_field_mul,
109 .field_sqr = ec_GFp_mont_field_sqr, 106 .field_sqr = ec_GFp_mont_field_sqr,
110 .field_encode = ec_GFp_mont_field_encode, 107 .field_encode = ec_GFp_mont_field_encode,
@@ -175,7 +172,7 @@ ec_GFp_mont_group_copy(EC_GROUP * dest, const EC_GROUP * src)
175 } 172 }
176 return 1; 173 return 1;
177 174
178 err: 175err:
179 if (dest->field_data1 != NULL) { 176 if (dest->field_data1 != NULL) {
180 BN_MONT_CTX_free(dest->field_data1); 177 BN_MONT_CTX_free(dest->field_data1);
181 dest->field_data1 = NULL; 178 dest->field_data1 = NULL;
@@ -228,7 +225,7 @@ ec_GFp_mont_group_set_curve(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a,
228 BN_free(group->field_data2); 225 BN_free(group->field_data2);
229 group->field_data2 = NULL; 226 group->field_data2 = NULL;
230 } 227 }
231 err: 228err:
232 BN_CTX_free(new_ctx); 229 BN_CTX_free(new_ctx);
233 BN_MONT_CTX_free(mont); 230 BN_MONT_CTX_free(mont);
234 BN_free(one); 231 BN_free(one);
diff --git a/src/lib/libcrypto/ec/ecp_nist.c b/src/lib/libcrypto/ec/ecp_nist.c
index 8aa9f49592..027a07d5c0 100644
--- a/src/lib/libcrypto/ec/ecp_nist.c
+++ b/src/lib/libcrypto/ec/ecp_nist.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_nist.c,v 1.11 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_nist.c,v 1.12 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Nils Larsch for the OpenSSL project. 3 * Written by Nils Larsch for the OpenSSL project.
4 */ 4 */
@@ -151,7 +151,7 @@ ec_GFp_nist_group_set_curve(EC_GROUP *group, const BIGNUM *p,
151 151
152 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); 152 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
153 153
154 err: 154err:
155 BN_CTX_end(ctx); 155 BN_CTX_end(ctx);
156 BN_CTX_free(new_ctx); 156 BN_CTX_free(new_ctx);
157 return ret; 157 return ret;
@@ -179,7 +179,7 @@ ec_GFp_nist_field_mul(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
179 goto err; 179 goto err;
180 180
181 ret = 1; 181 ret = 1;
182 err: 182err:
183 BN_CTX_free(ctx_new); 183 BN_CTX_free(ctx_new);
184 return ret; 184 return ret;
185} 185}
@@ -206,7 +206,7 @@ ec_GFp_nist_field_sqr(const EC_GROUP * group, BIGNUM * r, const BIGNUM * a,
206 goto err; 206 goto err;
207 207
208 ret = 1; 208 ret = 1;
209 err: 209err:
210 BN_CTX_free(ctx_new); 210 BN_CTX_free(ctx_new);
211 return ret; 211 return ret;
212} 212}
diff --git a/src/lib/libcrypto/ec/ecp_nistp224.c b/src/lib/libcrypto/ec/ecp_nistp224.c
index 3921508094..1ba8cb09a0 100644
--- a/src/lib/libcrypto/ec/ecp_nistp224.c
+++ b/src/lib/libcrypto/ec/ecp_nistp224.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_nistp224.c,v 1.20 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_nistp224.c,v 1.21 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Emilia Kasper (Google) for the OpenSSL project. 3 * Written by Emilia Kasper (Google) for the OpenSSL project.
4 */ 4 */
@@ -1281,7 +1281,7 @@ ec_GFp_nistp224_group_set_curve(EC_GROUP * group, const BIGNUM * p,
1281 } 1281 }
1282 group->field_mod_func = BN_nist_mod_224; 1282 group->field_mod_func = BN_nist_mod_224;
1283 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); 1283 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1284 err: 1284err:
1285 BN_CTX_end(ctx); 1285 BN_CTX_end(ctx);
1286 BN_CTX_free(new_ctx); 1286 BN_CTX_free(new_ctx);
1287 return ret; 1287 return ret;
@@ -1537,7 +1537,7 @@ ec_GFp_nistp224_points_mul(const EC_GROUP * group, EC_POINT * r,
1537 } 1537 }
1538 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx); 1538 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);
1539 1539
1540 err: 1540err:
1541 BN_CTX_end(ctx); 1541 BN_CTX_end(ctx);
1542 EC_POINT_free(generator); 1542 EC_POINT_free(generator);
1543 BN_CTX_free(new_ctx); 1543 BN_CTX_free(new_ctx);
@@ -1666,7 +1666,7 @@ ec_GFp_nistp224_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
1666 goto err; 1666 goto err;
1667 ret = 1; 1667 ret = 1;
1668 pre = NULL; 1668 pre = NULL;
1669 err: 1669err:
1670 BN_CTX_end(ctx); 1670 BN_CTX_end(ctx);
1671 EC_POINT_free(generator); 1671 EC_POINT_free(generator);
1672 BN_CTX_free(new_ctx); 1672 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ecp_nistp256.c b/src/lib/libcrypto/ec/ecp_nistp256.c
index 7046dcebc0..3b0784f153 100644
--- a/src/lib/libcrypto/ec/ecp_nistp256.c
+++ b/src/lib/libcrypto/ec/ecp_nistp256.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_nistp256.c,v 1.19 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_nistp256.c,v 1.20 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Adam Langley (Google) for the OpenSSL project 3 * Written by Adam Langley (Google) for the OpenSSL project
4 */ 4 */
@@ -1830,7 +1830,7 @@ ec_GFp_nistp256_group_set_curve(EC_GROUP * group, const BIGNUM * p,
1830 } 1830 }
1831 group->field_mod_func = BN_nist_mod_256; 1831 group->field_mod_func = BN_nist_mod_256;
1832 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); 1832 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1833 err: 1833err:
1834 BN_CTX_end(ctx); 1834 BN_CTX_end(ctx);
1835 BN_CTX_free(new_ctx); 1835 BN_CTX_free(new_ctx);
1836 return ret; 1836 return ret;
@@ -2090,7 +2090,7 @@ ec_GFp_nistp256_points_mul(const EC_GROUP * group, EC_POINT * r,
2090 } 2090 }
2091 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx); 2091 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);
2092 2092
2093 err: 2093err:
2094 BN_CTX_end(ctx); 2094 BN_CTX_end(ctx);
2095 EC_POINT_free(generator); 2095 EC_POINT_free(generator);
2096 BN_CTX_free(new_ctx); 2096 BN_CTX_free(new_ctx);
@@ -2213,7 +2213,7 @@ ec_GFp_nistp256_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
2213 goto err; 2213 goto err;
2214 ret = 1; 2214 ret = 1;
2215 pre = NULL; 2215 pre = NULL;
2216 err: 2216err:
2217 BN_CTX_end(ctx); 2217 BN_CTX_end(ctx);
2218 EC_POINT_free(generator); 2218 EC_POINT_free(generator);
2219 BN_CTX_free(new_ctx); 2219 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ecp_nistp521.c b/src/lib/libcrypto/ec/ecp_nistp521.c
index 7c20daae28..823e7a0d51 100644
--- a/src/lib/libcrypto/ec/ecp_nistp521.c
+++ b/src/lib/libcrypto/ec/ecp_nistp521.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_nistp521.c,v 1.20 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_nistp521.c,v 1.21 2018/07/15 05:38:48 jsg Exp $ */
2/* 2/*
3 * Written by Adam Langley (Google) for the OpenSSL project 3 * Written by Adam Langley (Google) for the OpenSSL project
4 */ 4 */
@@ -1721,7 +1721,7 @@ ec_GFp_nistp521_group_set_curve(EC_GROUP * group, const BIGNUM * p,
1721 } 1721 }
1722 group->field_mod_func = BN_nist_mod_521; 1722 group->field_mod_func = BN_nist_mod_521;
1723 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx); 1723 ret = ec_GFp_simple_group_set_curve(group, p, a, b, ctx);
1724 err: 1724err:
1725 BN_CTX_end(ctx); 1725 BN_CTX_end(ctx);
1726 BN_CTX_free(new_ctx); 1726 BN_CTX_free(new_ctx);
1727 return ret; 1727 return ret;
@@ -1979,7 +1979,7 @@ ec_GFp_nistp521_points_mul(const EC_GROUP * group, EC_POINT * r,
1979 } 1979 }
1980 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx); 1980 ret = EC_POINT_set_Jprojective_coordinates_GFp(group, r, x, y, z, ctx);
1981 1981
1982 err: 1982err:
1983 BN_CTX_end(ctx); 1983 BN_CTX_end(ctx);
1984 EC_POINT_free(generator); 1984 EC_POINT_free(generator);
1985 BN_CTX_free(new_ctx); 1985 BN_CTX_free(new_ctx);
@@ -2088,7 +2088,7 @@ ec_GFp_nistp521_precompute_mult(EC_GROUP * group, BN_CTX * ctx)
2088 goto err; 2088 goto err;
2089 ret = 1; 2089 ret = 1;
2090 pre = NULL; 2090 pre = NULL;
2091 err: 2091err:
2092 BN_CTX_end(ctx); 2092 BN_CTX_end(ctx);
2093 EC_POINT_free(generator); 2093 EC_POINT_free(generator);
2094 BN_CTX_free(new_ctx); 2094 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ecp_nistz256.c b/src/lib/libcrypto/ec/ecp_nistz256.c
index 3d52938721..71c2952d8c 100644
--- a/src/lib/libcrypto/ec/ecp_nistz256.c
+++ b/src/lib/libcrypto/ec/ecp_nistz256.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_nistz256.c,v 1.4 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_nistz256.c,v 1.5 2018/07/15 05:38:48 jsg Exp $ */
2/* Copyright (c) 2014, Intel Corporation. 2/* Copyright (c) 2014, Intel Corporation.
3 * 3 *
4 * Permission to use, copy, modify, and/or distribute this software for any 4 * Permission to use, copy, modify, and/or distribute this software for any
@@ -565,7 +565,7 @@ ecp_nistz256_windowed_mul(const EC_GROUP *group, P256_POINT *r,
565 } 565 }
566 566
567 ret = 1; 567 ret = 1;
568 err: 568err:
569 free(table); 569 free(table);
570 free(p_str); 570 free(p_str);
571 free(scalars); 571 free(scalars);
@@ -712,7 +712,7 @@ ecp_nistz256_mult_precompute(EC_GROUP *group, BN_CTX *ctx)
712 ec_pre_comp = NULL; 712 ec_pre_comp = NULL;
713 ret = 1; 713 ret = 1;
714 714
715 err: 715err:
716 if (ctx != NULL) 716 if (ctx != NULL)
717 BN_CTX_end(ctx); 717 BN_CTX_end(ctx);
718 BN_CTX_free(new_ctx); 718 BN_CTX_free(new_ctx);
@@ -985,7 +985,7 @@ ecp_nistz256_points_mul(const EC_GROUP *group, EC_POINT *r,
985 985
986 ret = 1; 986 ret = 1;
987 987
988 err: 988err:
989 if (ctx) 989 if (ctx)
990 BN_CTX_end(ctx); 990 BN_CTX_end(ctx);
991 BN_CTX_free(new_ctx); 991 BN_CTX_free(new_ctx);
diff --git a/src/lib/libcrypto/ec/ecp_oct.c b/src/lib/libcrypto/ec/ecp_oct.c
index da9eccfe6a..3d50f707c0 100644
--- a/src/lib/libcrypto/ec/ecp_oct.c
+++ b/src/lib/libcrypto/ec/ecp_oct.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_oct.c,v 1.9 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_oct.c,v 1.10 2018/07/15 05:38:48 jsg 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.
@@ -190,7 +190,7 @@ ec_GFp_simple_set_compressed_coordinates(const EC_GROUP * group,
190 190
191 ret = 1; 191 ret = 1;
192 192
193 err: 193err:
194 BN_CTX_end(ctx); 194 BN_CTX_end(ctx);
195 BN_CTX_free(new_ctx); 195 BN_CTX_free(new_ctx);
196 return ret; 196 return ret;
@@ -294,7 +294,7 @@ ec_GFp_simple_point2oct(const EC_GROUP * group, const EC_POINT * point, point_co
294 BN_CTX_free(new_ctx); 294 BN_CTX_free(new_ctx);
295 return ret; 295 return ret;
296 296
297 err: 297err:
298 if (used_ctx) 298 if (used_ctx)
299 BN_CTX_end(ctx); 299 BN_CTX_end(ctx);
300 BN_CTX_free(new_ctx); 300 BN_CTX_free(new_ctx);
@@ -388,7 +388,7 @@ ec_GFp_simple_oct2point(const EC_GROUP * group, EC_POINT * point,
388 } 388 }
389 ret = 1; 389 ret = 1;
390 390
391 err: 391err:
392 BN_CTX_end(ctx); 392 BN_CTX_end(ctx);
393 BN_CTX_free(new_ctx); 393 BN_CTX_free(new_ctx);
394 return ret; 394 return ret;
diff --git a/src/lib/libcrypto/ec/ecp_smpl.c b/src/lib/libcrypto/ec/ecp_smpl.c
index 57e8345364..1fe55307b4 100644
--- a/src/lib/libcrypto/ec/ecp_smpl.c
+++ b/src/lib/libcrypto/ec/ecp_smpl.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ecp_smpl.c,v 1.19 2018/07/10 22:06:14 tb Exp $ */ 1/* $OpenBSD: ecp_smpl.c,v 1.20 2018/07/15 05:38:48 jsg 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.
@@ -103,9 +103,6 @@ EC_GFp_simple_method(void)
103 .point_cmp = ec_GFp_simple_cmp, 103 .point_cmp = ec_GFp_simple_cmp,
104 .make_affine = ec_GFp_simple_make_affine, 104 .make_affine = ec_GFp_simple_make_affine,
105 .points_make_affine = ec_GFp_simple_points_make_affine, 105 .points_make_affine = ec_GFp_simple_points_make_affine,
106 .mul_generator_ct = ec_GFp_simple_mul_generator_ct,
107 .mul_single_ct = ec_GFp_simple_mul_single_ct,
108 .mul_double_nonct = ec_GFp_simple_mul_double_nonct,
109 .field_mul = ec_GFp_simple_field_mul, 106 .field_mul = ec_GFp_simple_field_mul,
110 .field_sqr = ec_GFp_simple_field_sqr 107 .field_sqr = ec_GFp_simple_field_sqr
111 }; 108 };
@@ -223,7 +220,7 @@ ec_GFp_simple_group_set_curve(EC_GROUP * group,
223 220
224 ret = 1; 221 ret = 1;
225 222
226 err: 223err:
227 BN_CTX_end(ctx); 224 BN_CTX_end(ctx);
228 BN_CTX_free(new_ctx); 225 BN_CTX_free(new_ctx);
229 return ret; 226 return ret;
@@ -268,7 +265,7 @@ ec_GFp_simple_group_get_curve(const EC_GROUP * group, BIGNUM * p, BIGNUM * a, BI
268 } 265 }
269 ret = 1; 266 ret = 1;
270 267
271 err: 268err:
272 BN_CTX_free(new_ctx); 269 BN_CTX_free(new_ctx);
273 return ret; 270 return ret;
274} 271}
@@ -349,7 +346,7 @@ ec_GFp_simple_group_check_discriminant(const EC_GROUP * group, BN_CTX * ctx)
349 } 346 }
350 ret = 1; 347 ret = 1;
351 348
352 err: 349err:
353 if (ctx != NULL) 350 if (ctx != NULL)
354 BN_CTX_end(ctx); 351 BN_CTX_end(ctx);
355 BN_CTX_free(new_ctx); 352 BN_CTX_free(new_ctx);
@@ -459,7 +456,7 @@ ec_GFp_simple_set_Jprojective_coordinates_GFp(const EC_GROUP * group, EC_POINT *
459 } 456 }
460 ret = 1; 457 ret = 1;
461 458
462 err: 459err:
463 BN_CTX_free(new_ctx); 460 BN_CTX_free(new_ctx);
464 return ret; 461 return ret;
465} 462}
@@ -507,7 +504,7 @@ ec_GFp_simple_get_Jprojective_coordinates_GFp(const EC_GROUP * group, const EC_P
507 504
508 ret = 1; 505 ret = 1;
509 506
510 err: 507err:
511 BN_CTX_free(new_ctx); 508 BN_CTX_free(new_ctx);
512 return ret; 509 return ret;
513} 510}
@@ -627,7 +624,7 @@ ec_GFp_simple_point_get_affine_coordinates(const EC_GROUP * group, const EC_POIN
627 624
628 ret = 1; 625 ret = 1;
629 626
630 err: 627err:
631 BN_CTX_end(ctx); 628 BN_CTX_end(ctx);
632 BN_CTX_free(new_ctx); 629 BN_CTX_free(new_ctx);
633 return ret; 630 return ret;
@@ -814,7 +811,7 @@ ec_GFp_simple_add(const EC_GROUP * group, EC_POINT * r, const EC_POINT * a, cons
814 811
815 ret = 1; 812 ret = 1;
816 813
817 end: 814end:
818 if (ctx) /* otherwise we already called BN_CTX_end */ 815 if (ctx) /* otherwise we already called BN_CTX_end */
819 BN_CTX_end(ctx); 816 BN_CTX_end(ctx);
820 BN_CTX_free(new_ctx); 817 BN_CTX_free(new_ctx);
@@ -957,7 +954,7 @@ ec_GFp_simple_dbl(const EC_GROUP * group, EC_POINT * r, const EC_POINT * a, BN_C
957 954
958 ret = 1; 955 ret = 1;
959 956
960 err: 957err:
961 BN_CTX_end(ctx); 958 BN_CTX_end(ctx);
962 BN_CTX_free(new_ctx); 959 BN_CTX_free(new_ctx);
963 return ret; 960 return ret;
@@ -1078,7 +1075,7 @@ ec_GFp_simple_is_on_curve(const EC_GROUP * group, const EC_POINT * point, BN_CTX
1078 1075
1079 ret = (0 == BN_ucmp(tmp, rh)); 1076 ret = (0 == BN_ucmp(tmp, rh));
1080 1077
1081 err: 1078err:
1082 BN_CTX_end(ctx); 1079 BN_CTX_end(ctx);
1083 BN_CTX_free(new_ctx); 1080 BN_CTX_free(new_ctx);
1084 return ret; 1081 return ret;
@@ -1180,7 +1177,7 @@ ec_GFp_simple_cmp(const EC_GROUP * group, const EC_POINT * a, const EC_POINT * b
1180 /* points are equal */ 1177 /* points are equal */
1181 ret = 0; 1178 ret = 0;
1182 1179
1183 end: 1180end:
1184 BN_CTX_end(ctx); 1181 BN_CTX_end(ctx);
1185 BN_CTX_free(new_ctx); 1182 BN_CTX_free(new_ctx);
1186 return ret; 1183 return ret;
@@ -1218,7 +1215,7 @@ ec_GFp_simple_make_affine(const EC_GROUP * group, EC_POINT * point, BN_CTX * ctx
1218 } 1215 }
1219 ret = 1; 1216 ret = 1;
1220 1217
1221 err: 1218err:
1222 BN_CTX_end(ctx); 1219 BN_CTX_end(ctx);
1223 BN_CTX_free(new_ctx); 1220 BN_CTX_free(new_ctx);
1224 return ret; 1221 return ret;
@@ -1383,7 +1380,7 @@ ec_GFp_simple_points_make_affine(const EC_GROUP * group, size_t num, EC_POINT *
1383 1380
1384 ret = 1; 1381 ret = 1;
1385 1382
1386 err: 1383err:
1387 BN_CTX_end(ctx); 1384 BN_CTX_end(ctx);
1388 BN_CTX_free(new_ctx); 1385 BN_CTX_free(new_ctx);
1389 if (heap != NULL) { 1386 if (heap != NULL) {
@@ -1412,248 +1409,3 @@ ec_GFp_simple_field_sqr(const EC_GROUP * group, BIGNUM * r, const BIGNUM * a, BN
1412{ 1409{
1413 return BN_mod_sqr(r, a, &group->field, ctx); 1410 return BN_mod_sqr(r, a, &group->field, ctx);
1414} 1411}
1415
1416#define EC_POINT_BN_set_flags(P, flags) do { \
1417 BN_set_flags(&(P)->X, (flags)); \
1418 BN_set_flags(&(P)->Y, (flags)); \
1419 BN_set_flags(&(P)->Z, (flags)); \
1420} while(0)
1421
1422#define EC_POINT_CSWAP(c, a, b, w, t) do { \
1423 if (!BN_swap_ct(c, &(a)->X, &(b)->X, w) || \
1424 !BN_swap_ct(c, &(a)->Y, &(b)->Y, w) || \
1425 !BN_swap_ct(c, &(a)->Z, &(b)->Z, w)) \
1426 goto err; \
1427 t = ((a)->Z_is_one ^ (b)->Z_is_one) & (c); \
1428 (a)->Z_is_one ^= (t); \
1429 (b)->Z_is_one ^= (t); \
1430} while(0)
1431
1432/*
1433 * This function computes (in constant time) a point multiplication over the
1434 * EC group.
1435 *
1436 * At a high level, it is Montgomery ladder with conditional swaps.
1437 *
1438 * It performs either a fixed point multiplication
1439 * (scalar * generator)
1440 * when point is NULL, or a variable point multiplication
1441 * (scalar * point)
1442 * when point is not NULL.
1443 *
1444 * scalar should be in the range [0,n) otherwise all constant time bets are off.
1445 *
1446 * NB: This says nothing about EC_POINT_add and EC_POINT_dbl,
1447 * which of course are not constant time themselves.
1448 *
1449 * The product is stored in r.
1450 *
1451 * Returns 1 on success, 0 otherwise.
1452 */
1453static int
1454ec_GFp_simple_mul_ct(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
1455 const EC_POINT *point, BN_CTX *ctx)
1456{
1457 int i, cardinality_bits, group_top, kbit, pbit, Z_is_one;
1458 EC_POINT *s = NULL;
1459 BIGNUM *k = NULL;
1460 BIGNUM *lambda = NULL;
1461 BIGNUM *cardinality = NULL;
1462 BN_CTX *new_ctx = NULL;
1463 int ret = 0;
1464
1465 if (ctx == NULL && (ctx = new_ctx = BN_CTX_new()) == NULL)
1466 return 0;
1467
1468 BN_CTX_start(ctx);
1469
1470 if ((s = EC_POINT_new(group)) == NULL)
1471 goto err;
1472
1473 if (point == NULL) {
1474 if (!EC_POINT_copy(s, group->generator))
1475 goto err;
1476 } else {
1477 if (!EC_POINT_copy(s, point))
1478 goto err;
1479 }
1480
1481 EC_POINT_BN_set_flags(s, BN_FLG_CONSTTIME);
1482
1483 if ((cardinality = BN_CTX_get(ctx)) == NULL)
1484 goto err;
1485 if ((lambda = BN_CTX_get(ctx)) == NULL)
1486 goto err;
1487 if ((k = BN_CTX_get(ctx)) == NULL)
1488 goto err;
1489 if (!BN_mul(cardinality, &group->order, &group->cofactor, ctx))
1490 goto err;
1491
1492 /*
1493 * Group cardinalities are often on a word boundary.
1494 * So when we pad the scalar, some timing diff might
1495 * pop if it needs to be expanded due to carries.
1496 * So expand ahead of time.
1497 */
1498 cardinality_bits = BN_num_bits(cardinality);
1499 group_top = cardinality->top;
1500 if ((bn_wexpand(k, group_top + 1) == NULL) ||
1501 (bn_wexpand(lambda, group_top + 1) == NULL))
1502 goto err;
1503
1504 if (!BN_copy(k, scalar))
1505 goto err;
1506
1507 BN_set_flags(k, BN_FLG_CONSTTIME);
1508
1509 if (BN_num_bits(k) > cardinality_bits || BN_is_negative(k)) {
1510 /*
1511 * This is an unusual input, and we don't guarantee
1512 * constant-timeness
1513 */
1514 if (!BN_nnmod(k, k, cardinality, ctx))
1515 goto err;
1516 }
1517
1518 if (!BN_add(lambda, k, cardinality))
1519 goto err;
1520 BN_set_flags(lambda, BN_FLG_CONSTTIME);
1521 if (!BN_add(k, lambda, cardinality))
1522 goto err;
1523 /*
1524 * lambda := scalar + cardinality
1525 * k := scalar + 2*cardinality
1526 */
1527 kbit = BN_is_bit_set(lambda, cardinality_bits);
1528 if (!BN_swap_ct(kbit, k, lambda, group_top + 1))
1529 goto err;
1530
1531 group_top = group->field.top;
1532 if ((bn_wexpand(&s->X, group_top) == NULL) ||
1533 (bn_wexpand(&s->Y, group_top) == NULL) ||
1534 (bn_wexpand(&s->Z, group_top) == NULL) ||
1535 (bn_wexpand(&r->X, group_top) == NULL) ||
1536 (bn_wexpand(&r->Y, group_top) == NULL) ||
1537 (bn_wexpand(&r->Z, group_top) == NULL))
1538 goto err;
1539
1540 /* top bit is a 1, in a fixed pos */
1541 if (!EC_POINT_copy(r, s))
1542 goto err;
1543
1544 EC_POINT_BN_set_flags(r, BN_FLG_CONSTTIME);
1545
1546 if (!EC_POINT_dbl(group, s, s, ctx))
1547 goto err;
1548
1549 pbit = 0;
1550
1551 /*
1552 * The ladder step, with branches, is
1553 *
1554 * k[i] == 0: S = add(R, S), R = dbl(R)
1555 * k[i] == 1: R = add(S, R), S = dbl(S)
1556 *
1557 * Swapping R, S conditionally on k[i] leaves you with state
1558 *
1559 * k[i] == 0: T, U = R, S
1560 * k[i] == 1: T, U = S, R
1561 *
1562 * Then perform the ECC ops.
1563 *
1564 * U = add(T, U)
1565 * T = dbl(T)
1566 *
1567 * Which leaves you with state
1568 *
1569 * k[i] == 0: U = add(R, S), T = dbl(R)
1570 * k[i] == 1: U = add(S, R), T = dbl(S)
1571 *
1572 * Swapping T, U conditionally on k[i] leaves you with state
1573 *
1574 * k[i] == 0: R, S = T, U
1575 * k[i] == 1: R, S = U, T
1576 *
1577 * Which leaves you with state
1578 *
1579 * k[i] == 0: S = add(R, S), R = dbl(R)
1580 * k[i] == 1: R = add(S, R), S = dbl(S)
1581 *
1582 * So we get the same logic, but instead of a branch it's a
1583 * conditional swap, followed by ECC ops, then another conditional swap.
1584 *
1585 * Optimization: The end of iteration i and start of i-1 looks like
1586 *
1587 * ...
1588 * CSWAP(k[i], R, S)
1589 * ECC
1590 * CSWAP(k[i], R, S)
1591 * (next iteration)
1592 * CSWAP(k[i-1], R, S)
1593 * ECC
1594 * CSWAP(k[i-1], R, S)
1595 * ...
1596 *
1597 * So instead of two contiguous swaps, you can merge the condition
1598 * bits and do a single swap.
1599 *
1600 * k[i] k[i-1] Outcome
1601 * 0 0 No Swap
1602 * 0 1 Swap
1603 * 1 0 Swap
1604 * 1 1 No Swap
1605 *
1606 * This is XOR. pbit tracks the previous bit of k.
1607 */
1608
1609 for (i = cardinality_bits - 1; i >= 0; i--) {
1610 kbit = BN_is_bit_set(k, i) ^ pbit;
1611 EC_POINT_CSWAP(kbit, r, s, group_top, Z_is_one);
1612 if (!EC_POINT_add(group, s, r, s, ctx))
1613 goto err;
1614 if (!EC_POINT_dbl(group, r, r, ctx))
1615 goto err;
1616 /*
1617 * pbit logic merges this cswap with that of the
1618 * next iteration
1619 */
1620 pbit ^= kbit;
1621 }
1622 /* one final cswap to move the right value into r */
1623 EC_POINT_CSWAP(pbit, r, s, group_top, Z_is_one);
1624
1625 ret = 1;
1626
1627 err:
1628 EC_POINT_free(s);
1629 if (ctx != NULL)
1630 BN_CTX_end(ctx);
1631 BN_CTX_free(new_ctx);
1632
1633 return ret;
1634}
1635
1636#undef EC_POINT_BN_set_flags
1637#undef EC_POINT_CSWAP
1638
1639int
1640ec_GFp_simple_mul_generator_ct(const EC_GROUP *group, EC_POINT *r,
1641 const BIGNUM *scalar, BN_CTX *ctx)
1642{
1643 return ec_GFp_simple_mul_ct(group, r, scalar, NULL, ctx);
1644}
1645
1646int
1647ec_GFp_simple_mul_single_ct(const EC_GROUP *group, EC_POINT *r,
1648 const BIGNUM *scalar, const EC_POINT *point, BN_CTX *ctx)
1649{
1650 return ec_GFp_simple_mul_ct(group, r, scalar, point, ctx);
1651}
1652
1653int
1654ec_GFp_simple_mul_double_nonct(const EC_GROUP *group, EC_POINT *r,
1655 const BIGNUM *g_scalar, const BIGNUM *p_scalar, const EC_POINT *point,
1656 BN_CTX *ctx)
1657{
1658 return ec_wNAF_mul(group, r, g_scalar, 1, &point, &p_scalar, ctx);
1659}