Commit 5cd259ca authored by Hongbo Li's avatar Hongbo Li Committed by Herbert Xu

crypto: sm2 - fix a memory leak in sm2

SM2 module alloc ec->Q in sm2_set_pub_key(), when doing alg test in
test_akcipher_one(), it will set public key for every test vector,
and don't free ec->Q. This will cause a memory leak.

This patch alloc ec->Q in sm2_ec_ctx_init().

Fixes: ea7ecb66 ("crypto: sm2 - introduce OSCCA SM2 asymmetric cipher algorithm")
Signed-off-by: default avatarHongbo Li <herberthbli@tencent.com>
Reviewed-by: default avatarTianjia Zhang <tianjia.zhang@linux.alibaba.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 9039878a
...@@ -79,10 +79,17 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec) ...@@ -79,10 +79,17 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec)
goto free; goto free;
rc = -ENOMEM; rc = -ENOMEM;
ec->Q = mpi_point_new(0);
if (!ec->Q)
goto free;
/* mpi_ec_setup_elliptic_curve */ /* mpi_ec_setup_elliptic_curve */
ec->G = mpi_point_new(0); ec->G = mpi_point_new(0);
if (!ec->G) if (!ec->G) {
mpi_point_release(ec->Q);
goto free; goto free;
}
mpi_set(ec->G->x, x); mpi_set(ec->G->x, x);
mpi_set(ec->G->y, y); mpi_set(ec->G->y, y);
...@@ -91,6 +98,7 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec) ...@@ -91,6 +98,7 @@ static int sm2_ec_ctx_init(struct mpi_ec_ctx *ec)
rc = -EINVAL; rc = -EINVAL;
ec->n = mpi_scanval(ecp->n); ec->n = mpi_scanval(ecp->n);
if (!ec->n) { if (!ec->n) {
mpi_point_release(ec->Q);
mpi_point_release(ec->G); mpi_point_release(ec->G);
goto free; goto free;
} }
...@@ -386,27 +394,15 @@ static int sm2_set_pub_key(struct crypto_akcipher *tfm, ...@@ -386,27 +394,15 @@ static int sm2_set_pub_key(struct crypto_akcipher *tfm,
MPI a; MPI a;
int rc; int rc;
ec->Q = mpi_point_new(0);
if (!ec->Q)
return -ENOMEM;
/* include the uncompressed flag '0x04' */ /* include the uncompressed flag '0x04' */
rc = -ENOMEM;
a = mpi_read_raw_data(key, keylen); a = mpi_read_raw_data(key, keylen);
if (!a) if (!a)
goto error; return -ENOMEM;
mpi_normalize(a); mpi_normalize(a);
rc = sm2_ecc_os2ec(ec->Q, a); rc = sm2_ecc_os2ec(ec->Q, a);
mpi_free(a); mpi_free(a);
if (rc)
goto error;
return 0;
error:
mpi_point_release(ec->Q);
ec->Q = NULL;
return rc; return rc;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment