digsig and mpi cleanups
Subsystems (2)
cover digsig and mpi cleanups
Here is couple of cleanups for digsig and libmpi.
- Dmitry
Andy Shevchenko (1):
mpilib: use DIV_ROUND_UP and remove unused macros
Dmitry Kasatkin (1):
digsig: remove unnecessary memory allocation and copying
lib/digsig.c | 41 ++++++++++++++--------------------------- lib/mpi/mpi-internal.h | 4 ---- lib/mpi/mpicoder.c | 8 ++++---- 3 files changed, 18 insertions(+), 35 deletions(-)
Signature · 1 line
1.7.10.4
PATCH 1/2 digsig: remove unnecessary memory allocation and copying
In existing use case, copying of the decoded data is unnecessary in pkcs_1_v1_5_decode_emsa. It is just enough to get pointer to the message. Removing copying and extra buffer allocation.
--- lib/digsig.c | 41 ++++++++++++++--------------------------- 1 file changed, 14 insertions(+), 27 deletions(-)
lib/digsig.c +14 -27
@@ -30,11 +30,10 @@static struct crypto_shash *shash; -static int pkcs_1_v1_5_decode_emsa (const unsigned char *msg, -unsigned long msglen, -unsigned long modulus_bitlen, -unsigned char *out, -unsigned long *outlen) +static const char *pkcs_1_v1_5_decode_emsa (const unsigned char *msg, +unsigned long msglen, +unsigned long modulus_bitlen, +unsigned long *outlen) {unsigned long modulus_len, ps_len, i;
@@ -42,11 +41,11 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,/* test message size */ if ((msglen > modulus_len) || (modulus_len <11 )) -return -EINVAL ; +return NULL ;/* separate encoded message */ -if ((msg[0 ] !=0x00 ) || (msg[1 ] != (unsigned char )1 )) -return -EINVAL ; +if (msg[0 ] !=0x00 || msg[1 ] !=0x01 ) +return NULL ;for (i =2 ; i < modulus_len -1 ; i++)if (msg[i] !=0xFF )
@@ -56,19 +55,13 @@ static int pkcs_1_v1_5_decode_emsa(const unsigned char *msg,if (msg[i] !=0 )/* There was no octet with hexadecimal value 0x00 to separate ps from m. */ -return -EINVAL ; +return NULL ; ps_len = i -2 ; -if (*outlen < (msglen - (2 + ps_len +1 ))) { - *outlen = msglen - (2 + ps_len +1 ); -return -EOVERFLOW ; - } - *outlen = (msglen - (2 + ps_len +1 )); -memcpy (out, &msg[2 + ps_len +1 ], *outlen); -return 0 ; +return msg +2 + ps_len +1 ; }/*
@@ -83,7 +76,8 @@ static int digsig_verify_rsa(struct key *key,unsigned long mlen, mblen;unsigned nret, l;int head, i; -unsigned char *out1 =NULL , *out2 =NULL ; +unsigned char *out1 =NULL ; +const char *m;MPI in =NULL , res =NULL , pkey[2 ];uint8_t *p, *datap, *endp;struct user_key_payload *ukp;
@@ -120,7 +114,7 @@ static int digsig_verify_rsa(struct key *key, } mblen =mpi_get_nbits (pkey[0 ]); - mlen = (mblen +7 )/8 ; + mlen =DIV_ROUND_UP (mblen,8 );if (mlen ==0 ) goto err;
@@ -129,10 +123,6 @@ static int digsig_verify_rsa(struct key *key,if (!out1) goto err; - out2 =kzalloc (mlen,GFP_KERNEL ); -if (!out2) - goto err; - nret = siglen; in =mpi_read_from_buffer (sig, &nret);if (!in)
@@ -164,18 +154,15 @@ static int digsig_verify_rsa(struct key *key,kfree (p); - err =pkcs_1_v1_5_decode_emsa (out1, len, mblen, out2, &len); -if (err) - goto err; + m =pkcs_1_v1_5_decode_emsa (out1, len, mblen, &len); -if (len != hlen ||memcmp (out2, h, hlen)) +if (!m || len != hlen ||memcmp (m, h, hlen)) err = -EINVAL ; err:mpi_free (in);mpi_free (res);kfree (out1); -kfree (out2);while (--i >=0 )mpi_free (pkey[i]); err1:
Signature · 1 line
1.7.10.4
James Morris
AppliedRe: [PATCH 1/2] digsig: remove unnecessary memory allocation and copying
Quoted 3 lines · Dmitry Kasatkin
In existing use case, copying of the decoded data is unnecessary in
pkcs_1_v1_5_decode_emsa. It is just enough to get pointer to the message. Removing copying and extra buffer allocation.
Applied.
Signature · 2 lines
James Morris <[email protected]>
PATCH 2/2 mpilib: use DIV_ROUND_UP and remove unused macros
In reply to Dmitry KasatkinFrom: Andy Shevchenko <[email protected]>
Remove MIN, MAX and ABS macros that are duplicates kernel's native implementation.
--- lib/mpi/mpi-internal.h | 4 ---- lib/mpi/mpicoder.c | 8 ++++---- 2 files changed, 4 insertions(+), 8 deletions(-)
lib/mpi/mpi-internal.h +0 -4
@@ -65,10 +65,6 @@typedef mpi_limb_t *mpi_ptr_t ;/* pointer to a limb */ typedef int mpi_size_t ;/* (must be a signed type) */ -#define ABS (x) (x >= 0 ? x : -x) -#define MIN (l, o) ((l) < (o) ? (l) : (o)) -#define MAX (h, i) ((h) > (i) ? (h) : (i)) -static inline int RESIZE_IF_NEEDED (MPI a,unsigned b) {if (a->alloced < b)
lib/mpi/mpicoder.c +4 -4
@@ -52,7 +52,7 @@ MPI mpi_read_raw_data(const void *xbuffer, size_t nbytes)else nbits =0 ; - nlimbs = (nbytes +BYTES_PER_MPI_LIMB -1 ) /BYTES_PER_MPI_LIMB ; + nlimbs =DIV_ROUND_UP (nbytes,BYTES_PER_MPI_LIMB ); val =mpi_alloc (nlimbs);if (!val)return NULL ;
@@ -96,8 +96,8 @@ MPI mpi_read_from_buffer(const void *xbuffer, unsigned *ret_nread) buffer +=2 ; nread =2 ; - nbytes = (nbits +7 ) /8 ; - nlimbs = (nbytes +BYTES_PER_MPI_LIMB -1 ) /BYTES_PER_MPI_LIMB ; + nbytes =DIV_ROUND_UP (nbits,8 ); + nlimbs =DIV_ROUND_UP (nbytes,BYTES_PER_MPI_LIMB ); val =mpi_alloc (nlimbs);if (!val)return NULL ;
@@ -193,7 +193,7 @@ int mpi_set_buffer(MPI a, const void *xbuffer, unsigned nbytes, int sign)int nlimbs;int i; - nlimbs = (nbytes +BYTES_PER_MPI_LIMB -1 ) /BYTES_PER_MPI_LIMB ; + nlimbs =DIV_ROUND_UP (nbytes,BYTES_PER_MPI_LIMB );if (RESIZE_IF_NEEDED (a, nlimbs) <0 )return -ENOMEM ; a->sign = sign;
Signature · 1 line
1.7.10.4
James Morris
AppliedRe: [PATCH 2/2] mpilib: use DIV_ROUND_UP and remove unused macros
Quoted 6 lines · Dmitry Kasatkin
From: Andy Shevchenko <[email protected]>
Remove MIN, MAX and ABS macros that are duplicates kernel's native implementation.
Signed-off-by Andy Shevchenko <[email protected]>
Applied.
As maintainer, you should have added your signed-off-by.
Signature · 2 lines
James Morris <[email protected]>