⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ec_asn1.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 3 页
字号:
		{		if ((buffer_1 = OPENSSL_malloc(len_1)) == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE,			      ERR_R_MALLOC_FAILURE);			goto err;			}		if ( (len_1 = BN_bn2bin(tmp_1, buffer_1)) == 0)			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB);			goto err;			}		a_buf = buffer_1;		}	if (len_2 == 0)		{		/* len_2 == 0 => b == 0 */		b_buf = &char_zero;		len_2 = 1;		}	else		{		if ((buffer_2 = OPENSSL_malloc(len_2)) == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE,			      ERR_R_MALLOC_FAILURE);			goto err;			}		if ( (len_2 = BN_bn2bin(tmp_2, buffer_2)) == 0)			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_BN_LIB);			goto err;			}		b_buf = buffer_2;		}		/* set a and b */	if (!M_ASN1_OCTET_STRING_set(curve->a, a_buf, len_1) ||	    !M_ASN1_OCTET_STRING_set(curve->b, b_buf, len_2))		{		ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB);		goto err;		}		/* set the seed (optional) */	if (group->seed)		{			if (!curve->seed)			if ((curve->seed = ASN1_BIT_STRING_new()) == NULL)				{				ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);				goto err;				}		curve->seed->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);		curve->seed->flags |= ASN1_STRING_FLAG_BITS_LEFT;		if (!ASN1_BIT_STRING_set(curve->seed, group->seed, 		                         (int)group->seed_len))			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_ASN1_LIB);			goto err;			}		}	else		{		if (curve->seed)			{			ASN1_BIT_STRING_free(curve->seed);			curve->seed = NULL;			}		}	ok = 1;err:	if (buffer_1)		OPENSSL_free(buffer_1);	if (buffer_2)		OPENSSL_free(buffer_2);	if (tmp_1)		BN_free(tmp_1);	if (tmp_2)		BN_free(tmp_2);	return(ok);	}static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *group,                                              ECPARAMETERS *param)	{	int	ok=0;	size_t  len=0;	ECPARAMETERS   *ret=NULL;	BIGNUM	       *tmp=NULL;	unsigned char  *buffer=NULL;	const EC_POINT *point=NULL;	point_conversion_form_t form;	if ((tmp = BN_new()) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);		goto err;		}	if (param == NULL)	{		if ((ret = ECPARAMETERS_new()) == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, 			      ERR_R_MALLOC_FAILURE);			goto err;			}	}	else		ret = param;	/* set the version (always one) */	ret->version = (long)0x1;	/* set the fieldID */	if (!ec_asn1_group2fieldid(group, ret->fieldID))		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);		goto err;		}	/* set the curve */	if (!ec_asn1_group2curve(group, ret->curve))		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);		goto err;		}	/* set the base point */	if ((point = EC_GROUP_get0_generator(group)) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, EC_R_UNDEFINED_GENERATOR);		goto err;		}	form = EC_GROUP_get_point_conversion_form(group);	len = EC_POINT_point2oct(group, point, form, NULL, len, NULL);	if (len == 0)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);		goto err;		}	if ((buffer = OPENSSL_malloc(len)) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);		goto err;		}	if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL))		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);		goto err;		}	if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_MALLOC_FAILURE);		goto err;		}	if (!ASN1_OCTET_STRING_set(ret->base, buffer, len))		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB);		goto err;		}	/* set the order */	if (!EC_GROUP_get_order(group, tmp, NULL))		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_EC_LIB);		goto err;		}	ret->order = BN_to_ASN1_INTEGER(tmp, ret->order);	if (ret->order == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB);		goto err;		}	/* set the cofactor (optional) */	if (EC_GROUP_get_cofactor(group, tmp, NULL))		{		ret->cofactor = BN_to_ASN1_INTEGER(tmp, ret->cofactor);		if (ret->cofactor == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB);			goto err;			}		}	ok = 1;err :	if(!ok)		{		if (ret && !param)			ECPARAMETERS_free(ret);		ret = NULL;		}	if (tmp)		BN_free(tmp);	if (buffer)		OPENSSL_free(buffer);	return(ret);	}ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *group,                                            ECPKPARAMETERS *params)	{	int            ok = 1, tmp;	ECPKPARAMETERS *ret = params;	if (ret == NULL)		{		if ((ret = ECPKPARAMETERS_new()) == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2PKPARAMETERS, 			      ERR_R_MALLOC_FAILURE);			return NULL;			}		}	else		{		if (ret->type == 0 && ret->value.named_curve)			ASN1_OBJECT_free(ret->value.named_curve);		else if (ret->type == 1 && ret->value.parameters)			ECPARAMETERS_free(ret->value.parameters);		}	if (EC_GROUP_get_asn1_flag(group))		{		/* use the asn1 OID to describe the		 * the elliptic curve parameters		 */		tmp = EC_GROUP_get_curve_name(group);		if (tmp)			{			ret->type = 0;			if ((ret->value.named_curve = OBJ_nid2obj(tmp)) == NULL)				ok = 0;			}		else			/* we don't kmow the nid => ERROR */			ok = 0;		}	else		{			/* use the ECPARAMETERS structure */		ret->type = 1;		if ((ret->value.parameters = ec_asn1_group2parameters(		     group, NULL)) == NULL)			ok = 0;		}	if (!ok)		{		ECPKPARAMETERS_free(ret);		return NULL;		}	return ret;	}static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)	{	int			ok = 0, tmp;	EC_GROUP		*ret = NULL;	BIGNUM			*p = NULL, *a = NULL, *b = NULL;	EC_POINT		*point=NULL;	long    		field_bits;	if (!params->fieldID || !params->fieldID->fieldType || 	    !params->fieldID->p.ptr)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);		goto err;		}	/* now extract the curve parameters a and b */	if (!params->curve || !params->curve->a || 	    !params->curve->a->data || !params->curve->b ||	    !params->curve->b->data)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);		goto err;		}	a = BN_bin2bn(params->curve->a->data, params->curve->a->length, NULL);	if (a == NULL)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB);		goto err;		}	b = BN_bin2bn(params->curve->b->data, params->curve->b->length, NULL);	if (b == NULL)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_BN_LIB);		goto err;		}	/* get the field parameters */	tmp = OBJ_obj2nid(params->fieldID->fieldType);	if (tmp == NID_X9_62_characteristic_two_field)		{		X9_62_CHARACTERISTIC_TWO *char_two;		char_two = params->fieldID->p.char_two;		field_bits = char_two->m;		if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE);			goto err;			}		if ((p = BN_new()) == NULL)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_MALLOC_FAILURE);			goto err;			}		/* get the base type */		tmp = OBJ_obj2nid(char_two->type);		if (tmp ==  NID_X9_62_tpBasis)			{			long tmp_long;			if (!char_two->p.tpBasis)				{				ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);				goto err;				}			tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis);			if (!(char_two->m > tmp_long && tmp_long > 0))				{				ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_TRINOMIAL_BASIS);				goto err;				}						/* create the polynomial */			if (!BN_set_bit(p, (int)char_two->m))				goto err;			if (!BN_set_bit(p, (int)tmp_long))				goto err;			if (!BN_set_bit(p, 0))				goto err;			}		else if (tmp == NID_X9_62_ppBasis)			{			X9_62_PENTANOMIAL *penta;			penta = char_two->p.ppBasis;			if (!penta)				{				ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);				goto err;				}			if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0))				{				ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_PENTANOMIAL_BASIS);				goto err;				}						/* create the polynomial */			if (!BN_set_bit(p, (int)char_two->m)) goto err;			if (!BN_set_bit(p, (int)penta->k1)) goto err;			if (!BN_set_bit(p, (int)penta->k2)) goto err;			if (!BN_set_bit(p, (int)penta->k3)) goto err;			if (!BN_set_bit(p, 0)) goto err;			}		else if (tmp == NID_X9_62_onBasis)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_NOT_IMPLEMENTED);			goto err;			}		else /* error */			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);			goto err;			}		/* create the EC_GROUP structure */		ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL);		}	else if (tmp == NID_X9_62_prime_field)		{		/* we have a curve over a prime field */		/* extract the prime number */		if (!params->fieldID->p.prime)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);			goto err;			}		p = ASN1_INTEGER_to_BN(params->fieldID->p.prime, NULL);		if (p == NULL)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);			goto err;			}		if (BN_is_negative(p) || BN_is_zero(p))			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD);			goto err;			}		field_bits = BN_num_bits(p);		if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_FIELD_TOO_LARGE);			goto err;			}		/* create the EC_GROUP structure */		ret = EC_GROUP_new_curve_GFp(p, a, b, NULL);		}	else		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_FIELD);		goto err;		}	if (ret == NULL)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB);		goto err;		}	/* extract seed (optional) */	if (params->curve->seed != NULL)		{		if (ret->seed != NULL)			OPENSSL_free(ret->seed);		if (!(ret->seed = OPENSSL_malloc(params->curve->seed->length)))			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, 			      ERR_R_MALLOC_FAILURE);			goto err;			}		memcpy(ret->seed, params->curve->seed->data, 		       params->curve->seed->length);		ret->seed_len = params->curve->seed->length;		}	if (!params->order || !params->base || !params->base->data)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_ASN1_ERROR);		goto err;		}	if ((point = EC_POINT_new(ret)) == NULL) goto err;	/* set the point conversion form */	EC_GROUP_set_point_conversion_form(ret, (point_conversion_form_t)				(params->base->data[0] & ~0x01));	/* extract the ec point */	if (!EC_POINT_oct2point(ret, point, params->base->data, 		                params->base->length, NULL))		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB);		goto err;		}	/* extract the order */	if ((a = ASN1_INTEGER_to_BN(params->order, a)) == NULL)		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);		goto err;		}	if (BN_is_negative(a) || BN_is_zero(a))		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);		goto err;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -