diff options
author | Vitaly Chikunov <vt@altlinux.org> | 2019-04-11 11:51:16 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-04-18 10:15:02 -0400 |
commit | 83bc0299960477a4b99d9ad11b766d63c0dfaf60 (patch) | |
tree | 4f444c5f25cdbe1137d2e95508ccefd27233facc /crypto | |
parent | c7381b01287240abe942a081729203e26782d981 (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.c | 10 | ||||
-rw-r--r-- | crypto/asymmetric_keys/public_key.c | 9 |
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); | ||
800 | error_free_req: | ||
801 | akcipher_request_free(req); | 793 | akcipher_request_free(req); |
802 | error_free_tfm: | 794 | error_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); | ||
282 | error_free_req: | 275 | error_free_req: |
283 | akcipher_request_free(req); | 276 | akcipher_request_free(req); |
284 | error_free_tfm: | 277 | error_free_tfm: |