393 lines
16 KiB
C
393 lines
16 KiB
C
/*****************************************************************************/
|
|
/* Copyright (C) 1989-1999 Open Systems Solutions, Inc. All rights reserved.*/
|
|
/*****************************************************************************/
|
|
|
|
/* THIS FILE IS PROPRIETARY MATERIAL OF OPEN SYSTEMS SOLUTIONS, INC.
|
|
* AND MAY BE USED ONLY BY DIRECT LICENSEES OF OPEN SYSTEMS SOLUTIONS, INC.
|
|
* THIS FILE MAY NOT BE DISTRIBUTED. */
|
|
|
|
/*****************************************************************************/
|
|
/* FILE: @(#)asn1code.h 5.36.1.16 97/10/20 */
|
|
/*****************************************************************************/
|
|
#ifndef ASN1CODE_H
|
|
#define ASN1CODE_H
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif
|
|
|
|
#include <stddef.h>
|
|
#include "asn1hdr.h"
|
|
#include "ossdll.h"
|
|
|
|
#define ERR_MSG_LENGTH 512 /* length of error messages to be output */
|
|
|
|
/*** encoder/decoder flags ***/
|
|
#define DEBUGPDU 0x02 /* produce tracing output */
|
|
#define BUFFER_PROVIDED 0x04 /* use caller-provided buffer */
|
|
#define RESTRAIN 0x08 /* limit output buffer to user-specified size*/
|
|
#define NOTRAPPING 0x200 /* do no signal trapping */
|
|
#define NOCONSTRAIN 0x800 /* ignore calling constraint checker */
|
|
|
|
/*** encoder flags ***/
|
|
#define DEFINITE 0x10 /* force definite-length encoding */
|
|
#define INDEFINITE 0x20 /* force indefinite-length encoding */
|
|
#define FRONT_ALIGN 0x80 /* align output to front of output buffer */
|
|
#define BACK_ALIGN 0x100 /* align output to back of output buffer */
|
|
#define DEFAULT_ALIGN 0 /* use most efficient align (back or front) */
|
|
#define DETERMINE_ENC_LENGTH 0x40 /* generate only total encoding length
|
|
* (for use in user memory managers) */
|
|
|
|
/*** decoder flags ***/
|
|
#define DEBUG_ERRORS 0x10 /* print errors to asn1out */
|
|
#define RELAXBER 0x400 /* relax BER */
|
|
#define OBJECT_HANDLE 0x1000 /* temporarily mark object of type with
|
|
* NOCOPY directive to not free it by
|
|
* ossFreePDU() (for use in user memory
|
|
* managers) */
|
|
|
|
/*** compatibility flags ***/
|
|
|
|
#define OSS_V412_TIME_AND_WIDE_CHAR_STRINGS 0x01
|
|
#define OSS_TRUNCATE_0_SECONDS_FROM_GENERALIZED_TIME 0x02
|
|
#define OSS_TRUNCATE_0_SECONDS_FROM_UTC_TIME 0x04
|
|
#define OSS_EXTENDED_UNRESTRICTED_CHAR_STRINGS 0x08
|
|
#define OSS_ALLOW_ZERO_LENGTH_OPENTYPE_STRINGS 0x10
|
|
|
|
/*** reserved flags for internal use ***/
|
|
#define RESERVED_FLAG1 0x8000
|
|
#define RESERVED_FLAG2 0x4000
|
|
|
|
/*** common return codes ***/
|
|
#define CANT_CLOSE_TRACE_FILE 46 /* error when closing a trace file */
|
|
#define MUTEX_NOT_CREATED 45 /* mutex was not created */
|
|
#define OPEN_TYPE_ERROR 44 /* error in automatic encoding/decoding/
|
|
* copying an open type */
|
|
#define PER_DLL_NOT_LINKED 43 /* PER DLL was not linked */
|
|
#define BERDER_DLL_NOT_LINKED 42 /* BER/DER DLL was not linked */
|
|
#define API_DLL_NOT_LINKED 41 /* API DLL was not linked */
|
|
#define PDV_CODE_NOT_LINKED 40 /* EMBEDDED PDV code was not linked */
|
|
#define PDV_DLL_NOT_LINKED 39 /* EMBEDDED PDV DLL was not linked */
|
|
#define MEM_MGR_DLL_NOT_LINKED 38 /* memory manager DLL was not linked */
|
|
#define COMPARATOR_CODE_NOT_LINKED 37 /* value comparator code was not linked */
|
|
#define COMPARATOR_DLL_NOT_LINKED 36 /* value comparator DLL was not linked */
|
|
#define CONSTRAINT_DLL_NOT_LINKED 35 /* constraint checker DLL was not linked */
|
|
#define COPIER_DLL_NOT_LINKED 34 /* value copier DLL was not linked */
|
|
#define OUT_OF_RANGE 33 /* parameter value range error */
|
|
#define REAL_CODE_NOT_LINKED 32 /* REAL code was not linked */
|
|
#define REAL_DLL_NOT_LINKED 31 /* REAL DLL was not linked */
|
|
#define TYPE_NOT_SUPPORTED 30 /* ASN.1 type is not supported */
|
|
#define TABLE_MISMATCH 29 /* C++ API: PDUcls function called with
|
|
* a ossControl object which refers to
|
|
* control table different from one the
|
|
* PDU was defined in */
|
|
#define TRACE_FILE_ALREADY_OPEN 28 /* the trace file has been opened */
|
|
#define CANT_OPEN_TRACE_FILE 27 /* error when opening a trace file */
|
|
#define OID_DLL_NOT_LINKED 26 /* OBJECT IDENTIFIER DLL was not linked */
|
|
#define UNIMPLEMENTED 25 /* unimplemented type or feature */
|
|
#define CANT_OPEN_TRACE_WINDOW 24 /* error when opening a trace window */
|
|
#define UNAVAIL_ENCRULES 23 /* the encoding rules requested are
|
|
* not implemented yet or were not
|
|
* linked because the encoder/decoder
|
|
* function pointers were not
|
|
* initialized by a call to ossinit() */
|
|
#define BAD_ENCRULES 22 /* unknown encoding rules set in the
|
|
* ossGlobal structure */
|
|
#define NULL_FCN 21 /* attempt was made to call the
|
|
* encoder/decoder via a NULL pointer */
|
|
#define NULL_TBL 20 /* attempt was made to pass a NULL
|
|
* control table pointer */
|
|
#define ACCESS_SERIALIZATION_ERROR 19 /* error occured during access to
|
|
* global data in a multi-threaded
|
|
* environment */
|
|
#define CONSTRAINT_VIOLATED 17 /* constraint violation error occured */
|
|
#define OUT_MEMORY 8 /* memory-allocation error */
|
|
#define BAD_VERSION 7 /* versions of encoder/decoder and
|
|
* control-table do not match */
|
|
#define PDU_RANGE 3 /* pdu specified out of range */
|
|
#define MORE_BUF 1 /* user-provided outbut buffer
|
|
* too small */
|
|
|
|
/*** encoder return codes ***/
|
|
#define FATAL_ERROR 18 /* *serious* error, could not free memory, &etc */
|
|
#define TOO_LONG 16 /* type was longer than shown in SIZE constraint */
|
|
#define BAD_TABLE 15 /* table was bad, but not NULL */
|
|
#define MEM_ERROR 14 /* memory violation signal trapped */
|
|
#define INDEFINITE_NOT_SUPPORTED 13 /* BER indefinite-length encoding is
|
|
* not supported for Spartan or time-optimized
|
|
* encoder/decoder */
|
|
#define BAD_TIME 12 /* bad value in time type */
|
|
#define BAD_PTR 11 /* unexpected NULL pointer in input buffer */
|
|
#define BAD_OBJID 10 /* object identifier conflicts with x.208 */
|
|
#define BAD_CHOICE 9 /* unknown selector for a choice */
|
|
#define BAD_ARG 6 /* something weird was passed--probably a NULL
|
|
* pointer */
|
|
#define PDU_ENCODED 0 /* PDU successfully encoded */
|
|
|
|
/*** decoder return codes ***/
|
|
/* MORE_BUF, BAD_VERSION, OUT_MEMORY, PDU_RANGE and BAD_ARG defined above */
|
|
#define LIMITED 10 /* implementation limit exceeded. eg:
|
|
* integer value too great */
|
|
#define PDU_MISMATCH 9 /* the PDU tag that the user specified was different
|
|
* from the tag found in the encoded data */
|
|
#define DATA_ERROR 5 /* an error exists in the encoded data */
|
|
#define MORE_INPUT 4 /* the PDU is not fully decoded, but the end
|
|
* of the input buffer has been reached */
|
|
#define NEGATIVE_UINTEGER 2 /* the first bit of the encoding is encountered
|
|
* set to 1 while decoding an unsigned integer */
|
|
#define PDU_DECODED 0 /* PDU successfully decoded */
|
|
|
|
|
|
extern int asn1chop; /* 0 means don't truncate strings; non-zero
|
|
* value means truncate long input strings
|
|
* (OCTET STRING, BIT STRING, CharacterStrings)
|
|
* to be asn1chop bytes long. Used by printPDU. */
|
|
|
|
extern size_t ossblock; /* if > 0, size of largest block to allocate */
|
|
extern size_t ossprefx; /* size of reserved OSAK buffer prefix */
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
extern void *(*mallocp)(size_t p); /* function which allocates memory */
|
|
extern void (*freep)(void *p); /* function which frees memory */
|
|
|
|
#ifdef EOF
|
|
extern FILE *asn1out;
|
|
|
|
/* pointer to output function used by printPDU; default to fprintf. */
|
|
extern int (*asn1prnt) (FILE *stream, const char *format, ...);
|
|
#endif
|
|
|
|
#ifndef storing
|
|
#ifndef coding
|
|
#ifndef OSS_TOED
|
|
#include "ossglobl.h"
|
|
#endif /* not OSS_TOED */
|
|
#endif /* not coding */
|
|
#endif /* not storing */
|
|
|
|
#if defined(_MSC_VER) && (defined(_WIN32) || defined(WIN32))
|
|
#pragma pack(push, ossPacking, 4)
|
|
#elif defined(_MSC_VER) && (defined(_WINDOWS) || defined(_MSDOS))
|
|
#pragma pack(1)
|
|
#elif defined(__BORLANDC__) && defined(__MSDOS__)
|
|
#ifdef _BC31
|
|
#pragma option -a-
|
|
#else
|
|
#pragma option -a1
|
|
#endif /* _BC31 */
|
|
#elif defined(__BORLANDC__) && defined(__WIN32__)
|
|
#pragma option -a4
|
|
#elif defined(__IBMC__)
|
|
#pragma pack(4)
|
|
#elif defined(__WATCOMC__) && defined(__NT__)
|
|
#pragma pack(push, 4)
|
|
#elif defined(__WATCOMC__) && (defined(__WINDOWS__) || defined(__DOS__))
|
|
#pragma pack(push, 1)
|
|
#endif /* _MSC_VER && _WIN32 */
|
|
|
|
#ifdef macintosh
|
|
#pragma options align=mac68k
|
|
#endif
|
|
|
|
typedef struct {
|
|
long length;
|
|
unsigned char *value;
|
|
} OssBuf;
|
|
|
|
#if defined(_MSC_VER) && (defined(_WIN32) || defined(WIN32))
|
|
#pragma pack(pop, ossPacking)
|
|
#elif defined(_MSC_VER) && (defined(_WINDOWS) || defined(_MSDOS))
|
|
#pragma pack()
|
|
#elif defined(__BORLANDC__) && (defined(__WIN32__) || defined(__MSDOS__))
|
|
#pragma option -a.
|
|
#elif defined(__IBMC__)
|
|
#pragma pack()
|
|
#elif defined(__WATCOMC__)
|
|
#pragma pack(pop)
|
|
#endif /* _MSC_VER && _WIN32 */
|
|
|
|
#ifdef macintosh
|
|
#pragma options align=reset
|
|
#endif
|
|
|
|
PUBLIC extern int DLL_ENTRY encode(struct ossGlobal *world,
|
|
int pdunum, void *inbuf, char **outbuf, long *outlen,
|
|
void *ctl_tbl, unsigned flags, char errmsg[ERR_MSG_LENGTH]);
|
|
|
|
PUBLIC extern int DLL_ENTRY decode(struct ossGlobal *world,
|
|
int *pdunum, char **inbuf, long *inlen, void **outbuf,
|
|
long *outlen, void *ctl_tbl, unsigned flags,
|
|
char errmsg[ERR_MSG_LENGTH]);
|
|
|
|
#define PDU_FREED 0
|
|
|
|
/* returns 0 (PDU_FREED), PDU_RANGE, UNIMPLEMENTED */
|
|
PUBLIC int DLL_ENTRY freePDU(struct ossGlobal *world, int pdunum, void *data, void *ctl_tbl);
|
|
PUBLIC void DLL_ENTRY freeBUF(struct ossGlobal *world, void *data);
|
|
|
|
#define PDU_PRINTED 0
|
|
|
|
/* returns 0 (PDU_PRINTED), PDU_RANGE */
|
|
PUBLIC int DLL_ENTRY printPDU(struct ossGlobal *world, int pdunum, void *data, void *ctl_tbl);
|
|
|
|
|
|
#define VALUE_COPIED 0
|
|
|
|
/*returns 0 (VALUE_COPIED), NULL_TBL, PDU_RANGE, BAD_ARG */
|
|
PUBLIC extern int DLL_ENTRY ossCpyValue (struct ossGlobal *world,
|
|
int pdunum, void *source, void **destination);
|
|
|
|
#define VALUES_EQUAL 0 /* The values are the same */
|
|
#define VALUES_NOT_EQUAL 1 /* The values are not the same */
|
|
|
|
/*returns VALUE_EQUAL, VALUES_NOT_EQUAL, NULL_TBL, PDU_RANGE, BAD_ARG */
|
|
PUBLIC extern int DLL_ENTRY ossCmpValue (struct ossGlobal *world,
|
|
int pdunum, void *originalData, void *copiedData);
|
|
|
|
#define INITIALIZATION_SUCCESSFUL 0
|
|
|
|
/* returns 0 (INITIALIZATION_SUCCESSFUL), BAD_TABLE */
|
|
PUBLIC int DLL_ENTRY ossinit(struct ossGlobal *world,
|
|
void *ctl_tbl);
|
|
PUBLIC void DLL_ENTRY ossterm(struct ossGlobal *world);
|
|
extern int ossPrint(struct ossGlobal *, const char *, ...);
|
|
|
|
PUBLIC int DLL_ENTRY ossEncode(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *input,
|
|
OssBuf *output);
|
|
|
|
PUBLIC int DLL_ENTRY ossDecode(struct ossGlobal *world,
|
|
int *pdunum,
|
|
OssBuf *input,
|
|
void **output);
|
|
|
|
PUBLIC int DLL_ENTRY ossPrintPDU(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *data);
|
|
|
|
PUBLIC int DLL_ENTRY ossFreePDU(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *data);
|
|
|
|
PUBLIC void DLL_ENTRY ossFreeBuf(struct ossGlobal *world,
|
|
void *data);
|
|
|
|
extern int DLL_ENTRY ossTest(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *data);
|
|
|
|
PUBLIC void DLL_ENTRY ossPrintHex(struct ossGlobal *world,
|
|
char *encodedData,
|
|
long length);
|
|
|
|
PUBLIC int DLL_ENTRY ossCheckConstraints(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *data);
|
|
|
|
PUBLIC long DLL_ENTRY ossDetermineEncodingLength(struct ossGlobal *world,
|
|
int pdunum,
|
|
void *data);
|
|
|
|
PUBLIC int DLL_ENTRY ossOpenTraceFile(struct ossGlobal *world,
|
|
char *fileName);
|
|
|
|
PUBLIC int DLL_ENTRY ossCloseTraceFile(struct ossGlobal *world);
|
|
|
|
/* Runtime support for encoded OBJECT IDENTIFIERs */
|
|
typedef struct {
|
|
unsigned short length;
|
|
unsigned char *value;
|
|
} OssEncodedOID;
|
|
|
|
PUBLIC int DLL_ENTRY ossEncodedOidToAsnVal(struct ossGlobal *world,
|
|
const OssEncodedOID *encodedOID, OssBuf *valOID);
|
|
PUBLIC int DLL_ENTRY ossEncodedOidToDotVal(struct ossGlobal *world,
|
|
const OssEncodedOID *encodedOID, OssBuf *dotOID);
|
|
PUBLIC int DLL_ENTRY ossAsnValToEncodedOid(struct ossGlobal *world,
|
|
const char *valOID, OssEncodedOID *encodedOID);
|
|
PUBLIC int DLL_ENTRY ossDotValToEncodedOid(struct ossGlobal *world,
|
|
const char *dotOID, OssEncodedOID *encodedOID);
|
|
|
|
#if !defined(_WINDOWS) && !defined(_DLL) && \
|
|
!defined(OS2_DLL) && !defined(NETWARE_DLL)
|
|
extern char OSS_PLUS_INFINITY[];
|
|
extern char OSS_MINUS_INFINITY[];
|
|
extern char ossNaN[];
|
|
#endif /* !_WINDOWS && !_DLL && !OS2_DLL && !NETWARE_DLL */
|
|
|
|
typedef enum {
|
|
OSS_DEFAULT_MEMMGR = 0, /* memory is malloc'ed for each pointer in
|
|
* data tree */
|
|
OSS_FILE_MEMMGR, /* file memory manager with memory malloc'ed
|
|
* for each pointer in data tree */
|
|
OSS_SOCKET_MEMMGR, /* TCP/IP socket and file memory manager with memory
|
|
* malloc'ed for each pointer in data tree */
|
|
OSS_FLAT_MEMMGR, /* memory is malloc'ed in large blocks */
|
|
OSS_OSAK_MEMMGR, /* OSAK-buffer memory manager */
|
|
OSS_USER_MEMMGR /* user memory manager */
|
|
} OssMemMgrType;
|
|
|
|
typedef enum {
|
|
OSS_UNKNOWN_OBJECT = 0,
|
|
OSS_FILE,
|
|
OSS_SOCKET,
|
|
OSS_OSAK_BUFFER
|
|
} OssObjType;
|
|
|
|
#if defined(__arm)
|
|
PUBLIC OssObjType DLL_ENTRY ossTestObj(struct ossGlobal *world, void *objHndl);
|
|
#else
|
|
PUBLIC void *DLL_ENTRY ossTestObj(struct ossGlobal *world, void *objHndl);
|
|
#endif /* __arm */
|
|
PUBLIC void *DLL_ENTRY ossGetObj(struct ossGlobal *world, void *objHndl);
|
|
PUBLIC void *DLL_ENTRY ossUnmarkObj(struct ossGlobal *world, void *objHndl);
|
|
PUBLIC void *DLL_ENTRY ossMarkObj(struct ossGlobal *world, OssObjType objType,
|
|
void *object);
|
|
PUBLIC void DLL_ENTRY ossFreeObjectStack(struct ossGlobal *world);
|
|
PUBLIC void DLL_ENTRY ossSetTimeout(struct ossGlobal *world, long timeout);
|
|
PUBLIC int DLL_ENTRY ossSetUserStack(struct ossGlobal *world, OssBuf *stack);
|
|
PUBLIC int DLL_ENTRY ossInitSync(void);
|
|
PUBLIC void DLL_ENTRY ossTermSync(void);
|
|
|
|
#ifdef __IBMC__
|
|
extern void *getStartAddress(struct ossGlobal *, char *);
|
|
extern void DLL_ENTRY ossWterm(struct ossGlobal *);
|
|
extern int DLL_ENTRY ossFreeDll(struct ossGlobal *, char *);
|
|
extern int DLL_ENTRY ossReadLine(struct ossGlobal *, HWND, FILE *, char *, MEMBLOCK *, LONG);
|
|
extern void DLL_ENTRY ossFreeList(struct ossGlobal *);
|
|
extern void DLL_ENTRY ossSaveTraceInfo(struct ossGlobal *, HWND, char *);
|
|
extern int DLL_ENTRY oss_test(struct ossGlobal *);
|
|
int ossGeneric(struct ossGlobal *, HWND);
|
|
extern int DLL_ENTRY ossOpenTraceWindow(struct ossGlobal *);
|
|
extern void *DLL_ENTRY ossGetHeader(void);
|
|
extern int DLL_ENTRY ossPrintWin(struct ossGlobal *, const char *,
|
|
int, int, int, int, int, int, int, int, int, int);
|
|
extern HINSTANCE DLL_ENTRY ossLoadDll(struct ossGlobal *, char *);
|
|
extern HINSTANCE DLL_ENTRY ossLoadMemoryManager(struct ossGlobal *,
|
|
OssMemMgrType, char *);
|
|
extern int DLL_ENTRY ossWinit(struct ossGlobal *, void *, char *, HWND);
|
|
#endif /* __IBMC__ */
|
|
|
|
|
|
/* Functions for manipulating pointers to OSAK buffers by
|
|
* marking them object handles.
|
|
* NOTE: only the pointer to the first OSAK buffer in a linked
|
|
* list of buffers is marked a pointer to an OSAK buffer */
|
|
|
|
|
|
#ifdef __hpux /* CHOOSE & CUT */
|
|
/* There is a real signal "SIGBUS", even if ANSI-C is compiled */
|
|
#define SIGBUS _SIGBUS
|
|
#endif /* CHOOSE & CUT */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* ASN1CODE_H */
|