ASN1_TYPE
_asn1_add_node (unsigned int type)
{
  list_type *listElement;
  ASN1_TYPE punt;

  punt = (ASN1_TYPE) _asn1_calloc (1, sizeof (struct node_asn_struct));
  if (punt == NULL)
    return NULL;

  listElement = (list_type *) _asn1_malloc (sizeof (list_type));
  if (listElement == NULL)
    {
      _asn1_free (punt);
      return NULL;
    }

  listElement->node = punt;
  listElement->next = firstElement;
  firstElement = listElement;

  punt->type = type;

  return punt;
}
ASN1_TYPE
_asn1_set_value (ASN1_TYPE node, const void *value, unsigned int len)
{
  if (node == NULL)
    return node;
  if (node->value)
    {
      if (node->value != node->small_value)
	_asn1_free (node->value);
      node->value = NULL;
      node->value_len = 0;
    }

  if (!len)
    return node;

  if (len < sizeof (node->small_value))
    {
      node->value = node->small_value;
    }
  else
    {
      node->value = _asn1_malloc (len);
      if (node->value == NULL)
	return NULL;
    }
  node->value_len = len;

  memcpy (node->value, value, len);
  return node;
}
Пример #3
0
node_asn *
_asn1_add_node (unsigned int type)
{
  list_type *listElement;
  node_asn *punt;

  punt = (node_asn *) _asn1_calloc (1, sizeof (node_asn));
  if (punt == NULL)
    return NULL;

  listElement = (list_type *) _asn1_malloc (sizeof (list_type));
  if (listElement == NULL)
    {
      _asn1_free (punt);
      return NULL;
    }

  listElement->node = punt;
  listElement->next = firstElement;
  firstElement = listElement;

  punt->type = type;

  return punt;
}
ASN1_TYPE
_asn1_set_value_octet (ASN1_TYPE node, const void *value, unsigned int len)
{
  int len2;
  void *temp;

  if (node == NULL)
    return node;

  asn1_length_der (len, NULL, &len2);
  temp = (unsigned char *) _asn1_malloc (len + len2);
  if (temp == NULL)
    return NULL;

  asn1_octet_der (value, len, temp, &len2);
  return _asn1_set_value_m (node, temp, len2);
}
Пример #5
0
/**
 * asn1_copy_node:
 * @dst: Destination ASN1_TYPE node.
 * @dst_name: Field name in destination node.
 * @src: Source ASN1_TYPE node.
 * @src_name: Field name in source node.
 *
 * Create a deep copy of a ASN1_TYPE variable.
 *
 * Returns: Return %ASN1_SUCCESS on success.
 **/
asn1_retCode
asn1_copy_node (ASN1_TYPE dst, const char *dst_name,
		ASN1_TYPE src, const char *src_name)
{
/* FIXME: rewrite using copy_structure().
 * It seems quite hard to do.
 */
  int result;
  ASN1_TYPE dst_node;
  void *data = NULL;
  int size = 0;

  result = asn1_der_coding (src, src_name, NULL, &size, NULL);
  if (result != ASN1_MEM_ERROR)
    return result;

  data = _asn1_malloc (size);
  if (data == NULL)
    return ASN1_MEM_ERROR;

  result = asn1_der_coding (src, src_name, data, &size, NULL);
  if (result != ASN1_SUCCESS)
    {
      _asn1_free (data);
      return result;
    }

  dst_node = asn1_find_node (dst, dst_name);
  if (dst_node == NULL)
    {
      _asn1_free (data);
      return ASN1_ELEMENT_NOT_FOUND;
    }

  result = asn1_der_decoding (&dst_node, data, size, NULL);

  _asn1_free (data);

  return result;
}
ASN1_TYPE
_asn1_append_value (ASN1_TYPE node, const void *value, unsigned int len)
{
  if (node == NULL)
    return node;
  if (node->value != NULL && node->value != node->small_value)
    {
      /* value is allocated */
      int prev_len = node->value_len;
      node->value_len += len;
      node->value = _asn1_realloc (node->value, node->value_len);
      if (node->value == NULL)
	{
	  node->value_len = 0;
	  return NULL;
	}
      memcpy (&node->value[prev_len], value, len);

      return node;
    }
  else if (node->value == node->small_value)
    {
      /* value is in node */
      int prev_len = node->value_len;
      node->value_len += len;
      node->value = _asn1_malloc (node->value_len);
      if (node->value == NULL)
	{
	  node->value_len = 0;
	  return NULL;
	}
      memcpy (node->value, node->small_value, prev_len);
      memcpy (&node->value[prev_len], value, len);

      return node;
    }
  else				/* node->value == NULL */
    return _asn1_set_value (node, value, len);
}
Пример #7
0
node_asn *
_asn1_set_value (node_asn * node, const void *_value, unsigned int len)
{
  const unsigned char *value = _value;

  if (node == NULL)
    return node;
  if (node->value)
    {
      _asn1_free (node->value);
      node->value = NULL;
      node->value_len = 0;
    }
  if (!len)
    return node;
  node->value = (unsigned char *) _asn1_malloc (len);
  if (node->value == NULL)
    return NULL;
  node->value_len = len;

  memcpy (node->value, value, len);
  return node;
}