Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: dh - allow for passing NULL to the ffdheXYZ(dh)s' ->set_secret()

Ephemeral key generation can be requested from any of the ffdheXYZ(dh)
variants' common ->set_secret() by passing it an (encoded) struct dh
with the key parameter being unset, i.e. with ->key_size == 0. As the
whole purpose of the ffdheXYZ(dh) templates is to fill in the group
parameters as appropriate, they expect ->p and ->g to be unset in any
input struct dh as well. This means that a user would have to encode an
all-zeroes struct dh instance via crypto_dh_encode_key() when requesting
ephemeral key generation from a ffdheXYZ(dh) instance, which is kind of
pointless.

Make dh_safe_prime_set_secret() to decode a struct dh from the supplied
buffer only if the latter is non-NULL and initialize it with all zeroes
otherwise.

That is, it is now possible to call

crypto_kpp_set_secret(tfm, NULL, 0);

on any ffdheXYZ(dh) tfm for requesting ephemeral key generation.

Signed-off-by: Nicolai Stange <nstange@suse.de>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Nicolai Stange and committed by
Herbert Xu
c8e8236c 209b7fc9

+8 -7
+8 -7
crypto/dh.c
··· 444 444 struct dh_safe_prime_instance_ctx *inst_ctx = 445 445 dh_safe_prime_instance_ctx(tfm); 446 446 struct dh_safe_prime_tfm_ctx *tfm_ctx = kpp_tfm_ctx(tfm); 447 - struct dh params; 447 + struct dh params = {}; 448 448 void *buf = NULL, *key = NULL; 449 449 unsigned int buf_size; 450 450 int err; 451 451 452 - err = __crypto_dh_decode_key(buffer, len, &params); 453 - if (err) 454 - return err; 455 - 456 - if (params.p_size || params.g_size) 457 - return -EINVAL; 452 + if (buffer) { 453 + err = __crypto_dh_decode_key(buffer, len, &params); 454 + if (err) 455 + return err; 456 + if (params.p_size || params.g_size) 457 + return -EINVAL; 458 + } 458 459 459 460 params.p = inst_ctx->safe_prime->p; 460 461 params.p_size = inst_ctx->safe_prime->p_size;