Re: [PATCH v2 06/18] crypto: ecdsa - Support P1363 signature encoding

Herbert Xu
2024-06-30T22:11:09Z

On Sun, Jun 30, 2024 at 09:41:00PM +0200, Lukas Wunner wrote:
>
> diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c
> index 258fffbf623d..8d412dec917f 100644
> --- a/crypto/ecdsa.c
> +++ b/crypto/ecdsa.c
> @@ -139,6 +139,7 @@ static int ecdsa_verify(struct akcipher_request *req)
> struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
> struct ecc_ctx *ctx = akcipher_tfm_ctx(tfm);
> size_t bufsize = ctx->curve->g.ndigits * sizeof(u64);
> + size_t keylen = DIV_ROUND_UP(ctx->curve->nbits, 8);
> struct ecdsa_signature_ctx sig_ctx = {
> .curve = ctx->curve,
> };
> @@ -159,10 +160,21 @@ static int ecdsa_verify(struct akcipher_request *req)
> sg_nents_for_len(req->src, req->src_len + req->dst_len),
> buffer, req->src_len + req->dst_len, 0);
>
> - ret = asn1_ber_decoder(&ecdsasignature_decoder, &sig_ctx,
> - buffer, req->src_len);
> - if (ret < 0)
> + if (strcmp(req->enc, "x962") == 0) {
> + ret = asn1_ber_decoder(&ecdsasignature_decoder, &sig_ctx,
> + buffer, req->src_len);
> + if (ret < 0)
> + goto error;
> + } else if (strcmp(req->enc, "p1363") == 0 &&
> + req->src_len == 2 * keylen) {
> + ecc_digits_from_bytes(buffer, keylen, sig_ctx.r,
> + ctx->curve->g.ndigits);
> + ecc_digits_from_bytes(&buffer[keylen], keylen, sig_ctx.s,
> + ctx->curve->g.ndigits);
> + } else {
> + ret = -EINVAL;
> goto error;
> + }

This should be implemented as a template. Change ecdsa to use a
"raw" encoding for r/s and then implement x962 and p1363 as templates
which converts their respective encodings to the raw one. You
would then use "x962(ecdsa-nist-XXX)" or "p1363(ecdsa-nist-XXX)"
to pick the encoding.

Cheers,
--
Email: Herbert Xu <herbert@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt