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 | 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, ¶ms); | |
| 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, ¶ms); | |
| 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; |