コード例 #1
0
ファイル: gost_pmeth.c プロジェクト: gost-engine/engine
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;
}
コード例 #2
0
ファイル: gost_pmeth.c プロジェクト: gost-engine/engine
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);
}
コード例 #3
0
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;
	}