crypto: sm2 - fix a memory leak in sm2

[ Upstream commit 5cd259ca5d466f65ffd21e2e2fa00fb648a8c555 ]

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: ea7ecb6644 ("crypto: sm2 - introduce OSCCA SM2 asymmetric cipher algorithm")
Signed-off-by: Hongbo Li <herberthbli@tencent.com>
Reviewed-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Hongbo Li 2021-06-04 14:30:35 +08:00 committed by Greg Kroah-Hartman
parent d598b8b77b
commit cd909ebb73

View File

@ -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)
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,
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;
} }