00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00036
00084 #ifndef _ASN1BER_H_
00085 #define _ASN1BER_H_
00086
00087 #include "rtsrc/asn1type.h"
00088
00089 #define ASN_K_INDEFLEN -9999
00090
00091 #define XU_DUMP(msg) xu_dump(msg,0,0)
00092 #define xd_resetp(pctxt) rtxResetContext(pctxt)
00093
00094 #define ASN1TAG2BYTE(tag) \
00095 ((OSOCTET)(((tag)&TM_B_IDCODE)|((tag)>>ASN1TAG_LSHIFT)))
00096
00101 typedef struct _Asn1BufLocDescr {
00102 OSUINT32 numocts;
00103 OSINT32 offset;
00104 } Asn1BufLocDescr;
00105
00106 #ifdef __cplusplus
00107 extern "C" {
00108
00109 #endif
00110
00111 #ifndef EXTERNBER
00112 #ifdef BUILDASN1BERDLL
00113 #define EXTERNBER __declspec(dllexport)
00114 #elif defined (USEASN1BERDLL)
00115 #define EXTERNBER __declspec(dllimport)
00116 #else
00117 #define EXTERNBER
00118 #endif
00119 #endif
00120
00121
00154 EXTERNBER int xd_tag (OSCTXT* pctxt, ASN1TAG *tag_p);
00155
00176 EXTERNBER int xd_tag_len (OSCTXT *pctxt, ASN1TAG *tag_p,
00177 int *len_p, OSOCTET flags);
00178
00203 EXTERNBER int xd_match (OSCTXT *pctxt, ASN1TAG tag,
00204 int *len_p, OSOCTET flags);
00205
00231 EXTERNBER int xd_boolean (OSCTXT *pctxt, OSBOOL *object_p,
00232 ASN1TagType tagging, int length);
00233
00257 EXTERNBER int xd_integer (OSCTXT *pctxt, OSINT32 *object_p,
00258 ASN1TagType tagging, int length);
00259
00277 EXTERNBER int xd_int8 (OSCTXT *pctxt, OSINT8 *object_p,
00278 ASN1TagType tagging, int length);
00279
00297 EXTERNBER int xd_int16 (OSCTXT *pctxt, OSINT16 *object_p,
00298 ASN1TagType tagging, int length);
00299
00324 EXTERNBER int xd_unsigned (OSCTXT *pctxt, OSUINT32 *object_p,
00325 ASN1TagType tagging, int length);
00326
00345 EXTERNBER int xd_uint8 (OSCTXT *pctxt, OSUINT8 *object_p,
00346 ASN1TagType tagging, int length);
00347
00366 EXTERNBER int xd_uint16 (OSCTXT *pctxt, OSUINT16 *object_p,
00367 ASN1TagType tagging, int length);
00368
00389 EXTERNBER int xd_int64 (OSCTXT *pctxt, OSINT64 *object_p,
00390 ASN1TagType tagging, int length);
00391
00413 EXTERNBER int xd_uint64 (OSCTXT *pctxt, OSUINT64 *object_p,
00414 ASN1TagType tagging, int length);
00415
00443 EXTERNBER int xd_bigint (OSCTXT *pctxt, const char** object_p,
00444 ASN1TagType tagging, int length);
00445
00473 EXTERNBER int xd_bitstr_s (OSCTXT *pctxt, OSOCTET* object_p,
00474 OSUINT32* numbits_p, ASN1TagType tagging,
00475 int length);
00476
00499 EXTERNBER int xd_bitstr (OSCTXT *pctxt, const OSOCTET** object_p2,
00500 OSUINT32* numbits_p, ASN1TagType tagging, int length);
00501
00521 EXTERNBER int xd_octstr_s (OSCTXT *pctxt, OSOCTET* object_p,
00522 OSUINT32* pnumocts, ASN1TagType tagging,
00523 int length);
00524
00544 EXTERNBER int xd_octstr (OSCTXT *pctxt, const OSOCTET** object_p2,
00545 OSUINT32* pnumocts, ASN1TagType tagging, int length);
00546
00568 EXTERNBER int xd_charstr (OSCTXT* pctxt, const char** object_p,
00569 ASN1TagType tagging, ASN1TAG tag, int length);
00570
00591 #define xd_utf8str(pctxt,object_p,tagging,length) \
00592 xd_charstr (pctxt, (const char**)object_p, tagging, ASN_ID_UTF8String, length)
00593
00616 EXTERNBER int xd_16BitCharStr (OSCTXT* pctxt, Asn116BitCharString* object_p,
00617 ASN1TagType tagging, ASN1TAG tag, int length);
00618
00641 EXTERNBER int xd_32BitCharStr (OSCTXT* pctxt, Asn132BitCharString* object_p,
00642 ASN1TagType tagging, ASN1TAG tag, int length);
00643
00658 EXTERNBER int xd_null (OSCTXT *pctxt, ASN1TagType tagging);
00659
00676 EXTERNBER int xd_objid (OSCTXT *pctxt, ASN1OBJID *object_p,
00677 ASN1TagType tagging, int length);
00678
00696 EXTERNBER int xd_oid64 (OSCTXT *pctxt, ASN1OID64 *object_p,
00697 ASN1TagType tagging, int length);
00698
00715 EXTERNBER int xd_reloid (OSCTXT *pctxt, ASN1OBJID *object_p,
00716 ASN1TagType tagging, int length);
00717
00733 EXTERNBER int xd_real (OSCTXT *pctxt, OSREAL *object_p,
00734 ASN1TagType tagging, int length);
00735
00751 EXTERNBER int xd_enum (OSCTXT *pctxt, OSINT32 *object_p,
00752 ASN1TagType tagging, int length);
00753
00769 EXTERNBER int xd_OpenType (OSCTXT *pctxt, const OSOCTET** object_p2,
00770 OSUINT32* pnumocts);
00771
00791 EXTERNBER int xd_OpenTypeExt (OSCTXT* pctxt, ASN1CCB* ccb_p, ASN1TAG tag,
00792 OSRTDList *pElemList);
00793
00806 EXTERNBER int xd_OpenTypeAppend (OSCTXT *pctxt, OSRTDList *pElemList);
00807
00823 EXTERNBER int xd_real10 (OSCTXT *pctxt, const char** object_p,
00824 ASN1TagType tagging, int length);
00825
00856 EXTERNBER int xd_setp (OSCTXT *pctxt, const OSOCTET* msg_p,
00857 int msglen, ASN1TAG *tag_p, int *len_p);
00858
00866 EXTERNBER int xd_indeflen_ex (const OSOCTET* msg_p, int bufSize);
00867
00868
00869 #define xd_indeflen(m) xd_indeflen_ex(m, INT_MAX)
00870
00882 EXTERNBER int xd_len (OSCTXT *pctxt, int *len_p);
00883
00898 EXTERNBER int xd_chkend (OSCTXT *pctxt, ASN1CCB* ccb_p);
00899
00911 EXTERNBER int xd_count (OSCTXT *pctxt, int length, int *count_p);
00912
00921 EXTERNBER int xd_NextElement (OSCTXT* pctxt);
00922
00937 EXTERNBER int xd_Tag1AndLen (OSCTXT* pctxt, OSINT32* len_p);
00938
00939
00954 EXTERNBER int xd_memcpy (OSCTXT* pctxt, OSOCTET *object_p, int length) ;
00955
00974 EXTERNBER int xd_match1 (OSCTXT *pctxt, OSOCTET tag, int *len_p);
00975
00976
00979
00980
01016 EXTERNBER int xdf_tag (FILE* fp, ASN1TAG* ptag, OSOCTET* buffer, int* pbufidx);
01017
01036 EXTERNBER int xdf_len (FILE* fp, OSINT32* plen, OSOCTET* buffer, int* pbufidx);
01037
01058 EXTERNBER int xdf_TagAndLen (FILE* fp, ASN1TAG* ptag, OSINT32* plen,
01059 OSOCTET* buffer, int* pbufidx);
01060
01082 EXTERNBER int xdf_ReadPastEOC (FILE* fp, OSOCTET* buffer,
01083 int bufsiz, int* pbufidx);
01084
01108 EXTERNBER int xdf_ReadContents (FILE* fp, int len, OSOCTET* buffer,
01109 int bufsiz, int* pbufidx);
01114
01162 EXTERNBER int xe_tag_len (OSCTXT *pctxt, ASN1TAG tag, int length) ;
01163
01187 EXTERNBER int xe_boolean (OSCTXT* pctxt, OSBOOL* object_p,
01188 ASN1TagType tagging);
01189
01210 EXTERNBER int xe_integer (OSCTXT* pctxt, int *object_p, ASN1TagType tagging);
01211
01233 EXTERNBER int xe_unsigned (OSCTXT* pctxt, OSUINT32 *object_p,
01234 ASN1TagType tagging);
01235
01256 EXTERNBER int xe_int8 (OSCTXT* pctxt, OSINT8 *object_p, ASN1TagType tagging);
01257
01278 EXTERNBER int xe_int16 (OSCTXT* pctxt, OSINT16 *object_p, ASN1TagType tagging);
01279
01302 EXTERNBER int xe_int64 (OSCTXT* pctxt, OSINT64 *object_p,
01303 ASN1TagType tagging);
01304
01328 EXTERNBER int xe_uint64 (OSCTXT* pctxt, OSUINT64 *object_p,
01329 ASN1TagType tagging);
01330
01352 EXTERNBER int xe_uint8 (OSCTXT* pctxt, OSUINT8 *object_p, ASN1TagType tagging);
01353
01375 EXTERNBER int xe_uint16 (OSCTXT* pctxt, OSUINT16 *object_p, ASN1TagType tagging);
01376
01402 EXTERNBER int xe_bigint (OSCTXT* pctxt, const char* object_p,
01403 ASN1TagType tagging);
01404
01426 EXTERNBER int xe_bitstr (OSCTXT* pctxt, const OSOCTET* object_p,
01427 OSUINT32 numbits, ASN1TagType tagging);
01428
01451 EXTERNBER int xe_octstr (OSCTXT* pctxt, const OSOCTET* object_p,
01452 OSUINT32 numocts, ASN1TagType tagging);
01453
01480 EXTERNBER int xe_charstr (OSCTXT* pctxt, const char* object_p,
01481 ASN1TagType tagging, ASN1TAG tag);
01482
01502 #define xe_utf8str(pctxt,object_p,tagging) \
01503 xe_charstr (pctxt, (const char*)object_p, tagging, ASN_ID_UTF8String)
01504
01534 EXTERNBER int xe_16BitCharStr (OSCTXT* pctxt, Asn116BitCharString* object_p,
01535 ASN1TagType tagging, ASN1TAG tag);
01536
01566 EXTERNBER int xe_32BitCharStr (OSCTXT* pctxt, Asn132BitCharString* object_p,
01567 ASN1TagType tagging, ASN1TAG tag);
01568
01585 EXTERNBER int xe_null (OSCTXT* pctxt, ASN1TagType tagging);
01586
01604 EXTERNBER int xe_objid (OSCTXT* pctxt, ASN1OBJID *object_p,
01605 ASN1TagType tagging);
01606
01625 EXTERNBER int xe_oid64 (OSCTXT* pctxt, ASN1OID64 *object_p,
01626 ASN1TagType tagging);
01627
01645 EXTERNBER int xe_reloid (OSCTXT* pctxt, ASN1OBJID *object_p,
01646 ASN1TagType tagging);
01647
01668 EXTERNBER int xe_enum (OSCTXT* pctxt, OSINT32 *object_p, ASN1TagType tagging);
01669
01694 EXTERNBER int xe_real (OSCTXT* pctxt, OSREAL *object_p, ASN1TagType tagging);
01695
01715 EXTERNBER int xe_OpenType (OSCTXT* pctxt, const OSOCTET* object_p,
01716 OSUINT32 numocts);
01717
01724 EXTERNBER int xe_OpenTypeExt (OSCTXT* pctxt, OSRTDList* pElemList);
01725
01744 EXTERNBER int xe_real10 (OSCTXT *pctxt, const char* object_p,
01745 ASN1TagType tagging);
01746
01765 EXTERNBER int xe_derReal10 (OSCTXT *pctxt, const char* object_p,
01766 ASN1TagType tagging);
01767
01785 EXTERNBER int xe_setp (OSCTXT* pctxt, OSOCTET *buf_p, int bufsiz);
01786
01800 EXTERNBER OSOCTET* xe_getp (OSCTXT* pctxt);
01801
01819 EXTERNBER void xe_free (OSCTXT* pctxt);
01820
01844 EXTERNBER int xe_expandBuffer (OSCTXT *pctxt, size_t length);
01845
01866 EXTERNBER int xe_memcpy (OSCTXT *pctxt, const OSOCTET* object_p,
01867 size_t length) ;
01868
01882 EXTERNBER int xe_len (OSCTXT *pctxt, int length) ;
01883
01902 EXTERNBER int xe_derCanonicalSort (OSCTXT* pctxt, OSRTSList* pList);
01903
01919 EXTERNBER int xe_TagAndIndefLen (OSCTXT *pctxt, ASN1TAG tag, int length) ;
01920
01928 EXTERNBER void xe_getBufLocDescr (OSCTXT *pctxt, OSUINT32 length,
01929 Asn1BufLocDescr* pDescr);
01930
01950 EXTERNBER int derEncBitString
01951 (OSCTXT* pctxt, const OSOCTET* pvalue, OSUINT32 numbits,
01952 ASN1TagType tagging);
01953
01956
01957
01980 EXTERNBER int berDefToIndefLen (OSCTXT *pSrcCtxt, OSCTXT *pDstCtxt);
01981
01992 EXTERNBER int berIndefToDefLen (OSCTXT *pSrcCtxt, OSCTXT *pDstCtxt);
01993
02001 EXTERNBER OSBOOL berErrAddTagParm (OSCTXT* pctxt, ASN1TAG tag);
02002
02003
02004
02005 #define xu_addTagErrParm berErrAddTagParm
02006
02016 EXTERNBER int berErrUnexpTag (OSCTXT* pctxt, ASN1TAG exptag);
02017
02022 EXTERNBER int berGetLibVersion ();
02023
02029 EXTERNBER const char *berGetLibInfo ();
02030
02049 EXTERNBER int berParseTagLen
02050 (const OSOCTET* buffer, size_t bufidx, size_t bufsize,
02051 ASN1TAG* ptag, size_t* plen);
02052
02062 EXTERNBER const char* berTagToString
02063 (ASN1TAG tag, char* buffer, size_t bufsiz);
02064
02075 EXTERNBER const char* berTagToDynStr (OSCTXT* pctxt, ASN1TAG tag);
02076
02077 EXTERNBER int xu_verify_len (OSOCTET *msg_p);
02078 EXTERNBER void *xu_parse_mmbuf (
02079 OSOCTET **buf_p2, int *buflen_p, OSOCTET *start_p, int bufsiz);
02080
02104 EXTERNBER void xu_alloc_array (
02105 OSCTXT* pctxt, ASN1SeqOf* seqOf_p, int recSize, int recCount);
02106
02107 EXTERNBER void xu_octscpy_s (
02108 OSUINT32* nocts_p, OSOCTET *data_p, char *cstr, char zterm);
02109
02110 EXTERNBER void xu_octscpy_ss (ASN1OctStr *octStr_p, char *cstring, char zterm);
02111
02112 EXTERNBER void xu_octscpy_d (
02113 OSCTXT* pctxt, OSUINT32* nocts_p, const OSOCTET** data_p2,
02114 char* cstring, char zterm);
02115
02116 EXTERNBER void xu_octscpy_ds (
02117 OSCTXT* pctxt, ASN1DynOctStr *octStr_p, char *cstring, char zterm);
02118
02119 EXTERNBER void xu_octmcpy_s (ASN1OctStr *octStr_p, void* data_p, int datalen);
02120
02121 EXTERNBER void xu_octmcpy_d (
02122 OSCTXT* pctxt, ASN1DynOctStr *octStr_p, void* data_p, int datalen);
02123
02124 EXTERNBER char* xu_fetchstr (int numocts, char *data);
02125
02126 EXTERNBER int xu_hexstrcpy (char *data, char *hstring);
02127 EXTERNBER int xu_binstrcpy (char *data, char *bstring);
02128
02154 EXTERNBER int xu_dump (OSOCTET *msgptr, ASN1DumpCbFunc cb, void* cbArg_p);
02155
02167 EXTERNBER int xu_fdump (FILE *file_p, OSOCTET *msgptr);
02168
02184 #define xu_hex_dump(msg,numoct,hdr) rtxHexDump(msg,numoct)
02185
02206 EXTERNBER int xu_dump2 (OSCTXT *pctxt, const OSOCTET *msgptr);
02207
02208 EXTERNBER void xu_fmt_tag (
02209 ASN1TAG *tag_p, char *class_p, char *form_p, char *id_code);
02210
02211 EXTERNBER char* xu_fmt_contents (OSCTXT* pctxt, int len, int *count);
02212
02213 EXTERNBER int xu_fread (FILE* fp, OSOCTET* bufp, int bufsiz);
02214
02221 EXTERNBER void xu_SaveBufferState (OSCTXT* pCtxt, OSRTBufSave* pSavedInfo);
02222
02230 EXTERNBER void xu_RestoreBufferState (OSCTXT* pCtxt, OSRTBufSave* pSavedInfo);
02231
02235
02236
02237
02238 #define XD_MEMCPY1(pctxt, object_p) \
02239 ((ASN1BUF_INDEFLEN(pctxt) || \
02240 ((pctxt)->buffer.byteIndex < (pctxt)->buffer.size)) ? \
02241 (*object_p = *OSRTBUFPTR(pctxt), (pctxt)->buffer.byteIndex ++, 0) : \
02242 RTERR_ENDOFBUF)
02243
02244
02245
02246
02247 #define XD_FETCH1(pctxt) ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex++])
02248
02249
02250
02251
02252 #define XD_PEEKTAG(pctxt, tag) \
02253 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] & (~0x20)) == (tag & (~0x20)))
02254
02255
02256
02257
02258 #define XD_PEEKPC(pctxt) \
02259 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] & 0x20) == 0x20)
02260
02261
02262
02263 #define XD_MATCHEOC(pctxt) \
02264 ( ( (pctxt)->buffer.byteIndex + 2 <= (pctxt)->buffer.size ) && \
02265 ( (pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == 0 ) && \
02266 ( (pctxt)->buffer.data[(pctxt)->buffer.byteIndex + 1] == 0 ) )
02267
02268
02269
02270 #define XD_MATCHBYTES1(pctxt, b1) \
02271 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == b1)
02272
02273 #define XD_MATCHBYTES2(pctxt, b1, b2) \
02274 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == b1) && \
02275 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+1] == b2))
02276
02277 #define XD_MATCHBYTES3(pctxt, b1, b2, b3) \
02278 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == b1) && \
02279 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+1] == b2) && \
02280 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+2] == b3))
02281
02282 #define XD_MATCHBYTES4(pctxt, b1, b2, b3, b4) \
02283 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == b1) && \
02284 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+1] == b2) && \
02285 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+2] == b3) && \
02286 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+3] == b4))
02287
02288 #define XD_MATCHBYTES5(pctxt, b1, b2, b3, b4, b5) \
02289 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == b1) && \
02290 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+1] == b2) && \
02291 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+2] == b3) && \
02292 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+3] == b4) && \
02293 ((pctxt)->buffer.data[(pctxt)->buffer.byteIndex+4] == b5))
02294
02295
02296
02297
02298 #define XD_BUMPIDX(pctxt, nbytes) ((pctxt)->buffer.byteIndex += nbytes)
02299
02300
02301
02302 #define XD_CHKBUFEND(pctxt) \
02303 (((ASN1BUF_INDEFLEN(pctxt)) || \
02304 ((pctxt)->buffer.byteIndex <= (pctxt)->buffer.size)) ? 0 : RTERR_ENDOFBUF)
02305
02306
02307
02308
02309
02310 #define XD_CHKDEFLEN(pctxt,len) \
02311 (((ASN1BUF_INDEFLEN(pctxt)) || \
02312 (((pctxt)->buffer.byteIndex + len) <= (pctxt)->buffer.size)) ? \
02313 0 : RTERR_ENDOFBUF)
02314
02315
02316
02317 #define XD_CHKEOB(pctxt) \
02318 (((pctxt)->buffer.byteIndex + 2 > (pctxt)->buffer.size) ? TRUE : \
02319 (((pctxt)->buffer.data[(pctxt)->buffer.byteIndex] == 0 && \
02320 (pctxt)->buffer.data[(pctxt)->buffer.byteIndex + 1] == 0 ) ? \
02321 TRUE : FALSE))
02322
02323
02324
02325 #define XD_CHKEND(pctxt,ccb_p) \
02326 (((ccb_p)->len == ASN_K_INDEFLEN) ? XD_CHKEOB(pctxt) : \
02327 ((OSRTBUFPTR(pctxt) - (ccb_p)->ptr >= (ccb_p)->len) || \
02328 ((pctxt)->buffer.byteIndex >= (pctxt)->buffer.size)))
02329
02330
02331
02332
02333 #define XE_CHKBUF(pctxt,len) \
02334 if (len > (pctxt)->buffer.byteIndex) { \
02335 int xstat = xe_expandBuffer (pctxt, len); \
02336 if (xstat != 0) return xstat; }
02337
02338
02339
02340
02341 #define XE_PUT1(pctxt,ch) \
02342 (pctxt)->buffer.data[--(pctxt)->buffer.byteIndex] = ch;
02343
02344
02345
02346
02347 #define XE_PUT2(pctxt,ch1,ch2) \
02348 (pctxt)->buffer.byteIndex -= 2; \
02349 (pctxt)->buffer.data[(pctxt)->buffer.byteIndex] = ch1; \
02350 (pctxt)->buffer.data[(pctxt)->buffer.byteIndex+1] = ch2;
02351
02352
02353
02354
02355
02356
02357 #define XE_SAFEPUT1(pctxt,ch) \
02358 XE_CHKBUF(pctxt,1); (pctxt)->buffer.data[--(pctxt)->buffer.byteIndex] = ch;
02359
02360 #ifdef __cplusplus
02361 }
02362 #endif
02363
02364 #endif