Beispiel #1
0
const char *OBJ_nid2ln(int n)
  {
  ADDED_OBJ ad,*adp;
  ASN1_OBJECT ob;

  if ((n >= 0) && (n < NUM_NID))
    {
    if ((n != NID_undef) && (nid_objs[n].nid == NID_undef))
      {
      OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
      return(NULL);
      }
    return(nid_objs[n].ln);
    }
  else if (added == NULL)
    return(NULL);
  else
    {
    ad.type=ADDED_NID;
    ad.obj= &ob;
    ob.nid=n;
    adp=(ADDED_OBJ *)lh_retrieve(added,&ad);
    if (adp != NULL)
      return(adp->obj->ln);
    else
      {
      OBJerr(OBJ_F_OBJ_NID2LN,OBJ_R_UNKNOWN_NID);
      return(NULL);
      }
    }
  }
ASN1_OBJECT *
OBJ_dup(const ASN1_OBJECT *o)
{
	ASN1_OBJECT *r;
	int i;
	char *ln = NULL, *sn = NULL;
	unsigned char *data = NULL;

	if (o == NULL)
		return (NULL);
	if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC))
		return((ASN1_OBJECT *)o); /* XXX: ugh! Why? What kind of
					     duplication is this??? */

	r = ASN1_OBJECT_new();
	if (r == NULL) {
		OBJerr(OBJ_F_OBJ_DUP, ERR_R_ASN1_LIB);
		return (NULL);
	}
	data = malloc(o->length);
	if (data == NULL)
		goto err;
	if (o->data != NULL)
		memcpy(data, o->data, o->length);
	/* once data attached to object it remains const */
	r->data = data;
	r->length = o->length;
	r->nid = o->nid;
	r->ln = r->sn = NULL;
	if (o->ln != NULL) {
		i = strlen(o->ln) + 1;
		ln = malloc(i);
		if (ln == NULL)
			goto err;
		memcpy(ln, o->ln, i);
		r->ln = ln;
	}

	if (o->sn != NULL) {
		i = strlen(o->sn) + 1;
		sn = malloc(i);
		if (sn == NULL)
			goto err;
		memcpy(sn, o->sn, i);
		r->sn = sn;
	}
	r->flags = o->flags | (ASN1_OBJECT_FLAG_DYNAMIC |
	    ASN1_OBJECT_FLAG_DYNAMIC_STRINGS | ASN1_OBJECT_FLAG_DYNAMIC_DATA);
	return (r);

err:
	OBJerr(OBJ_F_OBJ_DUP, ERR_R_MALLOC_FAILURE);
	free(ln);
	free(sn);
	free(data);
	free(r);
	return (NULL);
}
Beispiel #3
0
ASN1_OBJECT *OBJ_dup(const ASN1_OBJECT *o)
	{
	ASN1_OBJECT *r;
	int i;
	char *ln=NULL;

	if (o == NULL) return(NULL);
	if (!(o->flags & ASN1_OBJECT_FLAG_DYNAMIC))
		return((ASN1_OBJECT *)o); /* XXX: ugh! Why? What kind of
					     duplication is this??? */

	r=ASN1_OBJECT_new();
	if (r == NULL)
		{
		OBJerr(OBJ_F_OBJ_DUP,ERR_R_ASN1_LIB);
		return(NULL);
		}
	r->data=OPENSSL_malloc(o->length);
	if (r->data == NULL)
		goto err;
	if (o->data != NULL)
		memcpy(r->data,o->data,o->length);
	r->length=o->length;
	r->nid=o->nid;
	r->ln=r->sn=NULL;
	if (o->ln != NULL)
		{
		i=strlen(o->ln)+1;
		r->ln=ln=OPENSSL_malloc(i);
		if (r->ln == NULL) goto err;
		memcpy(ln,o->ln,i);
		}

	if (o->sn != NULL)
		{
		char *s;

		i=strlen(o->sn)+1;
		r->sn=s=OPENSSL_malloc(i);
		if (r->sn == NULL) goto err;
		memcpy(s,o->sn,i);
		}
	r->flags=o->flags|(ASN1_OBJECT_FLAG_DYNAMIC|
		ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|ASN1_OBJECT_FLAG_DYNAMIC_DATA);
	return(r);
err:
	OBJerr(OBJ_F_OBJ_DUP,ERR_R_MALLOC_FAILURE);
	if (r != NULL)
		{
		if (ln != NULL) OPENSSL_free(ln);
		if (r->data != NULL) OPENSSL_free(r->data);
		OPENSSL_free(r);
		}
	return(NULL);
	}
Beispiel #4
0
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);
  }
Beispiel #5
0
int OBJ_add_sigid(int signid, int dig_id, int pkey_id)
{
    nid_triple *ntr;
    if (sig_app == NULL)
        sig_app = sk_nid_triple_new(sig_sk_cmp);
    if (sig_app == NULL)
        return 0;
    if (sigx_app == NULL)
        sigx_app = sk_nid_triple_new(sigx_cmp);
    if (sigx_app == NULL)
        return 0;
    if ((ntr = OPENSSL_malloc(sizeof(*ntr))) == NULL) {
        OBJerr(OBJ_F_OBJ_ADD_SIGID, ERR_R_MALLOC_FAILURE);
        return 0;
    }
    ntr->sign_id = signid;
    ntr->hash_id = dig_id;
    ntr->pkey_id = pkey_id;

    if (!sk_nid_triple_push(sig_app, ntr)) {
        OPENSSL_free(ntr);
        return 0;
    }

    if (!sk_nid_triple_push(sigx_app, ntr))
        return 0;

    sk_nid_triple_sort(sig_app);
    sk_nid_triple_sort(sigx_app);

    return 1;
}
Beispiel #6
0
int
OBJ_NAME_new_index(unsigned long (*hash_func)(const char *),
    int (*cmp_func)(const char *, const char *),
    void (*free_func)(const char *, int, const char *))
{
	int ret;
	int i;
	NAME_FUNCS *name_funcs;

	if (name_funcs_stack == NULL)
		name_funcs_stack = sk_NAME_FUNCS_new_null();
	if (name_funcs_stack == NULL)
		return (0);

	ret = names_type_num;
	names_type_num++;
	for (i = sk_NAME_FUNCS_num(name_funcs_stack); i < names_type_num; i++) {
		name_funcs = malloc(sizeof(NAME_FUNCS));
		if (!name_funcs) {
			OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX, ERR_R_MALLOC_FAILURE);
			return (0);
		}
		name_funcs->hash_func = lh_strhash;
		name_funcs->cmp_func = strcmp;
		name_funcs->free_func = NULL;
		if (sk_NAME_FUNCS_push(name_funcs_stack, name_funcs) == 0) {
			free(name_funcs);
			OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX, ERR_R_MALLOC_FAILURE);
			return (0);
		}
	}
	name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret);
	if (hash_func != NULL)
		name_funcs->hash_func = hash_func;
	if (cmp_func != NULL)
		name_funcs->cmp_func = cmp_func;
	if (free_func != NULL)
		name_funcs->free_func = free_func;
	return (ret);
}
Beispiel #7
0
int OBJ_NAME_new_index(unsigned long (*hash_func)(const char *),
	int (*cmp_func)(const char *, const char *),
	void (*free_func)(const char *, int, const char *))
	{
	int ret;
	int i;
	NAME_FUNCS *name_funcs;

	if (name_funcs_stack == NULL)
		{
		MemCheck_off();
		name_funcs_stack=sk_NAME_FUNCS_new_null();
		MemCheck_on();
		}
	if ((name_funcs_stack == NULL))
		{
		/* ERROR */
		return(0);
		}
	ret=names_type_num;
	names_type_num++;
	for (i=sk_NAME_FUNCS_num(name_funcs_stack); i<names_type_num; i++)
		{
		MemCheck_off();
		name_funcs = OPENSSL_malloc(sizeof(NAME_FUNCS));
		MemCheck_on();
		if (!name_funcs)
			{
			OBJerr(OBJ_F_OBJ_NAME_NEW_INDEX,ERR_R_MALLOC_FAILURE);
			return(0);
			}
		name_funcs->hash_func = lh_strhash;
		name_funcs->cmp_func = OPENSSL_strcmp;
		name_funcs->free_func = 0; /* NULL is often declared to
						* ((void *)0), which according
						* to Compaq C is not really
						* compatible with a function
						* pointer.	-- Richard Levitte*/
		MemCheck_off();
		sk_NAME_FUNCS_push(name_funcs_stack,name_funcs);
		MemCheck_on();
		}
	name_funcs = sk_NAME_FUNCS_value(name_funcs_stack, ret);
	if (hash_func != NULL)
		name_funcs->hash_func = hash_func;
	if (cmp_func != NULL)
		name_funcs->cmp_func = cmp_func;
	if (free_func != NULL)
		name_funcs->free_func = free_func;
	return(ret);
	}
Beispiel #8
0
int OBJ_add_object(const ASN1_OBJECT *obj)
  {
  ASN1_OBJECT *o;
  ADDED_OBJ *ao[4]={NULL,NULL,NULL,NULL},*aop;
  int i;

  if (added == NULL)
    if (!init_added()) return(0);
  if ((o=OBJ_dup(obj)) == NULL) goto err;
  if (!(ao[ADDED_NID]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  if ((o->length != 0) && (obj->data != NULL))
    if (!(ao[ADDED_DATA]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  if (o->sn != NULL)
    if (!(ao[ADDED_SNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;
  if (o->ln != NULL)
    if (!(ao[ADDED_LNAME]=(ADDED_OBJ *)OPENSSL_malloc(sizeof(ADDED_OBJ)))) goto err2;

  for (i=ADDED_DATA; i<=ADDED_NID; i++)
    {
    if (ao[i] != NULL)
      {
      ao[i]->type=i;
      ao[i]->obj=o;
      aop=(ADDED_OBJ *)lh_insert(added,ao[i]);
      /* memory leak, buit should not normally matter */
      if (aop != NULL)
        OPENSSL_free(aop);
      }
    }
  o->flags&= ~(ASN1_OBJECT_FLAG_DYNAMIC|ASN1_OBJECT_FLAG_DYNAMIC_STRINGS|
      ASN1_OBJECT_FLAG_DYNAMIC_DATA);

  return(o->nid);
err2:
  OBJerr(OBJ_F_OBJ_ADD_OBJECT,ERR_R_MALLOC_FAILURE);
err:
  for (i=ADDED_DATA; i<=ADDED_NID; i++)
    if (ao[i] != NULL) OPENSSL_free(ao[i]);
  if (o != NULL) OPENSSL_free(o);
  return(NID_undef);
  }