crypto: rsa - only require output buffers as big as needed.
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>
Fri, 13 Nov 2015 11:01:33 +0000 (12:01 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 17 Nov 2015 14:00:39 +0000 (22:00 +0800)
rhe RSA operations explicitly left-align the integers being written
skipping any leading zero bytes, but still require the output buffers to
include just enough space for the integer + the leading zero bytes.
Since the size of integer + the leading zero bytes (i.e. the key modulus
size) can now be obtained more easily through crypto_akcipher_maxsize
change the operations to only require as big a buffer as actually needed
if the caller has that information.  The semantics for request->dst_len
don't change.

Signed-off-by: Andrew Zaborowski <andrew.zaborowski@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
crypto/rsa.c

index 1093e041db03b98549a0e7abcd6557683068ba11..58aad69a490ceb1a06f37e594212aa3e0d0380e2 100644 (file)
@@ -91,12 +91,6 @@ static int rsa_enc(struct akcipher_request *req)
                goto err_free_c;
        }
 
-       if (req->dst_len < mpi_get_size(pkey->n)) {
-               req->dst_len = mpi_get_size(pkey->n);
-               ret = -EOVERFLOW;
-               goto err_free_c;
-       }
-
        ret = -ENOMEM;
        m = mpi_read_raw_from_sgl(req->src, req->src_len);
        if (!m)
@@ -136,12 +130,6 @@ static int rsa_dec(struct akcipher_request *req)
                goto err_free_m;
        }
 
-       if (req->dst_len < mpi_get_size(pkey->n)) {
-               req->dst_len = mpi_get_size(pkey->n);
-               ret = -EOVERFLOW;
-               goto err_free_m;
-       }
-
        ret = -ENOMEM;
        c = mpi_read_raw_from_sgl(req->src, req->src_len);
        if (!c)
@@ -180,12 +168,6 @@ static int rsa_sign(struct akcipher_request *req)
                goto err_free_s;
        }
 
-       if (req->dst_len < mpi_get_size(pkey->n)) {
-               req->dst_len = mpi_get_size(pkey->n);
-               ret = -EOVERFLOW;
-               goto err_free_s;
-       }
-
        ret = -ENOMEM;
        m = mpi_read_raw_from_sgl(req->src, req->src_len);
        if (!m)
@@ -225,12 +207,6 @@ static int rsa_verify(struct akcipher_request *req)
                goto err_free_m;
        }
 
-       if (req->dst_len < mpi_get_size(pkey->n)) {
-               req->dst_len = mpi_get_size(pkey->n);
-               ret = -EOVERFLOW;
-               goto err_free_m;
-       }
-
        ret = -ENOMEM;
        s = mpi_read_raw_from_sgl(req->src, req->src_len);
        if (!s) {