X-Git-Url: http://wagner.pp.ru/gitweb/?a=blobdiff_plain;f=gost_pmeth.c;h=d4364e498db66eb68225abb67b5d270ad9f60001;hb=b629c446ff7246e526999bfdd2657e774faf306f;hp=2f3d7119b7b6e19c12a194021822ceed5039b691;hpb=c62cbdc744945d029bad90eb43cde5449bc1fa48;p=openssl-gost%2Fengine.git diff --git a/gost_pmeth.c b/gost_pmeth.c index 2f3d711..d4364e4 100644 --- a/gost_pmeth.c +++ b/gost_pmeth.c @@ -208,6 +208,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); @@ -252,6 +271,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 +343,7 @@ 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: result = (EVP_PKEY_assign(pkey, NID_id_GostR3410_2012_512, ec)) ? 1 : 0; break; @@ -330,6 +354,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 +476,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) @@ -938,6 +966,14 @@ static int pkey_gost_mac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, 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) { @@ -962,6 +998,8 @@ 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); + 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, @@ -980,6 +1018,8 @@ 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); + 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, @@ -998,6 +1038,8 @@ 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); + 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,