]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
crypto: ecdsa - Use ecc_digits_from_bytes to convert signature
authorStefan Berger <stefanb@linux.ibm.com>
Wed, 29 May 2024 23:08:27 +0000 (19:08 -0400)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 7 Jun 2024 11:46:39 +0000 (19:46 +0800)
Since ecc_digits_from_bytes will provide zeros when an insufficient number
of bytes are passed in the input byte array, use it to convert the r and s
components of the signature to digits directly from the input byte
array. This avoids going through an intermediate byte array that has the
first few bytes filled with zeros.

Signed-off-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/ecdsa.c

index daab3c2b87c1e693db457034c250effd29056303..d5a10959ec281c2a10f72c60e9d0569a748d53b9 100644 (file)
@@ -38,7 +38,6 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,
        size_t bufsize = ndigits * sizeof(u64);
        ssize_t diff = vlen - bufsize;
        const char *d = value;
-       u8 rs[ECC_MAX_BYTES];
 
        if (!value || !vlen)
                return -EINVAL;
@@ -46,7 +45,7 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,
        /* diff = 0: 'value' has exacly the right size
         * diff > 0: 'value' has too many bytes; one leading zero is allowed that
         *           makes the value a positive integer; error on more
-        * diff < 0: 'value' is missing leading zeros, which we add
+        * diff < 0: 'value' is missing leading zeros
         */
        if (diff > 0) {
                /* skip over leading zeros that make 'value' a positive int */
@@ -61,14 +60,7 @@ static int ecdsa_get_signature_rs(u64 *dest, size_t hdrlen, unsigned char tag,
        if (-diff >= bufsize)
                return -EINVAL;
 
-       if (diff) {
-               /* leading zeros not given in 'value' */
-               memset(rs, 0, -diff);
-       }
-
-       memcpy(&rs[-diff], d, vlen);
-
-       ecc_swap_digits((u64 *)rs, dest, ndigits);
+       ecc_digits_from_bytes(d, vlen, dest, ndigits);
 
        return 0;
 }