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

📄 asn1_gen.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 2 页
字号:
			return 0;			break;			}		}	else		*pclass = V_ASN1_CONTEXT_SPECIFIC;	return 1;	}/* Handle multiple types: SET and SEQUENCE */static ASN1_TYPE *asn1_multi(int utype, const char *section, X509V3_CTX *cnf)	{	ASN1_TYPE *ret = NULL, *typ = NULL;	STACK_OF(ASN1_TYPE) *sk = NULL;	STACK_OF(CONF_VALUE) *sect = NULL;	unsigned char *der = NULL, *p;	int derlen;	int i, is_set;	sk = sk_ASN1_TYPE_new_null();	if (section)		{		if (!cnf)			goto bad;		sect = X509V3_get_section(cnf, (char *)section);		if (!sect)			goto bad;		for (i = 0; i < sk_CONF_VALUE_num(sect); i++)			{			typ = ASN1_generate_v3(sk_CONF_VALUE_value(sect, i)->value, cnf);			if (!typ)				goto bad;			sk_ASN1_TYPE_push(sk, typ);			typ = NULL;			}		}	/* Now we has a STACK of the components, convert to the correct form */	if (utype == V_ASN1_SET)		is_set = 1;	else		is_set = 0;	derlen = i2d_ASN1_SET_OF_ASN1_TYPE(sk, NULL, i2d_ASN1_TYPE, utype,					   V_ASN1_UNIVERSAL, is_set);	der = OPENSSL_malloc(derlen);	p = der;	i2d_ASN1_SET_OF_ASN1_TYPE(sk, &p, i2d_ASN1_TYPE, utype,				  V_ASN1_UNIVERSAL, is_set);	if (!(ret = ASN1_TYPE_new()))		goto bad;	if (!(ret->value.asn1_string = ASN1_STRING_type_new(utype)))		goto bad;	ret->type = utype;	ret->value.asn1_string->data = der;	ret->value.asn1_string->length = derlen;	der = NULL;	bad:	if (der)		OPENSSL_free(der);	if (sk)		sk_ASN1_TYPE_pop_free(sk, ASN1_TYPE_free);	if (typ)		ASN1_TYPE_free(typ);	if (sect)		X509V3_section_free(cnf, sect);	return ret;	}static int append_exp(tag_exp_arg *arg, int exp_tag, int exp_class, int exp_constructed, int exp_pad, int imp_ok)	{	tag_exp_type *exp_tmp;	/* Can only have IMPLICIT if permitted */	if ((arg->imp_tag != -1) && !imp_ok)		{		ASN1err(ASN1_F_APPEND_EXP, ASN1_R_ILLEGAL_IMPLICIT_TAG);		return 0;		}	if (arg->exp_count == ASN1_FLAG_EXP_MAX)		{		ASN1err(ASN1_F_APPEND_EXP, ASN1_R_DEPTH_EXCEEDED);		return 0;		}	exp_tmp = &arg->exp_list[arg->exp_count++];	/* If IMPLICIT set tag to implicit value then	 * reset implicit tag since it has been used.	 */	if (arg->imp_tag != -1)		{		exp_tmp->exp_tag = arg->imp_tag;		exp_tmp->exp_class = arg->imp_class;		arg->imp_tag = -1;		arg->imp_class = -1;		}	else		{		exp_tmp->exp_tag = exp_tag;		exp_tmp->exp_class = exp_class;		}	exp_tmp->exp_constructed = exp_constructed;	exp_tmp->exp_pad = exp_pad;	return 1;	}static int asn1_str2tag(const char *tagstr, int len)	{	unsigned int i;	static struct tag_name_st *tntmp, tnst [] = {		ASN1_GEN_STR("BOOL", V_ASN1_BOOLEAN),		ASN1_GEN_STR("BOOLEAN", V_ASN1_BOOLEAN),		ASN1_GEN_STR("NULL", V_ASN1_NULL),		ASN1_GEN_STR("INT", V_ASN1_INTEGER),		ASN1_GEN_STR("INTEGER", V_ASN1_INTEGER),		ASN1_GEN_STR("ENUM", V_ASN1_ENUMERATED),		ASN1_GEN_STR("ENUMERATED", V_ASN1_ENUMERATED),		ASN1_GEN_STR("OID", V_ASN1_OBJECT),		ASN1_GEN_STR("OBJECT", V_ASN1_OBJECT),		ASN1_GEN_STR("UTCTIME", V_ASN1_UTCTIME),		ASN1_GEN_STR("UTC", V_ASN1_UTCTIME),		ASN1_GEN_STR("GENERALIZEDTIME", V_ASN1_GENERALIZEDTIME),		ASN1_GEN_STR("GENTIME", V_ASN1_GENERALIZEDTIME),		ASN1_GEN_STR("OCT", V_ASN1_OCTET_STRING),		ASN1_GEN_STR("OCTETSTRING", V_ASN1_OCTET_STRING),		ASN1_GEN_STR("BITSTR", V_ASN1_BIT_STRING),		ASN1_GEN_STR("BITSTRING", V_ASN1_BIT_STRING),		ASN1_GEN_STR("UNIVERSALSTRING", V_ASN1_UNIVERSALSTRING),		ASN1_GEN_STR("UNIV", V_ASN1_UNIVERSALSTRING),		ASN1_GEN_STR("IA5", V_ASN1_IA5STRING),		ASN1_GEN_STR("IA5STRING", V_ASN1_IA5STRING),		ASN1_GEN_STR("UTF8", V_ASN1_UTF8STRING),		ASN1_GEN_STR("UTF8String", V_ASN1_UTF8STRING),		ASN1_GEN_STR("BMP", V_ASN1_BMPSTRING),		ASN1_GEN_STR("BMPSTRING", V_ASN1_BMPSTRING),		ASN1_GEN_STR("VISIBLESTRING", V_ASN1_VISIBLESTRING),		ASN1_GEN_STR("VISIBLE", V_ASN1_VISIBLESTRING),		ASN1_GEN_STR("PRINTABLESTRING", V_ASN1_PRINTABLESTRING),		ASN1_GEN_STR("PRINTABLE", V_ASN1_PRINTABLESTRING),		ASN1_GEN_STR("T61", V_ASN1_T61STRING),		ASN1_GEN_STR("T61STRING", V_ASN1_T61STRING),		ASN1_GEN_STR("TELETEXSTRING", V_ASN1_T61STRING),		ASN1_GEN_STR("GeneralString", V_ASN1_GENERALSTRING),		ASN1_GEN_STR("GENSTR", V_ASN1_GENERALSTRING),		/* Special cases */		ASN1_GEN_STR("SEQUENCE", V_ASN1_SEQUENCE),		ASN1_GEN_STR("SEQ", V_ASN1_SEQUENCE),		ASN1_GEN_STR("SET", V_ASN1_SET),		/* type modifiers */		/* Explicit tag */		ASN1_GEN_STR("EXP", ASN1_GEN_FLAG_EXP),		ASN1_GEN_STR("EXPLICIT", ASN1_GEN_FLAG_EXP),		/* Implicit tag */		ASN1_GEN_STR("IMP", ASN1_GEN_FLAG_IMP),		ASN1_GEN_STR("IMPLICIT", ASN1_GEN_FLAG_IMP),		/* OCTET STRING wrapper */		ASN1_GEN_STR("OCTWRAP", ASN1_GEN_FLAG_OCTWRAP),		/* SEQUENCE wrapper */		ASN1_GEN_STR("SEQWRAP", ASN1_GEN_FLAG_SEQWRAP),		/* SET wrapper */		ASN1_GEN_STR("SETWRAP", ASN1_GEN_FLAG_SETWRAP),		/* BIT STRING wrapper */		ASN1_GEN_STR("BITWRAP", ASN1_GEN_FLAG_BITWRAP),		ASN1_GEN_STR("FORM", ASN1_GEN_FLAG_FORMAT),		ASN1_GEN_STR("FORMAT", ASN1_GEN_FLAG_FORMAT),	};	if (len == -1)		len = strlen(tagstr);		tntmp = tnst;		for (i = 0; i < sizeof(tnst) / sizeof(struct tag_name_st); i++, tntmp++)		{		if ((len == tntmp->len) && !strncmp(tntmp->strnam, tagstr, len))			return tntmp->tag;		}		return -1;	}static ASN1_TYPE *asn1_str2type(const char *str, int format, int utype)	{	ASN1_TYPE *atmp = NULL;	CONF_VALUE vtmp;	unsigned char *rdata;	long rdlen;	int no_unused = 1;	if (!(atmp = ASN1_TYPE_new()))		{		ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);		return NULL;		}	if (!str)		str = "";	switch(utype)		{		case V_ASN1_NULL:		if (str && *str)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_NULL_VALUE);			goto bad_form;			}		break;				case V_ASN1_BOOLEAN:		if (format != ASN1_GEN_FORMAT_ASCII)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_NOT_ASCII_FORMAT);			goto bad_form;			}		vtmp.name = NULL;		vtmp.section = NULL;		vtmp.value = (char *)str;		if (!X509V3_get_value_bool(&vtmp, &atmp->value.boolean))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_BOOLEAN);			goto bad_str;			}		break;		case V_ASN1_INTEGER:		case V_ASN1_ENUMERATED:		if (format != ASN1_GEN_FORMAT_ASCII)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_INTEGER_NOT_ASCII_FORMAT);			goto bad_form;			}		if (!(atmp->value.integer = s2i_ASN1_INTEGER(NULL, (char *)str)))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_INTEGER);			goto bad_str;			}		break;		case V_ASN1_OBJECT:		if (format != ASN1_GEN_FORMAT_ASCII)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_OBJECT_NOT_ASCII_FORMAT);			goto bad_form;			}		if (!(atmp->value.object = OBJ_txt2obj(str, 0)))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_OBJECT);			goto bad_str;			}		break;		case V_ASN1_UTCTIME:		case V_ASN1_GENERALIZEDTIME:		if (format != ASN1_GEN_FORMAT_ASCII)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_TIME_NOT_ASCII_FORMAT);			goto bad_form;			}		if (!(atmp->value.asn1_string = ASN1_STRING_new()))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);			goto bad_str;			}		if (!ASN1_STRING_set(atmp->value.asn1_string, str, -1))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);			goto bad_str;			}		atmp->value.asn1_string->type = utype;		if (!ASN1_TIME_check(atmp->value.asn1_string))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_TIME_VALUE);			goto bad_str;			}		break;		case V_ASN1_BMPSTRING:		case V_ASN1_PRINTABLESTRING:		case V_ASN1_IA5STRING:		case V_ASN1_T61STRING:		case V_ASN1_UTF8STRING:		case V_ASN1_VISIBLESTRING:		case V_ASN1_UNIVERSALSTRING:		case V_ASN1_GENERALSTRING:		if (format == ASN1_GEN_FORMAT_ASCII)			format = MBSTRING_ASC;		else if (format == ASN1_GEN_FORMAT_UTF8)			format = MBSTRING_UTF8;		else			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_FORMAT);			goto bad_form;			}		if (ASN1_mbstring_copy(&atmp->value.asn1_string, (unsigned char *)str,						-1, format, ASN1_tag2bit(utype)) <= 0)			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);			goto bad_str;			}				break;		case V_ASN1_BIT_STRING:		case V_ASN1_OCTET_STRING:		if (!(atmp->value.asn1_string = ASN1_STRING_new()))			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ERR_R_MALLOC_FAILURE);			goto bad_form;			}		if (format == ASN1_GEN_FORMAT_HEX)			{			if (!(rdata = string_to_hex((char *)str, &rdlen)))				{				ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_HEX);				goto bad_str;				}			atmp->value.asn1_string->data = rdata;			atmp->value.asn1_string->length = rdlen;			atmp->value.asn1_string->type = utype;			}		else if (format == ASN1_GEN_FORMAT_ASCII)			ASN1_STRING_set(atmp->value.asn1_string, str, -1);		else if ((format == ASN1_GEN_FORMAT_BITLIST) && (utype == V_ASN1_BIT_STRING))			{			if (!CONF_parse_list(str, ',', 1, bitstr_cb, atmp->value.bit_string))				{				ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_LIST_ERROR);				goto bad_str;				}			no_unused = 0;						}		else 			{			ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_ILLEGAL_BITSTRING_FORMAT);			goto bad_form;			}		if ((utype == V_ASN1_BIT_STRING) && no_unused)			{			atmp->value.asn1_string->flags				&= ~(ASN1_STRING_FLAG_BITS_LEFT|0x07);        		atmp->value.asn1_string->flags				|= ASN1_STRING_FLAG_BITS_LEFT;			}		break;		default:		ASN1err(ASN1_F_ASN1_STR2TYPE, ASN1_R_UNSUPPORTED_TYPE);		goto bad_str;		break;		}	atmp->type = utype;	return atmp;	bad_str:	ERR_add_error_data(2, "string=", str);	bad_form:	ASN1_TYPE_free(atmp);	return NULL;	}static int bitstr_cb(const char *elem, int len, void *bitstr)	{	long bitnum;	char *eptr;	if (!elem)		return 0;	bitnum = strtoul(elem, &eptr, 10);	if (eptr && *eptr && (eptr != elem + len))		return 0;	if (bitnum < 0)		{		ASN1err(ASN1_F_BITSTR_CB, ASN1_R_INVALID_NUMBER);		return 0;		}	if (!ASN1_BIT_STRING_set_bit(bitstr, bitnum, 1))		{		ASN1err(ASN1_F_BITSTR_CB, ERR_R_MALLOC_FAILURE);		return 0;		}	return 1;	}

⌨️ 快捷键说明

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