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; }
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); }
/** * 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); }
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; }