X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=9c1d602c303ba030196775ef357ebd6868b4624b;hb=4dc691d1177ad328f34bee01128b3a8aa23b2547;hp=af92fbf93c3f85d05eddc9786dddbf7c51bf3c83;hpb=410e6c831e2fc37ac9c81c5c6e2e32f564720e86;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index af92fbf..9c1d602 100644 --- a/gost_pmeth.c +++ b/gost_pmeth.c @@ -148,10 +148,25 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) pctx->sign_param_nid = (int)p1; return 1; case EVP_PKEY_CTRL_SET_IV: - OPENSSL_assert(p2 != NULL); + if (p1 > sizeof(pctx->shared_ukm) || !p2) { + GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_UKM_NOT_SET); + return 0; + } memcpy(pctx->shared_ukm, p2, (int)p1); pctx->shared_ukm_size = p1; return 1; + case EVP_PKEY_CTRL_SET_VKO: + switch (p1) { + case 0: /* switch to KEG */ + case NID_id_GostR3411_2012_256: + case NID_id_GostR3411_2012_512: + break; + default: + GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_INVALID_DIGEST_TYPE); + return 0; + } + pctx->vko_dgst_nid = p1; + return 1; case EVP_PKEY_CTRL_CIPHER: switch (p1) { case NID_magma_ctr_acpkm: @@ -202,6 +217,19 @@ static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx, OPENSSL_free(tmp); return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_IV, len, ukm_buf); + } else if (strcmp(type, vko_ctrl_string) == 0) { + int bits = atoi(value); + int vko_dgst_nid = 0; + + if (bits == 256) + vko_dgst_nid = NID_id_GostR3411_2012_256; + else if (bits == 512) + vko_dgst_nid = NID_id_GostR3411_2012_512; + else if (bits != 0) { + GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_COMMON, GOST_R_INVALID_DIGEST_TYPE); + return 0; + } + return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_SET_VKO, vko_dgst_nid, NULL); } return -2; }