mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-22 01:10:28 +00:00
crypto: testmgr - Allow leading zeros in RSA
This patch allows RSA implementations to produce output with leading zeroes. testmgr will skip leading zeroes when comparing the output. This patch also tries to make the RSA test function generic enough to potentially handle other akcipher algorithms. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
1503a24f53
commit
50d2b643ea
@ -1911,8 +1911,8 @@ static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
|
||||
return err;
|
||||
}
|
||||
|
||||
static int do_test_rsa(struct crypto_akcipher *tfm,
|
||||
struct akcipher_testvec *vecs)
|
||||
static int test_akcipher_one(struct crypto_akcipher *tfm,
|
||||
struct akcipher_testvec *vecs)
|
||||
{
|
||||
char *xbuf[XBUFSIZE];
|
||||
struct akcipher_request *req;
|
||||
@ -1963,17 +1963,18 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
|
||||
/* Run RSA encrypt - c = m^e mod n;*/
|
||||
err = wait_async_op(&result, crypto_akcipher_encrypt(req));
|
||||
if (err) {
|
||||
pr_err("alg: rsa: encrypt test failed. err %d\n", err);
|
||||
pr_err("alg: akcipher: encrypt test failed. err %d\n", err);
|
||||
goto free_all;
|
||||
}
|
||||
if (req->dst_len != vecs->c_size) {
|
||||
pr_err("alg: rsa: encrypt test failed. Invalid output len\n");
|
||||
pr_err("alg: akcipher: encrypt test failed. Invalid output len\n");
|
||||
err = -EINVAL;
|
||||
goto free_all;
|
||||
}
|
||||
/* verify that encrypted message is equal to expected */
|
||||
if (memcmp(vecs->c, outbuf_enc, vecs->c_size)) {
|
||||
pr_err("alg: rsa: encrypt test failed. Invalid output\n");
|
||||
pr_err("alg: akcipher: encrypt test failed. Invalid output\n");
|
||||
hexdump(outbuf_enc, vecs->c_size);
|
||||
err = -EINVAL;
|
||||
goto free_all;
|
||||
}
|
||||
@ -2001,18 +2002,22 @@ static int do_test_rsa(struct crypto_akcipher *tfm,
|
||||
/* Run RSA decrypt - m = c^d mod n;*/
|
||||
err = wait_async_op(&result, crypto_akcipher_decrypt(req));
|
||||
if (err) {
|
||||
pr_err("alg: rsa: decrypt test failed. err %d\n", err);
|
||||
pr_err("alg: akcipher: decrypt test failed. err %d\n", err);
|
||||
goto free_all;
|
||||
}
|
||||
out_len = req->dst_len;
|
||||
if (out_len != vecs->m_size) {
|
||||
pr_err("alg: rsa: decrypt test failed. Invalid output len\n");
|
||||
if (out_len < vecs->m_size) {
|
||||
pr_err("alg: akcipher: decrypt test failed. "
|
||||
"Invalid output len %u\n", out_len);
|
||||
err = -EINVAL;
|
||||
goto free_all;
|
||||
}
|
||||
/* verify that decrypted message is equal to the original msg */
|
||||
if (memcmp(vecs->m, outbuf_dec, vecs->m_size)) {
|
||||
pr_err("alg: rsa: decrypt test failed. Invalid output\n");
|
||||
if (memchr_inv(outbuf_dec, 0, out_len - vecs->m_size) ||
|
||||
memcmp(vecs->m, outbuf_dec + out_len - vecs->m_size,
|
||||
vecs->m_size)) {
|
||||
pr_err("alg: akcipher: decrypt test failed. Invalid output\n");
|
||||
hexdump(outbuf_dec, out_len);
|
||||
err = -EINVAL;
|
||||
}
|
||||
free_all:
|
||||
@ -2025,31 +2030,23 @@ free_xbuf:
|
||||
return err;
|
||||
}
|
||||
|
||||
static int test_rsa(struct crypto_akcipher *tfm, struct akcipher_testvec *vecs,
|
||||
unsigned int tcount)
|
||||
static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
|
||||
struct akcipher_testvec *vecs, unsigned int tcount)
|
||||
{
|
||||
int ret, i;
|
||||
|
||||
for (i = 0; i < tcount; i++) {
|
||||
ret = do_test_rsa(tfm, vecs++);
|
||||
if (ret) {
|
||||
pr_err("alg: rsa: test failed on vector %d, err=%d\n",
|
||||
i + 1, ret);
|
||||
return ret;
|
||||
}
|
||||
ret = test_akcipher_one(tfm, vecs++);
|
||||
if (!ret)
|
||||
continue;
|
||||
|
||||
pr_err("alg: akcipher: test failed on vector %d, err=%d\n",
|
||||
i + 1, ret);
|
||||
return ret;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int test_akcipher(struct crypto_akcipher *tfm, const char *alg,
|
||||
struct akcipher_testvec *vecs, unsigned int tcount)
|
||||
{
|
||||
if (strncmp(alg, "rsa", 3) == 0)
|
||||
return test_rsa(tfm, vecs, tcount);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int alg_test_akcipher(const struct alg_test_desc *desc,
|
||||
const char *driver, u32 type, u32 mask)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user