aboutsummaryrefslogtreecommitdiffstats
path: root/crypto
diff options
context:
space:
mode:
authorVitaly Chikunov <vt@altlinux.org>2019-04-11 11:51:16 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-04-18 10:15:02 -0400
commit83bc0299960477a4b99d9ad11b766d63c0dfaf60 (patch)
tree4f444c5f25cdbe1137d2e95508ccefd27233facc /crypto
parentc7381b01287240abe942a081729203e26782d981 (diff)
KEYS: do not kmemdup digest in {public,tpm}_key_verify_signature
Treat (struct public_key_signature)'s digest same as its signature (s). Since digest should be already in the kmalloc'd memory do not kmemdup digest value before calling {public,tpm}_key_verify_signature. Patch is split from the previous as suggested by Herbert Xu. Suggested-by: David Howells <dhowells@redhat.com> Cc: David Howells <dhowells@redhat.com> Cc: keyrings@vger.kernel.org Signed-off-by: Vitaly Chikunov <vt@altlinux.org> Reviewed-by: Denis Kenzior <denkenz@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto')
-rw-r--r--crypto/asymmetric_keys/asym_tpm.c10
-rw-r--r--crypto/asymmetric_keys/public_key.c9
2 files changed, 2 insertions, 17 deletions
diff --git a/crypto/asymmetric_keys/asym_tpm.c b/crypto/asymmetric_keys/asym_tpm.c
index 4e5b6fb57a94..402fc34ca044 100644
--- a/crypto/asymmetric_keys/asym_tpm.c
+++ b/crypto/asymmetric_keys/asym_tpm.c
@@ -748,7 +748,6 @@ static int tpm_key_verify_signature(const struct key *key,
748 char alg_name[CRYPTO_MAX_ALG_NAME]; 748 char alg_name[CRYPTO_MAX_ALG_NAME];
749 uint8_t der_pub_key[PUB_KEY_BUF_SIZE]; 749 uint8_t der_pub_key[PUB_KEY_BUF_SIZE];
750 uint32_t der_pub_key_len; 750 uint32_t der_pub_key_len;
751 void *digest;
752 int ret; 751 int ret;
753 752
754 pr_devel("==>%s()\n", __func__); 753 pr_devel("==>%s()\n", __func__);
@@ -780,14 +779,9 @@ static int tpm_key_verify_signature(const struct key *key,
780 if (!req) 779 if (!req)
781 goto error_free_tfm; 780 goto error_free_tfm;
782 781
783 ret = -ENOMEM;
784 digest = kmemdup(sig->digest, sig->digest_size, GFP_KERNEL);
785 if (!digest)
786 goto error_free_req;
787
788 sg_init_table(src_sg, 2); 782 sg_init_table(src_sg, 2);
789 sg_set_buf(&src_sg[0], sig->s, sig->s_size); 783 sg_set_buf(&src_sg[0], sig->s, sig->s_size);
790 sg_set_buf(&src_sg[1], digest, sig->digest_size); 784 sg_set_buf(&src_sg[1], sig->digest, sig->digest_size);
791 akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size, 785 akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size,
792 sig->digest_size); 786 sig->digest_size);
793 crypto_init_wait(&cwait); 787 crypto_init_wait(&cwait);
@@ -796,8 +790,6 @@ static int tpm_key_verify_signature(const struct key *key,
796 crypto_req_done, &cwait); 790 crypto_req_done, &cwait);
797 ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait); 791 ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait);
798 792
799 kfree(digest);
800error_free_req:
801 akcipher_request_free(req); 793 akcipher_request_free(req);
802error_free_tfm: 794error_free_tfm:
803 crypto_free_akcipher(tfm); 795 crypto_free_akcipher(tfm);
diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c
index 0c069fe8a59c..33093b7bcc47 100644
--- a/crypto/asymmetric_keys/public_key.c
+++ b/crypto/asymmetric_keys/public_key.c
@@ -229,7 +229,6 @@ int public_key_verify_signature(const struct public_key *pkey,
229 struct akcipher_request *req; 229 struct akcipher_request *req;
230 struct scatterlist src_sg[2]; 230 struct scatterlist src_sg[2];
231 char alg_name[CRYPTO_MAX_ALG_NAME]; 231 char alg_name[CRYPTO_MAX_ALG_NAME];
232 void *digest;
233 int ret; 232 int ret;
234 233
235 pr_devel("==>%s()\n", __func__); 234 pr_devel("==>%s()\n", __func__);
@@ -262,14 +261,9 @@ int public_key_verify_signature(const struct public_key *pkey,
262 if (ret) 261 if (ret)
263 goto error_free_req; 262 goto error_free_req;
264 263
265 ret = -ENOMEM;
266 digest = kmemdup(sig->digest, sig->digest_size, GFP_KERNEL);
267 if (!digest)
268 goto error_free_req;
269
270 sg_init_table(src_sg, 2); 264 sg_init_table(src_sg, 2);
271 sg_set_buf(&src_sg[0], sig->s, sig->s_size); 265 sg_set_buf(&src_sg[0], sig->s, sig->s_size);
272 sg_set_buf(&src_sg[1], digest, sig->digest_size); 266 sg_set_buf(&src_sg[1], sig->digest, sig->digest_size);
273 akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size, 267 akcipher_request_set_crypt(req, src_sg, NULL, sig->s_size,
274 sig->digest_size); 268 sig->digest_size);
275 crypto_init_wait(&cwait); 269 crypto_init_wait(&cwait);
@@ -278,7 +272,6 @@ int public_key_verify_signature(const struct public_key *pkey,
278 crypto_req_done, &cwait); 272 crypto_req_done, &cwait);
279 ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait); 273 ret = crypto_wait_req(crypto_akcipher_verify(req), &cwait);
280 274
281 kfree(digest);
282error_free_req: 275error_free_req:
283 akcipher_request_free(req); 276 akcipher_request_free(req);
284error_free_tfm: 277error_free_tfm: