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

📄 obj_dat.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
📖 第 1 页 / 共 2 页
字号:
 * if "noname" is not set then search for short and long names first. * This will convert the "dotted" form into an object: unlike OBJ_txt2nid * it can be used with any objects, not just registered ones. */ASN1_OBJECT *OBJ_txt2obj(const char *s, int no_name)	{	int nid = NID_undef;	ASN1_OBJECT *op=NULL;	unsigned char *buf;	unsigned char *p;	const unsigned char *cp;	int i, j;	if(!no_name) {		if( ((nid = OBJ_sn2nid(s)) != NID_undef) ||			((nid = OBJ_ln2nid(s)) != NID_undef) ) 					return OBJ_nid2obj(nid);	}	/* Work out size of content octets */	i=a2d_ASN1_OBJECT(NULL,0,s,-1);	if (i <= 0) {		/* Don't clear the error */		/*ERR_clear_error();*/		return NULL;	}	/* Work out total size */	j = ASN1_object_size(0,i,V_ASN1_OBJECT);	if((buf=(unsigned char *)OPENSSL_malloc(j)) == NULL) return NULL;	p = buf;	/* Write out tag+length */	ASN1_put_object(&p,0,i,V_ASN1_OBJECT,V_ASN1_UNIVERSAL);	/* Write out contents */	a2d_ASN1_OBJECT(p,i,s,-1);	cp=buf;	op=d2i_ASN1_OBJECT(NULL,&cp,j);	OPENSSL_free(buf);	return op;	}int OBJ_obj2txt(char *buf, int buf_len, const ASN1_OBJECT *a, int no_name){	int i,n=0,len,nid, first, use_bn;	BIGNUM *bl;	unsigned long l;	unsigned char *p;	char tbuf[DECIMAL_SIZE(i)+DECIMAL_SIZE(l)+2];	if ((a == NULL) || (a->data == NULL)) {		buf[0]='\0';		return(0);	}	if (!no_name && (nid=OBJ_obj2nid(a)) != NID_undef)		{		const char *s;		s=OBJ_nid2ln(nid);		if (s == NULL)			s=OBJ_nid2sn(nid);		if (buf)			BUF_strlcpy(buf,s,buf_len);		n=strlen(s);		return n;		}	len=a->length;	p=a->data;	first = 1;	bl = NULL;	while (len > 0)		{		l=0;		use_bn = 0;		for (;;)			{			unsigned char c = *p++;			len--;			if ((len == 0) && (c & 0x80))				goto err;			if (use_bn)				{				if (!BN_add_word(bl, c & 0x7f))					goto err;				}			else				l |= c  & 0x7f;			if (!(c & 0x80))				break;			if (!use_bn && (l > (ULONG_MAX >> 7L)))				{				if (!bl && !(bl = BN_new()))					goto err;				if (!BN_set_word(bl, l))					goto err;				use_bn = 1;				}			if (use_bn)				{				if (!BN_lshift(bl, bl, 7))					goto err;				}			else				l<<=7L;			}		if (first)			{			first = 0;			if (l >= 80)				{				i = 2;				if (use_bn)					{					if (!BN_sub_word(bl, 80))						goto err;					}				else					l -= 80;				}			else				{				i=(int)(l/40);				l-=(long)(i*40);				}			if (buf && (buf_len > 0))				{				*buf++ = i + '0';				buf_len--;				}			n++;			}		if (use_bn)			{			char *bndec;			bndec = BN_bn2dec(bl);			if (!bndec)				goto err;			i = strlen(bndec);			if (buf)				{				if (buf_len > 0)					{					*buf++ = '.';					buf_len--;					}				BUF_strlcpy(buf,bndec,buf_len);				if (i > buf_len)					{					buf += buf_len;					buf_len = 0;					}				else					{					buf+=i;					buf_len-=i;					}				}			n++;			n += i;			OPENSSL_free(bndec);			}		else			{			BIO_snprintf(tbuf,sizeof tbuf,".%lu",l);			i=strlen(tbuf);			if (buf && (buf_len > 0))				{				BUF_strlcpy(buf,tbuf,buf_len);				if (i > buf_len)					{					buf += buf_len;					buf_len = 0;					}				else					{					buf+=i;					buf_len-=i;					}				}			n+=i;			l=0;			}		}	if (bl)		BN_free(bl);	return n;	err:	if (bl)		BN_free(bl);	return -1;}int OBJ_txt2nid(const char *s){	ASN1_OBJECT *obj;	int nid;	obj = OBJ_txt2obj(s, 0);	nid = OBJ_obj2nid(obj);	ASN1_OBJECT_free(obj);	return nid;}int OBJ_ln2nid(const char *s)	{	ASN1_OBJECT o,*oo= &o,**op;	ADDED_OBJ ad,*adp;	o.ln=s;	if (added != NULL)		{		ad.type=ADDED_LNAME;		ad.obj= &o;		adp=(ADDED_OBJ *)lh_retrieve(added,&ad);		if (adp != NULL) return (adp->obj->nid);		}	op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)ln_objs, NUM_LN,		sizeof(ASN1_OBJECT *),ln_cmp);	if (op == NULL) return(NID_undef);	return((*op)->nid);	}int OBJ_sn2nid(const char *s)	{	ASN1_OBJECT o,*oo= &o,**op;	ADDED_OBJ ad,*adp;	o.sn=s;	if (added != NULL)		{		ad.type=ADDED_SNAME;		ad.obj= &o;		adp=(ADDED_OBJ *)lh_retrieve(added,&ad);		if (adp != NULL) return (adp->obj->nid);		}	op=(ASN1_OBJECT **)OBJ_bsearch((char *)&oo,(char *)sn_objs,NUM_SN,		sizeof(ASN1_OBJECT *),sn_cmp);	if (op == NULL) return(NID_undef);	return((*op)->nid);	}static int obj_cmp(const void *ap, const void *bp)	{	int j;	const ASN1_OBJECT *a= *(ASN1_OBJECT * const *)ap;	const ASN1_OBJECT *b= *(ASN1_OBJECT * const *)bp;	j=(a->length - b->length);        if (j) return(j);	return(memcmp(a->data,b->data,a->length));        }const char *OBJ_bsearch(const char *key, const char *base, int num, int size,	int (*cmp)(const void *, const void *))	{	return OBJ_bsearch_ex(key, base, num, size, cmp, 0);	}const char *OBJ_bsearch_ex(const char *key, const char *base, int num,	int size, int (*cmp)(const void *, const void *), int flags)	{	int l,h,i=0,c=0;	const char *p = NULL;	if (num == 0) return(NULL);	l=0;	h=num;	while (l < h)		{		i=(l+h)/2;		p= &(base[i*size]);		c=(*cmp)(key,p);		if (c < 0)			h=i;		else if (c > 0)			l=i+1;		else			break;		}#ifdef CHARSET_EBCDIC/* THIS IS A KLUDGE - Because the *_obj is sorted in ASCII order, and * I don't have perl (yet), we revert to a *LINEAR* search * when the object wasn't found in the binary search. */	if (c != 0)		{		for (i=0; i<num; ++i)			{			p= &(base[i*size]);			c = (*cmp)(key,p);			if (c == 0 || (c < 0 && (flags & OBJ_BSEARCH_VALUE_ON_NOMATCH)))				return p;			}		}#endif	if (c != 0 && !(flags & OBJ_BSEARCH_VALUE_ON_NOMATCH))		p = NULL;	else if (c == 0 && (flags & OBJ_BSEARCH_FIRST_VALUE_ON_MATCH))		{		while(i > 0 && (*cmp)(key,&(base[(i-1)*size])) == 0)			i--;		p = &(base[i*size]);		}	return(p);	}int OBJ_create_objects(BIO *in)	{	MS_STATIC char buf[512];	int i,num=0;	char *o,*s,*l=NULL;	for (;;)		{		s=o=NULL;		i=BIO_gets(in,buf,512);		if (i <= 0) return(num);		buf[i-1]='\0';		if (!isalnum((unsigned char)buf[0])) return(num);		o=s=buf;		while (isdigit((unsigned char)*s) || (*s == '.'))			s++;		if (*s != '\0')			{			*(s++)='\0';			while (isspace((unsigned char)*s))				s++;			if (*s == '\0')				s=NULL;			else				{				l=s;				while ((*l != '\0') && !isspace((unsigned char)*l))					l++;				if (*l != '\0')					{					*(l++)='\0';					while (isspace((unsigned char)*l))						l++;					if (*l == '\0') l=NULL;					}				else					l=NULL;				}			}		else			s=NULL;		if ((o == NULL) || (*o == '\0')) return(num);		if (!OBJ_create(o,s,l)) return(num);		num++;		}	/* return(num); */	}int OBJ_create(const char *oid, const char *sn, const char *ln)	{	int ok=0;	ASN1_OBJECT *op=NULL;	unsigned char *buf;	int i;	i=a2d_ASN1_OBJECT(NULL,0,oid,-1);	if (i <= 0) return(0);	if ((buf=(unsigned char *)OPENSSL_malloc(i)) == NULL)		{		OBJerr(OBJ_F_OBJ_CREATE,ERR_R_MALLOC_FAILURE);		return(0);		}	i=a2d_ASN1_OBJECT(buf,i,oid,-1);	if (i == 0)		goto err;	op=(ASN1_OBJECT *)ASN1_OBJECT_create(OBJ_new_nid(1),buf,i,sn,ln);	if (op == NULL) 		goto err;	ok=OBJ_add_object(op);err:	ASN1_OBJECT_free(op);	OPENSSL_free(buf);	return(ok);	}

⌨️ 快捷键说明

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