/* 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;
+
+ /* Allocate itself from the stack */
+ asn1 = silc_scalloc(stack1, 1, sizeof(*asn1));
+ if (!asn1) {
+ silc_stack_free(stack1);
return NULL;
+ }
- if (!silc_asn1_init(asn1))
+ asn1->orig_stack = stack;
+ 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->orig_stack = stack;
+
+ 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);
+ SilcStack stack1 = asn1->stack1;
+
+ if (asn1->switched) {
+ stack1 = asn1->stack2;
+ asn1->stack2 = asn1->stack1;
+ }
+
silc_stack_free(asn1->stack2);
+ silc_stack_free(stack1);
}
#if defined(SILC_DEBUG)
}
fprintf(stdout, "Type %s [%d]\n",
- silc_asn1_tag_name(rtag), rtag);
+ silc_asn1_tag_name(rtag), (int)rtag);
if (renc == SILC_BER_ENC_PRIMITIVE)
len = len + rdata_len;