Message ID | 20240529230827.379111-3-stefanb@linux.ibm.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Herbert Xu |
Headers | show |
Series | ecdsa: Use ecc_digits_from_bytes to simplify code | expand |
On Thu May 30, 2024 at 2:08 AM EEST, Stefan Berger wrote: > 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> > --- > crypto/ecdsa.c | 12 ++---------- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c > index fa029f36110b..941cdc2b889b 100644 > --- a/crypto/ecdsa.c > +++ b/crypto/ecdsa.c > @@ -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; > } Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org> BR, Jarkko
diff --git a/crypto/ecdsa.c b/crypto/ecdsa.c index fa029f36110b..941cdc2b889b 100644 --- a/crypto/ecdsa.c +++ b/crypto/ecdsa.c @@ -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; }
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> --- crypto/ecdsa.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-)