else {
i = len; p += i - 1; to += i - 1; while((!*p) && i) { *(to--) = 0; i--; p--; }  if(!i) { *s = 1; s[len] = 0; p += len; len++; } else { *(to--) = (*(p--) ^ 0xff) + 1; i--; for(;i > 0; i--) *(to--) = *(p--) ^ 0xff; p += len; } } else {
ASN1_INTEGER *d2i_ASN1_INTEGER(ASN1_INTEGER **a, unsigned char **pp,	     long length)	{	ASN1_INTEGER *ret=NULL;	unsigned char *p,*to,*s;	long len;	int inf,tag,xclass;	int i;	if ((a == NULL) || ((*a) == NULL))		{		if ((ret=ASN1_INTEGER_new()) == NULL) return(NULL);		ret->type=V_ASN1_INTEGER;		}	else		ret=(*a);	p= *pp;	inf=ASN1_get_object(&p,&len,&tag,&xclass,length);	if (inf & 0x80)		{		i=ASN1_R_BAD_OBJECT_HEADER;		goto err;		}	if (tag != V_ASN1_INTEGER)		{		i=ASN1_R_EXPECTING_AN_INTEGER;		goto err;		}	/* We must Malloc stuff, even for 0 bytes otherwise it	 * signifies a missing NULL parameter. */	s=(unsigned char *)Malloc((int)len+1);	if (s == NULL)		{		i=ERR_R_MALLOC_FAILURE;		goto err;		}	to=s;	if (*p & 0x80) /* a negative number */		{		ret->type=V_ASN1_NEG_INTEGER;		if (*p == 0xff)			{			p++;			len--;			}		for (i=(int)len; i>0; i--)			*(to++)= (*(p++)^0xFF)+1;		}	else		{		ret->type=V_ASN1_INTEGER;		if ((*p == 0) && (len != 1))			{			p++;			len--;			}		memcpy(s,p,(int)len);		p+=len;		}	if (ret->data != NULL) Free((char *)ret->data);	ret->data=s;	ret->length=(int)len;	if (a != NULL) (*a)=ret;	*pp=p;	return(ret);err:	ASN1err(ASN1_F_D2I_ASN1_INTEGER,i);	if ((ret != NULL) && ((a == NULL) || (*a != ret)))		ASN1_INTEGER_free(ret);	return(NULL);	}