2 * Routines for dissection of ASN.1 Aligned PER
5 * Wireshark - Network traffic analyzer
6 * By Gerald Combs <gerald@wireshark.org>
7 * Copyright 1998 Gerald Combs
9 * SPDX-License-Identifier: GPL-2.0-or-later
12 #ifndef __PACKET_PER_H__
13 #define __PACKET_PER_H__
15 #include "ws_symbol_export.h"
17 typedef int (*per_type_fn
)(tvbuff_t
*, int, asn1_ctx_t
*, proto_tree
*, int);
19 /* in all functions here, offset is uint32_t and is
20 byteposition<<3 + bitposition
23 /* value for value and size constraints */
27 /* values for extensions */
28 #define ASN1_NO_EXTENSIONS 0
29 #define ASN1_EXTENSION_ROOT ASN1_EXT_ROOT
30 #define ASN1_NOT_EXTENSION_ROOT ASN1_EXT_EXT
32 /* value for optional */
33 #define ASN1_NOT_OPTIONAL 0
34 #define ASN1_OPTIONAL ASN1_OPT
36 typedef struct _per_choice_t
{
43 typedef struct _per_sequence_t
{
50 WS_DLL_PUBLIC
void dissect_per_not_decoded_yet(proto_tree
* tree
, packet_info
* pinfo
, tvbuff_t
*tvb
, const char* reason
);
52 WS_DLL_PUBLIC
uint32_t dissect_per_null(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
);
54 WS_DLL_PUBLIC
uint32_t dissect_per_GeneralString(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
);
56 WS_DLL_PUBLIC
uint32_t dissect_per_sequence_of(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*parent_tree
, int hf_index
, int ett_index
, const per_sequence_t
*seq
);
58 WS_DLL_PUBLIC
uint32_t dissect_per_IA5String(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, tvbuff_t
**value_tvb
);
60 WS_DLL_PUBLIC
uint32_t dissect_per_NumericString(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, tvbuff_t
**value_tvb
);
62 WS_DLL_PUBLIC
uint32_t dissect_per_PrintableString(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, tvbuff_t
**value_tvb
);
64 WS_DLL_PUBLIC
uint32_t dissect_per_VisibleString(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, tvbuff_t
**value_tvb
);
66 WS_DLL_PUBLIC
uint32_t dissect_per_BMPString(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
);
68 extern uint32_t dissect_per_UTF8String(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
);
70 extern uint32_t dissect_per_object_descriptor(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, tvbuff_t
**value_tvb
);
72 WS_DLL_PUBLIC
uint32_t dissect_per_constrained_sequence_of(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*parent_tree
, int hf_index
, int ett_index
, const per_sequence_t
*seq
, int min_len
, int max_len
, bool has_extension
);
74 WS_DLL_PUBLIC
uint32_t dissect_per_constrained_set_of(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*parent_tree
, int hf_index
, int ett_index
, const per_sequence_t
*seq
, int min_len
, int max_len
, bool has_extension
);
76 WS_DLL_PUBLIC
uint32_t dissect_per_set_of(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*parent_tree
, int hf_index
, int ett_index
, const per_sequence_t
*seq
);
78 WS_DLL_PUBLIC
uint32_t dissect_per_object_identifier(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, tvbuff_t
**value_tvb
);
79 WS_DLL_PUBLIC
uint32_t dissect_per_object_identifier_str(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, const char **value_stringx
);
81 WS_DLL_PUBLIC
uint32_t dissect_per_relative_oid(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, tvbuff_t
**value_tvb
);
82 WS_DLL_PUBLIC
uint32_t dissect_per_relative_oid_str(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, const char **value_stringx
);
84 WS_DLL_PUBLIC
uint32_t dissect_per_boolean(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, bool *bool_val
);
86 WS_DLL_PUBLIC
uint32_t dissect_per_integer(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int32_t *value
);
88 WS_DLL_PUBLIC
uint32_t dissect_per_constrained_integer(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, uint32_t min
, uint32_t max
, uint32_t *value
, bool has_extension
);
90 WS_DLL_PUBLIC
uint32_t dissect_per_constrained_integer_64b(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, uint64_t min
, uint64_t max
, uint64_t *value
, bool has_extension
);
92 WS_DLL_PUBLIC
uint32_t dissect_per_real(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, double *value
);
94 WS_DLL_PUBLIC
uint32_t dissect_per_choice(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int ett_index
, const per_choice_t
*choice
, int *value
);
96 WS_DLL_PUBLIC
uint32_t dissect_per_sequence(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*parent_tree
, int hf_index
, int ett_index
, const per_sequence_t
*sequence
);
97 WS_DLL_PUBLIC
uint32_t dissect_per_sequence_eag(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, const per_sequence_t
*sequence
);
99 WS_DLL_PUBLIC
uint32_t dissect_per_octet_string(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, tvbuff_t
**value_tvb
);
100 WS_DLL_PUBLIC
uint32_t dissect_per_octet_string_containing_pdu_new(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, dissector_t type_cb
);
102 WS_DLL_PUBLIC
uint32_t dissect_per_bit_string(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, int * const *named_bits
, int num_named_bits
, tvbuff_t
**value_tvb
, int *len
);
104 WS_DLL_PUBLIC
uint32_t dissect_per_bit_string_containing_pdu_new(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, dissector_t type_cb
);
106 WS_DLL_PUBLIC
uint32_t dissect_per_restricted_character_string(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, int min_len
, int max_len
, bool has_extension
, const char *alphabet
, int alphabet_length
, tvbuff_t
**value_tvb
);
108 WS_DLL_PUBLIC
uint32_t dissect_per_enumerated(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, uint32_t root_num
, uint32_t *value
, bool has_extension
, uint32_t ext_num
, uint32_t *value_map
);
110 WS_DLL_PUBLIC
uint32_t dissect_per_open_type(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, per_type_fn type_cb
);
111 WS_DLL_PUBLIC
uint32_t dissect_per_open_type_pdu_new(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, dissector_t type_cb
);
113 WS_DLL_PUBLIC
uint32_t dissect_per_external_type(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, per_type_fn type_cb
);
115 extern uint32_t dissect_per_size_constrained_type(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx
, proto_tree
*tree
, int hf_index
, per_type_fn type_cb
, const char *name
, int min_len
, int max_len
, bool has_extension
);
116 extern bool get_size_constraint_from_stack(asn1_ctx_t
*actx
, const char *name
, int *pmin_len
, int *pmax_len
, bool *phas_extension
);
118 extern uint32_t dissect_per_length_determinant(tvbuff_t
*tvb
, uint32_t offset
, asn1_ctx_t
*actx _U_
, proto_tree
*tree
, int hf_index
, uint32_t *length
, bool *is_fragmented
);
120 WS_DLL_PUBLIC
int call_per_oid_callback(const char *oid
, tvbuff_t
*tvb
, packet_info
*pinfo
, proto_tree
*tree
, int offset
, asn1_ctx_t
*actx
, int hf_index
);
121 WS_DLL_PUBLIC
void register_per_oid_dissector(const char *oid
, dissector_t dissector
, int proto
, const char *name
);
122 WS_DLL_PUBLIC
void add_per_encoded_label(tvbuff_t
* tvb
, packet_info
* pinfo _U_
, proto_tree
* tree
);
123 #endif /* __PACKET_PER_H__ */