X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=166cf856055187c74bfad9e890a1657ed086b65c;hb=72237db330af33496416ed74271bf2b4a9c725d3;hp=a8252172dbb304722c9a6044bbc8d19f5849bb09;hpb=57d07eb0dc22bee10aebb0bd37cbdf2258413564;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index a825217..166cf85 100644 --- a/gost_pmeth.c +++ b/gost_pmeth.c @@ -30,20 +30,19 @@ static int pkey_gost_init(EVP_PKEY_CTX *ctx) return 0; memset(data, 0, sizeof(*data)); if (pkey && EVP_PKEY_get0(pkey)) { - switch (EVP_PKEY_base_id(pkey)) { - case NID_id_GostR3410_2001: - case NID_id_GostR3410_2012_256: - case NID_id_GostR3410_2012_512: + int id = (EVP_PKEY_base_id(pkey)); + if (id == NID_id_GostR3410_2001 || + id == NID_gost2012_256 || + id == NID_gost2012_512) { const EC_GROUP *group = EC_KEY_get0_group(EVP_PKEY_get0((EVP_PKEY *)pkey)); if (group != NULL) { data->sign_param_nid = EC_GROUP_get_curve_name(group); - break; } - /* else */ } - default: + else + { OPENSSL_free(data); return 0; } @@ -97,28 +96,23 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) OPENSSL_assert(p2 != NULL); - switch (EVP_MD_type((const EVP_MD *)p2)) { - case NID_id_GostR3411_94: + int md_type = EVP_MD_type((const EVP_MD *)p2); + if (md_type == NID_id_GostR3411_94) { if (pkey_nid == NID_id_GostR3410_2001 || pkey_nid == NID_id_GostR3410_94) { pctx->md = (EVP_MD *)p2; return 1; } - break; - - case NID_id_GostR3411_2012_256: - if (pkey_nid == NID_id_GostR3410_2012_256) { + } else if (md_type == NID_md_gost12_256) { + if (pkey_nid == NID_gost2012_256) { pctx->md = (EVP_MD *)p2; return 1; } - break; - - case NID_id_GostR3411_2012_512: - if (pkey_nid == NID_id_GostR3410_2012_512) { + } else if ( md_type == NID_md_gost12_512) { + if (pkey_nid == NID_gost2012_512) { pctx->md = (EVP_MD *)p2; return 1; } - break; } GOSTerr(GOST_F_PKEY_GOST_CTRL, GOST_R_INVALID_DIGEST_TYPE); @@ -311,25 +305,19 @@ static int pkey_gost2012_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) return 0; } - switch (data->sign_param_nid) { - case NID_id_tc26_gost_3410_2012_512_paramSetA: - case NID_id_tc26_gost_3410_2012_512_paramSetB: + if (data->sign_param_nid == NID_id_tc26_gost_3410_2012_512_paramSetA || + data->sign_param_nid == NID_id_tc26_gost_3410_2012_512_paramSetB) { result = - (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_512, ec)) ? 1 : 0; - break; - - case NID_id_GostR3410_2001_CryptoPro_A_ParamSet: - case NID_id_GostR3410_2001_CryptoPro_B_ParamSet: - case NID_id_GostR3410_2001_CryptoPro_C_ParamSet: - case NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet: - case NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet: - case NID_id_GostR3410_2001_TestParamSet: + (EVP_PKEY_assign(pkey, NID_gost2012_512, ec)) ? 1 : 0; + } else + if (data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_A_ParamSet || + data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_B_ParamSet || + data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_C_ParamSet || + data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet || + data->sign_param_nid == NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet || + data->sign_param_nid == NID_id_GostR3410_2001_TestParamSet) { result = - (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_256, ec)) ? 1 : 0; - break; - default: - result = 0; - break; + (EVP_PKEY_assign(pkey, NID_gost2012_256, ec)) ? 1 : 0; } if (result == 0) @@ -382,21 +370,18 @@ static int pkey_gost_ec_cp_sign(EVP_PKEY_CTX *ctx, unsigned char *sig, DSA_SIG *unpacked_sig = NULL; EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); int order = 0; - + int id = EVP_PKEY_base_id(pkey); if (!siglen) return 0; if (!pkey) return 0; - switch (EVP_PKEY_base_id(pkey)) { - case NID_id_GostR3410_2001: - case NID_id_GostR3410_2012_256: + if (id == NID_id_GostR3410_2001 || + id == NID_gost2012_256) { order = 64; - break; - case NID_id_GostR3410_2012_512: + } else if (id == NID_gost2012_512) { order = 128; - break; - default: + } else { return 0; } @@ -470,6 +455,7 @@ static int pkey_gost_mac_init(EVP_PKEY_CTX *ctx) if (!data) return 0; memset(data, 0, sizeof(*data)); + data->mac_size = 4; EVP_PKEY_CTX_set_data(ctx, data); return 1; } @@ -553,6 +539,17 @@ static int pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) } return mctx->digest->md_ctrl(mctx, EVP_MD_CTRL_SET_KEY, 32, key); } + case EVP_PKEY_CTRL_MAC_LEN: + { + if (p1<1 || p1>8) + { + + GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL,GOST_R_INVALID_MAC_SIZE); + return 0; + } + data->mac_size = p1; + return 1; + } } return -2; } @@ -584,6 +581,16 @@ static int pkey_gost_mac_ctrl_str(EVP_PKEY_CTX *ctx, return ret; } + if (!strcmp(type,maclen_ctrl_string)) { + char *endptr; + long size=strtol(value,&endptr,10); + if (*endptr!='\0') { + GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL_STR, + GOST_R_INVALID_MAC_SIZE); + return 0; + } + return pkey_gost_mac_ctrl(ctx, EVP_PKEY_CTRL_MAC_LEN,size,NULL); + } return -2; } @@ -624,6 +631,7 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, { unsigned int tmpsiglen; int ret; + struct gost_mac_pmeth_data *data = EVP_PKEY_CTX_get_data(ctx); if (!siglen) return 0; @@ -631,11 +639,13 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, * sizeof(size_t) */ if (!sig) { - *siglen = 4; + *siglen = data->mac_size; return 1; } + + mctx->digest->md_ctrl(mctx, EVP_MD_CTRL_MAC_LEN, data->mac_size, NULL); ret = EVP_DigestFinal_ex(mctx, sig, &tmpsiglen); - *siglen = tmpsiglen; + *siglen = data->mac_size; return ret; } @@ -646,8 +656,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) if (!*pmeth) return 0; - switch (id) { - case NID_id_GostR3410_2001: + if (id == NID_id_GostR3410_2001) { EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_ctrl, pkey_gost_ec_ctrl_str_256); EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign); @@ -663,8 +672,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) pkey_gost_derive_init, pkey_gost_ec_derive); EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2001_paramgen); - break; - case NID_id_GostR3410_2012_256: + } else if (id == NID_gost2012_256) { EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_ctrl, pkey_gost_ec_ctrl_str_256); EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign); @@ -681,8 +689,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2012_paramgen); - break; - case NID_id_GostR3410_2012_512: + } else if (id == NID_gost2012_512 ) { EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_ctrl, pkey_gost_ec_ctrl_str_512); EVP_PKEY_meth_set_sign(*pmeth, NULL, pkey_gost_ec_cp_sign); @@ -699,8 +706,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2012_paramgen); - break; - case NID_id_Gost28147_89_MAC: + } else if (id == NID_id_Gost28147_89_MAC) { EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_mac_ctrl, pkey_gost_mac_ctrl_str); EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_mac_signctx_init, @@ -709,8 +715,8 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_init(*pmeth, pkey_gost_mac_init); EVP_PKEY_meth_set_cleanup(*pmeth, pkey_gost_mac_cleanup); EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy); - return 1; - case NID_gost_mac_12: + return 1; + } else if (id == NID_gost_mac_12) { EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_mac_ctrl, pkey_gost_mac_ctrl_str); EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_mac_signctx_init, @@ -719,8 +725,9 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_init(*pmeth, pkey_gost_mac_init); EVP_PKEY_meth_set_cleanup(*pmeth, pkey_gost_mac_cleanup); EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy); - return 1; - default: /* Unsupported method */ + return 1; + } else { + /* Unsupported method */ return 0; } EVP_PKEY_meth_set_init(*pmeth, pkey_gost_init);