diff options
Diffstat (limited to 'addons/ooh323c/src/ooasn1.h')
-rw-r--r-- | addons/ooh323c/src/ooasn1.h | 1814 |
1 files changed, 1814 insertions, 0 deletions
diff --git a/addons/ooh323c/src/ooasn1.h b/addons/ooh323c/src/ooasn1.h new file mode 100644 index 000000000..47219fac2 --- /dev/null +++ b/addons/ooh323c/src/ooasn1.h @@ -0,0 +1,1814 @@ +/* + * Copyright (C) 1997-2005 by Objective Systems, Inc. + * + * This software is furnished under an open source license and may be + * used and copied only in accordance with the terms of this license. + * The text of the license may generally be found in the root + * directory of this installation in the COPYING file. It + * can also be viewed online at the following URL: + * + * http://www.obj-sys.com/open/license.html + * + * Any redistributions of this file including modified versions must + * maintain this copyright notice. + * + *****************************************************************************/ +/** + * @file ooasn1.h + * Common ASN.1 runtime constants, data structure definitions, and run-time + * functions to support ASN.1 PER encoding/decoding as defined in the + * ITU-T standards. + */ +#ifndef _OOASN1_H_ +#define _OOASN1_H_ + +#include <limits.h> +#include <stdio.h> +#include <string.h> +#include <stddef.h> +#include "dlist.h" +#include "ootrace.h" +/** + * @defgroup cruntime C Runtime Common Functions + * @{ + */ + +/* Error Code Constants */ + +#define ASN_OK 0 /* normal completion status */ +#define ASN_OK_FRAG 2 /* message fragment detected */ +#define ASN_E_BUFOVFLW -1 /* encode buffer overflow */ +#define ASN_E_ENDOFBUF -2 /* unexpected end of buffer on decode */ +#define ASN_E_IDNOTFOU -3 /* identifer not found */ +#define ASN_E_INVOBJID -4 /* invalid object identifier */ +#define ASN_E_INVLEN -5 /* invalid field length */ +#define ASN_E_INVENUM -6 /* enumerated value not in defined set */ +#define ASN_E_SETDUPL -7 /* duplicate element in set */ +#define ASN_E_SETMISRQ -8 /* missing required element in set */ +#define ASN_E_NOTINSET -9 /* element not part of set */ +#define ASN_E_SEQOVFLW -10 /* sequence of field overflow */ +#define ASN_E_INVOPT -11 /* invalid option encountered in choice */ +#define ASN_E_NOMEM -12 /* no dynamic memory available */ +#define ASN_E_INVHEXS -14 /* invalid hex string */ +#define ASN_E_INVBINS -15 /* invalid binary string */ +#define ASN_E_INVREAL -16 /* invalid real value */ +#define ASN_E_STROVFLW -17 /* octet or bit string field overflow */ +#define ASN_E_BADVALUE -18 /* invalid value specification */ +#define ASN_E_UNDEFVAL -19 /* no def found for ref'd defined value */ +#define ASN_E_UNDEFTYP -20 /* no def found for ref'd defined type */ +#define ASN_E_BADTAG -21 /* invalid tag value */ +#define ASN_E_TOODEEP -22 /* nesting level is too deep */ +#define ASN_E_CONSVIO -23 /* value constraint violation */ +#define ASN_E_RANGERR -24 /* invalid range (lower > upper) */ +#define ASN_E_ENDOFFILE -25 /* end of file on file decode */ +#define ASN_E_INVUTF8 -26 /* invalid UTF-8 encoding */ +#define ASN_E_CONCMODF -27 /* Concurrent list modification */ +#define ASN_E_ILLSTATE -28 /* Illegal state error */ +#define ASN_E_OUTOFBND -29 /* out of bounds (of array, etc) */ +#define ASN_E_INVPARAM -30 /* invalid parameter */ +#define ASN_E_INVFORMAT -31 /* invalid time string format */ +#define ASN_E_NOTINIT -32 /* not initialized */ +#define ASN_E_TOOBIG -33 /* value is too big for given data type */ +#define ASN_E_INVCHAR -34 /* invalid character (not in char set) */ +#define ASN_E_XMLSTATE -35 /* XML state error */ +#define ASN_E_XMLPARSE -36 /* XML parse error */ +#define ASN_E_SEQORDER -37 /* SEQUENCE elements not in order */ +#define ASN_E_INVINDEX -38 /* invalid index for TC id */ +#define ASN_E_INVTCVAL -39 /* invalid value for TC field */ +#define ASN_E_FILNOTFOU -40 /* file not found */ +#define ASN_E_FILEREAD -41 /* error occurred reading file */ +#define ASN_E_FILEWRITE -42 /* error occurred writing file */ +#define ASN_E_INVBASE64 -43 /* invalid base64 encoding */ +#define ASN_E_INVSOCKET -44 /* invalid socket operation */ +#define ASN_E_XMLLIBNFOU -45 /* XML library is not found */ +#define ASN_E_XMLLIBINV -46 /* XML library is invalid */ +#define ASN_E_NOTSUPP -99 /* non-supported ASN construct */ +#define ASN_K_INDEFLEN -9999 /* indefinite length message indicator */ + +/* universal built-in type ID code value constants */ + +#define ASN_ID_EOC 0 /* end of contents */ +#define ASN_ID_BOOL 1 /* boolean */ +#define ASN_ID_INT 2 /* integer */ +#define ASN_ID_BITSTR 3 /* bit string */ +#define ASN_ID_OCTSTR 4 /* byte (octet) string */ +#define ASN_ID_NULL 5 /* null */ +#define ASN_ID_OBJID 6 /* object ID */ +#define ASN_ID_OBJDSC 7 /* object descriptor */ +#define ASN_ID_EXTERN 8 /* external type */ +#define ASN_ID_REAL 9 /* real */ +#define ASN_ID_ENUM 10 /* enumerated value */ +#define ASN_ID_EPDV 11 /* EmbeddedPDV type */ +#define ASN_ID_RELOID 13 /* relative object ID */ +#define ASN_ID_SEQ 16 /* sequence, sequence of */ +#define ASN_ID_SET 17 /* set, set of */ + +#define ASN_SEQ_TAG 0x30 /* SEQUENCE universal tag byte */ +#define ASN_SET_TAG 0x31 /* SET universal tag byte */ + +/* Restricted character string type ID's */ + +#define ASN_ID_NumericString 18 +#define ASN_ID_PrintableString 19 +#define ASN_ID_TeletexString 20 +#define ASN_ID_T61String ASN_ID_TeletexString +#define ASN_ID_VideotexString 21 +#define ASN_ID_IA5String 22 +#define ASN_ID_UTCTime 23 +#define ASN_ID_GeneralTime 24 +#define ASN_ID_GraphicString 25 +#define ASN_ID_VisibleString 26 +#define ASN_ID_GeneralString 27 +#define ASN_ID_UniversalString 28 +#define ASN_ID_BMPString 30 + +/* flag mask values */ + +#define XM_SEEK 0x01 /* seek match until found or end-of-buf */ +#define XM_ADVANCE 0x02 /* advance pointer to contents on match */ +#define XM_DYNAMIC 0x04 /* alloc dyn mem for decoded variable */ +#define XM_SKIP 0x08 /* skip to next field after parsing tag */ + +/* Sizing Constants */ + +#define ASN_K_MAXDEPTH 32 /* maximum nesting depth for messages */ +#define ASN_K_MAXSUBIDS 128 /* maximum sub-id's in an object ID */ +#define ASN_K_MAXENUM 100 /* maximum enum values in an enum type */ +#define ASN_K_MAXERRP 5 /* maximum error parameters */ +#define ASN_K_MAXERRSTK 8 /* maximum levels on error ctxt stack */ +#define ASN_K_ENCBUFSIZ 2*1024 /* dynamic encode buffer extent size */ +#define ASN_K_MEMBUFSEG 1024 /* memory buffer extent size */ + +/* Canonical character set definitions */ + +#define NUM_ABITS 4 +#define NUM_UBITS 4 +#define NUM_CANSET \ +" 0123456789" + +#define PRN_ABITS 8 +#define PRN_UBITS 7 +#define PRN_CANSET \ +" '()+,-./0123456789:=?ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" + +#define VIS_ABITS 8 +#define VIS_UBITS 7 +#define VIS_CANSET \ +" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]"\ +"^_`abcdefghijklmnopqrstuvwxyz{|}~" + +#define T61_ABITS 8 +#define T61_UBITS 7 +#define T61_CANSET \ +" !\"%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]"\ +"_abcdefghijklmnopqrstuvwxyz" + +#define IA5_ABITS 8 +#define IA5_UBITS 7 +#define IA5_CANSET \ +"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"\ +"\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"\ +" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]"\ +"^_`abcdefghijklmnopqrstuvwxyz{|}~" + +#define IA5_RANGE1_LOWER 0 +#define IA5_RANGE2_LOWER 0x5f + +#define GEN_ABITS 8 +#define GEN_UBITS 7 +#define GEN_CANSET \ +"\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017"\ +"\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037"\ +" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_"\ +"`abcdefghijklmnopqrstuvwxyz{|}~\177\200\201\202\203\204\205\206\207"\ +"\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237"\ +"\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257"\ +"\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277"\ +"\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317"\ +"\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337"\ +"\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357"\ +"\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377" + +#define BMP_ABITS 16 +#define BMP_UBITS 16 +#define BMP_FIRST 0 +#define BMP_LAST 0xffff + +#define UCS_ABITS 32 +#define UCS_UBITS 32 +#define UCS_FIRST 0 +#define UCS_LAST 0xfffffffful + +/* ASN.1 Primitive Type Definitions */ + +typedef char ASN1CHAR; +typedef unsigned char ASN1OCTET; +typedef ASN1OCTET ASN1BOOL; +typedef signed char ASN1INT8; +typedef unsigned char ASN1UINT8; +typedef int ASN1INT; +typedef unsigned int ASN1UINT; +typedef ASN1INT ASN1ENUM; +typedef double ASN1REAL; + +typedef short ASN1SINT; +typedef unsigned short ASN1USINT; +typedef ASN1UINT ASN1TAG; +#define ASN1TAG_LSHIFT 24 +typedef ASN1USINT ASN116BITCHAR; +typedef ASN1UINT ASN132BITCHAR; +typedef void* ASN1ANY; + +#define ASN1UINT_MAX 4294967295U +#define ASN1INT_MAX ((ASN1INT)2147483647L) +#define ASN1INT_MIN ((ASN1INT)(-ASN1INT_MAX-1)) + +#define ASN1UINTCNT(val) val##u + + +#ifndef ASN1INT64 + +#if defined(_MSC_VER) || defined(__BORLANDC__) || defined(__WATCOMC__) || \ +defined(_WIN32) +#define ASN1INT64 __int64 + +#elif defined(__IBMC__) || defined(__GNUC__) || defined(__SUNPRO_C) || \ +defined(__SUNPRO_CC) || defined(__CC_ARM) || \ +defined(__HPUX_CC__) || defined(__HP_aCC) +#define ASN1INT64 long long + +#else /* !MSC_VER && !__IBMC__ etc */ +#define ASN1INT64 long + +#endif +#endif /* ASN1INT64 */ + +#ifndef FALSE +#define FALSE 0 +#define TRUE 1 +#endif + +typedef struct { /* object identifier */ + ASN1UINT numids; + ASN1UINT subid[ASN_K_MAXSUBIDS]; +} ASN1OBJID; + +typedef struct { /* generic octet string structure */ + ASN1UINT numocts; + ASN1OCTET data[1]; +} ASN1OctStr; + +typedef struct { /* generic octet string structure (dynamic) */ + ASN1UINT numocts; + const ASN1OCTET* data; +} ASN1DynOctStr; + +typedef struct { /* generic bit string structure (dynamic) */ + ASN1UINT numbits; + const ASN1OCTET* data; +} ASN1DynBitStr; + +typedef struct { /* generic sequence of structure */ + ASN1UINT n; + void* elem; +} ASN1SeqOf; + +typedef struct { /* sequence of OCTET STRING */ + ASN1UINT n; + ASN1DynOctStr* elem; +} ASN1SeqOfOctStr; + +typedef struct { /* generic open type data structure */ + ASN1UINT numocts; + const ASN1OCTET* data; +} ASN1OpenType; + +/* ASN.1 useful type definitions */ + +typedef struct { + ASN1UINT nchars; + ASN116BITCHAR* data; +} Asn116BitCharString; + +typedef struct { + ASN1UINT nchars; + ASN132BITCHAR* data; +} Asn132BitCharString; + +typedef const char* ASN1GeneralizedTime; +typedef const char* ASN1GeneralString; +typedef const char* ASN1GraphicString; +typedef const char* ASN1IA5String; +typedef const char* ASN1ISO646String; +typedef const char* ASN1NumericString; +typedef const char* ASN1ObjectDescriptor; +typedef const char* ASN1PrintableString; +typedef const char* ASN1TeletexString; +typedef const char* ASN1T61String; +typedef const char* ASN1UTCTime; +typedef const char* ASN1UTF8String; +typedef const char* ASN1VideotexString; +typedef const char* ASN1VisibleString; + +typedef Asn116BitCharString ASN1BMPString; +typedef Asn132BitCharString ASN1UniversalString; + +/* ASN.1 constrained string structures */ + +typedef struct { + int nchars; + char data[255]; +} Asn1CharArray; + +typedef struct { + Asn1CharArray charSet; + const char* canonicalSet; + int canonicalSetSize; + unsigned canonicalSetBits; + unsigned charSetUnalignedBits; + unsigned charSetAlignedBits; +} Asn1CharSet; + +typedef struct { + Asn116BitCharString charSet; + ASN1USINT firstChar, lastChar; + unsigned unalignedBits; + unsigned alignedBits; +} Asn116BitCharSet; + +/* ASN.1 size constraint structure */ + +typedef struct _Asn1SizeCnst { + ASN1BOOL extended; + ASN1UINT lower; + ASN1UINT upper; + struct _Asn1SizeCnst* next; +} Asn1SizeCnst; + +/* ASN.1 encode/decode buffer info structure */ + +typedef struct { + ASN1OCTET* data; /* pointer to start of data buffer */ + ASN1UINT byteIndex; /* byte index */ + ASN1UINT size; /* current buffer size */ + ASN1SINT bitOffset; /* current bit offset (8 - 1) */ + ASN1BOOL dynamic; /* is buffer dynamic? */ +} ASN1BUFFER; + +/* This structure is used to save the current state of the buffer */ + +typedef struct { + ASN1UINT byteIndex; /* byte index */ + ASN1SINT bitOffset; /* current bit offset (8 - 1) */ + ASN1USINT flags; /* flag bits */ +} ASN1BUFSAVE; + +/* ASN.1 run-time error info structures */ + +typedef struct { + const char* module; + int lineno; +} ASN1ErrLocn; + +typedef struct { + ASN1ErrLocn stack[ASN_K_MAXERRSTK]; + int stkx; + int status; + int parmcnt; + const char* parms[ASN_K_MAXERRP]; +} ASN1ErrInfo; + +#define XM_K_MEMBLKSIZ (4*1024) + +/* Flag mask constant values */ + +#define ASN1DYNCTXT 0x8000 +#define ASN1INDEFLEN 0x4000 +#define ASN1TRACE 0x2000 +#define ASN1LASTEOC 0x1000 +#define ASN1FASTCOPY 0x0800 /* turns on the "fast copy" mode */ +#define ASN1CONSTAG 0x0400 /* form of last parsed tag */ +#define ASN1CANXER 0x0200 /* canonical XER */ +#define ASN1SAVEBUF 0x0100 /* do not free dynamic encode buffer */ +#define ASN1OPENTYPE 0x0080 /* item is an open type field */ + +/* ASN.1 encode/decode context block structure */ + +struct EventHandler; + +typedef struct OOCTXT { /* context block */ + void* pMsgMemHeap; /* internal message memory heap */ + void* pTypeMemHeap; /* memory heap */ + ASN1BUFFER buffer; /* data buffer */ + ASN1ErrInfo errInfo; /* run-time error info */ + Asn1SizeCnst* pSizeConstraint; /* Size constraint list */ + const char* pCharSet; /* String of permitted characters */ + struct EventHandler* pEventHandler; /* event handler object */ + ASN1USINT flags; /* flag bits */ + ASN1OCTET spare[2]; +} OOCTXT; + +/* macros and function prototypes */ + +#ifndef ASN1MAX +#define ASN1MAX(a,b) (((a)>(b))?(a):(b)) +#endif + +#ifndef ASN1MIN +#define ASN1MIN(a,b) (((a)<(b))?(a):(b)) +#endif + +/** + * @defgroup mem Memory Allocation Macros and Functions + * @ingroup cruntime + * + * Memory allocation functions and macros handle memory management for the + * ASN1C run-time. Special algorithms are used for allocation and deallocation + * of memory to improve the run-time performance. @{ + */ +/** + * Allocate a dynamic array. This macro allocates a dynamic array of records of + * the given type. This version of the macro will return the ASN_E_NOMEM error + * status if the memory request cannot be fulfilled. + * + * @param pctxt - Pointer to a context block + * @param pseqof - Pointer to a generated SEQUENCE OF array structure. + * The <i>n</i> member variable must be set to the number + * of records to allocate. + * @param type - Data type of an array record + */ +#define ALLOC_ASN1ARRAY(pctxt,pseqof,type) do {\ +if (sizeof(type)*(pseqof)->n < (pseqof)->n) return ASN_E_NOMEM; \ +if (((pseqof)->elem = (type*) memHeapAlloc \ +(&(pctxt)->pTypeMemHeap, sizeof(type)*(pseqof)->n)) == 0) return ASN_E_NOMEM; \ +} while (0) + +/** + * Allocate and zero an ASN.1 element. This macro allocates and zeros a single + * element of the given type. + * + * @param pctxt - Pointer to a context block + * @param type - Data type of record to allocate + */ +#define ALLOC_ASN1ELEM(pctxt,type) \ +(type*) memHeapAllocZ (&(pctxt)->pTypeMemHeap, sizeof(type)) + +/** + * Allocate memory. This macro allocates the given number of bytes. It is + * similar to the C \c malloc run-time function. + * + * @param pctxt - Pointer to a context block + * @param nbytes - Number of bytes of memory to allocate + * @return - Void pointer to allocated memory or NULL if + * insufficient memory was available to fulfill the + * request. + */ +#define ASN1MALLOC(pctxt,nbytes) \ +memHeapAlloc(&(pctxt)->pTypeMemHeap, nbytes) + +/** + * Free memory associated with a context. This macro frees all memory held + * within a context. This is all memory allocated using the ASN1MALLOC (and + * similar macros) and the mem memory allocation functions using the given + * context variable. + * + * @param pctxt - Pointer to a context block + */ +#define ASN1MEMFREE(pctxt) \ +memHeapFreeAll(&(pctxt)->pTypeMemHeap) + +/** + * Free memory pointer. This macro frees memory at the given pointer. The + * memory must have been allocated using the ASN1MALLOC (or similar) macros or + * the mem memory allocation functions. This macro is similar to the C \c + * free function. + * + * @param pctxt - Pointer to a context block + * @param pmem - Pointer to memory block to free. This must have been + * allocated using the ASN1MALLOC macro or the + * memHeapAlloc function. + */ +#define ASN1MEMFREEPTR(pctxt,pmem) \ +memHeapFreePtr(&(pctxt)->pTypeMemHeap, (void*)pmem) + +/** + * @} + */ +#define ASN1BUFCUR(cp) (cp)->buffer.data[(cp)->buffer.byteIndex] +#define ASN1BUFPTR(cp) &(cp)->buffer.data[(cp)->buffer.byteIndex] + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef EXTERN +#ifdef MAKE_DLL +#define EXTERN __declspec(dllexport) +#elif defined (USEASN1DLL) +#define EXTERN __declspec(dllimport) +#else +#define EXTERN +#endif /* MAKE_DLL */ +#endif /* EXTERN */ + +#ifndef _NO_MALLOC +#define ASN1CRTMALLOC0(nbytes) malloc(nbytes) +#define ASN1CRTFREE0(ptr) free(ptr) +#else + +#ifdef _NO_THREADS +extern EXTERN OOCTXT g_ctxt; + +#define ASN1CRTMALLOC0(nbytes) memAlloc(&g_ctxt,(nbytes)) +#define ASN1CRTFREE0(ptr) memFreePtr(&g_ctxt,(ptr)) +#else +#define ASN1CRTMALLOC0(nbytes) (void*)0 +#define ASN1CRTFREE0(ptr) (void*)0 + +#endif /* _NO_THREADS */ +#endif /* _NO_MALLOC */ + +#define ASN1CRTMALLOC memHeapAlloc +#define ASN1CRTFREE ASN1MEMFREEPTR + +/* Function prototypes */ + +#define DE_INCRBITIDX(pctxt) \ +((--(pctxt)->buffer.bitOffset < 0) ? \ +((++(pctxt)->buffer.byteIndex >= (pctxt)->buffer.size) ? ASN_E_ENDOFBUF : \ +((pctxt)->buffer.bitOffset = 7, ASN_OK)) : ASN_OK) + + +#define DE_BIT(pctxt,pvalue) \ +((DE_INCRBITIDX (pctxt) != ASN_OK) ? ASN_E_ENDOFBUF : ((pvalue) ? \ +((*(pvalue) = (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex]) & \ +(1 << (pctxt)->buffer.bitOffset)) != 0), ASN_OK) : ASN_OK )) + + +#define encodeIA5String(pctxt,value,permCharSet) \ +encodeConstrainedStringEx (pctxt, value, permCharSet, 8, 7, 7) + +#define encodeGeneralizedTime encodeIA5String + +#define decodeIA5String(pctxt,pvalue,permCharSet) \ +decodeConstrainedStringEx (pctxt, pvalue, permCharSet, 8, 7, 7) + +#define decodeGeneralizedTime decodeIA5String + +/* run-time error and diagnostic functions */ + +/* Context management functions */ + +/** + * @defgroup cmfun Context Management Functions + * @{ + * + * Context initialization functions handle the allocation, initialization, and + * destruction of ASN.1 context variables (variables of type OOCTXT). These + * variables hold all of the working data used during the process of encoding + * or decoding a message. The context provides thread safe operation by + * isolating what would otherwise be global variables within this structure. + * The context variable is passed from function to function as a message is + * encoded or decoded and maintains state information on the encoding or + * decoding process. + */ + +/** + * This function assigns a buffer to a context block. The block should have + * been previously initialized by initContext. + * + * @param pctxt The pointer to the context structure variable to be + * initialized. + * @param bufaddr For encoding, the address of a memory buffer to receive + * and encode a message. For decoding the address of a + * buffer that contains the message data to be decoded. + * This address will be stored within the context + * structure. For encoding it might be zero, the dynamic + * buffer will be used in this case. + * @param bufsiz The size of the memory buffer. For encoding, it might be + * zero; the dynamic buffer will be used in this case. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int initContextBuffer +(OOCTXT* pctxt, const ASN1OCTET* bufaddr, ASN1UINT bufsiz); + +/** + * This function initializes a context block. It makes sure that if the block + * was not previosly initialized, that all key working parameters are set to + * thier correct initial state values (i.e. declared within a function as a + * normal working variable), it is required that they invoke this function + * before using it. + * + * @param pctxt The pointer to the context structure variable to be + * initialized. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int initContext (OOCTXT* pctxt); + +/** + * This function frees all dynamic memory associated with a context. This + * includes all memory inside the block (in particular, the list of memory + * blocks used by the mem functions). + * + * @param pctxt A pointer to a context structure. + */ +EXTERN void freeContext (OOCTXT* pctxt); + +/** + * This function allocates a new OOCTXT block and initializes it. Although + * the block is allocated from the standard heap, it should not be freed using + * free. The freeContext function should be used because this frees items + * allocated within the block before freeing the block itself. + * + * @return Pointer to newly created context + */ +EXTERN OOCTXT* newContext (void); + +EXTERN void copyContext (OOCTXT* pdest, OOCTXT* psrc); +EXTERN int initSubContext (OOCTXT* pctxt, OOCTXT* psrc); +EXTERN void setCtxtFlag (OOCTXT* pctxt, ASN1USINT mask); +EXTERN void clearCtxtFlag (OOCTXT* pctxt, ASN1USINT mask); + +EXTERN int setPERBuffer +(OOCTXT* pctxt, ASN1OCTET* bufaddr, ASN1UINT bufsiz, ASN1BOOL aligned); + +EXTERN int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource); + +#define ZEROCONTEXT(pctxt) memset(pctxt,0,sizeof(OOCTXT)) +/** + * @} cmfun + */ +/** + * @defgroup errfp Error Formatting and Print Functions + * @{ + * + * Error formatting and print functions allow information about the + * encode/decode errors to be added to a context block structure and then + * printed out when the error is propagated to the top level. + */ + +/** + * This function adds an integer parameter to an error information structure. + * Parameter substitution is done in much the same way as it is done in C + * printf statments. The base error message specification that goes along with + * a particular status code may have variable fields built in using '%' + * modifiers. These would be replaced with actual parameter data. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + * @param errParm The typed error parameter. + * @return The status of the operation. + */ +EXTERN int errAddIntParm (ASN1ErrInfo* pErrInfo, int errParm); + +/** + * This function adds an string parameter to an error information structure. + * Parameter substitution is done in much the same way as it is done in C + * printf statments. The base error message specification that goes along with + * a particular status code may have variable fields built in using '%' + * modifiers. These would be replaced with actual parameter data. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + * @param errprm_p The typed error parameter. + * @return The status of the operation. + */ +EXTERN int errAddStrParm (ASN1ErrInfo* pErrInfo, + const char* errprm_p); + +/** + * This function adds an unsigned integer parameter to an error information + * structure. Parameter substitution is done in much the same way as it is done + * in C printf statments. The base error message specification that goes along + * with a particular status code may have variable fields built in using '%' + * modifiers. These would be replaced with actual parameter data. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + * @param errParm The typed error parameter. + * @return The status of the operation. + */ +EXTERN int errAddUIntParm (ASN1ErrInfo* pErrInfo, unsigned int errParm); + + +EXTERN int errCopyData (ASN1ErrInfo* pSrcErrInfo, + ASN1ErrInfo* pDestErrInfo); + +/** + * This function frees memory associated with the storage of parameters + * associated with an error message. These parameters are maintained on an + * internal linked list maintained within the error information structure. The + * list memory must be freed when error processing is complete. This function + * is called from within errPrint after teh error has been printed out. It is + * also called in teh freeContext function. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + */ +EXTERN void errFreeParms (ASN1ErrInfo* pErrInfo); + + +EXTERN char* errFmtMsg (ASN1ErrInfo* pErrInfo, char* bufp); + +/** + * This function gets the text of the error + * + * @param pctxt A pointer to a context structure. + */ +EXTERN char* errGetText (OOCTXT* pctxt); + +/** + * This function prints error information to the standard output device. The + * error information is stored in a structure of type ASN1ErrInfo. A structure + * of the this type is part f the OOCTXT structure. This is where error + * information is stored within the ASN1C generated and low-level encode/decode + * functions. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + */ +EXTERN void errPrint (ASN1ErrInfo* pErrInfo); + +/** + * This function resets the error information in the error information + * sturcture. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + */ +EXTERN int errReset (ASN1ErrInfo* pErrInfo); + +/** + * This function sets error information in an error information structure. The + * information set includes status code, module name, and line number. Location + * information (i.e. module name and line number) is pushed onto a stack within + * the error information structure to provide a complete stack trace when the + * information is printed out. + * + * @param pErrInfo A pointer to a structure containing information on the + * error to be printed. Typically, the error info + * structure referred to is the one inside the OOCTXT + * structure. (i.e. &pctxt->errInfo). + * @param status The error status code. This is one of the negative error + * status codes. + * @param module The name of the module (C or C++ source file) in which + * the module occurred. This is typically obtained by + * using the _FILE_ macro. + * @param lno The line number at which the error occurred. This is + * typically obtained by using the _LINE_ macro. + * @return The status value passed to the operation in the third + * argument. This makes it possible to set the error + * information and return the status value in one line of + * code. + */ +EXTERN int errSetData (ASN1ErrInfo* pErrInfo, int status, + const char* module, int lno); + +#ifndef _COMPACT +#define LOG_ASN1ERR(ctxt,stat) \ +errSetData(&(ctxt)->errInfo,stat,__FILE__,__LINE__) +#else +#define LOG_ASN1ERR(ctxt,stat) \ +((ctxt)->errInfo.status = stat, stat) +#endif + + + +#define LOG_ASN1ERR_AND_FREE(pctxt,stat,lctxt) \ +freeContext ((lctxt)), LOG_ASN1ERR(pctxt, stat) +/** + * @} + */ + +#define RT_MH_DONTKEEPFREE 0x1 + +#define OSRTMH_PROPID_DEFBLKSIZE 1 +#define OSRTMH_PROPID_SETFLAGS 2 +#define OSRTMH_PROPID_CLEARFLAGS 3 + +#define OSRTMH_PROPID_USER 10 + +/** + * @addtogroup rtmem + * @{ + */ +/** + * Allocate memory. This macro allocates the given number of bytes. It is + * similar to the C \c malloc run-time function. + * + * @param pctxt - Pointer to a context block + * @param nbytes - Number of bytes of memory to allocate + * @return - Void pointer to allocated memory or NULL if insufficient memory + * was available to fulfill the request. + */ +#define memAlloc(pctxt,nbytes) \ +memHeapAlloc(&(pctxt)->pTypeMemHeap,nbytes) + +/** + * Allocate and zero memory. This macro allocates the given number of bytes + * and then initializes the memory block to zero. + * + * @param pctxt - Pointer to a context block + * @param nbytes - Number of bytes of memory to allocate + * @return - Void pointer to allocated memory or NULL if insufficient memory + * was available to fulfill the request. + */ +#define memAllocZ(pctxt,nbytes) \ +memHeapAllocZ(&(pctxt)->pTypeMemHeap,nbytes) + +/** + * Reallocate memory. This macro reallocates a memory block (either + * expands or contracts) to the given number of bytes. It is + * similar to the C \c realloc run-time function. + * + * @param pctxt - Pointer to a context block + * @param mem_p - Pointer to memory block to reallocate. This must have been + * allocated using the memHeapAlloc macro or the memHeapAlloc function. + * @param nbytes - Number of bytes of memory to which the block is to be + * resized. + * @return - Void pointer to allocated memory or NULL if insufficient memory + * was available to fulfill the request. This may be the same as the pmem + * pointer that was passed in if the block did not need to be relocated. + */ +#define memRealloc(pctxt,mem_p,nbytes) \ +memHeapRealloc(&(pctxt)->pTypeMemHeap, (void*)mem_p, nbytes) + +/** + * Free memory pointer. This macro frees memory at the given pointer. + * The memory must have been allocated using the memHeapAlloc (or similar) + * macros or the mem memory allocation macros. This macro is + * similar to the C \c free function. + * + * @param pctxt - Pointer to a context block + * @param mem_p - Pointer to memory block to free. This must have + * been allocated using the memHeapAlloc or memAlloc macro or the + * memHeapAlloc function. + */ +#define memFreePtr(pctxt,mem_p) \ +if (memHeapCheckPtr (&(pctxt)->pTypeMemHeap, (void*)mem_p)) \ +memHeapFreePtr(&(pctxt)->pTypeMemHeap, (void*)mem_p) + +/** + * Free memory associated with a context. This macro frees all memory + * held within a context. This is all memory allocated using the + * memHeapAlloc (and similar macros) and the mem memory allocation + * functions using the given context variable. + * + * @param pctxt - Pointer to a context block + */ +#define memFree(pctxt) \ +memHeapFreeAll(&(pctxt)->pTypeMemHeap) + +/** + * Reset memory associated with a context. This macro resets all memory + * held within a context. This is all memory allocated using the memHeapAlloc + * (and similar macros) and the mem memory allocation functions using the + * given context variable. + * + * <p>The difference between this and the ASN1MEMFREE macro is that the + * memory blocks held within the context are not actually freed. Internal + * pointers are reset so the existing blocks can be reused. This can + * provide a performace improvement for repetitive tasks such as decoding + * messages in a loop. + * + * @param pctxt - Pointer to a context block + */ +#define memReset(pctxt) \ +memHeapReset(&(pctxt)->pTypeMemHeap) + +/* Alias for __cdecl modifier; if __cdecl keyword is not supported, + * redefine it as empty macro. */ + +#if !defined(OSCDECL) +#if defined(_MSC_VER) || defined(__BORLANDC__) +#define OSCDECL __cdecl +#else +#define OSCDECL +#endif +#endif /* OSCDECL */ + +/* Pointers to C Run-Time memory allocation functions * + * (See memSetAllocFuncs) */ + +typedef void *(OSCDECL *OSMallocFunc ) (size_t size); +typedef void *(OSCDECL *OSReallocFunc) (void *ptr, size_t size); +typedef void (OSCDECL *OSFreeFunc ) (void *ptr); + +EXTERN void memHeapAddRef (void** ppvMemHeap); +EXTERN void* memHeapAlloc (void** ppvMemHeap, int nbytes); +EXTERN void* memHeapAllocZ (void** ppvMemHeap, int nbytes); +EXTERN int memHeapCheckPtr (void** ppvMemHeap, void* mem_p); +EXTERN int memHeapCreate (void** ppvMemHeap); +EXTERN void memHeapFreeAll (void** ppvMemHeap); +EXTERN void memHeapFreePtr (void** ppvMemHeap, void* mem_p); +EXTERN void* memHeapRealloc (void** ppvMemHeap, void* mem_p, int nbytes_); +EXTERN void memHeapRelease (void** ppvMemHeap); +EXTERN void memHeapReset (void** ppvMemHeap); + +EXTERN void* memHeapMarkSaved +(void** ppvMemHeap, const void* mem_p, ASN1BOOL saved); + +EXTERN void memHeapSetProperty +(void** ppvMemHeap, ASN1UINT propId, void* pProp); + + +/** + * This function sets the pointers to standard allocation functions. These + * functions are used to allocate/reallocate/free the memory blocks. By + * default, standard C functions - 'malloc', 'realloc' and 'free' - are used. + * But if some platforms do not support these functions (or some other reasons + * exist) they can be overloaded. The functions being overloaded should have + * the same prototypes as standard ones. + * + * @param malloc_func Pointer to the memory allocation function ('malloc' by + * default). + * @param realloc_func Pointer to the memory reallocation function ('realloc' + * by default). + * @param free_func Pointer to the memory deallocation function ('free' by + * default). + */ +EXTERN void memSetAllocFuncs (OSMallocFunc malloc_func, + OSReallocFunc realloc_func, + OSFreeFunc free_func); + +EXTERN void memFreeOpenSeqExt (OOCTXT* pctxt, DList *pElemList); + +/* + * This function sets flags to a heap. May be used to control the heap's + * behavior. + * + * @param pctxt Pointer to a memory block structure that contains the + * list of dynamic memory block maintained by these + * functions. + * @param flags The flags. + */ +EXTERN void memHeapSetFlags (OOCTXT* pctxt, ASN1UINT flags); + +/* + * This function clears memory heap flags. + * + * @param pctxt Pointer to a memory block structure that contains the + * list of dynamic memory block maintained by these + * functions. + * @param flags The flags + */ +EXTERN void memHeapClearFlags (OOCTXT* pctxt, ASN1UINT flags); + +/** + * This function sets the pointer to standard allocation functions. These + * functions are used to allocate/reallocate/free the memory blocks. By + * default, standard C functions - malloc, realloc, and free - are used. But if + * some platforms do not support these functions or some other reasons exist) + * they can be overloaded. The functions being overloaded should have the same + * prototypes as standard ones. + * + * @param pctxt Pointer to a context block. + * @param blkSize The currently used minimum size and the granularity of + * memory blocks. + */ + +EXTERN void memHeapSetDefBlkSize (OOCTXT* pctxt, ASN1UINT blkSize); + +/** + * This function returns the actual granularity of memory blocks. + * + * @param pctxt Pointer to a context block. + */ +EXTERN ASN1UINT memHeapGetDefBlkSize (OOCTXT* pctxt); + +#ifdef _STATIC_HEAP +EXTERN void memSetStaticBuf (void* memHeapBuf, ASN1UINT blkSize); +#endif + +/* PER encode/decode related items */ + +#define INCRBITIDX(pctxt) \ +((--(pctxt)->buffer.bitOffset < 0) ? \ +((++(pctxt)->buffer.byteIndex >= (pctxt)->buffer.size) ? ASN_E_ENDOFBUF : \ +((pctxt)->buffer.bitOffset = 7, ASN_OK)) : ASN_OK) + +#define DECODEBIT(pctxt,pvalue) \ +((INCRBITIDX (pctxt) != ASN_OK) ? ASN_E_ENDOFBUF : ((pvalue) ? \ +((*(pvalue) = (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex]) & \ +(1 << (pctxt)->buffer.bitOffset)) != 0), ASN_OK) : ASN_OK )) + +/* +#define SETCHARSET(csetvar, canset, abits, ubits) \ +csetvar.charSet.nchars = 0; \ +csetvar.canonicalSet = canset; \ +csetvar.canonicalSetSize = sizeof(canset)-1; \ +csetvar.canonicalSetBits = getUIntBitCount(csetvar.canonicalSetSize); \ +csetvar.charSetUnalignedBits = ubits; \ +csetvar.charSetAlignedBits = abits; +*/ + +/** + * This function will decode a series of multiple bits and place the results in + * an unsigned integer variable. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param pvalue A pointer to an unsigned integer variable to receive the + * decoded result. + * @param nbits The number of bits to decode. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeBits +(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT nbits); + +/** + * This function will decode a value of the ASN.1 bit string type whose maximum + * size is is known in advance. The ASN1C complier generates a call to this + * function to decode bit string productions or elements that contain a size + * constraint. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param numbits_p Pointer to an unsigned integer variable to receive + * decoded number of bits. + * @param buffer Pointer to a fixed-size or pre-allocated array of bufsiz + * octets to receive a decoded bit string. + * @param bufsiz Length (in octets) of the buffer to receive the decoded + * bit string. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeBitString +(OOCTXT* pctxt, ASN1UINT* numbits_p, ASN1OCTET* buffer, + ASN1UINT bufsiz); + +/** + * This function will decode a variable of the ASN.1 BMP character string. This + * differs from the decode routines for the character strings previously + * described in that the BMP string type is based on 16-bit characters. A + * 16-bit character string is modeled using an array of unsigned short + * integers. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param pvalue Pointer to character string structure to receive the + * decoded result The structure includes a count field + * containing the number of characters and an array of + * unsigned short integers to hold the 16-bit character + * values. + * @param permCharSet A pointer to the constraining character set. This + * contains an array containing all valid characters in + * the set as well as the aligned and unaligned bit + * counts required to encode the characters. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeBMPString +(OOCTXT* pctxt, ASN1BMPString* pvalue, Asn116BitCharSet* permCharSet); + +/** + * This function will position the decode bit cursor on the next byte boundary. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeByteAlign (OOCTXT* pctxt); + +/** + * This function will decode an integer constrained either by a value or value + * range constraint. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to integer variable to receive decoded value. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConsInteger +(OOCTXT* pctxt, ASN1INT* pvalue, ASN1INT lower, ASN1INT upper); + +/** + * This function will decode an unsigned integer constrained either by a value + * or value range constraint. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to unsigned integer variable to receive decoded + * value. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConsUnsigned +(OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT lower, ASN1UINT upper); + +/** + * This function will decode an 8-bit unsigned integer constrained either by a + * value or value range constraint. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to 8-bit unsigned integer variable to receive + * decoded value. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConsUInt8 (OOCTXT* pctxt, + ASN1UINT8* pvalue, ASN1UINT lower, ASN1UINT upper); + +/** + * This function will decode a 16-bit unsigned integer constrained either by a + * value or value range constraint. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to 16-bit unsigned integer variable to receive + * decoded value. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConsUInt16 +(OOCTXT* pctxt, ASN1USINT* pvalue, ASN1UINT lower, ASN1UINT upper); + +/** + * This function decodes a constrained whole number as specified in Section + * 10.5 of the X.691 standard. + * + * @param pctxt Pointer to context block structure. + * @param padjusted_value Pointer to unsigned adjusted integer value to + * receive decoded result. To get the final value, + * this value is added to the lower boundary of the + * range. + * @param range_value Unsigned integer value specifying the total size + * of the range. This is obtained by subtracting + * the lower range value from the upper range + * value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConsWholeNumber +(OOCTXT* pctxt, ASN1UINT* padjusted_value, ASN1UINT range_value); + +/** + * This function decodes a constrained string value. This version of the + * function allows all of the required permitted alphabet constraint parameters + * to be passed in as arguments. + * + * @param pctxt Pointer to context block structure. + * @param string Pointer to const char* to receive decoded string. Memory + * will be allocated for this variable using internal + * memory management functions. + * @param charSet String containing permitted alphabet character set. Can + * be null if no character set was specified. + * @param abits Number of bits in a character set character (aligned). + * @param ubits Number of bits in a character set character (unaligned). + * @param canSetBits Number of bits in a character from the canonical set + * representing this string. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeConstrainedStringEx +(OOCTXT* pctxt, const char** string, const char* charSet, + ASN1UINT abits, ASN1UINT ubits, ASN1UINT canSetBits); + +/** + * This function will decode a variable of thr ASN.1 BIT STRING type. This + * function allocates dynamic memory t store the decoded result. The ASN1C + * complier generates a call to this function to decode an unconstrained bit + * string production or element. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param pBitStr Pointer to a dynamic bit string structure to receive the + * decoded result. This structure contains a field to + * hold the number of decoded bits and a pointer to an + * octet string to hold the decoded data. Memory is + * allocated by the decoder using the memAlloc + * function. This memory is tracked within the context + * and released when the freeContext function is + * invoked. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeDynBitString (OOCTXT* pctxt, ASN1DynBitStr* pBitStr); + +/** + * This function will decode a value of the ASN.1 octet string type whose + * maximum size is known in advance. The ASN1C complier generates a call to + * this function to decode octet string productions or elements that contain a + * size constraint. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param pOctStr A pointer to a dynamic octet string to receive the + * decoded result. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeDynOctetString +(OOCTXT* pctxt, ASN1DynOctStr* pOctStr); + +/** + * This function will decode a length determinant value. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param pvalue A pointer to an unsigned integer variable to receive the + * decoded length value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeLength (OOCTXT* pctxt, ASN1UINT* pvalue); + +/** + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param bitOffset The bit offset inside the message buffer. + */ +EXTERN int moveBitCursor (OOCTXT* pctxt, int bitOffset); + +/** + * This function decodes a value of the ASN.1 object identifier type. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to value to receive decoded result. The + * ASN1OBJID structure contains an integer to hold the + * number of subidentifiers and an array to hold the + * subidentifier values. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeObjectIdentifier (OOCTXT* pctxt, ASN1OBJID* pvalue); + +/** + * This function will decode a value of the ASN.1 octet string type whose + * maximun size is known in advance. The ASN1C compiler generates a call to + * this function to decode octet string productions or elements that contain a + * size constraint. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param numocts_p A pointer to an unsigned buffer of bufsiz octets to + * receive decoded data. + * @param buffer A pointer to a pre-allocated buffer of size octets to + * receive the decoded data. + * @param bufsiz The size of the buffer to receive the decoded result. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeOctetString +(OOCTXT* pctxt, ASN1UINT* numocts_p, ASN1OCTET* buffer, + ASN1UINT bufsiz); + +/** + * This function will decode an ASN.1 open type. This used to be the ASN.1 ANY + * type, but now is used in a variety of applications requiring an encoding + * that can be interpreted by a decoder without prior knowledge of the type + * of the variable. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param numocts_p A pointer to an unsigned buffer of bufsiz octets to + * receive decoded data. + * @param object_p2 A pointer to an open type variable to receive the + * decoded data. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeOpenType +(OOCTXT* pctxt, const ASN1OCTET** object_p2, ASN1UINT* numocts_p); + +/** + * This function will decode a small non-negative whole number as specified in + * Section 10.6 of the X.691 standard. This is a number that is expected to be + * small, but whose size is potentially unlimited due to the presence of an + * extension maker. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all workings variables + * that must be maintained between function calls. + * @param pvalue Pointer to an unsigned integer value t receive decoded + * results. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeSmallNonNegWholeNumber +(OOCTXT* pctxt, ASN1UINT* pvalue); + +/** + * This function will decode a semi-constrained integer. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to integer variable to receive decoded value. + * @param lower Lower range value, represented as signed + * integer. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeSemiConsInteger + (OOCTXT* pctxt, ASN1INT* pvalue, ASN1INT lower); + +/** + * This function will decode a semi-constrained unsigned integer. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to unsigned integer variable to receive decoded + * value. + * @param lower Lower range value, represented as unsigned + * integer. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int decodeSemiConsUnsigned + (OOCTXT* pctxt, ASN1UINT* pvalue, ASN1UINT lower); + +/** + * This function will decode an unconstrained integer. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to integer variable to receive decoded value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +#define decodeUnconsInteger(pctxt,pvalue) \ +decodeSemiConsInteger(pctxt, pvalue, ASN1INT_MIN) + +/** + * This function will decode an unconstrained unsigned integer. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to unsigned integer variable to receive decoded + * value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +#define decodeUnconsUnsigned(pctxt,pvalue) \ +decodeSemiConsUnsigned(pctxt, pvalue, 0U) + +EXTERN int decodeVarWidthCharString (OOCTXT* pctxt, const char** pvalue); + +/** + * This function will encode a variable of the ASN.1 BOOLEAN type in + * a single bit. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param value The BOOLEAN value to be encoded. + */ +EXTERN int encodeBit (OOCTXT* pctxt, ASN1BOOL value); + +/** + * This function encodes multiple bits. + * + * @param pctxt Pointer to context block structure. + * @param value Unsigned integer containing the bits to be encoded. + * @param nbits Number of bits in value to encode. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeBits +(OOCTXT* pctxt, ASN1UINT value, ASN1UINT nbits); + +/** + * This function will encode a value of the ASN.1 bit string type. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param numocts The number of bits n the string to be encoded. + * @param data Pointer to the bit string data to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeBitString +(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data); + +/** + * This function will encode a variable of the ASN.1 BMP character string. This + * differs from the encode routines for the character strings previously + * described in that the BMP string type is based on 16-bit characters. A + * 16-bit character string is modeled using an array of unsigned short + * integers. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param value Character string to be encoded. This structure includes + * a count field containing the number of characters to + * encode and an array of unsigned short integers to hold + * the 16-bit characters to be encoded. + * @param permCharSet Pointer to the constraining character set. This contains + * an array containing all valid characters in the set as + * well as the aligned and unaligned bit counts required + * to encode the characters. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeBMPString +(OOCTXT* pctxt, ASN1BMPString value, Asn116BitCharSet* permCharSet); + +/** + * This function will position the encode bit cursor on the next byte boundry. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeByteAlign (OOCTXT* pctxt); + +/** + * This function will determine if the given number of bytes will fit in the + * encode buffer. If not, either the buffer is expanded (if it is a dynamic + * buffer) or an error is signaled. + * + * @param pctxt A pointer to a context structure. This provides a + * storage area for the function to store all working + * variables that must be maintained between function + * calls. + * @param nbytes Number of bytes of space required to hold the variable + * to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeCheckBuffer (OOCTXT* pctxt, ASN1UINT nbytes); + +/** + * This function encodes a constrained string value. This version of the + * function allows all of the required permitted alphabet constraint parameters + * to be passed in as arguments. + * + * @param pctxt Pointer to context block structure. + * @param string Pointer to string to be encoded. + * @param charSet String containing permitted alphabet character set. Can + * be null if no character set was specified. + * @param abits Number of bits in a character set character (aligned). + * @param ubits Number of bits in a character set character (unaligned). + * @param canSetBits Number of bits in a character from the canonical set + * representing this string. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeConstrainedStringEx +(OOCTXT* pctxt, const char* string, const char* charSet, + ASN1UINT abits, ASN1UINT ubits, ASN1UINT canSetBits); + +/** + * This function encodes an integer constrained either by a value or value + * range constraint. + * + * @param pctxt Pointer to context block structure. + * @param value Value to be encoded. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeConsInteger +(OOCTXT* pctxt, ASN1INT value, ASN1INT lower, ASN1INT upper); + +/** + * This function encodes an unsigned integer constrained either by a value or + * value range constraint. The constrained unsigned integer option is used if: + * + * 1. The lower value of the range is >= 0, and 2. The upper value of the range + * is >= MAXINT + * + * @param pctxt Pointer to context block structure. + * @param value Value to be encoded. + * @param lower Lower range value. + * @param upper Upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeConsUnsigned +(OOCTXT* pctxt, ASN1UINT value, ASN1UINT lower, ASN1UINT upper); + +/** + * This function encodes a constrained whole number as specified in Section + * 10.5 of the X.691 standard. + * + * @param pctxt Pointer to context block structure. + * @param adjusted_value Unsigned adjusted integer value to be encoded. The + * adjustment is done by subtracting the lower value + * of the range from the value to be encoded. + * @param range_value Unsigned integer value specifying the total size of + * the range. This is obtained by subtracting the + * lower range value from the upper range value. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeConsWholeNumber +(OOCTXT* pctxt, ASN1UINT adjusted_value, ASN1UINT range_value); + +/** + * This function will expand the buffer to hold the given number of bytes. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param nbytes The number of bytes the buffer is to be expanded by. + * Note that the buffer will be expanded by + * ASN_K_ENCBIFXIZ or nbytes (whichever is larger. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeExpandBuffer (OOCTXT* pctxt, ASN1UINT nbytes); + +/** + * This function will return the message pointer and length of an encoded + * message. This function is called after a complier generated encode function + * to get the pointer and length of the message. It is normally used when + * dynamic encoding is specified because the message pointer is not known until + * encoding is complete. If static encoding is used, the message starts at the + * beginning of the specified buffer adn the encodeGetMsgLen function can be + * used to obtain the lenght of the message. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param pLength Pointer to variable to receive length of the encoded + * message. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN ASN1OCTET* encodeGetMsgPtr (OOCTXT* pctxt, int* pLength); + +/** + * This function will encode a length determinant value. + * + * @param pctxt Pointer to a context structure. This provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param value Length value to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeLength (OOCTXT* pctxt, ASN1UINT value); + +/** + * This function encodes a value of the ASN.1 object identifier type. + * + * @param pctxt Pointer to context block structure. + * @param pvalue Pointer to value to be encoded. The ASN1OBJID structure + * contains a numids fields to hold the number of + * subidentifiers and an array to hold the subidentifier + * values. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeObjectIdentifier (OOCTXT* pctxt, ASN1OBJID* pvalue); + + +/** + * + * This function encodes bits from a given octet to the output buffer. + * + * @param pctxt Pointer to ASN.1 PER context structure + * @param value Value of bits to be encoded + * @param nbits Number of bits to be encoded + * + * @return Status of operation + */ +EXTERN int encodebitsFromOctet (OOCTXT* pctxt, ASN1OCTET value, ASN1UINT nbits); + +/** + * This fuction will encode an array of octets. The Octets will be encoded + * unaligned starting at the current bit offset within the encode buffer. + * + * @param pctxt A pointer to a context structure. The provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param pvalue A pointer to an array of octets to encode + * @param nbits The number of Octets to encode + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeOctets +(OOCTXT* pctxt, const ASN1OCTET* pvalue, ASN1UINT nbits); + +/** + * This function will encode a value of the ASN.1 octet string type. + * + * @param pctxt A pointer to a context structure. The provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param numocts Number of octets in the string to be encoded. + * @param data Pointer to octet string data to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeOctetString +(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data); + +/** + * This function will encode an ASN.1 open type. This used to be the ANY type, + * but now is used in a variety of applications requiring an encoding that can + * be interpreted by a decoder without a prior knowledge of the type of the + * variable. + * + * @param pctxt A pointer to a context structure. The provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param numocts Number of octets in the string to be encoded. + * @param data Pointer to octet string data to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeOpenType +(OOCTXT* pctxt, ASN1UINT numocts, const ASN1OCTET* data); + +/** + * This function will encode an ASN.1 open type extension. An open type + * extension field is the data that potentially resides after the ... marker in + * a version-1 message. The open type structure contains a complete encoded bit + * set including option element bits or choice index, length, and data. + * Typically, this data is populated when a version-1 system decodes a + * version-2 message. The extension fields are retained and can then be + * re-encoded if a new message is to be sent out (for example, in a store and + * forward system). + * + * @param pctxt A pointer to a context structure. The provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param pElemList A pointer to the open type to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeOpenTypeExt +(OOCTXT* pctxt, DList* pElemList); + +EXTERN int encodeOpenTypeExtBits +(OOCTXT* pctxt, DList* pElemList); + +/** + * This function will endcode a small, non-negative whole number as specified + * in Section 10.6 of teh X.691 standard. This is a number that is expected to + * be small, but whose size is potentially unlimited due to the presence of an + * extension marker. + * + * @param pctxt A pointer to a context structure. The provides a storage + * area for the function to store all working variables + * that must be maintained between function calls. + * @param value An unsigned integer value to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeSmallNonNegWholeNumber (OOCTXT* pctxt, ASN1UINT value); + +/** + * This function encodes a semi-constrained integer. + * + * @param pctxt Pointer to context block structure. + * @param value Value to be encoded. + * @param lower Lower range value, represented as signed + * integer. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeSemiConsInteger + (OOCTXT* pctxt, ASN1INT value, ASN1INT lower); + +/** + * This function encodes an semi-constrained unsigned integer. + * + * @param pctxt Pointer to context block structure. + * @param value Value to be encoded. + * @param lower Lower range value, represented as unsigned + * integer. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +EXTERN int encodeSemiConsUnsigned + (OOCTXT* pctxt, ASN1UINT value, ASN1UINT lower); + +/** + * This function encodes an unconstrained integer. + * + * @param pctxt Pointer to context block structure. + * @param value Value to be encoded. + * @return Completion status of operation: + * - 0 (ASN_OK) = success, + * - negative return value is error. + */ +#define encodeUnconsInteger(pctxt,value) \ +encodeSemiConsInteger(pctxt,value,ASN1INT_MIN) + +EXTERN int encodeVarWidthCharString (OOCTXT* pctxt, const char* value); + +EXTERN int addSizeConstraint (OOCTXT* pctxt, Asn1SizeCnst* pSize); + +EXTERN ASN1BOOL alignCharStr +(OOCTXT* pctxt, ASN1UINT len, ASN1UINT nbits, Asn1SizeCnst* pSize); + +EXTERN int bitAndOctetStringAlignmentTest +(Asn1SizeCnst* pSizeList, ASN1UINT itemCount, + ASN1BOOL bitStrFlag, ASN1BOOL* pAlignFlag); + +EXTERN int getPERMsgLen (OOCTXT* pctxt); + +EXTERN int addSizeConstraint (OOCTXT* pctxt, Asn1SizeCnst* pSize); + +EXTERN Asn1SizeCnst* getSizeConstraint (OOCTXT* pctxt, ASN1BOOL extbit); + +EXTERN int checkSizeConstraint(OOCTXT* pctxt, int size); +EXTERN ASN1UINT getUIntBitCount (ASN1UINT value); + +EXTERN Asn1SizeCnst* checkSize +(Asn1SizeCnst* pSizeList, ASN1UINT value, ASN1BOOL* pExtendable); + +EXTERN void init16BitCharSet +(Asn116BitCharSet* pCharSet, ASN116BITCHAR first, + ASN116BITCHAR last, ASN1UINT abits, ASN1UINT ubits); + +EXTERN ASN1BOOL isExtendableSize (Asn1SizeCnst* pSizeList); + +EXTERN void set16BitCharSet +(OOCTXT* pctxt, Asn116BitCharSet* pCharSet, Asn116BitCharSet* pAlphabet); + +#ifdef __cplusplus +} +#endif + +#endif |