summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--epan/asn1.c83
-rw-r--r--epan/asn1.h37
2 files changed, 120 insertions, 0 deletions
diff --git a/epan/asn1.c b/epan/asn1.c
index a7cf9ae10b..19038ae7e8 100644
--- a/epan/asn1.c
+++ b/epan/asn1.c
@@ -61,6 +61,89 @@ void asn1_ctx_clean_epdv(asn1_ctx_t *actx) {
actx->embedded_pdv.identification = -1;
}
+
+/*--- stack/parameters ---*/
+
+void asn1_stack_frame_push(asn1_ctx_t *actx, const gchar *name) {
+ asn1_stack_frame_t *frame;
+
+ frame = ep_alloc0(sizeof(asn1_stack_frame_t));
+ frame->name = name;
+ frame->next = actx->stack;
+ actx->stack = frame;
+}
+
+void asn1_stack_frame_pop(asn1_ctx_t *actx, const gchar *name) {
+ DISSECTOR_ASSERT(actx->stack);
+ DISSECTOR_ASSERT(!strcmp(actx->stack->name, name));
+ actx->stack = actx->stack->next;
+}
+
+void asn1_stack_frame_check(asn1_ctx_t *actx, const gchar *name, const asn1_par_def_t *par_def) {
+ const asn1_par_def_t *pd = par_def;
+ asn1_par_t *par;
+
+ DISSECTOR_ASSERT(actx->stack);
+ DISSECTOR_ASSERT(!strcmp(actx->stack->name, name));
+
+ par = actx->stack->par;
+ while (pd->name) {
+ DISSECTOR_ASSERT(par);
+ DISSECTOR_ASSERT((pd->ptype == ASN1_PAR_IRR) || (par->ptype == pd->ptype));
+ par->name = pd->name;
+ pd++;
+ par = par->next;
+ }
+ DISSECTOR_ASSERT(!par);
+}
+
+static asn1_par_t *get_par_by_name(asn1_ctx_t *actx, const gchar *name) {
+ asn1_par_t *par = NULL;
+
+ DISSECTOR_ASSERT(actx->stack);
+ par = actx->stack->par;
+ while (par) {
+ if (!strcmp(par->name, name))
+ return par;
+ par = par->next;
+ }
+ return par;
+}
+
+static asn1_par_t *push_new_par(asn1_ctx_t *actx) {
+ asn1_par_t *par, **pp;
+
+ DISSECTOR_ASSERT(actx->stack);
+
+ par = ep_alloc0(sizeof(asn1_par_t));
+
+ pp = &(actx->stack->par);
+ while (*pp)
+ pp = &((*pp)->next);
+ *pp = par;
+
+ return par;
+}
+
+void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value) {
+ asn1_par_t *par;
+
+ par = push_new_par(actx);
+ par->ptype = ASN1_PAR_INTEGER;
+ par->value.v_integer = value;
+}
+
+gint32 asn1_param_get_integer(asn1_ctx_t *actx, const gchar *name) {
+ asn1_par_t *par = NULL;
+
+ par = get_par_by_name(actx, name);
+ DISSECTOR_ASSERT(par);
+ return par->value.v_integer;
+}
+
+
+/*--- ROSE ---*/
+
void rose_ctx_init(rose_ctx_t *rctx) {
memset(rctx, '\0', sizeof(*rctx));
rctx->signature = ROSE_CTX_SIGNATURE;
diff --git a/epan/asn1.h b/epan/asn1.h
index 4d081aed85..02d5a51a62 100644
--- a/epan/asn1.h
+++ b/epan/asn1.h
@@ -40,6 +40,35 @@ typedef enum {
CB_DISSECTOR_HANDLE
} asn1_cb_variant;
+typedef enum {
+ ASN1_PAR_IRR, /* irrelevant parameter */
+ /* value */
+ ASN1_PAR_INTEGER,
+ /* type */
+ ASN1_PAR_TYPE
+} asn1_par_type;
+
+typedef struct _asn1_par_def_t {
+ const gchar *name;
+ asn1_par_type ptype;
+} asn1_par_def_t;
+
+typedef struct _asn1_par_t {
+ const gchar *name;
+ asn1_par_type ptype;
+ union {
+ gint32 v_integer;
+ void *v_type;
+ } value;
+ struct _asn1_par_t *next;
+} asn1_par_t;
+
+typedef struct _asn1_stack_frame_t {
+ const gchar *name;
+ struct _asn1_par_t *par;
+ struct _asn1_stack_frame_t *next;
+} asn1_stack_frame_t;
+
#define ASN1_CTX_SIGNATURE 0x41435458 /* "ACTX" */
typedef struct _asn1_ctx_t {
@@ -48,6 +77,7 @@ typedef struct _asn1_ctx_t {
gboolean aligned;
packet_info *pinfo;
proto_item *created_item;
+ struct _asn1_stack_frame_t *stack;
void *value_ptr;
void *private_data;
struct {
@@ -137,6 +167,13 @@ extern gboolean asn1_ctx_check_signature(asn1_ctx_t *actx);
extern void asn1_ctx_clean_external(asn1_ctx_t *actx);
extern void asn1_ctx_clean_epdv(asn1_ctx_t *actx);
+extern void asn1_stack_frame_push(asn1_ctx_t *actx, const gchar *name);
+extern void asn1_stack_frame_pop(asn1_ctx_t *actx, const gchar *name);
+extern void asn1_stack_frame_check(asn1_ctx_t *actx, const gchar *name, const asn1_par_def_t *par_def);
+
+extern void asn1_param_push_integer(asn1_ctx_t *actx, gint32 value);
+extern gint32 asn1_param_get_integer(asn1_ctx_t *actx, const gchar *name);
+
extern void rose_ctx_init(rose_ctx_t *rctx);
extern gboolean rose_ctx_check_signature(rose_ctx_t *rctx);
extern void rose_ctx_clean_data(rose_ctx_t *rctx);