Skip to content

Commit

Permalink
param->ctrl translation: Fix fix_ec_paramgen_curve_nid()
Browse files Browse the repository at this point in the history
This function didn't prepare space to get the param string, which causes
the default_fixup_args() call to fail.

Fixes #20161

Reviewed-by: Tomas Mraz <tomas@openssl.org>
Reviewed-by: Todd Short <todd.short@me.com>
(Merged from #20780)

(cherry picked from commit ac52fe5)
  • Loading branch information
levitte authored and mattcaswell committed May 1, 2023
1 parent 87abde5 commit ff56f28
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion crypto/evp/ctrl_params_translate.c
Expand Up @@ -1136,6 +1136,7 @@ static int fix_ec_paramgen_curve_nid(enum state state,
const struct translation_st *translation,
struct translation_ctx_st *ctx)
{
char *p2 = NULL;
int ret;

if ((ret = default_check(state, translation, ctx)) <= 0)
Expand All @@ -1148,13 +1149,25 @@ static int fix_ec_paramgen_curve_nid(enum state state,
if (state == PRE_CTRL_TO_PARAMS) {
ctx->p2 = (char *)OBJ_nid2sn(ctx->p1);
ctx->p1 = 0;
} else if (state == PRE_PARAMS_TO_CTRL) {
/*
* We're translating from params to ctrl and setting the curve name.
* The ctrl function needs it to be a NID, but meanwhile, we need
* space to get the curve name from the param. |ctx->name_buf| is
* sufficient for that.
* The double indirection is necessary for default_fixup_args()'s
* call of OSSL_PARAM_get_utf8_string() to be done correctly.
*/
p2 = ctx->name_buf;
ctx->p2 = &p2;
ctx->sz = sizeof(ctx->name_buf);
}

if ((ret = default_fixup_args(state, translation, ctx)) <= 0)
return ret;

if (state == PRE_PARAMS_TO_CTRL) {
ctx->p1 = OBJ_sn2nid(ctx->p2);
ctx->p1 = OBJ_sn2nid(p2);
ctx->p2 = NULL;
}

Expand Down

0 comments on commit ff56f28

Please sign in to comment.