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

📄 ec_asn1.c

📁 OpenSSL 0.9.8k 最新版OpenSSL
💻 C
📖 第 1 页 / 共 3 页
字号:
		}	if (BN_num_bits(a) > (int)field_bits + 1) /* Hasse bound */		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_INVALID_GROUP_ORDER);		goto err;		}		/* extract the cofactor (optional) */	if (params->cofactor == NULL)		{		if (b)			{			BN_free(b);			b = NULL;			}		}	else		if ((b = ASN1_INTEGER_to_BN(params->cofactor, b)) == NULL)			{			ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_ASN1_LIB);			goto err;			}	/* set the generator, order and cofactor (if present) */	if (!EC_GROUP_set_generator(ret, point, a, b))		{		ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, ERR_R_EC_LIB);		goto err;		}	ok = 1;err:	if (!ok)		{		if (ret) 			EC_GROUP_clear_free(ret);		ret = NULL;		}	if (p)			BN_free(p);	if (a)			BN_free(a);	if (b)			BN_free(b);	if (point)			EC_POINT_free(point);	return(ret);}EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *params)	{	EC_GROUP *ret=NULL;	int      tmp=0;	if (params == NULL)		{		ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, 		      EC_R_MISSING_PARAMETERS);		return NULL;		}	if (params->type == 0)		{ /* the curve is given by an OID */		tmp = OBJ_obj2nid(params->value.named_curve);		if ((ret = EC_GROUP_new_by_curve_name(tmp)) == NULL)			{			ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, 			      EC_R_EC_GROUP_NEW_BY_NAME_FAILURE);			return NULL;			}		EC_GROUP_set_asn1_flag(ret, OPENSSL_EC_NAMED_CURVE);		}	else if (params->type == 1)		{ /* the parameters are given by a ECPARAMETERS		   * structure */		ret = ec_asn1_parameters2group(params->value.parameters);		if (!ret)			{			ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, ERR_R_EC_LIB);			return NULL;			}		EC_GROUP_set_asn1_flag(ret, 0x0);		}	else if (params->type == 2)		{ /* implicitlyCA */		return NULL;		}	else		{		ECerr(EC_F_EC_ASN1_PKPARAMETERS2GROUP, EC_R_ASN1_ERROR);		return NULL;		}	return ret;	}/* EC_GROUP <-> DER encoding of ECPKPARAMETERS */EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len)	{	EC_GROUP	*group  = NULL;	ECPKPARAMETERS	*params = NULL;	if ((params = d2i_ECPKPARAMETERS(NULL, in, len)) == NULL)		{		ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_D2I_ECPKPARAMETERS_FAILURE);		ECPKPARAMETERS_free(params);		return NULL;		}		if ((group = ec_asn1_pkparameters2group(params)) == NULL)		{		ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE);		return NULL; 		}		if (a && *a)		EC_GROUP_clear_free(*a);	if (a)		*a = group;	ECPKPARAMETERS_free(params);	return(group);	}int i2d_ECPKParameters(const EC_GROUP *a, unsigned char **out)	{	int		ret=0;	ECPKPARAMETERS	*tmp = ec_asn1_group2pkparameters(a, NULL);	if (tmp == NULL)		{		ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_GROUP2PKPARAMETERS_FAILURE);		return 0;		}	if ((ret = i2d_ECPKPARAMETERS(tmp, out)) == 0)		{		ECerr(EC_F_I2D_ECPKPARAMETERS, EC_R_I2D_ECPKPARAMETERS_FAILURE);		ECPKPARAMETERS_free(tmp);		return 0;		}		ECPKPARAMETERS_free(tmp);	return(ret);	}/* some EC_KEY functions */EC_KEY *d2i_ECPrivateKey(EC_KEY **a, const unsigned char **in, long len)	{	int             ok=0;	EC_KEY          *ret=NULL;	EC_PRIVATEKEY   *priv_key=NULL;	if ((priv_key = EC_PRIVATEKEY_new()) == NULL)		{		ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE);		return NULL;		}	if ((priv_key = d2i_EC_PRIVATEKEY(&priv_key, in, len)) == NULL)		{		ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);		EC_PRIVATEKEY_free(priv_key);		return NULL;		}	if (a == NULL || *a == NULL)		{		if ((ret = EC_KEY_new()) == NULL)				{			ECerr(EC_F_D2I_ECPRIVATEKEY,                                 ERR_R_MALLOC_FAILURE);			goto err;			}		if (a)			*a = ret;		}	else		ret = *a;	if (priv_key->parameters)		{		if (ret->group)			EC_GROUP_clear_free(ret->group);		ret->group = ec_asn1_pkparameters2group(priv_key->parameters);		}	if (ret->group == NULL)		{		ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);		goto err;		}	ret->version = priv_key->version;	if (priv_key->privateKey)		{		ret->priv_key = BN_bin2bn(			M_ASN1_STRING_data(priv_key->privateKey),			M_ASN1_STRING_length(priv_key->privateKey),			ret->priv_key);		if (ret->priv_key == NULL)			{			ECerr(EC_F_D2I_ECPRIVATEKEY,                              ERR_R_BN_LIB);			goto err;			}		}	else		{		ECerr(EC_F_D2I_ECPRIVATEKEY,                       EC_R_MISSING_PRIVATE_KEY);		goto err;		}	if (priv_key->publicKey)		{		const unsigned char *pub_oct;		size_t pub_oct_len;		if (ret->pub_key)			EC_POINT_clear_free(ret->pub_key);		ret->pub_key = EC_POINT_new(ret->group);		if (ret->pub_key == NULL)			{			ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);			goto err;			}		pub_oct     = M_ASN1_STRING_data(priv_key->publicKey);		pub_oct_len = M_ASN1_STRING_length(priv_key->publicKey);		/* save the point conversion form */		ret->conv_form = (point_conversion_form_t)(pub_oct[0] & ~0x01);		if (!EC_POINT_oct2point(ret->group, ret->pub_key,			pub_oct, pub_oct_len, NULL))			{			ECerr(EC_F_D2I_ECPRIVATEKEY, ERR_R_EC_LIB);			goto err;			}		}	ok = 1;err:	if (!ok)		{		if (ret)			EC_KEY_free(ret);		ret = NULL;		}	if (priv_key)		EC_PRIVATEKEY_free(priv_key);	return(ret);	}int	i2d_ECPrivateKey(EC_KEY *a, unsigned char **out)	{	int             ret=0, ok=0;	unsigned char   *buffer=NULL;	size_t          buf_len=0, tmp_len;	EC_PRIVATEKEY   *priv_key=NULL;	if (a == NULL || a->group == NULL || a->priv_key == NULL)		{		ECerr(EC_F_I2D_ECPRIVATEKEY,                      ERR_R_PASSED_NULL_PARAMETER);		goto err;		}	if ((priv_key = EC_PRIVATEKEY_new()) == NULL)		{		ECerr(EC_F_I2D_ECPRIVATEKEY,                      ERR_R_MALLOC_FAILURE);		goto err;		}	priv_key->version = a->version;	buf_len = (size_t)BN_num_bytes(a->priv_key);	buffer = OPENSSL_malloc(buf_len);	if (buffer == NULL)		{		ECerr(EC_F_I2D_ECPRIVATEKEY,                      ERR_R_MALLOC_FAILURE);		goto err;		}		if (!BN_bn2bin(a->priv_key, buffer))		{		ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_BN_LIB);		goto err;		}	if (!M_ASN1_OCTET_STRING_set(priv_key->privateKey, buffer, buf_len))		{		ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB);		goto err;		}		if (!(a->enc_flag & EC_PKEY_NO_PARAMETERS))		{		if ((priv_key->parameters = ec_asn1_group2pkparameters(			a->group, priv_key->parameters)) == NULL)			{			ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB);			goto err;			}		}	if (!(a->enc_flag & EC_PKEY_NO_PUBKEY))		{		priv_key->publicKey = M_ASN1_BIT_STRING_new();		if (priv_key->publicKey == NULL)			{			ECerr(EC_F_I2D_ECPRIVATEKEY,				ERR_R_MALLOC_FAILURE);			goto err;			}		tmp_len = EC_POINT_point2oct(a->group, a->pub_key, 				a->conv_form, NULL, 0, NULL);		if (tmp_len > buf_len)			{			unsigned char *tmp_buffer = OPENSSL_realloc(buffer, tmp_len);			if (!tmp_buffer)				{				ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_MALLOC_FAILURE);				goto err;				}			buffer = tmp_buffer;			buf_len = tmp_len;			}		if (!EC_POINT_point2oct(a->group, a->pub_key, 			a->conv_form, buffer, buf_len, NULL))			{			ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB);			goto err;			}		priv_key->publicKey->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);		priv_key->publicKey->flags |= ASN1_STRING_FLAG_BITS_LEFT;		if (!M_ASN1_BIT_STRING_set(priv_key->publicKey, buffer, 				buf_len))			{			ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_ASN1_LIB);			goto err;			}		}	if ((ret = i2d_EC_PRIVATEKEY(priv_key, out)) == 0)		{		ECerr(EC_F_I2D_ECPRIVATEKEY, ERR_R_EC_LIB);		goto err;		}	ok=1;err:	if (buffer)		OPENSSL_free(buffer);	if (priv_key)		EC_PRIVATEKEY_free(priv_key);	return(ok?ret:0);	}int i2d_ECParameters(EC_KEY *a, unsigned char **out)	{	if (a == NULL)		{		ECerr(EC_F_I2D_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER);		return 0;		}	return i2d_ECPKParameters(a->group, out);	}EC_KEY *d2i_ECParameters(EC_KEY **a, const unsigned char **in, long len)	{	EC_KEY   *ret;	if (in == NULL || *in == NULL)		{		ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_PASSED_NULL_PARAMETER);		return NULL;		}	if (a == NULL || *a == NULL)		{		if ((ret = EC_KEY_new()) == NULL)			{			ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_MALLOC_FAILURE);			return NULL;			}		if (a)			*a = ret;		}	else		ret = *a;	if (!d2i_ECPKParameters(&ret->group, in, len))		{		ECerr(EC_F_D2I_ECPARAMETERS, ERR_R_EC_LIB);		return NULL;		}	return ret;	}EC_KEY *o2i_ECPublicKey(EC_KEY **a, const unsigned char **in, long len)	{	EC_KEY *ret=NULL;	if (a == NULL || (*a) == NULL || (*a)->group == NULL)		{		/* sorry, but a EC_GROUP-structur is necessary                 * to set the public key */		ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER);		return 0;		}	ret = *a;	if (ret->pub_key == NULL && 		(ret->pub_key = EC_POINT_new(ret->group)) == NULL)		{		ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_MALLOC_FAILURE);		return 0;		}	if (!EC_POINT_oct2point(ret->group, ret->pub_key, *in, len, NULL))		{		ECerr(EC_F_O2I_ECPUBLICKEY, ERR_R_EC_LIB);		return 0;		}	/* save the point conversion form */	ret->conv_form = (point_conversion_form_t)(*in[0] & ~0x01);	*in += len;	return ret;	}int i2o_ECPublicKey(EC_KEY *a, unsigned char **out)	{        size_t buf_len=0;	int new_buffer = 0;        if (a == NULL) 		{		ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_PASSED_NULL_PARAMETER);		return 0;		}        buf_len = EC_POINT_point2oct(a->group, a->pub_key,                               a->conv_form, NULL, 0, NULL);	if (out == NULL || buf_len == 0)	/* out == NULL => just return the length of the octet string */		return buf_len;	if (*out == NULL)		{		if ((*out = OPENSSL_malloc(buf_len)) == NULL)			{			ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_MALLOC_FAILURE);			return 0;			}		new_buffer = 1;		}        if (!EC_POINT_point2oct(a->group, a->pub_key, a->conv_form,				*out, buf_len, NULL))		{		ECerr(EC_F_I2O_ECPUBLICKEY, ERR_R_EC_LIB);		OPENSSL_free(*out);		*out = NULL;		return 0;		}	if (!new_buffer)		*out += buf_len;	return buf_len;	}

⌨️ 快捷键说明

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