You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

673 lines
27 KiB
C

/************************************************************************/
/* SISCO SOFTWARE MODULE HEADER *****************************************/
/************************************************************************/
/* (c) Copyright Systems Integration Specialists Company, Inc., */
/* 1986 - 2002, All Rights Reserved. */
/* */
/* PROPRIETARY AND CONFIDENTIAL */
/* */
/* MODULE NAME : asn1r.h */
/* PRODUCT(S) : ASN1DE */
/* */
/* MODULE DESCRIPTION : */
/* Contains definitions and global variables useful to the ASN1DE */
/* user. */
/* */
/* MODIFICATION LOG : */
/* Date Who Rev Comments */
/* -------- --- ------ ------------------------------------------- */
/* 08/01/05 JRB 22 Add const on asn1r_wr_vstr, asn1_wr_octstr args.*/
/* 03/23/05 JRB 21 Move APP_REF from suicacse to here so almost */
/* any SISCO app can use it. */
/* 07/08/04 JRB 20 Add define TIME_T_1984_JAN_1 & other defines.*/
/* Add asn1_convert_timet_to_btime6. */
/* 10/13/03 JRB 19 Add ASN1E_DECODE_OTHER, ASN1E_ENCODE_OTHER. */
/* 03/31/03 JRB 18 Add UTF8string support. */
/* asn1r_get_bitstr: add max_bits arg. */
/* 12/14/02 JRB 17 Add BSTR_*, MMS_BVSTRING, bstrcpy, bvstrcpy */
/* 11/11/02 EJV 16 asn1r_tag_add: added type cast */
/* 11/08/02 JRB 15 Add ASN1_DEC_PTR, ASN1_DEC_LEN macros. */
/* 10/29/02 JRB 14 Add asn1r_magic to ASN1_ENC_CTXT. */
/* 10/25/02 JRB 13 Add ASN1_ENC_PTR, ASN1_ENC_LEN macros. */
/* Add MMS_BTIME6 struct. */
/* 07/03/02 EJV 12 MMS_UTC_TIME: chg name usec to fraction. */
/* 01/22/02 JRB 11 Add "asn1r_buf_end" to ASN1_ENC_CTXT. */
/* Chg asn1r_end_of_buffer to asn1r_buf_start */
/* & asn1r_field_start to asn1r_field_end */
/* & _asn1_constr_start to asn1r_constr_end */
/* in ENC_CTX (start means start, end means end)*/
/* 01/07/02 EJV 09 Added asn1_ prefix to convert_... functions. */
/* 01/04/02 EJV 08 Add convert_btod_to_utc, convert_utc_to_btod */
/* 12/20/01 JRB 07 Split ASN1_CTXT into ASN1_DEC_CTXT, ASN1_ENC_CTXT*/
/* Del unused calendar stuff. */
/* Del backward compatibility defines. */
/* Chg asn1r_objidcmp to asn1_objidcmp. */
/* Del unused tzhour_diff, tconst, default_dcomp*/
/* Del unused strt_asn1,asn1_tz_calc,asn1_is_dst*/
/* 11/09/01 EJV 06 Added MMS_UTC_TIME typedef. */
/* Added asn1r_wr_utc_time, asn1r_get_utc_time */
/* ASN1_CTXT: del _save_asn1_len, _save_asn1_ptr*/
/* 08/15/00 JRB 05 Add asn1_ctxt "forward reference". */
/* 06/19/00 JRB 04 Add #if INT64_SUPP... */
/* 05/25/00 RKR 03 Deleted a an extra declaration of asn1_tzone */
/* 07/29/99 MDE 02 Added TABLE method */
/* 07/26/99 MDE 01 New, derived from asn1defs.h */
/************************************************************************/
#if !defined(ASN1DEFS_INCLUDED) && !defined(ASN1R_INCLUDED)
#define ASN1R_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
/************************************************************************/
#include "slog.h"
/* Defines for UNICODE local data format. */
#define UNICODE_UTF8 0
#define UNICODE_UTF16 1
#if !defined(UNICODE_LOCAL_FORMAT)
#if defined(_WIN32)
#define UNICODE_LOCAL_FORMAT UNICODE_UTF8
#else
#define UNICODE_LOCAL_FORMAT UNICODE_UTF8 /*default format */
#endif
#endif /* !defined(UNICODE_LOCAL_FORMAT) */
/************************************************************************/
/* asn1_debug_sel bit assignments */
#define ASN1_LOG_DEC 0x0001
#define ASN1_LOG_ENC 0x0002
#define ASN1_LOG_ERR 0x0004
#define ASN1_LOG_NERR 0x0008
/************************************************************************/
/* These are S_LOG control items for ASN1 logging */
extern ST_UINT asn1_debug_sel;
/************************************************************************/
/* Support for development time debugging can be enabled here */
/* #define DEBUG_ASN1_DECODE */
/************************************************************************/
/* Support for seldom needed decode features can be disabled here */
#if !defined(MMS_LITE)
#define GET_CONSTRUCTED_BSTRINGS
#define GET_CONSTRUCTED_OSTRINGS
#define ASN1_ARB_FLOAT
#endif
/************************************************************************/
/* Helpful Time-related defines */
#define SECONDS_PER_DAY (60*60*24)
#define MILLISECONDS_PER_DAY (1000 * SECONDS_PER_DAY)
#define DAYS_FROM_1970_TO_1984 ((11*365) + (3*366)) /*includes 3 leap years 1972, 1976, 1980*/
#define TIME_T_1984_JAN_1 (DAYS_FROM_1970_TO_1984 * SECONDS_PER_DAY)
/************************************************************************/
/* Binary Time Of Day */
#define MMS_BTOD4 4
#define MMS_BTOD6 6
typedef struct btod_data
{
ST_INT form; /* MMS_BTOD6, MMS_BTOD4 */
ST_INT32 ms; /* Number of milliseconds since midnight */
ST_INT32 day; /* Number of days since Jan 1, 1984 */
} MMS_BTOD;
/* MMS_BTIME6: this structure is the format used to pass "Btime6" data */
/* (i.e. ISO/IEC 9506-2 TimeOfDay with size=6) between the user and */
/* the ASN.1 encoder/decoder (i.e. ms_asn1_to_local & ms_local_to_asn1).*/
typedef struct
{
ST_INT32 ms; /* Number of milliseconds since midnight */
ST_INT32 day; /* Number of days since Jan 1, 1984 */
} MMS_BTIME6;
/************************************************************************/
/* UTC Time */
typedef struct mms_utc_time_tag
{
ST_UINT32 secs; /* Number of seconds since January 1, 1970 */
ST_UINT32 fraction; /* Fraction of a second */
ST_UINT32 qflags; /* Quality flags, 8 least-significant bits only */
} MMS_UTC_TIME;
ST_RET asn1_convert_btod_to_utc (MMS_BTOD *btod, MMS_UTC_TIME *utc);
ST_RET asn1_convert_utc_to_btod (MMS_UTC_TIME *utc, MMS_BTOD *btod);
ST_RET asn1_convert_timet_to_btime6 (time_t tThis, MMS_BTIME6 *bTime6);
/************************************************************************/
/* Variable Length Bitstring */
/* This structure defines the format used to pass "variable length */
/* bitstring" data between the user and */
/* the ASN.1 encoder/decoder (i.e. ms_asn1_to_local & ms_local_to_asn1).*/
/* NOTE: For bitstrings longer than 8 bits, the actual data extends */
/* beyond the end of this struct. */
typedef struct
{
ST_INT16 len;
ST_UCHAR data[1];
} MMS_BVSTRING;
/************************************************************************/
/* VMS Float Format select */
#define A_D_FLOAT 1
#define A_G_FLOAT 2
extern ST_INT asn1_vax_double_type;
/************************************************************************/
/* ASN1-DE limitiations */
#define ASN1_MAX_PDU 0x7FFF /* maximum decodable message length */
#define ASN1_MAX_FIELD 0x7FFF /* maximum field (data element) length */
#define ASN1_MAX_LEVEL 50 /* maximum supported nesting level */
/************************************************************************/
/* ASN.1 Definitions to support identifier construction by bit OR. */
/* Used to make up and test 'tag' bits. */
#define UNI 0x00 /* universal class */
#define APP 0x40 /* application wide */
#define CTX 0x80 /* context specific */
#define PRV 0xC0 /* private use */
#define CONSTR 0x20 /* constructor */
#define DEF 0x00 /* definite length constructor */
#define INDEF 0xFF /* indefinite length constructor */
/* Universal class ASN.1 ID code definitions */
#define EOC_CODE 0x00
#define BOOL_CODE 0x01
#define INT_CODE 0x02
#define BITS_CODE 0x03
#define OCT_CODE 0x04
#define NULL_CODE 0x05
#define OBJ_ID_CODE 0x06
#define OBJDSCR_CODE 0x07
#define EXTERN_CODE 0x08
#define SEQ_CODE 0x10
#define SET_CODE 0x11
#define NUMSTR_CODE 0x12
#define PRTSTR_CODE 0x13
#define S61STR_CODE 0x14
#define S100STR_CODE 0x15
#define IA5STR_CODE 0x16
#define UTCTIM_CODE 0x17
#define GENTIM_CODE 0x18
#define GRAFSTR_CODE 0x19
#define VISTR_CODE 0x1A
#define GENSTR_CODE 0x1B
/************************************************************************/
/* ASN.1 decode error definitions */
/* Used as the argument to "asn1_set_dec_err" function which sets the */
/* global variable "asn1_pdu_dec_err". */
/************************************************************************/
#define NO_DECODE_ERR 0 /* no decode error */
#define ASN1E_NEST_TOO_DEEP 0x7001
#define ASN1E_UNEXPECTED_CLASS 0x7002
#define ASN1E_UNEXPECTED_TAG 0x7003
#define ASN1E_ID_TOO_BIG 0x7004
#define ASN1E_CSTR_INVALID_LEN 0x7005
#define ASN1E_INVALID_LENGTH 0x7006
#define ASN1E_UNEXPECTED_FORM 0x7007
#define ASN1E_PDU_TOO_BIG 0x7008
#define ASN1E_END_O_BUFFER 0x7009
#define ASN1E_BITCSTR_TOO_BIG 0x700a
#define ASN1E_INVALID_BITSTR 0x700b
#define ASN1E_OCTSTR_TOO_BIG 0x700c
#define ASN1E_INVALID_BOOLEAN 0x700d
#define ASN1E_END_OF_MESSAGE 0x700e
#define ASN1E_END_OF_CSTR 0x700f
/* CRITICAL: The rest of the ASN.1 decode error definitions must not */
/* must not be changed. The lower 2 nibbles are used to set the */
/* REJECT class and code (mmsdec_map_err saves value to rslt.err_code */
/* which is used in "mmspdu.c" to generate REJECT class and code). */
/************************************************************************/
/* CONFIRMED REQUEST REJECT DEFINITIONS */
/************************************************************************/
#define REQ_UNSPECIFIED 0x7010
#define REQ_UNREC_SERV 0x7011
#define REQ_UNREC_MOD 0x7012
#define REQ_INVAL_INVOKE 0x7013
#define REQ_INVAL_ARG 0x7014
#define REQ_INVAL_MOD 0x7015
#define REQ_OUTSTD_EXCEED 0x7016
#define REQ_EXCSV_LENGTH 0x7017
#define REQ_EXCSV_NEST 0x7018
#define REQ_BAD_VALUE 0x7019
/************************************************************************/
/* CONFIRMED RESPONSE REJECT DEFINITIONS */
/************************************************************************/
#define RESP_UNSPECIFIED 0x7020
#define RESP_UNREC_SERV 0x7021
#define RESP_INVAL_INVOKE 0x7022
#define RESP_INVAL_RSLT 0x7023
#define RESP_EXCSV_LENGTH 0x7024
#define RESP_EXCSV_NEST 0x7025
#define RESP_BAD_VALUE 0x7026
/************************************************************************/
/* CONFIRMED ERROR REJECT DEFINITIONS */
/************************************************************************/
#define ERR_UNSPECIFIED 0x7030
#define ERR_UNREC_SERV 0x7031
#define ERR_INVAL_INVOKE 0x7032
#define ERR_INVAL_SERV 0x7033
#define ERR_BAD_VALUE 0x7034
/************************************************************************/
/* UNCONFIRMED PDU REJECT DEFINITIONS */
/************************************************************************/
#define UNCONF_UNSPECIFIED 0x7040
#define UNCONF_UNREC_SERV 0x7041
#define UNCONF_INVAL_ARG 0x7042
#define UNCONF_EXCSV_NEST 0x7043
#define UNCONF_BAD_VALUE 0x7044
/************************************************************************/
/* PDU REJECT DEFINITIONS */
/************************************************************************/
#define PDU_UNKNOWN_TYPE 0x7050
#define PDU_INVALID 0x7051
/************************************************************************/
/* CANCEL REQUEST REJECT DEFINITIONS */
/************************************************************************/
#define CANREQ_UNSPECIFIED 0x7060
#define CANREQ_INVAL_INVOKE 0x7061
/************************************************************************/
/* CANCEL RESPONSE REJECT DEFINITIONS */
/************************************************************************/
#define CANRESP_UNSPECIFIED 0x7070
#define CANRESP_INVAL_INVOKE 0x7071
/************************************************************************/
/* CANCEL ERROR REJECT DEFINITIONS */
/************************************************************************/
#define CANERR_UNSPECIFIED 0x7080
#define CANERR_INVAL_INVOKE 0x7081
#define CANERR_INVAL_SERV 0x7082
#define CANERR_BAD_VALUE 0x7083
/************************************************************************/
/* CONCLUDE REQUEST REJECT DEFINITIONS */
/************************************************************************/
#define CONREQ_UNSPECIFIED 0x7090
#define CONREQ_INVAL_ARG 0x7091
/************************************************************************/
/* CONCLUDE RESPONSE REJECT DEFINITIONS */
/************************************************************************/
#define CONRESP_UNSPECIFIED 0x70A0
#define CONRESP_INVAL_RSLT 0x70A1
/************************************************************************/
/* CONCLUDE ERROR REJECT DEFINITIONS */
/************************************************************************/
#define CONERR_UNSPECIFIED 0x70B0
#define CONERR_INVAL_SERV 0x70B1
#define CONERR_BAD_VALUE 0x70B2
/************************************************************************/
/* OTHER ASN.1 ENCODE/DECODE ERROR DEFINITIONS */
/************************************************************************/
#define ASN1E_DECODE_OTHER 0x70C0
#define ASN1E_ENCODE_OTHER 0x70C1
/************************************************************************/
/* General variables and pointers used by the ASN1 system. */
/************************************************************************/
#define ASN1_TAG_METHOD 0 /* decode by tag method */
#define ASN1_CLASS_METHOD 1 /* decode by class method */
#define ASN1_TABLE_METHOD 2 /* decode by table method */
#define CSTR_DONE_FUN ac->asn1r_c_done_fun[ac->asn1r_msg_level]
/************************************************************************/
/* This define is the maximum tag + length for a MMS-EASE encoded data */
/* element (actually probably is 9), and is used in fin_constr and */
/* fin_prim to prevent encode buffer overrun */
#define ASN1_MAX_ELEMENT_OVERHEAD 10
struct asn1_dec_ctxt; /* Forward reference */
/************************************************************************/
/************************************************************************/
/* TAG METHOD STRUCTURES AND DEFINES */
#define ASN1R_TAG_VAL(class,code) (((ST_UINT16)(class) << 8) | (code))
typedef struct
{
ST_UINT16 _asn1r_tag;
ST_VOID (*_asn1r_tag_fun)(struct asn1_dec_ctxt *ac);
} ASN1R_TAG_PAIR;
/* Decode users: Select the structure that has sufficient tag capacity */
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[1]; } ASN1R_TAG_CTRL_1;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[2]; } ASN1R_TAG_CTRL_2;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[3]; } ASN1R_TAG_CTRL_3;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[4]; } ASN1R_TAG_CTRL_4;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[5]; } ASN1R_TAG_CTRL_5;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[6]; } ASN1R_TAG_CTRL_6;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[7]; } ASN1R_TAG_CTRL_7;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[8]; } ASN1R_TAG_CTRL_8;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[9]; } ASN1R_TAG_CTRL_9;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[10];} ASN1R_TAG_CTRL_10;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[11];} ASN1R_TAG_CTRL_11;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[12];} ASN1R_TAG_CTRL_12;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[13];} ASN1R_TAG_CTRL_13;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[14];} ASN1R_TAG_CTRL_14;
typedef struct {ST_INT num_tags; ASN1R_TAG_PAIR tags[15];} ASN1R_TAG_CTRL_15;
/************************************************************************/
/* ASN.1 Context */
/* This data structure is used to store all ASN.1 encode/decode context */
/* information. If an application provides thread safe storage for this */
/* data structure the ASN.1 tools become thread safe. */
#define ASN1_MAX_USR_INFO 5
#define MAX_TAG_FUN 16
typedef struct asn1_dec_ctxt
{
/****** User and Internal Use ******/
/* User State */
ST_VOID *usr_info[ASN1_MAX_USR_INFO];
/* General variables and pointers */
ST_BOOLEAN asn1r_decode_done;
ST_UCHAR *asn1r_field_ptr;
ST_UCHAR *asn1r_field_start;
ST_UCHAR asn1r_constr_elmnt;
ST_UCHAR asn1r_elmnt_class;
ST_UINT16 asn1r_elmnt_id;
ST_INT asn1r_elmnt_len;
ST_INT asn1r_msg_level;
ST_BOOLEAN asn1r_indef_flag; /* flag for indef cstr */
ST_RET asn1r_pdu_dec_err;
ST_INT asn1r_decode_method;
ST_INT asn1r_save_method;
ST_INT asn1r_max_bits;
ST_INT asn1r_bitcount;
ST_INT asn1r_octetcount;
/* For ASN1 decode table mode */
ST_VOID *asn1r_tag_table;
/* Function pointers used by decoder users */
ST_VOID (*asn1r_decode_done_fun)(struct asn1_dec_ctxt *ac);
ST_VOID (*asn1r_err_fun)(struct asn1_dec_ctxt *ac, ST_RET err_code);
ST_VOID (*asn1r_c_done_fun[ASN1_MAX_LEVEL])(struct asn1_dec_ctxt *ac);
ST_VOID (*asn1r_u_id_fun)(struct asn1_dec_ctxt *ac, ST_UINT16 id);
ST_VOID (*asn1r_a_id_fun)(struct asn1_dec_ctxt *ac, ST_UINT16 id);
ST_VOID (*asn1r_c_id_fun)(struct asn1_dec_ctxt *ac, ST_UINT16 id);
ST_VOID (*asn1r_p_id_fun)(struct asn1_dec_ctxt *ac, ST_UINT16 id);
/****** Internal Use Only ******/
/* Decode variables */
ST_INT _asn1_maxoctets;
ST_UCHAR *_asn1_octetptr;
ST_UCHAR *_ad_bitptr;
/* Function pointers used internally by the ASN.1 tools */
ST_VOID (*_asn1r_cstr_done_save)(struct asn1_dec_ctxt *ac);
ST_VOID (*_asn1r_fun_save)(struct asn1_dec_ctxt *ac);
ST_INT _asn1r_ntag;
ST_UINT16 _asn1r_valid_tags[MAX_TAG_FUN];
ST_VOID (*_asn1r_tag_fun[MAX_TAG_FUN])(struct asn1_dec_ctxt *ac);
ST_INT _asn1r_old_ntag;
ST_BOOLEAN _asn1_indef_track[ASN1_MAX_LEVEL];
ST_UCHAR *_asn1_constr_start[ASN1_MAX_LEVEL];
ST_INT _asn1_byte_count[ASN1_MAX_LEVEL];
ST_INT _ad_parse_method_save;
ST_VOID (*_ad_parse_asn1r_fun_save)(struct asn1_dec_ctxt *ac);
ST_UCHAR *_contents_done; /* will be here when done parsing cstr contents */
ST_UCHAR *_parse_begin_ptr; /* pointer to beginning of element being skipped*/
} ASN1_DEC_CTXT;
typedef struct asn1_enc_ctxt
{
/* General variables and pointers */
ST_UCHAR *asn1r_field_ptr;
ST_UCHAR *asn1r_field_end;
ST_INT asn1r_msg_level;
ST_UCHAR *asn1r_buf_start; /* ptr to first byte of buffer */
ST_UCHAR *asn1r_buf_end; /* ptr to last byte of buffer */
ST_BOOLEAN asn1r_encode_overrun;
ST_UINT16 asn1r_magic; /* Use to verify asn1r_strt.. was called*/
ST_UCHAR *asn1r_constr_end[ASN1_MAX_LEVEL];
} ASN1_ENC_CTXT;
/* Set "asn1r_magic" in ASN1_ENC_CTXT to this value in "asn1r_strt_asn1_bld".*/
/* Check later to be sure asn1r_strt_asn1_bld was called. */
#define ASN1_ENC_MAGIC_NUMBER 0xABCD
/************************************************************************/
ASN1_DEC_CTXT *asn1r_get_ctxt (ST_VOID);
ST_VOID asn1r_decode_asn1 (ASN1_DEC_CTXT *ac, ST_UCHAR *ptr, ST_INT len);
ST_VOID asn1r_decode_asn1_seq (ASN1_DEC_CTXT *ac, ST_UCHAR *ptr, ST_INT len);
ST_VOID asn1r_head_decode (ASN1_DEC_CTXT *ac);
ST_VOID asn1r_set_dec_err (ASN1_DEC_CTXT *ac, ST_RET err_code);
ST_VOID asn1r_done_err (ASN1_DEC_CTXT *ac);
ST_VOID asn1r_cstr_done_err (ASN1_DEC_CTXT *ac);
ST_VOID asn1r_set_all_cstr_done (ASN1_DEC_CTXT *ac);
ST_VOID asn1r_class_err (ASN1_DEC_CTXT *ac, ST_UINT16 id);
ST_VOID asn1r_chk_getcstr_done (ASN1_DEC_CTXT *ac);
#if !defined(ASN1R_FAST_TAG_ADD)
#define ASN1R_TAG_ADD(ac, class, code, fcn_ptr)\
asn1r_tag_add (ac, (ST_UINT16)(((ST_UINT16)(class) << 8) | (code)), (fcn_ptr))
#else
#define ASN1R_TAG_ADD(ac, class, code, fcn_ptr)\
{\
ac->_asn1r_valid_tags[ac->_asn1r_ntag] = \
(((ST_UINT16)(class) << 8) | (code));\
ac->_asn1r_tag_fun[ac->_asn1r_ntag] = (ST_VOID (*)(ASN1_DEC_CTXT *)) fcn_ptr;\
ac->_asn1r_ntag++;\
}
#endif
#define ASN1R_TAG_DEL(ac, class, code)\
asn1r_tag_del (ac, (((ST_UINT16)(class) << 8) | (code)))
ST_VOID asn1r_tag_add (ASN1_DEC_CTXT *ac, ST_UINT16 tag_class,
ST_VOID (*fcn_ptr)(ASN1_DEC_CTXT *ac));
ST_VOID asn1r_tag_del (ASN1_DEC_CTXT *ac, ST_UINT16 tag);
ST_VOID asn1r_tag_restore (ASN1_DEC_CTXT *ac);
ST_VOID asn1r_strt_asn1_bld (ASN1_ENC_CTXT *ac, ST_UCHAR *bufptr, ST_INT buflen);
ST_VOID asn1r_fin_prim (ASN1_ENC_CTXT *ac, ST_UINT16 id_code, ST_UINT16 tag);
ST_VOID asn1r_fin_constr (ASN1_ENC_CTXT *ac, ST_UINT16 id_code, ST_UINT16 el_tag, ST_BOOLEAN indef);
ST_VOID asn1r_strt_constr (ASN1_ENC_CTXT *ac);
ST_VOID asn1r_wr_u8 (ASN1_ENC_CTXT *ac, ST_UINT8 data);
ST_VOID asn1r_wr_u16 (ASN1_ENC_CTXT *ac, ST_UINT16 data);
ST_VOID asn1r_wr_u32 (ASN1_ENC_CTXT *ac, ST_UINT32 data);
ST_VOID asn1r_wr_i8 (ASN1_ENC_CTXT *ac, ST_INT8 data);
ST_VOID asn1r_wr_bool (ASN1_ENC_CTXT *ac, ST_BOOLEAN data);
ST_VOID asn1r_wr_i16 (ASN1_ENC_CTXT *ac, ST_INT16 data);
ST_VOID asn1r_wr_i32 (ASN1_ENC_CTXT *ac, ST_INT32 data);
ST_VOID asn1r_wr_vstr (ASN1_ENC_CTXT *ac, const ST_CHAR *data);
ST_VOID asn1r_wr_delmnt (ASN1_ENC_CTXT *ac, ST_UCHAR *bufptr, ST_INT buflen);
ST_VOID asn1r_wr_btod (ASN1_ENC_CTXT *ac, MMS_BTOD *data);
ST_VOID asn1r_wr_time (ASN1_ENC_CTXT *ac, time_t data);
ST_VOID asn1r_wr_objid (ASN1_ENC_CTXT *ac, ST_INT16 *data, ST_INT num_el);
ST_VOID asn1r_wr_bitstr (ASN1_ENC_CTXT *ac, ST_UCHAR *bitptr, ST_INT numbits);
ST_VOID asn1r_wr_octstr (ASN1_ENC_CTXT *ac, const ST_UCHAR *octptr, ST_INT numoctets);
ST_VOID asn1r_wr_float (ASN1_ENC_CTXT *ac, ST_FLOAT data);
ST_VOID asn1r_wr_double (ASN1_ENC_CTXT *ac, ST_DOUBLE data);
ST_VOID asn1r_wr_utc_time (ASN1_ENC_CTXT *ac, MMS_UTC_TIME *data);
ST_RET asn1r_wr_utf8 (ASN1_ENC_CTXT *ac, ST_CHAR *data, ST_INT el_len);
ST_RET asn1r_get_identifier (ASN1_DEC_CTXT *ac, ST_CHAR *dest);
ST_RET asn1r_get_objid (ASN1_DEC_CTXT *ac, ST_INT16 component_list[], ST_INT *num_components);
ST_RET asn1r_get_bool (ASN1_DEC_CTXT *ac, ST_BOOLEAN *dest);
ST_VOID asn1r_get_strn (ASN1_DEC_CTXT *ac, ST_CHAR *dest);
ST_RET asn1r_get_nstr (ASN1_DEC_CTXT *ac, ST_CHAR *dest);
ST_RET asn1r_get_pstr (ASN1_DEC_CTXT *ac, ST_CHAR *dest);
ST_RET asn1r_get_vstr (ASN1_DEC_CTXT *ac, ST_CHAR *dest);
ST_RET asn1r_get_i8 (ASN1_DEC_CTXT *ac, ST_INT8 *dest);
ST_RET asn1r_get_i16 (ASN1_DEC_CTXT *ac, ST_INT16 *dest);
ST_RET asn1r_get_i32 (ASN1_DEC_CTXT *ac, ST_INT32 *dest);
ST_RET asn1r_get_u8 (ASN1_DEC_CTXT *ac, ST_UCHAR *dest);
ST_RET asn1r_get_u16 (ASN1_DEC_CTXT *ac, ST_UINT16 *dest);
ST_RET asn1r_get_u32 (ASN1_DEC_CTXT *ac, ST_UINT32 *dest);
ST_RET asn1r_get_btod (ASN1_DEC_CTXT *ac, MMS_BTOD *dest);
ST_RET asn1r_get_time (ASN1_DEC_CTXT *ac, time_t *dest);
ST_RET asn1r_get_bitstr (ASN1_DEC_CTXT *ac, ST_UCHAR *dest, ST_INT max_bits);
ST_VOID asn1r_get_bitstr_cstr (ASN1_DEC_CTXT *ac, ST_INT bits, ST_UCHAR *ptr);
ST_RET asn1r_get_octstr (ASN1_DEC_CTXT *ac, ST_UCHAR *dest);
ST_VOID asn1r_get_octstr_cstr (ASN1_DEC_CTXT *ac, ST_INT numoctets, ST_UCHAR *octptr);
ST_VOID asn1r_get_delmnt (ASN1_DEC_CTXT *ac, ST_INT buflen, ST_UCHAR *bufptr,
ST_VOID (*done_fun)(ASN1_DEC_CTXT *ac));
ST_RET asn1r_get_float (ASN1_DEC_CTXT *ac, ST_FLOAT *dest);
ST_RET asn1r_get_double (ASN1_DEC_CTXT *ac, ST_DOUBLE *dest);
ST_RET asn1r_get_utc_time (ASN1_DEC_CTXT *ac, MMS_UTC_TIME *dest);
ST_RET asn1r_get_utf8 (ASN1_DEC_CTXT *ac, ST_CHAR *ptr, ST_INT el_len);
#ifdef INT64_SUPPORT
ST_VOID asn1r_wr_i64 (ASN1_ENC_CTXT *ac, ST_INT64 data);
ST_VOID asn1r_wr_u64 (ASN1_ENC_CTXT *ac, ST_UINT64 data);
ST_RET asn1r_get_i64 (ASN1_DEC_CTXT *ac, ST_INT64 *dest);
ST_RET asn1r_get_u64 (ASN1_DEC_CTXT *ac, ST_UINT64 *dest);
#endif /* INT64_SUPPORT */
ST_VOID asn1r_parse_next (ASN1_DEC_CTXT *ac, ST_VOID (*done_fun)(ASN1_DEC_CTXT *ac));
ST_VOID asn1r_parse_cstr_contents (ASN1_DEC_CTXT *ac, ST_VOID (*done_fun)(ASN1_DEC_CTXT *ac));
/************************************************************************/
/* These macros simplify access to members of the ASN1_ENC_CTXT struct. */
/************************************************************************/
/* This macro returns a pointer to the start of the ASN.1 encoded data. */
#define ASN1_ENC_PTR(aCtx) ((aCtx)->asn1r_field_ptr+1)
/* This macro returns the length (in bytes) of the ASN.1 encoded data. */
#define ASN1_ENC_LEN(aCtx) ((aCtx)->asn1r_buf_end - (aCtx)->asn1r_field_ptr)
/* This macro returns a pointer to the start of the ASN.1 DECODED data. */
#define ASN1_DEC_PTR(aCtx) ((aCtx)->asn1r_field_ptr)
/* This macro returns the length (in bytes) of the ASN.1 DECODED data. */
#define ASN1_DEC_LEN(aCtx) ((aCtx)->asn1r_elmnt_len)
/************************************************************************/
/* OBJECT IDENTIFIER */
/************************************************************************/
#define MAX_OBJID_COMPONENTS 16
struct mms_obj_id
{
ST_INT num_comps; /* number of objid components */
ST_INT16 comps[MAX_OBJID_COMPONENTS]; /* identifier components */
SD_END_STRUCT
};
typedef struct mms_obj_id MMS_OBJ_ID;
ST_BOOLEAN asn1_objidcmp (MMS_OBJ_ID *obj1, MMS_OBJ_ID *obj2);
/************************************************************************/
/* Application Reference data structure */
/************************************************************************/
#define APP_REF_FORM1 0
#define APP_REF_FORM2 1
struct form1
{
ST_UCHAR *ptr; /* ptr to something */
ST_INT16 len; /* length of contents at ptr */
};
typedef struct form1 FORM1_T;
struct app_ref
{
ST_INT16 form; /* tells if form 1 or form 2 */
ST_BOOLEAN ap_title_pres; /* tells if AP title is there */
union /* AP title differs in form */
{
FORM1_T form_1; /* form 1 of AP title is ASN.1 */
MMS_OBJ_ID form_2; /* form 2 of AP title is objectid*/
} ap_title;
ST_BOOLEAN ap_invoke_pres; /* tells if AP invoke is there */
ST_INT32 ap_invoke;
ST_BOOLEAN ae_qual_pres; /* tells if AE qualifier is there*/
union /* AE qualifier differs in form */
{
FORM1_T form_1; /* form 1 of AE qual is ASN.1 */
ST_INT32 form_2; /* form 2 if AE qual is long word*/
} ae_qual;
ST_BOOLEAN ae_invoke_pres; /* tells if AE invoke is there */
ST_INT32 ae_invoke;
};
typedef struct app_ref APP_REF;
/************************************************************************/
/* Miscellaneous functions/macros. */
/************************************************************************/
/* Functions to copy bitstrings and "variable length bitstrings". */
ST_VOID bstrcpy (ST_UCHAR *dstptr, ST_UCHAR *srcptr, ST_INT numbits);
ST_VOID bvstrcpy (MMS_BVSTRING *dstptr, MMS_BVSTRING *srcptr);
/* Macros to access each individual bit of any bitstring. */
#define BSTR_BIT_SET_ON(ptr,bitnum) \
( ((ST_UINT8 *)(ptr))[(bitnum)/8] |= (0x80>>((bitnum)&7)) )
#define BSTR_BIT_SET_OFF(ptr,bitnum) \
( ((ST_UINT8 *)(ptr))[(bitnum)/8] &= ~(0x80>>((bitnum)&7)) )
/* BSTR_BIT_GET returns zero if bit is clear, non-zero if bit is set. */
/* If MUST return ONLY 0 or 1, simply add "? 1:0" to end of macro. */
#define BSTR_BIT_GET(ptr,bitnum) \
( ((ST_UINT8 *)(ptr))[(bitnum)/8] & (0x80>>((bitnum)&7)) )
#define BSTR_BIT_SET_TRUE BSTR_BIT_SET_ON
#define BSTR_BIT_SET_FALSE BSTR_BIT_SET_OFF
/* Calculate number of bytes needed to contain number of bits. */
#define BSTR_NUMBITS_TO_NUMBYTES(numbits) (((numbits)+7)/8)
/* Functions for conversion from ASN.1 UTF8string to local format. */
/* Must be ported to each platform. */
ST_INT asn1r_utf8_to_local (ST_CHAR *dst, ST_INT dst_len, ST_CHAR *src, ST_INT src_len);
ST_INT asn1r_local_to_utf8 (ST_CHAR *dst, ST_INT dst_len, ST_CHAR *src);
#ifdef __cplusplus
}
#endif
/************************************************************************/
#endif /* File not already included */
/************************************************************************/