All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Berger <stefanb@linux.vnet.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,
	lukas@wunner.de, bbhushan2@marvell.com, jarkko@kernel.org,
	Stefan Berger <stefanb@linux.ibm.com>
Subject: [PATCH v6 02/13] crypto: ecdsa - Convert byte arrays with key coordinates to digits
Date: Tue, 12 Mar 2024 14:36:07 -0400	[thread overview]
Message-ID: <20240312183618.1211745-3-stefanb@linux.vnet.ibm.com> (raw)
In-Reply-To: <20240312183618.1211745-1-stefanb@linux.vnet.ibm.com>

From: Stefan Berger <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
need to have leading zeros prepended to the most significant digit since
only 2 bytes of the most significant digit are provided.

Therefore, 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.

Suggested-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Tested-by: Lukas Wunner <lukas@wunner.de>
---
 crypto/ecdsa.c                | 14 +++++++++-----
 include/crypto/internal/ecc.h | 21 +++++++++++++++++++++
 2 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c
index fbd76498aba8..6653dec17327 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 = DIV_ROUND_UP(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..ab722a8986b7 100644
--- a/include/crypto/internal/ecc.h
+++ b/include/crypto/internal/ecc.h
@@ -56,6 +56,27 @@ 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 o = nbytes & 7;
+	__be64 msd = 0;
+
+	if (o) {
+		memcpy((u8 *)&msd + sizeof(msd) - o, in, o);
+		out[--ndigits] = be64_to_cpu(msd);
+		in += o;
+	}
+	ecc_swap_digits(in, out, ndigits);
+}
+
 /**
  * ecc_is_key_valid() - Validate a given ECDH private key
  *
-- 
2.43.0


  parent reply	other threads:[~2024-03-12 18:37 UTC|newest]

Thread overview: 54+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-12 18:36 [PATCH v6 00/13] Add support for NIST P521 to ecdsa Stefan Berger
2024-03-12 18:36 ` [PATCH v6 01/13] crypto: ecc - Use ECC_CURVE_NIST_P192/256/384_DIGITS where possible Stefan Berger
2024-03-18 20:08   ` Jarkko Sakkinen
2024-03-12 18:36 ` Stefan Berger [this message]
2024-03-18 20:21   ` [PATCH v6 02/13] crypto: ecdsa - Convert byte arrays with key coordinates to digits Jarkko Sakkinen
2024-03-18 20:35     ` Lukas Wunner
2024-03-18 22:20       ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 03/13] crypto: ecdsa - Adjust tests on length of key parameters Stefan Berger
2024-03-18 20:25   ` Jarkko Sakkinen
2024-03-18 20:32     ` Lukas Wunner
2024-03-18 22:25       ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 04/13] crypto: ecdsa - Extend res.x mod n calculation for NIST P521 Stefan Berger
2024-03-18 20:33   ` Jarkko Sakkinen
2024-03-18 20:39     ` Lukas Wunner
2024-03-18 22:19       ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 05/13] crypto: ecc - Add nbits field to ecc_curve structure Stefan Berger
2024-03-18 20:34   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 06/13] crypto: ecc - Implement vli_mmod_fast_521 for NIST p521 Stefan Berger
2024-03-18  5:47   ` [EXTERNAL] " Bharat Bhushan
2024-03-18 18:38     ` Stefan Berger
2024-03-19  3:53       ` Bharat Bhushan
2024-03-18 20:35   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 07/13] crypto: ecc - Add special case for NIST P521 in ecc_point_mult Stefan Berger
2024-03-18 20:50   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 08/13] crypto: ecc - Add NIST P521 curve parameters Stefan Berger
2024-03-18 21:05   ` Jarkko Sakkinen
2024-03-18 22:54     ` Stefan Berger
2024-03-12 18:36 ` [PATCH v6 09/13] crypto: ecdsa - Replace ndigits with nbits where precision is needed Stefan Berger
2024-03-18 21:06   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 10/13] crypto: ecdsa - Rename keylen to bufsize where necessary Stefan Berger
2024-03-18 21:07   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 11/13] crypto: ecdsa - Register NIST P521 and extend test suite Stefan Berger
2024-03-18 21:08   ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 12/13] crypto: asymmetric_keys - Adjust signature size calculation for NIST P521 Stefan Berger
2024-03-18  5:58   ` [EXTERNAL] " Bharat Bhushan
2024-03-18  7:06     ` Lukas Wunner
2024-03-19  3:38       ` Bharat Bhushan
2024-03-18 21:12   ` Jarkko Sakkinen
2024-03-18 22:42     ` Stefan Berger
2024-03-19 18:21       ` Jarkko Sakkinen
2024-03-12 18:36 ` [PATCH v6 13/13] crypto: x509 - Add OID for NIST P521 and extend parser for it Stefan Berger
2024-03-15 17:10 ` [PATCH v6 00/13] Add support for NIST P521 to ecdsa Stefan Berger
2024-03-18 18:48 ` Lukas Wunner
2024-03-18 22:42   ` Stefan Berger
2024-03-19 18:22     ` Jarkko Sakkinen
2024-03-19 18:25       ` Jarkko Sakkinen
2024-03-19 18:55       ` Stefan Berger
2024-03-19 19:14         ` Jarkko Sakkinen
2024-03-20  5:40       ` Lukas Wunner
2024-03-20 14:41         ` Konstantin Ryabitsev
2024-03-21 16:17           ` Jarkko Sakkinen
2024-03-21 16:19             ` Jarkko Sakkinen
2024-03-21 16:36               ` Stefan Berger
2024-03-21 16:50                 ` Jarkko Sakkinen

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=20240312183618.1211745-3-stefanb@linux.vnet.ibm.com \
    --to=stefanb@linux.vnet.ibm.com \
    --cc=bbhushan2@marvell.com \
    --cc=davem@davemloft.net \
    --cc=herbert@gondor.apana.org.au \
    --cc=jarkko@kernel.org \
    --cc=keyrings@vger.kernel.org \
    --cc=linux-crypto@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=lukas@wunner.de \
    --cc=saulo.alessandre@tse.jus.br \
    --cc=stefanb@linux.ibm.com \
    /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.