X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=3f60210773418d110c3757294f8d6616ea24b044;hb=1a2714eb8f2c526517a01c90bb02ccd0e22f4c08;hp=4713e3c07bded81559fdf9288a6809cebbbfc03e;hpb=0906436e33bdd8dabf07d494e3d6d5184cc02246;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index 4713e3c..3f60210 100644 --- a/gost_pmeth.c +++ b/gost_pmeth.c @@ -177,6 +177,29 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) return -2; } +static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx, + const char *type, const char *value) +{ + if (0 == strcmp(type, ukm_ctrl_string)) { + unsigned char ukm_buf[32], *tmp = NULL; + long len = 0; + tmp = OPENSSL_hexstr2buf(value, &len); + if (tmp == NULL) + return 0; + + if (len > 32) { + OPENSSL_free(tmp); + GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_COMMON, GOST_R_CTRL_CALL_FAILED); + return 0; + } + memcpy(ukm_buf, tmp, len); + OPENSSL_free(tmp); + + return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_IV, len, ukm_buf); + } + return -2; +} + static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, const char *type, const char *value) { @@ -254,7 +277,8 @@ static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL); } - return -2; + + return pkey_gost_ec_ctrl_str_common(ctx, type, value); } static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, @@ -263,7 +287,7 @@ static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, int param_nid = NID_undef; if (strcmp(type, param_ctrl_string)) - return -2; + return pkey_gost_ec_ctrl_str_common(ctx, type, value); if (!value) return 0;