Skip to content

Commit

Permalink
crypto: rsa-pkcs1pad - Move key size check to setkey
Browse files Browse the repository at this point in the history
Rather than repeatedly checking the key size on each operation,
we should be checking it once when the key is set.

Signed-off-by: Herbert Xu <[email protected]>
  • Loading branch information
herbertx committed Jul 1, 2016
1 parent 3a32ce5 commit 73f7918
Showing 1 changed file with 26 additions and 30 deletions.
56 changes: 26 additions & 30 deletions crypto/rsa-pkcs1pad.c
Original file line number Diff line number Diff line change
Expand Up @@ -111,40 +111,48 @@ static int pkcs1pad_set_pub_key(struct crypto_akcipher *tfm, const void *key,
unsigned int keylen)
{
struct pkcs1pad_ctx *ctx = akcipher_tfm_ctx(tfm);
int err, size;
int err;

ctx->key_size = 0;

err = crypto_akcipher_set_pub_key(ctx->child, key, keylen);
if (err)
return err;

if (!err) {
/* Find out new modulus size from rsa implementation */
size = crypto_akcipher_maxsize(ctx->child);
/* Find out new modulus size from rsa implementation */
err = crypto_akcipher_maxsize(ctx->child);
if (err < 0)
return err;

ctx->key_size = size > 0 ? size : 0;
if (size <= 0)
err = size;
}
if (err > PAGE_SIZE)
return -ENOTSUPP;

return err;
ctx->key_size = err;
return 0;
}

static int pkcs1pad_set_priv_key(struct crypto_akcipher *tfm, const void *key,
unsigned int keylen)
{
struct pkcs1pad_ctx *ctx = akcipher_tfm_ctx(tfm);
int err, size;
int err;

ctx->key_size = 0;

err = crypto_akcipher_set_priv_key(ctx->child, key, keylen);
if (err)
return err;

if (!err) {
/* Find out new modulus size from rsa implementation */
size = crypto_akcipher_maxsize(ctx->child);
/* Find out new modulus size from rsa implementation */
err = crypto_akcipher_maxsize(ctx->child);
if (err < 0)
return err;

ctx->key_size = size > 0 ? size : 0;
if (size <= 0)
err = size;
}
if (err > PAGE_SIZE)
return -ENOTSUPP;

return err;
ctx->key_size = err;
return 0;
}

static int pkcs1pad_get_max_size(struct crypto_akcipher *tfm)
Expand Down Expand Up @@ -247,9 +255,6 @@ static int pkcs1pad_encrypt(struct akcipher_request *req)
return -EOVERFLOW;
}

if (ctx->key_size > PAGE_SIZE)
return -ENOTSUPP;

/*
* Replace both input and output to add the padding in the input and
* the potential missing leading zeros in the output.
Expand Down Expand Up @@ -367,9 +372,6 @@ static int pkcs1pad_decrypt(struct akcipher_request *req)
if (!ctx->key_size || req->src_len != ctx->key_size)
return -EINVAL;

if (ctx->key_size > PAGE_SIZE)
return -ENOTSUPP;

/* Reuse input buffer, output to a new buffer */
req_ctx->child_req.src = req->src;
req_ctx->child_req.src_len = req->src_len;
Expand Down Expand Up @@ -420,9 +422,6 @@ static int pkcs1pad_sign(struct akcipher_request *req)
return -EOVERFLOW;
}

if (ctx->key_size > PAGE_SIZE)
return -ENOTSUPP;

/*
* Replace both input and output to add the padding in the input and
* the potential missing leading zeros in the output.
Expand Down Expand Up @@ -560,9 +559,6 @@ static int pkcs1pad_verify(struct akcipher_request *req)
if (!ctx->key_size || req->src_len < ctx->key_size)
return -EINVAL;

if (ctx->key_size > PAGE_SIZE)
return -ENOTSUPP;

/* Reuse input buffer, output to a new buffer */
req_ctx->child_req.src = req->src;
req_ctx->child_req.src_len = req->src_len;
Expand Down

0 comments on commit 73f7918

Please sign in to comment.