crypto: ecc - Prevent ecc_digits_from_bytes from reading too many bytes
Subsystems (3)
Stefan Berger
reviewerPATCH v3 1/1 crypto: ecc - Prevent ecc_digits_from_bytes from reading too many bytes
Prevent ecc_digits_from_bytes from reading too many bytes from the input byte array in case an insufficient number of bytes is provided to fill the output digit array of ndigits. Therefore, initialize the most significant digits with 0 to avoid trying to read too many bytes later on. Convert the function into a regular function since it is getting too big for an inline function.
If too many bytes are provided on the input byte array the extra bytes are ignored since the input variable 'ndigits' limits the number of digits that will be filled.
---
v3:
- Applied Jarkko's tag
v2:
- un-inline function
- use memset
--- crypto/ecc.c | 22 ++++++++++++++++++++++ include/crypto/internal/ecc.h | 15 ++------------- 2 files changed, 24 insertions(+), 13 deletions(-)
crypto/ecc.c +22 -0
@@ -68,6 +68,28 @@ const struct ecc_curve *ecc_get_curve(unsigned int curve_id) }EXPORT_SYMBOL (ecc_get_curve); +void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, +u64 *out,unsigned int ndigits) +{ +int diff = ndigits -DIV_ROUND_UP (nbytes,sizeof (u64)); +unsigned int o = nbytes &7 ; +__be64 msd =0 ; + +/* diff > 0: not enough input bytes: set most significant digits to 0 */ +if (diff >0 ) { + ndigits -= diff; +memset (&out[ndigits -1 ],0 , diff *sizeof (u64)); + } + +if (o) { +memcpy ((u8 *)&msd +sizeof (msd) - o, in, o); + out[--ndigits] =be64_to_cpu (msd); + in += o; + } +ecc_swap_digits (in, out, ndigits); +} +EXPORT_SYMBOL (ecc_digits_from_bytes); +static u64 *ecc_alloc_digits_space (unsigned int ndigits) {size_t len = ndigits *sizeof (u64);
include/crypto/internal/ecc.h +2 -13
@@ -64,19 +64,8 @@ static inline void ecc_swap_digits(const void *in, u64 *out, unsigned int ndigit* @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); -} +void ecc_digits_from_bytes (const u8 *in,unsigned int nbytes, +u64 *out,unsigned int ndigits);/** * ecc_is_key_valid() - Validate a given ECDH private key
Signature · 1 line
2.43.0
Lukas Wunner
maintainerQuoted 11 lines · Stefan Berger
Prevent
ecc_digits_from_bytesfrom reading too many bytes from the input byte array in case an insufficient number of bytes is provided to fill the output digit array of ndigits. Therefore, initialize the most significant digits with 0 to avoid trying to read too many bytes later on. Convert the function into a regular function since it is getting too big for an inline function.If too many bytes are provided on the input byte array the extra bytes are ignored since the input variable 'ndigits' limits the number of digits that will be filled.
Quoted 7 lines
Fixes d67c96fb97b5 ("crypto: ecdsa - Convert byte arrays with key coordinates to digits")Reviewed-by Jarkko Sakkinen <[email protected]>Signed-off-by Stefan Berger <[email protected]>---
v3:
- Applied Jarkko's tag
Already landed in Linus' tree 42 hours ago -- with Jarkko's tag: