#ifndef __DERPARSE_H__
#define __DERPARSE_H__
#if defined(__cplusplus)
extern "C"
{
#endif
#define IDENTIFIER_MASK 0xC0
#define IDENTIFIER_UNIVERSAL 0x00
#define IDENTIFIER_APPLICATION 0x40
#define IDENTIFIER_CONTEXT_SPECIFIC 0x80
#define IDENTIFIER_PRIVATE 0xC0
#define FORM_MASK 0x20
#define PRIMITIVE 0x00
#define CONSTRUCTED 0x20
#define TAG_MASK 0x1F
#define BOOLEAN 0x01
#define INTEGER 0x02
#define BITSTRING 0x03
#define OCTETSTRING 0x04
#define NULLTAG 0x05
#define OID 0x06
#define OBJDESCRIPTOR 0x07
#define EXTERNAL 0x08
#define REAL 0x09
#define ENUMERATED 0x0A
#define EMBEDDED_PDV 0x0B
#define SEQUENCE 0x10
#define SET 0x11
#define NUMERICSTR 0x12
#define PRINTABLESTR 0x13
#define T61STR 0x14
#define VIDEOTEXSTR 0x15
#define IA5STR 0x16
#define UTCTIME 0x17
#define GENERALIZEDTIME 0x18
#define GRAPHICSTR 0x19
#define VISIBLESTR 0x1A
#define GENERALSTR 0x1B
#define UNIVERSALSTR 0x1C
#define BMPSTR 0x1E
#define LEN_XTND 0x80
#define LEN_MASK 0x7f
#define SEQ_ELM(n) (IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | ((n)&TAG_MASK))
#define SPNEGO_NEGINIT_MAXLEN_REQFLAGS 2
#define SPNEGO_NEGINIT_REQFLAGS_BITDIFF 1
#define SPNEGO_NEGTARG_MAXLEN_NEGRESULT 1
#define SPNEGO_NEGINIT_APP_CONSTRUCT ( IDENTIFIER_APPLICATION | CONSTRUCTED )
#define SPNEGO_CONSTRUCTED_SEQUENCE ( SEQUENCE | CONSTRUCTED )
#define SPNEGO_MECHLIST_TYPE ( SEQUENCE | CONSTRUCTED | OID )
#define SPNEGO_NEGINIT_TOKEN_IDENTIFIER ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | \
SPNEGO_TOKEN_INIT )
#define SPNEGO_NEGINIT_MECHTYPES 0x0
#define SPNEGO_NEGINIT_REQFLAGS 0x1
#define SPNEGO_NEGINIT_MECHTOKEN 0x2
#define SPNEGO_NEGINIT_MECHLISTMIC 0x3
#define SPNEGO_NEGINIT_ELEMENT_MECHTYPES SEQ_ELM(SPNEGO_NEGINIT_MECHTYPES)
#define SPNEGO_NEGINIT_ELEMENT_REQFLAGS SEQ_ELM(SPNEGO_NEGINIT_REQFLAGS)
#define SPNEGO_NEGINIT_ELEMENT_MECHTOKEN SEQ_ELM(SPNEGO_NEGINIT_MECHTOKEN)
#define SPNEGO_NEGINIT_ELEMENT_MECHLISTMIC SEQ_ELM(SPNEGO_NEGINIT_MECHLISTMIC)
#define SPNEGO_NEGTARG_TOKEN_IDENTIFIER ( IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | \
SPNEGO_TOKEN_TARG )
#define SPNEGO_NEGTARG_NEGRESULT 0x0
#define SPNEGO_NEGTARG_SUPPORTEDMECH 0x1
#define SPNEGO_NEGTARG_RESPONSETOKEN 0x2
#define SPNEGO_NEGTARG_MECHLISTMIC 0x3
#define SPNEGO_NEGTARG_ELEMENT_NEGRESULT SEQ_ELM(SPNEGO_NEGTARG_NEGRESULT)
#define SPNEGO_NEGTARG_ELEMENT_SUPPORTEDMECH SEQ_ELM(SPNEGO_NEGTARG_SUPPORTEDMECH)
#define SPNEGO_NEGTARG_ELEMENT_RESPONSETOKEN SEQ_ELM(SPNEGO_NEGTARG_RESPONSETOKEN)
#define SPNEGO_NEGTARG_ELEMENT_MECHLISTMIC SEQ_ELM(SPNEGO_NEGTARG_MECHLISTMIC)
typedef struct _mechOID
{
unsigned char* ucOid;
int iLen;
int iActualDataLen;
SPNEGO_MECH_OID eMechanismOID;
} MECH_OID;
int ASNDerGetLength( unsigned char* pbLengthData, long nBoundaryLength, long* pnLength,
long* pnNumLengthBytes );
int ASNDerCheckToken( unsigned char* pbTokenData, unsigned char nToken,
long nCheckLength, long nBoundaryLength, long* pnLength,
long* pnTokenLength );
int ASNDerCheckOID( unsigned char* pbTokenData, SPNEGO_MECH_OID nMechOID, long nBoundaryLength,
long* pnTokenLength );
int ASNDerCalcNumLengthBytes( long nLength );
long ASNDerCalcTokenLength( long nLength, long nDataLength );
long ASNDerCalcElementLength( long nDataLength, long* pnInternalLength );
long ASNDerCalcMechListLength( SPNEGO_MECH_OID *mechOidLst, int mechOidCnt,
long* pnInternalLength );
int ASNDerWriteLength( unsigned char* pbData, long nLength );
int ASNDerWriteToken( unsigned char* pbData, unsigned char ucType,
unsigned char* pbTokenValue, long nLength );
int ASNDerWriteOID( unsigned char* pbData, SPNEGO_MECH_OID eMechOID );
long ASNDerWriteMechList( unsigned char* pbData, SPNEGO_MECH_OID *mechOidLst, int mechOidCnt );
int ASNDerWriteElement( unsigned char* pbData, unsigned char ucElementSequence,
unsigned char ucType, unsigned char* pbTokenValue, long nLength );
#if defined(__cplusplus)
}
#endif
#endif