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.
Unified · Split
| @@ -444,17 +444,18 @@ static int dh_safe_prime_set_secret(struct crypto_kpp *tfm, const void *buffer, · 443 unmodified lines | |||
| 444 | struct dh_safe_prime_instance_ctx *inst_ctx = | 444 | struct dh_safe_prime_instance_ctx *inst_ctx = |
| 445 | dh_safe_prime_instance_ctx(tfm); | 445 | dh_safe_prime_instance_ctx(tfm); |
| 446 | struct dh_safe_prime_tfm_ctx *tfm_ctx = kpp_tfm_ctx(tfm); | 446 | struct dh_safe_prime_tfm_ctx *tfm_ctx = kpp_tfm_ctx(tfm); |
| 447 | struct dh params; | 447 | struct dh params = {}; |
| 448 | void *buf = NULL, *key = NULL; | 448 | void *buf = NULL, *key = NULL; |
| 449 | unsigned int buf_size; | 449 | unsigned int buf_size; |
| 450 | int err; | 450 | int err; |
| 451 | 451 | ||
| 452 | err = __crypto_dh_decode_key(buffer, len, ¶ms); | 452 | if (buffer) { |
| 453 | if (err) | 453 | err = __crypto_dh_decode_key(buffer, len, ¶ms); |
| 454 | return err; | 454 | if (err) |
| 455 | 455 | return err; | |
| 456 | if (params.p_size || params.g_size) | 456 | if (params.p_size || params.g_size) |
| 457 | return -EINVAL; | 457 | return -EINVAL; |
| 458 | } | ||
| 458 | 459 | ||
| 459 | params.p = inst_ctx->safe_prime->p; | 460 | params.p = inst_ctx->safe_prime->p; |
| 460 | params.p_size = inst_ctx->safe_prime->p_size; | 461 | params.p_size = inst_ctx->safe_prime->p_size; |