/* Allocate ASN.1 context. */
-SilcAsn1 silc_asn1_alloc(void)
+SilcAsn1 silc_asn1_alloc(SilcStack stack)
{
- SilcAsn1 asn1 = silc_calloc(1, sizeof(*asn1));
- if (!asn1)
+ SilcAsn1 asn1;
+ SilcStack stack1;
+
+ stack1 = silc_stack_alloc(0, stack);
+ if (!stack1)
return NULL;
- if (!silc_asn1_init(asn1))
+ /* Allocate itself from the stack */
+ asn1 = silc_scalloc(stack1, 1, sizeof(*asn1));
+ if (!asn1) {
+ silc_stack_free(stack1);
+ return NULL;
+ }
+
+ asn1->stack1 = stack1;
+ asn1->stack2 = silc_stack_alloc(0, stack);
+ if (!asn1->stack2) {
+ silc_stack_free(stack1);
return NULL;
+ }
+
+ asn1->accumul = 0;
return asn1;
}
void silc_asn1_free(SilcAsn1 asn1)
{
silc_asn1_uninit(asn1);
- silc_free(asn1);
}
/* Init pre-allocated ASN.1 context */
-SilcBool silc_asn1_init(SilcAsn1 asn1)
+SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack)
{
- asn1->stack1 = silc_stack_alloc(768);
+ asn1->stack1 = silc_stack_alloc(0, stack);
if (!asn1->stack1)
return FALSE;
- asn1->stack2 = silc_stack_alloc(768);
+ asn1->stack2 = silc_stack_alloc(0, stack);
if (!asn1->stack2) {
- silc_stack_free(asn1->stack2);
+ silc_stack_free(asn1->stack1);
return FALSE;
}
void silc_asn1_uninit(SilcAsn1 asn1)
{
- silc_stack_free(asn1->stack1);
silc_stack_free(asn1->stack2);
+ silc_stack_free(asn1->stack1);
}
#if defined(SILC_DEBUG)
*
* SYNOPSIS
*
- * SilcAsn1 silc_asn1_alloc(void);
+ * SilcAsn1 silc_asn1_alloc(SilcStack stack);
*
* DESCRIPTION
*
* Allocates and initializes ASN.1 encoder/decoder and returns SilcAsn1
* context or NULL on error. This context can be used with both
- * silc_asn1_encode and silc_asn1_decode functions.
+ * silc_asn1_encode and silc_asn1_decode functions. If `stack' is non-NULL
+ * all memory will be allocated from `stack'.
*
* Usually SilcAsn1 is allocated when encoder or decoder is needed,
* however it is also possible to allocate long-lasting SilcAsn1 and
* data that is returned by silc_asn1_decode function becomes invalid.
*
***/
-SilcAsn1 silc_asn1_alloc(void);
+SilcAsn1 silc_asn1_alloc(SilcStack stack);
/****f* silcasn1/SilcASN1API/silc_asn1_free
*
*
* SYNOPSIS
*
- * SilcBool silc_asn1_init(SilcAsn1 asn1);
+ * SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
*
* DESCRIPTION
*
* EXAMPLE
*
* SilcAsn1Struct asn1;
- * if (!silc_asn1_init(&asn1))
+ * if (!silc_asn1_init(&asn1, NULL))
* error;
*
***/
-SilcBool silc_asn1_init(SilcAsn1 asn1);
+SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack);
/****f* silcasn1/SilcASN1API/silc_asn1_uninit
*
char tmp[32];
SilcRng rng;
SilcMPInt mpint, mpint2;
+ SilcStack stack;
memset(&node, 0, sizeof(node));
memset(&node2, 0, sizeof(node2));
if (argc > 1 && !strcmp(argv[1], "-d")) {
silc_log_debug(TRUE);
silc_log_debug_hexdump(TRUE);
- silc_log_set_debug_string("*asn1*,*ber*");
+ silc_log_set_debug_string("*asn1*,*ber*,*stack*");
}
silc_hash_register_default();
rng = silc_rng_alloc();
silc_rng_init(rng);
+ stack = silc_stack_alloc(0, NULL);
+
SILC_LOG_DEBUG(("Allocating ASN.1 context"));
- asn1 = silc_asn1_alloc();
+ asn1 = silc_asn1_alloc(stack);
if (!asn1)
goto out;
#endif /* 1 */
silc_asn1_free(asn1);
+ silc_rng_free(rng);
+ silc_hash_unregister_all();
+ silc_stack_free(stack);
success = TRUE;
out: