aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2016-05-05 04:42:49 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2016-05-09 04:47:53 -0400
commitdf27b26f04ed388ff4cc2b5d8cfdb5d97678816f (patch)
treeb21b9265fbe4911f803a53a2d0f4bb375140ccaf
parent58446fef579e5214dc6fffd28cc538051efe1f24 (diff)
crypto: testmgr - Use kmalloc memory for RSA input
As akcipher uses an SG interface, you must not use vmalloc memory as input for it. This patch fixes testmgr to copy the vmalloc test vectors to kmalloc memory before running the test. This patch also removes a superfluous sg_virt call in do_test_rsa. Cc: <stable@vger.kernel.org> Reported-by: Anatoly Pugachev <matorola@gmail.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--crypto/testmgr.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index b86883aedca1..7d4acc449233 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -1776,6 +1776,7 @@ static int alg_test_drbg(const struct alg_test_desc *desc, const char *driver,
1776static int do_test_rsa(struct crypto_akcipher *tfm, 1776static int do_test_rsa(struct crypto_akcipher *tfm,
1777 struct akcipher_testvec *vecs) 1777 struct akcipher_testvec *vecs)
1778{ 1778{
1779 char *xbuf[XBUFSIZE];
1779 struct akcipher_request *req; 1780 struct akcipher_request *req;
1780 void *outbuf_enc = NULL; 1781 void *outbuf_enc = NULL;
1781 void *outbuf_dec = NULL; 1782 void *outbuf_dec = NULL;
@@ -1784,9 +1785,12 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
1784 int err = -ENOMEM; 1785 int err = -ENOMEM;
1785 struct scatterlist src, dst, src_tab[2]; 1786 struct scatterlist src, dst, src_tab[2];
1786 1787
1788 if (testmgr_alloc_buf(xbuf))
1789 return err;
1790
1787 req = akcipher_request_alloc(tfm, GFP_KERNEL); 1791 req = akcipher_request_alloc(tfm, GFP_KERNEL);
1788 if (!req) 1792 if (!req)
1789 return err; 1793 goto free_xbuf;
1790 1794
1791 init_completion(&result.completion); 1795 init_completion(&result.completion);
1792 1796
@@ -1804,9 +1808,14 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
1804 if (!outbuf_enc) 1808 if (!outbuf_enc)
1805 goto free_req; 1809 goto free_req;
1806 1810
1811 if (WARN_ON(vecs->m_size > PAGE_SIZE))
1812 goto free_all;
1813
1814 memcpy(xbuf[0], vecs->m, vecs->m_size);
1815
1807 sg_init_table(src_tab, 2); 1816 sg_init_table(src_tab, 2);
1808 sg_set_buf(&src_tab[0], vecs->m, 8); 1817 sg_set_buf(&src_tab[0], xbuf[0], 8);
1809 sg_set_buf(&src_tab[1], vecs->m + 8, vecs->m_size - 8); 1818 sg_set_buf(&src_tab[1], xbuf[0] + 8, vecs->m_size - 8);
1810 sg_init_one(&dst, outbuf_enc, out_len_max); 1819 sg_init_one(&dst, outbuf_enc, out_len_max);
1811 akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size, 1820 akcipher_request_set_crypt(req, src_tab, &dst, vecs->m_size,
1812 out_len_max); 1821 out_len_max);
@@ -1825,7 +1834,7 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
1825 goto free_all; 1834 goto free_all;
1826 } 1835 }
1827 /* verify that encrypted message is equal to expected */ 1836 /* verify that encrypted message is equal to expected */
1828 if (memcmp(vecs->c, sg_virt(req->dst), vecs->c_size)) { 1837 if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
1829 pr_err("alg: rsa: encrypt test failed. Invalid output\n"); 1838 pr_err("alg: rsa: encrypt test failed. Invalid output\n");
1830 err = -EINVAL; 1839 err = -EINVAL;
1831 goto free_all; 1840 goto free_all;
@@ -1840,7 +1849,13 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
1840 err = -ENOMEM; 1849 err = -ENOMEM;
1841 goto free_all; 1850 goto free_all;
1842 } 1851 }
1843 sg_init_one(&src, vecs->c, vecs->c_size); 1852
1853 if (WARN_ON(vecs->c_size > PAGE_SIZE))
1854 goto free_all;
1855
1856 memcpy(xbuf[0], vecs->c, vecs->c_size);
1857
1858 sg_init_one(&src, xbuf[0], vecs->c_size);
1844 sg_init_one(&dst, outbuf_dec, out_len_max); 1859 sg_init_one(&dst, outbuf_dec, out_len_max);
1845 init_completion(&result.completion); 1860 init_completion(&result.completion);
1846 akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max); 1861 akcipher_request_set_crypt(req, &src, &dst, vecs->c_size, out_len_max);
@@ -1867,6 +1882,8 @@ free_all:
1867 kfree(outbuf_enc); 1882 kfree(outbuf_enc);
1868free_req: 1883free_req:
1869 akcipher_request_free(req); 1884 akcipher_request_free(req);
1885free_xbuf:
1886 testmgr_free_buf(xbuf);
1870 return err; 1887 return err;
1871} 1888}
1872 1889