X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=3f60210773418d110c3757294f8d6616ea24b044;hb=41b4121253a9c0e8d82d3eebcfe728d5d43e1b51;hp=ddbe1433ca6571f58e5853816e4edfea54d6e1f3;hpb=cd7f9c8e3c396cff87e1393df835c5f5f9fb661f;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index ddbe143..3f60210 100644 --- a/gost_pmeth.c +++ b/gost_pmeth.c @@ -12,12 +12,19 @@ #include #include #include /* For string_to_hex */ +#include /* For OPENSSL_VERSION_MAJOR */ #include #include #include #include "gost_lcl.h" #include "e_gost_err.h" +#define ossl3_const +#ifdef OPENSSL_VERSION_MAJOR +#undef ossl3_const +#define ossl3_const const +#endif + /* -----init, cleanup, copy - uniform for all algs --------------*/ /* Allocates new gost_pmeth_data structure and assigns it as data */ static int pkey_gost_init(EVP_PKEY_CTX *ctx) @@ -53,7 +60,7 @@ static int pkey_gost_init(EVP_PKEY_CTX *ctx) } /* Copies contents of gost_pmeth_data structure */ -static int pkey_gost_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) +static int pkey_gost_copy(EVP_PKEY_CTX *dst, ossl3_const EVP_PKEY_CTX *src) { struct gost_pmeth_data *dst_data, *src_data; if (!pkey_gost_init(dst)) { @@ -170,12 +177,35 @@ static int pkey_gost_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) return -2; } -static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, +static int pkey_gost_ec_ctrl_str_common(EVP_PKEY_CTX *ctx, const char *type, const char *value) { - int param_nid = 0; + 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) +{ if (strcmp(type, param_ctrl_string) == 0) { + int param_nid = 0; + if (!value) { return 0; } @@ -208,6 +238,25 @@ static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, default: return 0; } + } else if ((strlen(value) == 3) + && (toupper((unsigned char)value[0]) == 'T') + && (toupper((unsigned char)value[1]) == 'C')) { + switch (toupper((unsigned char)value[2])) { + case 'A': + param_nid = NID_id_tc26_gost_3410_2012_256_paramSetA; + break; + case 'B': + param_nid = NID_id_tc26_gost_3410_2012_256_paramSetB; + break; + case 'C': + param_nid = NID_id_tc26_gost_3410_2012_256_paramSetC; + break; + case 'D': + param_nid = NID_id_tc26_gost_3410_2012_256_paramSetD; + break; + default: + return 0; + } } else { R3410_ec_params *p = R3410_2001_paramset; param_nid = OBJ_txt2nid(value); @@ -228,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, @@ -237,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; @@ -252,6 +302,10 @@ static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, param_nid = NID_id_tc26_gost_3410_2012_512_paramSetB; break; + case 'C': + param_nid = NID_id_tc26_gost_3410_2012_512_paramSetC; + break; + default: return 0; } @@ -320,6 +374,8 @@ static int pkey_gost2012_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) switch (data->sign_param_nid) { case NID_id_tc26_gost_3410_2012_512_paramSetA: case NID_id_tc26_gost_3410_2012_512_paramSetB: + case NID_id_tc26_gost_3410_2012_512_paramSetC: + case NID_id_tc26_gost_3410_2012_512_paramSetTest: result = (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_512, ec)) ? 1 : 0; break; @@ -330,6 +386,10 @@ static int pkey_gost2012_paramgen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) case NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet: case NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet: case NID_id_GostR3410_2001_TestParamSet: + case NID_id_tc26_gost_3410_2012_256_paramSetA: + case NID_id_tc26_gost_3410_2012_256_paramSetB: + case NID_id_tc26_gost_3410_2012_256_paramSetC: + case NID_id_tc26_gost_3410_2012_256_paramSetD: result = (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_256, ec)) ? 1 : 0; break; @@ -448,9 +508,9 @@ static int pkey_gost_ec_cp_verify(EVP_PKEY_CTX *ctx, const unsigned char *sig, return 0; #ifdef DEBUG_SIGN fprintf(stderr, "R="); - BN_print_fp(stderr, s->r); + BN_print_fp(stderr, ECDSA_SIG_get0_r(s)); fprintf(stderr, "\nS="); - BN_print_fp(stderr, s->s); + BN_print_fp(stderr, ECDSA_SIG_get0_s(s)); fprintf(stderr, "\n"); #endif if (pub_key) @@ -521,12 +581,12 @@ static int pkey_gost_omac_init(EVP_PKEY_CTX *ctx, size_t mac_size) static int pkey_gost_magma_mac_init(EVP_PKEY_CTX *ctx) { - return pkey_gost_omac_init(ctx, 4); + return pkey_gost_omac_init(ctx, 8); } static int pkey_gost_grasshopper_mac_init(EVP_PKEY_CTX *ctx) { - return pkey_gost_omac_init(ctx, 8); + return pkey_gost_omac_init(ctx, 16); } static void pkey_gost_mac_cleanup(EVP_PKEY_CTX *ctx) @@ -536,7 +596,7 @@ static void pkey_gost_mac_cleanup(EVP_PKEY_CTX *ctx) OPENSSL_free(data); } -static int pkey_gost_mac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) +static int pkey_gost_mac_copy(EVP_PKEY_CTX *dst, ossl3_const EVP_PKEY_CTX *src) { struct gost_mac_pmeth_data *dst_data, *src_data; if (!pkey_gost_mac_init(dst)) { @@ -595,8 +655,8 @@ static int pkey_gost_mac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) case EVP_PKEY_CTRL_DIGESTINIT: { EVP_MD_CTX *mctx = p2; - struct gost_mac_key *key; if (!data->key_set) { + struct gost_mac_key *key; EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (!pkey) { GOSTerr(GOST_F_PKEY_GOST_MAC_CTRL, @@ -697,7 +757,9 @@ static int pkey_gost_omac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2, si case EVP_PKEY_CTRL_MD: { int nid = EVP_MD_type((const EVP_MD *)p2); - if (nid != NID_magma_mac && nid != NID_grasshopper_mac) { + if (nid != NID_magma_mac && nid != NID_grasshopper_mac + && nid != NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac /* FIXME beldmit */ + && nid != NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac) { GOSTerr(GOST_F_PKEY_GOST_OMAC_CTRL, GOST_R_INVALID_DIGEST_TYPE); return 0; @@ -726,8 +788,8 @@ static int pkey_gost_omac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2, si case EVP_PKEY_CTRL_DIGESTINIT: { EVP_MD_CTX *mctx = p2; - struct gost_mac_key *key; if (!data->key_set) { + struct gost_mac_key *key; EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx); if (!pkey) { GOSTerr(GOST_F_PKEY_GOST_OMAC_CTRL, @@ -930,12 +992,20 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, } EVP_MD_meth_get_ctrl(EVP_MD_CTX_md(mctx)) - (mctx, EVP_MD_CTRL_MAC_LEN, data->mac_size, NULL); + (mctx, EVP_MD_CTRL_XOF_LEN, data->mac_size, NULL); ret = EVP_DigestFinal_ex(mctx, sig, &tmpsiglen); *siglen = data->mac_size; return ret; } +/* ----------- misc callbacks -------------------------------------*/ + +/* Callback for both EVP_PKEY_check() and EVP_PKEY_public_check. */ +static int pkey_gost_check(EVP_PKEY *pkey) +{ + return EC_KEY_check_key(EVP_PKEY_get0(pkey)); +} + /* ----------------------------------------------------------------*/ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) { @@ -954,12 +1024,14 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_encrypt(*pmeth, pkey_gost_encrypt_init, - pkey_GOST_ECcp_encrypt); - EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_GOST_ECcp_decrypt); + pkey_gost_encrypt); + EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_gost_decrypt); EVP_PKEY_meth_set_derive(*pmeth, pkey_gost_derive_init, pkey_gost_ec_derive); EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2001_paramgen); + EVP_PKEY_meth_set_check(*pmeth, pkey_gost_check); + EVP_PKEY_meth_set_public_check(*pmeth, pkey_gost_check); break; case NID_id_GostR3410_2012_256: EVP_PKEY_meth_set_ctrl(*pmeth, @@ -971,13 +1043,15 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_encrypt(*pmeth, pkey_gost_encrypt_init, - pkey_GOST_ECcp_encrypt); - EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_GOST_ECcp_decrypt); + pkey_gost_encrypt); + EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_gost_decrypt); EVP_PKEY_meth_set_derive(*pmeth, pkey_gost_derive_init, pkey_gost_ec_derive); EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2012_paramgen); + EVP_PKEY_meth_set_check(*pmeth, pkey_gost_check); + EVP_PKEY_meth_set_public_check(*pmeth, pkey_gost_check); break; case NID_id_GostR3410_2012_512: EVP_PKEY_meth_set_ctrl(*pmeth, @@ -989,13 +1063,15 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_encrypt(*pmeth, pkey_gost_encrypt_init, - pkey_GOST_ECcp_encrypt); - EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_GOST_ECcp_decrypt); + pkey_gost_encrypt); + EVP_PKEY_meth_set_decrypt(*pmeth, NULL, pkey_gost_decrypt); EVP_PKEY_meth_set_derive(*pmeth, pkey_gost_derive_init, pkey_gost_ec_derive); EVP_PKEY_meth_set_paramgen(*pmeth, pkey_gost_paramgen_init, pkey_gost2012_paramgen); + EVP_PKEY_meth_set_check(*pmeth, pkey_gost_check); + EVP_PKEY_meth_set_public_check(*pmeth, pkey_gost_check); break; case NID_id_Gost28147_89_MAC: EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_mac_ctrl, @@ -1028,6 +1104,7 @@ int register_pmeth_gost(int id, EVP_PKEY_METHOD **pmeth, int flags) EVP_PKEY_meth_set_copy(*pmeth, pkey_gost_mac_copy); return 1; case NID_grasshopper_mac: + case NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac: /* FIXME beldmit */ EVP_PKEY_meth_set_ctrl(*pmeth, pkey_gost_grasshopper_mac_ctrl, pkey_gost_grasshopper_mac_ctrl_str); EVP_PKEY_meth_set_signctx(*pmeth, pkey_gost_grasshopper_mac_signctx_init,