summaryrefslogtreecommitdiffstats
path: root/crypto/testmgr.c
diff options
context:
space:
mode:
authorVitaly Chikunov <vt@altlinux.org>2019-04-11 11:51:17 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-04-18 10:15:02 -0400
commitf1774cb8956a35269f539efcee99fe7eda838b77 (patch)
tree249ba0956270b8a21c0fc9d52bc51dc7a2b1119d /crypto/testmgr.c
parent83bc0299960477a4b99d9ad11b766d63c0dfaf60 (diff)
X.509: parse public key parameters from x509 for akcipher
Some public key algorithms (like EC-DSA) keep in parameters field important data such as digest and curve OIDs (possibly more for different EC-DSA variants). Thus, just setting a public key (as for RSA) is not enough. Append parameters into the key stream for akcipher_set_{pub,priv}_key. Appended data is: (u32) algo OID, (u32) parameters length, parameters data. This does not affect current akcipher API nor RSA ciphers (they could ignore it). Idea of appending parameters to the key stream is by Herbert Xu. Cc: David Howells <dhowells@redhat.com> Cc: Denis Kenzior <denkenz@gmail.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/testmgr.c')
-rw-r--r--crypto/testmgr.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 21b27996508a..bc382b0c0ac6 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -2585,6 +2585,12 @@ static int alg_test_kpp(const struct alg_test_desc *desc, const char *driver,
2585 return err; 2585 return err;
2586} 2586}
2587 2587
2588static u8 *test_pack_u32(u8 *dst, u32 val)
2589{
2590 memcpy(dst, &val, sizeof(val));
2591 return dst + sizeof(val);
2592}
2593
2588static int test_akcipher_one(struct crypto_akcipher *tfm, 2594static int test_akcipher_one(struct crypto_akcipher *tfm,
2589 const struct akcipher_testvec *vecs) 2595 const struct akcipher_testvec *vecs)
2590{ 2596{
@@ -2599,6 +2605,7 @@ static int test_akcipher_one(struct crypto_akcipher *tfm,
2599 const char *m, *c; 2605 const char *m, *c;
2600 unsigned int m_size, c_size; 2606 unsigned int m_size, c_size;
2601 const char *op; 2607 const char *op;
2608 u8 *key, *ptr;
2602 2609
2603 if (testmgr_alloc_buf(xbuf)) 2610 if (testmgr_alloc_buf(xbuf))
2604 return err; 2611 return err;
@@ -2609,12 +2616,20 @@ static int test_akcipher_one(struct crypto_akcipher *tfm,
2609 2616
2610 crypto_init_wait(&wait); 2617 crypto_init_wait(&wait);
2611 2618
2619 key = kmalloc(vecs->key_len + sizeof(u32) * 2 + vecs->param_len,
2620 GFP_KERNEL);
2621 if (!key)
2622 goto free_xbuf;
2623 memcpy(key, vecs->key, vecs->key_len);
2624 ptr = key + vecs->key_len;
2625 ptr = test_pack_u32(ptr, vecs->algo);
2626 ptr = test_pack_u32(ptr, vecs->param_len);
2627 memcpy(ptr, vecs->params, vecs->param_len);
2628
2612 if (vecs->public_key_vec) 2629 if (vecs->public_key_vec)
2613 err = crypto_akcipher_set_pub_key(tfm, vecs->key, 2630 err = crypto_akcipher_set_pub_key(tfm, key, vecs->key_len);
2614 vecs->key_len);
2615 else 2631 else
2616 err = crypto_akcipher_set_priv_key(tfm, vecs->key, 2632 err = crypto_akcipher_set_priv_key(tfm, key, vecs->key_len);
2617 vecs->key_len);
2618 if (err) 2633 if (err)
2619 goto free_req; 2634 goto free_req;
2620 2635
@@ -2744,6 +2759,7 @@ free_all:
2744 kfree(outbuf_enc); 2759 kfree(outbuf_enc);
2745free_req: 2760free_req:
2746 akcipher_request_free(req); 2761 akcipher_request_free(req);
2762 kfree(key);
2747free_xbuf: 2763free_xbuf:
2748 testmgr_free_buf(xbuf); 2764 testmgr_free_buf(xbuf);
2749 return err; 2765 return err;