1815 lines
73 KiB
C
1815 lines
73 KiB
C
/*
|
|
* 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
|