summaryrefslogtreecommitdiffstats
path: root/crypto/ec
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/ec')
-rwxr-xr-xcrypto/ec/asm/ecp_nistz256-x86_64.pl4
-rw-r--r--crypto/ec/asm/ecp_sm2p256-armv8.pl2
-rw-r--r--crypto/ec/curve448/arch_64/f_impl64.c2
-rw-r--r--crypto/ec/ec_curve.c36
-rw-r--r--crypto/ec/ec_lib.c4
-rw-r--r--crypto/ec/ec_local.h1
-rw-r--r--crypto/ec/ecdsa_ossl.c20
-rw-r--r--crypto/ec/ecp_nistz256.c128
-rw-r--r--crypto/ec/ecx_backend.c2
9 files changed, 183 insertions, 16 deletions
diff --git a/crypto/ec/asm/ecp_nistz256-x86_64.pl b/crypto/ec/asm/ecp_nistz256-x86_64.pl
index 430b14c86d..feeb8c5cb3 100755
--- a/crypto/ec/asm/ecp_nistz256-x86_64.pl
+++ b/crypto/ec/asm/ecp_nistz256-x86_64.pl
@@ -85,6 +85,7 @@ $code.=<<___;
.extern OPENSSL_ia32cap_P
# The polynomial
+.section .rodata align=4096
.align 64
.Lpoly:
.quad 0xffffffffffffffff, 0x00000000ffffffff, 0x0000000000000000, 0xffffffff00000001
@@ -107,6 +108,7 @@ $code.=<<___;
.quad 0xf3b9cac2fc632551, 0xbce6faada7179e84, 0xffffffffffffffff, 0xffffffff00000000
.LordK:
.quad 0xccd1c8aaee00bc4f
+.previous
___
{
@@ -4723,7 +4725,7 @@ close TABLE;
die "insane number of elements" if ($#arr != 64*16*37-1);
print <<___;
-.text
+.section .rodata align=4096
.globl ecp_nistz256_precomputed
.type ecp_nistz256_precomputed,\@object
.align 4096
diff --git a/crypto/ec/asm/ecp_sm2p256-armv8.pl b/crypto/ec/asm/ecp_sm2p256-armv8.pl
index de2f96964d..59e0b190e1 100644
--- a/crypto/ec/asm/ecp_sm2p256-armv8.pl
+++ b/crypto/ec/asm/ecp_sm2p256-armv8.pl
@@ -1,5 +1,5 @@
#! /usr/bin/env perl
-# Copyright 2023 The OpenSSL Project Authors. All Rights Reserved.
+# Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
#
# Licensed under the Apache License 2.0 (the "License"). You may not use
# this file except in compliance with the License. You can obtain a copy
diff --git a/crypto/ec/curve448/arch_64/f_impl64.c b/crypto/ec/curve448/arch_64/f_impl64.c
index c8f7671788..06cc33a964 100644
--- a/crypto/ec/curve448/arch_64/f_impl64.c
+++ b/crypto/ec/curve448/arch_64/f_impl64.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2017-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2017-2024 The OpenSSL Project Authors. All Rights Reserved.
* Copyright 2014 Cryptography Research, Inc.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c
index d703d16b3c..75feaa79d4 100644
--- a/crypto/ec/ec_curve.c
+++ b/crypto/ec/ec_curve.c
@@ -383,7 +383,7 @@ static const struct {
static const struct {
EC_CURVE_DATA h;
- unsigned char data[20 + 32 * 6];
+ unsigned char data[20 + 32 * 8];
} _EC_X9_62_PRIME_256V1 = {
{
NID_X9_62_prime_field, 20, 32, 1
@@ -415,7 +415,15 @@ static const struct {
/* order */
0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xBC, 0xE6, 0xFA, 0xAD, 0xA7, 0x17, 0x9E, 0x84,
- 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51
+ 0xF3, 0xB9, 0xCA, 0xC2, 0xFC, 0x63, 0x25, 0x51,
+ /* RR for prime */
+ 0x00, 0x00, 0x00, 0x04, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+ /* RR for order */
+ 0x66, 0xe1, 0x2d, 0x94, 0xf3, 0xd9, 0x56, 0x20, 0x28, 0x45, 0xb2, 0x39,
+ 0x2b, 0x6b, 0xec, 0x59, 0x46, 0x99, 0x79, 0x9c, 0x49, 0xbd, 0x6f, 0xa6,
+ 0x83, 0x24, 0x4c, 0x95, 0xbe, 0x79, 0xee, 0xa2
}
};
@@ -3168,6 +3176,24 @@ static EC_GROUP *ec_group_new_from_data(OSSL_LIB_CTX *libctx,
seed_len = data->seed_len;
param_len = data->param_len;
params = (const unsigned char *)(data + 1); /* skip header */
+
+ if (curve.meth != NULL) {
+ meth = curve.meth();
+ if ((group = ossl_ec_group_new_ex(libctx, propq, meth)) == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+ if (group->meth->group_full_init != NULL) {
+ if (!group->meth->group_full_init(group, params)){
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+ EC_GROUP_set_curve_name(group, curve.nid);
+ BN_CTX_free(ctx);
+ return group;
+ }
+ }
+
params += seed_len; /* skip seed */
if ((p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) == NULL
@@ -3177,10 +3203,8 @@ static EC_GROUP *ec_group_new_from_data(OSSL_LIB_CTX *libctx,
goto err;
}
- if (curve.meth != 0) {
- meth = curve.meth();
- if (((group = ossl_ec_group_new_ex(libctx, propq, meth)) == NULL) ||
- (!(group->meth->group_set_curve(group, p, a, b, ctx)))) {
+ if (group != NULL) {
+ if (group->meth->group_set_curve(group, p, a, b, ctx) == 0) {
ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
goto err;
}
diff --git a/crypto/ec/ec_lib.c b/crypto/ec/ec_lib.c
index c92b4dcb0a..f6309b3034 100644
--- a/crypto/ec/ec_lib.c
+++ b/crypto/ec/ec_lib.c
@@ -746,9 +746,13 @@ void EC_POINT_free(EC_POINT *point)
if (point == NULL)
return;
+#ifdef FIPS_MODULE
+ EC_POINT_clear_free(point);
+#else
if (point->meth->point_finish != 0)
point->meth->point_finish(point);
OPENSSL_free(point);
+#endif
}
void EC_POINT_clear_free(EC_POINT *point)
diff --git a/crypto/ec/ec_local.h b/crypto/ec/ec_local.h
index 2814d87394..a041db9c13 100644
--- a/crypto/ec/ec_local.h
+++ b/crypto/ec/ec_local.h
@@ -196,6 +196,7 @@ struct ec_method_st {
int (*ladder_post)(const EC_GROUP *group,
EC_POINT *r, EC_POINT *s,
EC_POINT *p, BN_CTX *ctx);
+ int (*group_full_init)(EC_GROUP *group, const unsigned char *data);
};
/*
diff --git a/crypto/ec/ecdsa_ossl.c b/crypto/ec/ecdsa_ossl.c
index 0da33799e4..1e611f7ffc 100644
--- a/crypto/ec/ecdsa_ossl.c
+++ b/crypto/ec/ecdsa_ossl.c
@@ -77,6 +77,11 @@ int ossl_ecdsa_sign(int type, const unsigned char *dgst, int dlen,
{
ECDSA_SIG *s;
+ if (sig == NULL && (kinv == NULL || r == NULL)) {
+ *siglen = ECDSA_size(eckey);
+ return 1;
+ }
+
s = ECDSA_do_sign_ex(dgst, dlen, kinv, r, eckey);
if (s == NULL) {
*siglen = 0;
@@ -97,6 +102,11 @@ int ossl_ecdsa_deterministic_sign(const unsigned char *dgst, int dlen,
BIGNUM *kinv = NULL, *r = NULL;
int ret = 0;
+ if (sig == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_PASSED_NULL_PARAMETER);
+ return 0;
+ }
+
*siglen = 0;
if (!ecdsa_sign_setup(eckey, NULL, &kinv, &r, dgst, dlen,
nonce_type, digestname, libctx, propq))
@@ -106,7 +116,7 @@ int ossl_ecdsa_deterministic_sign(const unsigned char *dgst, int dlen,
if (s == NULL)
goto end;
- *siglen = i2d_ECDSA_SIG(s, sig != NULL ? &sig : NULL);
+ *siglen = i2d_ECDSA_SIG(s, &sig);
ECDSA_SIG_free(s);
ret = 1;
end:
@@ -188,17 +198,17 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in,
libctx, propq);
#endif
} else {
- res = BN_generate_dsa_nonce(k, order, priv_key, dgst, dlen,
- ctx);
+ res = ossl_bn_gen_dsa_nonce_fixed_top(k, order, priv_key,
+ dgst, dlen, ctx);
}
} else {
- res = BN_priv_rand_range_ex(k, order, 0, ctx);
+ res = ossl_bn_priv_rand_range_fixed_top(k, order, 0, ctx);
}
if (!res) {
ERR_raise(ERR_LIB_EC, EC_R_RANDOM_NUMBER_GENERATION_FAILED);
goto err;
}
- } while (BN_is_zero(k));
+ } while (ossl_bn_is_word_fixed_top(k, 0));
/* compute r the x-coordinate of generator * k */
if (!EC_POINT_mul(group, tmp_point, k, NULL, NULL, ctx)) {
diff --git a/crypto/ec/ecp_nistz256.c b/crypto/ec/ecp_nistz256.c
index 5760639a2e..765c344bec 100644
--- a/crypto/ec/ecp_nistz256.c
+++ b/crypto/ec/ecp_nistz256.c
@@ -1445,6 +1445,131 @@ err:
# define ecp_nistz256_inv_mod_ord NULL
#endif
+static int ecp_nistz256group_full_init(EC_GROUP *group,
+ const unsigned char *params) {
+ BN_CTX *ctx = NULL;
+ BN_MONT_CTX *mont = NULL, *ordmont = NULL;
+ const int param_len = 32;
+ const int seed_len = 20;
+ int ok = 0;
+ uint32_t hi_order_n = 0xccd1c8aa;
+ uint32_t lo_order_n = 0xee00bc4f;
+ BIGNUM *p = NULL, *a = NULL, *b = NULL, *x = NULL, *y = NULL, *one = NULL,
+ *order = NULL;
+ EC_POINT *P = NULL;
+
+ if ((ctx = BN_CTX_new_ex(group->libctx)) == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_MALLOC_FAILURE);
+ return 0;
+ }
+
+ if (!EC_GROUP_set_seed(group, params, seed_len)) {
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+ params += seed_len;
+
+ if ((p = BN_bin2bn(params + 0 * param_len, param_len, NULL)) == NULL
+ || (a = BN_bin2bn(params + 1 * param_len, param_len, NULL)) == NULL
+ || (b = BN_bin2bn(params + 2 * param_len, param_len, NULL)) == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB);
+ goto err;
+ }
+
+ /*
+ * Set up curve params and montgomery for field
+ * Start by setting up montgomery and one
+ */
+ mont = BN_MONT_CTX_new();
+ if (mont == NULL)
+ goto err;
+
+ if (!ossl_bn_mont_ctx_set(mont, p, 256, params + 6 * param_len, param_len,
+ 1, 0))
+ goto err;
+
+ one = BN_new();
+ if (one == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB);
+ goto err;
+ }
+ if (!BN_to_montgomery(one, BN_value_one(), mont, ctx)){
+ ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB);
+ goto err;
+ }
+ group->field_data1 = mont;
+ mont = NULL;
+ group->field_data2 = one;
+ one = NULL;
+
+ if (!ossl_ec_GFp_simple_group_set_curve(group, p, a, b, ctx)) {
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+
+ if ((P = EC_POINT_new(group)) == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+
+ if ((x = BN_bin2bn(params + 3 * param_len, param_len, NULL)) == NULL
+ || (y = BN_bin2bn(params + 4 * param_len, param_len, NULL)) == NULL) {
+ ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB);
+ goto err;
+ }
+ if (!EC_POINT_set_affine_coordinates(group, P, x, y, ctx)) {
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+ if ((order = BN_bin2bn(params + 5 * param_len, param_len, NULL)) == NULL
+ || !BN_set_word(x, (BN_ULONG)1)) { // cofactor is 1
+ ERR_raise(ERR_LIB_EC, ERR_R_BN_LIB);
+ goto err;
+ }
+
+ /*
+ * Set up generator and order and montgomery data
+ */
+ group->generator = EC_POINT_new(group);
+ if (group->generator == NULL){
+ ERR_raise(ERR_LIB_EC, ERR_R_EC_LIB);
+ goto err;
+ }
+ if (!EC_POINT_copy(group->generator, P))
+ goto err;
+ if (!BN_copy(group->order, order))
+ goto err;
+ if (!BN_set_word(group->cofactor, 1))
+ goto err;
+
+ ordmont = BN_MONT_CTX_new();
+ if (ordmont == NULL)
+ goto err;
+ if (!ossl_bn_mont_ctx_set(ordmont, order, 256, params + 7 * param_len,
+ param_len, lo_order_n, hi_order_n))
+ goto err;
+
+ group->mont_data = ordmont;
+ ordmont = NULL;
+
+ ok = 1;
+
+ err:
+ EC_POINT_free(P);
+ BN_CTX_free(ctx);
+ BN_MONT_CTX_free(mont);
+ BN_MONT_CTX_free(ordmont);
+ BN_free(p);
+ BN_free(one);
+ BN_free(a);
+ BN_free(b);
+ BN_free(order);
+ BN_free(x);
+ BN_free(y);
+
+ return ok;
+}
+
const EC_METHOD *EC_GFp_nistz256_method(void)
{
static const EC_METHOD ret = {
@@ -1501,7 +1626,8 @@ const EC_METHOD *EC_GFp_nistz256_method(void)
0, /* blind_coordinates */
0, /* ladder_pre */
0, /* ladder_step */
- 0 /* ladder_post */
+ 0, /* ladder_post */
+ ecp_nistz256group_full_init
};
return &ret;
diff --git a/crypto/ec/ecx_backend.c b/crypto/ec/ecx_backend.c
index 2afa5c7063..d21c037841 100644
--- a/crypto/ec/ecx_backend.c
+++ b/crypto/ec/ecx_backend.c
@@ -1,5 +1,5 @@
/*
- * Copyright 2020-2023 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy