return(objsize);
}
-size_t a2d_ASN1_OBJECT(unsigned char *out, size_t olen, const char *buf,
- int num)
+int a2d_ASN1_OBJECT(unsigned char *out, int olen, const char *buf, int num)
{
- int i,len=0,c, use_bn;
- unsigned first;
+ int i,first,len=0,c, use_bn;
char ftmp[24], *tmp = ftmp;
- size_t tmpsize = sizeof ftmp;
+ int tmpsize = sizeof ftmp;
const char *p;
unsigned long l;
BIGNUM *bl = NULL;
ASN1err(ASN1_F_A2D_ASN1_OBJECT,ASN1_R_INVALID_DIGIT);
goto err;
}
- if (!use_bn && l > (ULONG_MAX / 10L))
+ if (!use_bn && l >= ((ULONG_MAX - 80) / 10L))
{
use_bn = 1;
if (!bl)
if (use_bn)
{
if (!BN_mul_word(bl, 10L)
- || !BN_add_signed_word(bl, c-'0'))
+ || !BN_add_word(bl, c-'0'))
goto err;
}
else
- l=l*10L+(c-'0');
+ l=l*10L+(long)(c-'0');
}
if (len == 0)
{
return(0);
}
-int i2t_ASN1_OBJECT(char *buf, size_t buf_len, ASN1_OBJECT *a)
+int i2t_ASN1_OBJECT(char *buf, int buf_len, ASN1_OBJECT *a)
{
return OBJ_obj2txt(buf, buf_len, a, 0);
}
int i2a_ASN1_OBJECT(BIO *bp, ASN1_OBJECT *a)
{
char buf[80], *p = buf;
- size_t i;
+ int i;
if ((a == NULL) || (a->data == NULL))
return(BIO_write(bp,"NULL",4));
i2t_ASN1_OBJECT(p,i + 1,a);
}
if (i <= 0)
- return BIO_write(bp, "<INVALID>", 9);
+ {
+ i = BIO_write(bp, "<INVALID>", 9);
+ i += BIO_dump(bp, (const char *)a->data, a->length);
+ return i;
+ }
BIO_write(bp,p,i);
if (p != buf)
OPENSSL_free(p);
}
ASN1_OBJECT *d2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
- size_t length)
+ long length)
{
const unsigned char *p;
- size_t len;
+ long len;
int tag,xclass;
int inf,i;
ASN1_OBJECT *ret = NULL;
-
p= *pp;
inf=ASN1_get_object(&p,&len,&tag,&xclass,length);
if (inf & 0x80)
return(NULL);
}
ASN1_OBJECT *c2i_ASN1_OBJECT(ASN1_OBJECT **a, const unsigned char **pp,
- size_t len)
+ long len)
{
ASN1_OBJECT *ret=NULL;
const unsigned char *p;
unsigned char *data;
int i;
+ /* Sanity check OID encoding: can't have leading 0x80 in
+ * subidentifiers, see: X.690 8.19.2
+ */
+ for (i = 0, p = *pp; i < len; i++, p++)
+ {
+ if (*p == 0x80 && (!i || !(p[-1] & 0x80)))
+ {
+ ASN1err(ASN1_F_C2I_ASN1_OBJECT,ASN1_R_INVALID_OBJECT_ENCODING);
+ return NULL;
+ }
+ }
/* only the ASN1_OBJECTs from the 'table' will have values
* for ->sn or ->ln */
{
ret->length=0;
if (data != NULL) OPENSSL_free(data);
- data=OPENSSL_malloc(len ? len : 1);
+ data=(unsigned char *)OPENSSL_malloc(len ? (int)len : 1);
if (data == NULL)
{ i=ERR_R_MALLOC_FAILURE; goto err; }
ret->flags|=ASN1_OBJECT_FLAG_DYNAMIC_DATA;
}
- memcpy(data,p,len);
+ memcpy(data,p,(int)len);
/* reattach data to object, after which it remains const */
- ret->data=data;
- ret->length=len;
+ ret->data =data;
+ ret->length=(int)len;
ret->sn=NULL;
ret->ln=NULL;
/* ret->flags=ASN1_OBJECT_FLAG_DYNAMIC; we know it is dynamic */
OPENSSL_free(a);
}
-ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, size_t len,
+ASN1_OBJECT *ASN1_OBJECT_create(int nid, unsigned char *data, int len,
const char *sn, const char *ln)
{
ASN1_OBJECT o;