All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Berger <stefanb@linux.ibm.com>
To: keyrings@vger.kernel.org, linux-crypto@vger.kernel.org,
	herbert@gondor.apana.org.au, davem@davemloft.net
Cc: linux-kernel@vger.kernel.org, saulo.alessandre@tse.jus.br,
	Stefan Berger <stefanb@linux.ibm.com>
Subject: [PATCH v3 01/10] crypto: ecdsa - Convert byte arrays with key coordinates to digits
Date: Fri, 23 Feb 2024 15:41:40 -0500	[thread overview]
Message-ID: <20240223204149.4055630-2-stefanb@linux.ibm.com> (raw)
In-Reply-To: <20240223204149.4055630-1-stefanb@linux.ibm.com>

For NIST P192/256/384 the public key's x and y parameters could be copied
directly from a given array since both parameters filled 'ndigits' of
digits (a 'digit' is a u64). For support of NIST P521 the key parameters
first have to be copied into a temporary byte array with leading zeros
and can then be copied into the final digit array using ecc_swap_digits.

Implement ecc_digits_from_bytes to convert a byte array into an array of
digits and use this function in ecdsa_set_pub_key where an input byte array
needs to be converted into digits.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
---
 crypto/ecdsa.c                | 14 +++++++++-----
 include/crypto/internal/ecc.h | 19 +++++++++++++++++++
 2 files changed, 28 insertions(+), 5 deletions(-)

diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c
index fbd76498aba8..ba8fb76fd165 100644
--- a/crypto/ecdsa.c
+++ b/crypto/ecdsa.c
@@ -222,9 +222,8 @@ static int ecdsa_ecc_ctx_reset(struct ecc_ctx *ctx)
 static int ecdsa_set_pub_key(struct crypto_akcipher *tfm, const void *key, unsigned int keylen)
 {
 	struct ecc_ctx *ctx = akcipher_tfm_ctx(tfm);
+	unsigned int digitlen, ndigits;
 	const unsigned char *d = key;
-	const u64 *digits = (const u64 *)&d[1];
-	unsigned int ndigits;
 	int ret;
 
 	ret = ecdsa_ecc_ctx_reset(ctx);
@@ -238,12 +237,17 @@ static int ecdsa_set_pub_key(struct crypto_akcipher *tfm, const void *key, unsig
 		return -EINVAL;
 
 	keylen--;
-	ndigits = (keylen >> 1) / sizeof(u64);
+	digitlen = keylen >> 1;
+
+	ndigits = digitlen / sizeof(u64);
 	if (ndigits != ctx->curve->g.ndigits)
 		return -EINVAL;
 
-	ecc_swap_digits(digits, ctx->pub_key.x, ndigits);
-	ecc_swap_digits(&digits[ndigits], ctx->pub_key.y, ndigits);
+	d++;
+
+	ecc_digits_from_bytes(d, digitlen, ctx->pub_key.x, ndigits);
+	ecc_digits_from_bytes(&d[digitlen], digitlen, ctx->pub_key.y, ndigits);
+
 	ret = ecc_is_pubkey_valid_full(ctx->curve, &ctx->pub_key);
 
 	ctx->pub_key_set = ret == 0;
diff --git a/include/crypto/internal/ecc.h b/include/crypto/internal/ecc.h
index 4f6c1a68882f..bee3329af7de 100644
--- a/include/crypto/internal/ecc.h
+++ b/include/crypto/internal/ecc.h
@@ -56,6 +56,25 @@ static inline void ecc_swap_digits(const void *in, u64 *out, unsigned int ndigit
 		out[i] = get_unaligned_be64(&src[ndigits - 1 - i]);
 }
 
+/**
+ * ecc_digits_from_bytes() - Create ndigits-sized digits array from byte array
+ * @in:       Input byte array
+ * @nbytes    Size of input byte array
+ * @out       Output digits array
+ * @ndigits:  Number of digits to create from byte array
+ */
+static inline void ecc_digits_from_bytes(const u8 *in, unsigned int nbytes,
+					 u64 *out, unsigned int ndigits)
+{
+	unsigned int sz = ndigits << ECC_DIGITS_TO_BYTES_SHIFT;
+	u8 tmp[ECC_MAX_DIGITS << ECC_DIGITS_TO_BYTES_SHIFT];
+	unsigned int o = sz - nbytes;
+
+	memset(tmp, 0, o);
+	memcpy(&tmp[o], in, nbytes);
+	ecc_swap_digits(tmp, out, ndigits);
+}
+
 /**
  * ecc_is_key_valid() - Validate a given ECDH private key
  *
-- 
2.43.0


  reply	other threads:[~2024-02-23 20:42 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-23 20:41 [PATCH v3 00/10] Add support for NIST P521 to ecdsa Stefan Berger
2024-02-23 20:41 ` Stefan Berger [this message]
2024-02-29  9:11   ` [PATCH v3 01/10] crypto: ecdsa - Convert byte arrays with key coordinates to digits Lukas Wunner
2024-02-29 14:57     ` Stefan Berger
2024-02-29 16:48       ` Lukas Wunner
2024-02-29 17:20         ` Stefan Berger
2024-03-01 20:26       ` Jarkko Sakkinen
2024-03-01 20:48         ` Stefan Berger
2024-03-01 20:51           ` Jarkko Sakkinen
2024-03-02 14:00         ` Lukas Wunner
2024-03-02 21:19           ` Stefan Berger
2024-03-02 21:36             ` Lukas Wunner
2024-03-02 21:55           ` Jarkko Sakkinen
2024-02-23 20:41 ` [PATCH v3 02/10] crypto: ecdsa - Adjust tests on length of key parameters Stefan Berger
2024-02-29  9:16   ` Lukas Wunner
2024-02-29 20:28     ` Stefan Berger
2024-02-23 20:41 ` [PATCH v3 03/10] crypto: ecdsa - Extend res.x mod n calculation for NIST P521 Stefan Berger
2024-02-23 20:41 ` [PATCH v3 04/10] crypto: ecc - Implement vli_mmod_fast_521 for NIST p521 Stefan Berger
2024-02-23 20:41 ` [PATCH v3 05/10] crypto: ecc - Add nbits field to ecc_curve structure Stefan Berger
2024-02-23 20:41 ` [PATCH v3 06/10] crypte: ecc - Implement ecc_curve_get_nbits to get number of bits Stefan Berger
2024-02-27 20:15   ` Lukas Wunner
2024-02-29 20:29     ` Stefan Berger
2024-02-23 20:41 ` [PATCH v3 07/10] crypto: ecc - Use ecc_get_curve_nbits to get number of bits for NIST P521 Stefan Berger
2024-02-23 20:41 ` [PATCH v3 08/10] crypto: ecc - Add NIST P521 curve parameters Stefan Berger
2024-02-23 20:41 ` [PATCH v3 09/10] crypto: ecdsa - Register NIST P521 and extend test suite Stefan Berger
2024-02-23 20:41 ` [PATCH v3 10/10] x509: Add OID for NIST P521 and extend parser for it Stefan Berger
2024-02-29  9:34 ` [PATCH v3 00/10] Add support for NIST P521 to ecdsa Lukas Wunner
2024-02-29 18:45   ` Stefan Berger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240223204149.4055630-2-stefanb@linux.ibm.com \
    --to=stefanb@linux.ibm.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=keyrings@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=saulo.alessandre@tse.jus.br \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.