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

📄 ec_asn1.c

📁 OpenSSL 0.9.8k 最新版OpenSSL
💻 C
📖 第 1 页 / 共 3 页
字号:
/* crypto/ec/ec_asn1.c *//* * Written by Nils Larsch for the OpenSSL project. *//* ==================================================================== * Copyright (c) 2000-2003 The OpenSSL Project.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer.  * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. All advertising materials mentioning features or use of this *    software must display the following acknowledgment: *    "This product includes software developed by the OpenSSL Project *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" * * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to *    endorse or promote products derived from this software without *    prior written permission. For written permission, please contact *    licensing@OpenSSL.org. * * 5. Products derived from this software may not be called "OpenSSL" *    nor may "OpenSSL" appear in their names without prior written *    permission of the OpenSSL Project. * * 6. Redistributions of any form whatsoever must retain the following *    acknowledgment: *    "This product includes software developed by the OpenSSL Project *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" * * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This product includes cryptographic software written by Eric Young * (eay@cryptsoft.com).  This product includes software written by Tim * Hudson (tjh@cryptsoft.com). * */#include <string.h>#include "ec_lcl.h"#include <openssl/err.h>#include <openssl/asn1t.h>#include <openssl/objects.h>int EC_GROUP_get_basis_type(const EC_GROUP *group)	{	int i=0;	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=		NID_X9_62_characteristic_two_field)		/* everything else is currently not supported */		return 0;	while (group->poly[i] != 0)		i++;	if (i == 4)		return NID_X9_62_ppBasis;	else if (i == 2)		return NID_X9_62_tpBasis;	else		/* everything else is currently not supported */		return 0;	}int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k)	{	if (group == NULL)		return 0;	if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve	    || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0)))		{		ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);		return 0;		}	if (k)		*k = group->poly[1];	return 1;	}int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1,	unsigned int *k2, unsigned int *k3)	{	if (group == NULL)		return 0;	if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve	    || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0)))		{		ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);		return 0;		}	if (k1)		*k1 = group->poly[3];	if (k2)		*k2 = group->poly[2];	if (k3)		*k3 = group->poly[1];	return 1;	}/* some structures needed for the asn1 encoding */typedef struct x9_62_pentanomial_st {	long k1;	long k2;	long k3;	} X9_62_PENTANOMIAL;typedef struct x9_62_characteristic_two_st {	long m;	ASN1_OBJECT  *type;	union	{		char *ptr;		/* NID_X9_62_onBasis */		ASN1_NULL    *onBasis;		/* NID_X9_62_tpBasis */		ASN1_INTEGER *tpBasis;		/* NID_X9_62_ppBasis */		X9_62_PENTANOMIAL *ppBasis;		/* anything else */		ASN1_TYPE *other;		} p;	} X9_62_CHARACTERISTIC_TWO;typedef struct x9_62_fieldid_st {        ASN1_OBJECT *fieldType;	union	{		char *ptr;		/* NID_X9_62_prime_field */		ASN1_INTEGER *prime;		/* NID_X9_62_characteristic_two_field */		X9_62_CHARACTERISTIC_TWO *char_two;		/* anything else */		ASN1_TYPE *other;		} p;	} X9_62_FIELDID;typedef struct x9_62_curve_st {        ASN1_OCTET_STRING *a;        ASN1_OCTET_STRING *b;        ASN1_BIT_STRING   *seed;        } X9_62_CURVE;typedef struct ec_parameters_st {        long              version;        X9_62_FIELDID     *fieldID;        X9_62_CURVE       *curve;        ASN1_OCTET_STRING *base;        ASN1_INTEGER      *order;        ASN1_INTEGER      *cofactor;        } ECPARAMETERS;struct ecpk_parameters_st {	int	type;	union {		ASN1_OBJECT  *named_curve;		ECPARAMETERS *parameters;		ASN1_NULL    *implicitlyCA;	} value;	}/* ECPKPARAMETERS */;/* SEC1 ECPrivateKey */typedef struct ec_privatekey_st {	long              version;	ASN1_OCTET_STRING *privateKey;        ECPKPARAMETERS    *parameters;	ASN1_BIT_STRING   *publicKey;	} EC_PRIVATEKEY;/* the OpenSSL ASN.1 definitions */ASN1_SEQUENCE(X9_62_PENTANOMIAL) = {	ASN1_SIMPLE(X9_62_PENTANOMIAL, k1, LONG),	ASN1_SIMPLE(X9_62_PENTANOMIAL, k2, LONG),	ASN1_SIMPLE(X9_62_PENTANOMIAL, k3, LONG)} ASN1_SEQUENCE_END(X9_62_PENTANOMIAL)DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL)IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_PENTANOMIAL)ASN1_ADB_TEMPLATE(char_two_def) = ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.other, ASN1_ANY);ASN1_ADB(X9_62_CHARACTERISTIC_TWO) = {	ADB_ENTRY(NID_X9_62_onBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.onBasis, ASN1_NULL)),	ADB_ENTRY(NID_X9_62_tpBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.tpBasis, ASN1_INTEGER)),	ADB_ENTRY(NID_X9_62_ppBasis, ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, p.ppBasis, X9_62_PENTANOMIAL))} ASN1_ADB_END(X9_62_CHARACTERISTIC_TWO, 0, type, 0, &char_two_def_tt, NULL);ASN1_SEQUENCE(X9_62_CHARACTERISTIC_TWO) = {	ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, m, LONG),	ASN1_SIMPLE(X9_62_CHARACTERISTIC_TWO, type, ASN1_OBJECT),	ASN1_ADB_OBJECT(X9_62_CHARACTERISTIC_TWO)} ASN1_SEQUENCE_END(X9_62_CHARACTERISTIC_TWO)DECLARE_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO)IMPLEMENT_ASN1_ALLOC_FUNCTIONS(X9_62_CHARACTERISTIC_TWO)ASN1_ADB_TEMPLATE(fieldID_def) = ASN1_SIMPLE(X9_62_FIELDID, p.other, ASN1_ANY);ASN1_ADB(X9_62_FIELDID) = {	ADB_ENTRY(NID_X9_62_prime_field, ASN1_SIMPLE(X9_62_FIELDID, p.prime, ASN1_INTEGER)),	ADB_ENTRY(NID_X9_62_characteristic_two_field, ASN1_SIMPLE(X9_62_FIELDID, p.char_two, X9_62_CHARACTERISTIC_TWO))} ASN1_ADB_END(X9_62_FIELDID, 0, fieldType, 0, &fieldID_def_tt, NULL);ASN1_SEQUENCE(X9_62_FIELDID) = {	ASN1_SIMPLE(X9_62_FIELDID, fieldType, ASN1_OBJECT),	ASN1_ADB_OBJECT(X9_62_FIELDID)} ASN1_SEQUENCE_END(X9_62_FIELDID)ASN1_SEQUENCE(X9_62_CURVE) = {	ASN1_SIMPLE(X9_62_CURVE, a, ASN1_OCTET_STRING),	ASN1_SIMPLE(X9_62_CURVE, b, ASN1_OCTET_STRING),	ASN1_OPT(X9_62_CURVE, seed, ASN1_BIT_STRING)} ASN1_SEQUENCE_END(X9_62_CURVE)ASN1_SEQUENCE(ECPARAMETERS) = {	ASN1_SIMPLE(ECPARAMETERS, version, LONG),	ASN1_SIMPLE(ECPARAMETERS, fieldID, X9_62_FIELDID),	ASN1_SIMPLE(ECPARAMETERS, curve, X9_62_CURVE),	ASN1_SIMPLE(ECPARAMETERS, base, ASN1_OCTET_STRING),	ASN1_SIMPLE(ECPARAMETERS, order, ASN1_INTEGER),	ASN1_OPT(ECPARAMETERS, cofactor, ASN1_INTEGER)} ASN1_SEQUENCE_END(ECPARAMETERS)DECLARE_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS)IMPLEMENT_ASN1_ALLOC_FUNCTIONS(ECPARAMETERS)ASN1_CHOICE(ECPKPARAMETERS) = {	ASN1_SIMPLE(ECPKPARAMETERS, value.named_curve, ASN1_OBJECT),	ASN1_SIMPLE(ECPKPARAMETERS, value.parameters, ECPARAMETERS),	ASN1_SIMPLE(ECPKPARAMETERS, value.implicitlyCA, ASN1_NULL)} ASN1_CHOICE_END(ECPKPARAMETERS)DECLARE_ASN1_FUNCTIONS_const(ECPKPARAMETERS)DECLARE_ASN1_ENCODE_FUNCTIONS_const(ECPKPARAMETERS, ECPKPARAMETERS)IMPLEMENT_ASN1_FUNCTIONS_const(ECPKPARAMETERS)ASN1_SEQUENCE(EC_PRIVATEKEY) = {	ASN1_SIMPLE(EC_PRIVATEKEY, version, LONG),	ASN1_SIMPLE(EC_PRIVATEKEY, privateKey, ASN1_OCTET_STRING),	ASN1_EXP_OPT(EC_PRIVATEKEY, parameters, ECPKPARAMETERS, 0),	ASN1_EXP_OPT(EC_PRIVATEKEY, publicKey, ASN1_BIT_STRING, 1)} ASN1_SEQUENCE_END(EC_PRIVATEKEY)DECLARE_ASN1_FUNCTIONS_const(EC_PRIVATEKEY)DECLARE_ASN1_ENCODE_FUNCTIONS_const(EC_PRIVATEKEY, EC_PRIVATEKEY)IMPLEMENT_ASN1_FUNCTIONS_const(EC_PRIVATEKEY)/* some declarations of internal function *//* ec_asn1_group2field() sets the values in a X9_62_FIELDID object */ static int ec_asn1_group2fieldid(const EC_GROUP *, X9_62_FIELDID *);/* ec_asn1_group2curve() sets the values in a X9_62_CURVE object */ static int ec_asn1_group2curve(const EC_GROUP *, X9_62_CURVE *);/* ec_asn1_parameters2group() creates a EC_GROUP object from a * ECPARAMETERS object */static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *); /* ec_asn1_group2parameters() creates a ECPARAMETERS object from a  * EC_GROUP object */static ECPARAMETERS *ec_asn1_group2parameters(const EC_GROUP *,ECPARAMETERS *);/* ec_asn1_pkparameters2group() creates a EC_GROUP object from a * ECPKPARAMETERS object */static EC_GROUP *ec_asn1_pkparameters2group(const ECPKPARAMETERS *); /* ec_asn1_group2pkparameters() creates a ECPKPARAMETERS object from a  * EC_GROUP object */static ECPKPARAMETERS *ec_asn1_group2pkparameters(const EC_GROUP *, 	ECPKPARAMETERS *);/* the function definitions */static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field)	{	int			ok=0, nid;	BIGNUM			*tmp = NULL;		if (group == NULL || field == NULL)		return 0;	/* clear the old values (if necessary) */	if (field->fieldType != NULL)		ASN1_OBJECT_free(field->fieldType);	if (field->p.other != NULL)		ASN1_TYPE_free(field->p.other);	nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group));	/* set OID for the field */	if ((field->fieldType = OBJ_nid2obj(nid)) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB);		goto err;		}	if (nid == NID_X9_62_prime_field)		{		if ((tmp = BN_new()) == NULL) 			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);			goto err;			}		/* the parameters are specified by the prime number p */		if (!EC_GROUP_get_curve_GFp(group, tmp, NULL, NULL, NULL))			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB);			goto err;			}		/* set the prime number */		field->p.prime = BN_to_ASN1_INTEGER(tmp,NULL);		if (field->p.prime == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_ASN1_LIB);			goto err;			}		}	else	/* nid == NID_X9_62_characteristic_two_field */		{		int		field_type;		X9_62_CHARACTERISTIC_TWO *char_two;		field->p.char_two = X9_62_CHARACTERISTIC_TWO_new();		char_two = field->p.char_two;		if (char_two == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);			goto err;			}			char_two->m = (long)EC_GROUP_get_degree(group);		field_type = EC_GROUP_get_basis_type(group);		if (field_type == 0)			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_EC_LIB);			goto err;			}		/* set base type OID */		if ((char_two->type = OBJ_nid2obj(field_type)) == NULL)			{			ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_OBJ_LIB);			goto err;			}		if (field_type == NID_X9_62_tpBasis)			{			unsigned int k;			if (!EC_GROUP_get_trinomial_basis(group, &k))				goto err;			char_two->p.tpBasis = ASN1_INTEGER_new();			if (!char_two->p.tpBasis)				{				ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);				goto err;				}			if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long)k))				{				ECerr(EC_F_EC_ASN1_GROUP2FIELDID,					ERR_R_ASN1_LIB);				goto err;				}			}		else if (field_type == NID_X9_62_ppBasis)			{			unsigned int k1, k2, k3;			if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3))				goto err;			char_two->p.ppBasis = X9_62_PENTANOMIAL_new();			if (!char_two->p.ppBasis)				{				ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);				goto err;				}			/* set k? values */			char_two->p.ppBasis->k1 = (long)k1;			char_two->p.ppBasis->k2 = (long)k2;			char_two->p.ppBasis->k3 = (long)k3;			}		else /* field_type == NID_X9_62_onBasis */			{			/* for ONB the parameters are (asn1) NULL */			char_two->p.onBasis = ASN1_NULL_new();			if (!char_two->p.onBasis)				{				ECerr(EC_F_EC_ASN1_GROUP2FIELDID, ERR_R_MALLOC_FAILURE);				goto err;				}			}		}	ok = 1;err :	if (tmp)		BN_free(tmp);	return(ok);}static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)	{	int           ok=0, nid;	BIGNUM        *tmp_1=NULL, *tmp_2=NULL;	unsigned char *buffer_1=NULL, *buffer_2=NULL,	              *a_buf=NULL, *b_buf=NULL;	size_t        len_1, len_2;	unsigned char char_zero = 0;	if (!group || !curve || !curve->a || !curve->b)		return 0;	if ((tmp_1 = BN_new()) == NULL || (tmp_2 = BN_new()) == NULL)		{		ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_MALLOC_FAILURE);		goto err;		}	nid = EC_METHOD_get_field_type(EC_GROUP_method_of(group));	/* get a and b */	if (nid == NID_X9_62_prime_field)		{		if (!EC_GROUP_get_curve_GFp(group, NULL, tmp_1, tmp_2, NULL))			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB);			goto err;			}		}	else	/* nid == NID_X9_62_characteristic_two_field */		{		if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL))			{			ECerr(EC_F_EC_ASN1_GROUP2CURVE, ERR_R_EC_LIB);			goto err;			}		}	len_1 = (size_t)BN_num_bytes(tmp_1);	len_2 = (size_t)BN_num_bytes(tmp_2);	if (len_1 == 0)		{		/* len_1 == 0 => a == 0 */		a_buf = &char_zero;		len_1 = 1;		}	else

⌨️ 快捷键说明

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