static int pkey_gost_ec_ctrl_str_256(EVP_PKEY_CTX *ctx, const char *type, const char *value) { int param_nid = 0; if (strcmp(type, param_ctrl_string) == 0) { if (!value) { return 0; } if (strlen(value) == 1) { switch (toupper((unsigned char)value[0])) { case 'A': param_nid = NID_id_GostR3410_2001_CryptoPro_A_ParamSet; break; case 'B': param_nid = NID_id_GostR3410_2001_CryptoPro_B_ParamSet; break; case 'C': param_nid = NID_id_GostR3410_2001_CryptoPro_C_ParamSet; break; case '0': param_nid = NID_id_GostR3410_2001_TestParamSet; break; default: return 0; } } else if ((strlen(value) == 2) && (toupper((unsigned char)value[0]) == 'X')) { switch (toupper((unsigned char)value[1])) { case 'A': param_nid = NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet; break; case 'B': param_nid = NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet; break; default: return 0; } } else { R3410_ec_params *p = R3410_2001_paramset; param_nid = OBJ_txt2nid(value); if (param_nid == NID_undef) { return 0; } for (; p->nid != NID_undef; p++) { if (p->nid == param_nid) break; } if (p->nid == NID_undef) { GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_256, GOST_R_INVALID_PARAMSET); return 0; } } return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL); } return -2; }
static int pkey_gost_ec_ctrl_str_512(EVP_PKEY_CTX *ctx, const char *type, const char *value) { int param_nid = NID_undef; if (strcmp(type, param_ctrl_string)) return -2; if (!value) return 0; if (strlen(value) == 1) { switch (toupper((unsigned char)value[0])) { case 'A': param_nid = NID_id_tc26_gost_3410_2012_512_paramSetA; break; case 'B': param_nid = NID_id_tc26_gost_3410_2012_512_paramSetB; break; default: return 0; } } else { R3410_ec_params *p = R3410_2012_512_paramset; param_nid = OBJ_txt2nid(value); if (param_nid == NID_undef) return 0; while (p->nid != NID_undef && p->nid != param_nid) p++; if (p->nid == NID_undef) { GOSTerr(GOST_F_PKEY_GOST_EC_CTRL_STR_512, GOST_R_INVALID_PARAMSET); return 0; } } return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL); }
static int pkey_gost_ctrl01_str(EVP_PKEY_CTX *ctx, const char *type, const char *value) { int param_nid=0; if(!TINYCLR_SSL_STRCMP(type, param_ctrl_string)) { if (!value) { return 0; } if (TINYCLR_SSL_STRLEN(value) == 1) { switch(TINYCLR_SSL_TOUPPER(value[0])) { case 'A': param_nid = NID_id_GostR3410_2001_CryptoPro_A_ParamSet; break; case 'B': param_nid = NID_id_GostR3410_2001_CryptoPro_B_ParamSet; break; case 'C': param_nid = NID_id_GostR3410_2001_CryptoPro_C_ParamSet; break; case '0': param_nid = NID_id_GostR3410_2001_TestParamSet; break; default: return 0; break; } } else if ((TINYCLR_SSL_STRLEN(value) == 2) && (TINYCLR_SSL_TOUPPER(value[0]) == 'X')) { switch (TINYCLR_SSL_TOUPPER(value[1])) { case 'A': param_nid = NID_id_GostR3410_2001_CryptoPro_XchA_ParamSet; break; case 'B': param_nid = NID_id_GostR3410_2001_CryptoPro_XchB_ParamSet; break; default: return 0; break; } } else { R3410_2001_params *p = R3410_2001_paramset; param_nid = OBJ_txt2nid(value); if (param_nid == NID_undef) { return 0; } for (;p->nid != NID_undef;p++) { if (p->nid == param_nid) break; } if (p->nid == NID_undef) { GOSTerr(GOST_F_PKEY_GOST_CTRL01_STR, GOST_R_INVALID_PARAMSET); return 0; } } return pkey_gost_ctrl(ctx, EVP_PKEY_CTRL_GOST_PARAMSET, param_nid, NULL); } return -2; }