Message ID | 20220831183706.1600-1-ignat@cloudflare.com |
---|---|
State | Accepted |
Commit | bc155c6c188c2f0c5749993b1405673d25a80389 |
Headers | show |
Series | [v2] crypto: akcipher - default implementation for setting a private key | expand |
On Wed, Aug 31, 2022 at 07:37:06PM +0100, Ignat Korchagin wrote: > Changes from v1: > * removed the default implementation from set_pub_key: it is assumed that > an implementation must always have this callback defined as there are > no use case for an algorithm, which doesn't need a public key > > Many akcipher implementations (like ECDSA) support only signature > verifications, so they don't have all callbacks defined. > > Commit 78a0324f4a53 ("crypto: akcipher - default implementations for > request callbacks") introduced default callbacks for sign/verify > operations, which just return an error code. > > However, these are not enough, because before calling sign the caller would > likely call set_priv_key first on the instantiated transform (as the > in-kernel testmgr does). This function does not have a default stub, so the > kernel crashes, when trying to set a private key on an akcipher, which > doesn't support signature generation. > > I've noticed this, when trying to add a KAT vector for ECDSA signature to > the testmgr. > > With this patch the testmgr returns an error in dmesg (as it should) > instead of crashing the kernel NULL ptr dereference. > > Fixes: 78a0324f4a53 ("crypto: akcipher - default implementations for request callbacks") > Signed-off-by: Ignat Korchagin <ignat@cloudflare.com> > --- > crypto/akcipher.c | 8 ++++++++ > 1 file changed, 8 insertions(+) Patch applied. Thanks.
diff --git a/crypto/akcipher.c b/crypto/akcipher.c index f866085c8a4a..ab975a420e1e 100644 --- a/crypto/akcipher.c +++ b/crypto/akcipher.c @@ -120,6 +120,12 @@ static int akcipher_default_op(struct akcipher_request *req) return -ENOSYS; } +static int akcipher_default_set_key(struct crypto_akcipher *tfm, + const void *key, unsigned int keylen) +{ + return -ENOSYS; +} + int crypto_register_akcipher(struct akcipher_alg *alg) { struct crypto_alg *base = &alg->base; @@ -132,6 +138,8 @@ int crypto_register_akcipher(struct akcipher_alg *alg) alg->encrypt = akcipher_default_op; if (!alg->decrypt) alg->decrypt = akcipher_default_op; + if (!alg->set_priv_key) + alg->set_priv_key = akcipher_default_set_key; akcipher_prepare_alg(alg); return crypto_register_alg(base);
Changes from v1: * removed the default implementation from set_pub_key: it is assumed that an implementation must always have this callback defined as there are no use case for an algorithm, which doesn't need a public key Many akcipher implementations (like ECDSA) support only signature verifications, so they don't have all callbacks defined. Commit 78a0324f4a53 ("crypto: akcipher - default implementations for request callbacks") introduced default callbacks for sign/verify operations, which just return an error code. However, these are not enough, because before calling sign the caller would likely call set_priv_key first on the instantiated transform (as the in-kernel testmgr does). This function does not have a default stub, so the kernel crashes, when trying to set a private key on an akcipher, which doesn't support signature generation. I've noticed this, when trying to add a KAT vector for ECDSA signature to the testmgr. With this patch the testmgr returns an error in dmesg (as it should) instead of crashing the kernel NULL ptr dereference. Fixes: 78a0324f4a53 ("crypto: akcipher - default implementations for request callbacks") Signed-off-by: Ignat Korchagin <ignat@cloudflare.com> --- crypto/akcipher.c | 8 ++++++++ 1 file changed, 8 insertions(+) -- 2.36.1