/*
* // Copyright (C) 2002 Microsoft Corporation
* // All rights reserved.
* //
* // THIS CODE AND INFORMATION IS PROVIDED "AS IS"
* // WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
* // OR IMPLIED, INCLUDING BUT NOT LIMITED
* // TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY
* // AND/OR FITNESS FOR A PARTICULAR PURPOSE.
* //
* // Date - 10/08/2002
* // Author - Sanj Surati
*/
/*
*
* SPNEGO Token Handler Header File
*
* Contains the definitions required to properly parse the
* SPNEGO DER encoding.
*
*
*/
#ifndef __DERPARSE_H__
#define __DERPARSE_H__
/* C++ Specific */
#if defined(__cplusplus)
extern "C"
{
#endif
/* Identifier Types */
#define IDENTIFIER_MASK 0xC0 /* Bits 7 and 8 */
#define IDENTIFIER_UNIVERSAL 0x00 /* 00 = universal */
#define IDENTIFIER_APPLICATION 0x40 /* 01 = application */
#define IDENTIFIER_CONTEXT_SPECIFIC 0x80 /* 10 = context specific */
#define IDENTIFIER_PRIVATE 0xC0 /* 11 = Private */
/* Encoding type */
#define FORM_MASK 0x20 /* Bit 6 */
#define PRIMITIVE 0x00 /* 0 = primitive */
#define CONSTRUCTED 0x20 /* 1 = constructed */
/* Universal tags */
#define TAG_MASK 0x1F /* Bits 5 - 1 */
#define BOOLEAN 0x01 /* 1: TRUE or FALSE */
#define INTEGER 0x02 /* 2: Arbitrary precision integer */
#define BITSTRING 0x03 /* 2: Sequence of bits */
#define OCTETSTRING 0x04 /* 4: Sequence of bytes */
#define NULLTAG 0x05 /* 5: NULL */
#define OID 0x06 /* 6: Object Identifier (numeric sequence) */
#define OBJDESCRIPTOR 0x07 /* 7: Object Descriptor (human readable) */
#define EXTERNAL 0x08 /* 8: External / Instance Of */
#define REAL 0x09 /* 9: Real (Mantissa * Base^Exponent) */
#define ENUMERATED 0x0A /* 10: Enumerated */
#define EMBEDDED_PDV 0x0B /* 11: Embedded Presentation Data Value */
#define SEQUENCE 0x10 /* 16: Constructed Sequence / Sequence Of */
#define SET 0x11 /* 17: Constructed Set / Set Of */
#define NUMERICSTR 0x12 /* 18: Numeric String (digits only) */
#define PRINTABLESTR 0x13 /* 19: Printable String */
#define T61STR 0x14 /* 20: T61 String (Teletex) */
#define VIDEOTEXSTR 0x15 /* 21: Videotex String */
#define IA5STR 0x16 /* 22: IA5 String */
#define UTCTIME 0x17 /* 23: UTC Time */
#define GENERALIZEDTIME 0x18 /* 24: Generalized Time */
#define GRAPHICSTR 0x19 /* 25: Graphic String */
#define VISIBLESTR 0x1A /* 26: Visible String (ISO 646) */
#define GENERALSTR 0x1B /* 27: General String */
#define UNIVERSALSTR 0x1C /* 28: Universal String */
#define BMPSTR 0x1E /* 30: Basic Multilingual Plane String */
/* Length encoding */
#define LEN_XTND 0x80 /* Indefinite or long form */
#define LEN_MASK 0x7f /* Bits 7 - 1 */
#define SEQ_ELM(n) (IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | ((n)&TAG_MASK))
/* SPNEGO Token Parsing Constants */
/* Fixed Length of NegTokenInit ReqFlags field */
#define SPNEGO_NEGINIT_MAXLEN_REQFLAGS 2
/* Difference in bits for ReqFlags token */
#define SPNEGO_NEGINIT_REQFLAGS_BITDIFF 1
/* Fixed Length of NegTokenTarg NegResult field */
#define SPNEGO_NEGTARG_MAXLEN_NEGRESULT 1
/* Application Specific Construct - Always at the start of a NegTokenInit */
#define SPNEGO_NEGINIT_APP_CONSTRUCT \
(IDENTIFIER_APPLICATION | CONSTRUCTED) /* 0x60 */
/* Constructed Sequence token - after the actual token identifier token */
#define SPNEGO_CONSTRUCTED_SEQUENCE (SEQUENCE | CONSTRUCTED)
/* MechList Type Identifier */
#define SPNEGO_MECHLIST_TYPE (SEQUENCE | CONSTRUCTED | OID)
/* NegTokenInit - Token Identifier and Elements */
/* NegTokenInit - 0xa0 */
#define SPNEGO_NEGINIT_TOKEN_IDENTIFIER (IDENTIFIER_CONTEXT_SPECIFIC | \
CONSTRUCTED | SPNEGO_TOKEN_INIT)
/* Structure elements for NegTokenInit */
#define SPNEGO_NEGINIT_MECHTYPES 0x0 /* MechTypes is element 0 */
#define SPNEGO_NEGINIT_REQFLAGS 0x1 /* ReqFlags is element 1 */
#define SPNEGO_NEGINIT_MECHTOKEN 0x2 /* MechToken is element 2 */
#define SPNEGO_NEGINIT_MECHLISTMIC 0x3 /* MechListMIC is element 3 */
/* MechTypes element is 0xa0 */
#define SPNEGO_NEGINIT_ELEMENT_MECHTYPES \
SEQ_ELM(SPNEGO_NEGINIT_MECHTYPES)
/* ReqFlags element is 0xa1 */
#define SPNEGO_NEGINIT_ELEMENT_REQFLAGS \
SEQ_ELM(SPNEGO_NEGINIT_REQFLAGS)
/* MechToken element is 0xa2 */
#define SPNEGO_NEGINIT_ELEMENT_MECHTOKEN \
SEQ_ELM(SPNEGO_NEGINIT_MECHTOKEN)
/* MechListMIC element is 0xa3 */
#define SPNEGO_NEGINIT_ELEMENT_MECHLISTMIC \
SEQ_ELM(SPNEGO_NEGINIT_MECHLISTMIC)
/* NegTokenTarg - Token Identifier and Elements */
/* NegTokenTarg - 0xa1 */
#define SPNEGO_NEGTARG_TOKEN_IDENTIFIER \
(IDENTIFIER_CONTEXT_SPECIFIC | CONSTRUCTED | SPNEGO_TOKEN_TARG)
/* Structure elements for NegTokenTarg */
#define SPNEGO_NEGTARG_NEGRESULT 0x0 /* NegResult is element 0 */
#define SPNEGO_NEGTARG_SUPPORTEDMECH 0x1 /* SupportedMech is element 1 */
#define SPNEGO_NEGTARG_RESPONSETOKEN 0x2 /* ResponseToken is element 2 */
#define SPNEGO_NEGTARG_MECHLISTMIC 0x3 /* MechListMIC is element 3 */
/* NegResult element is 0xa0 */
#define SPNEGO_NEGTARG_ELEMENT_NEGRESULT \
SEQ_ELM(SPNEGO_NEGTARG_NEGRESULT)
/* SupportedMech element is 0xa1 */
#define SPNEGO_NEGTARG_ELEMENT_SUPPORTMECH \
SEQ_ELM(SPNEGO_NEGTARG_SUPPORTEDMECH)
/* ResponseToken element is 0xa2 */
#define SPNEGO_NEGTARG_ELEMENT_RESPONSETKN \
SEQ_ELM(SPNEGO_NEGTARG_RESPONSETOKEN)
/* MechListMIC element is 0xa3 */
#define SPNEGO_NEGTARG_ELEMENT_MECHLISTMIC \
SEQ_ELM(SPNEGO_NEGTARG_MECHLISTMIC)
/*
* Defines a GSS Mechanism OID. We keep a single static array
* of these which we'll use for validation/searches/parsing.
*/
typedef struct _mechOID
{
unsigned char *ucOid; /* Byte representation of OID */
int iLen; /* Length of the OID, length & id */
int iActualDataLen; /* Length of the actual OID */
SPNEGO_MECH_OID eMechanismOID; /* Which OID is this? */
} MECH_OID;
/* ASN Der functions */
int smbfs_ASNDerCheckToken(unsigned char *, unsigned char,
long, long, long *, long *);
int smbfs_ASNDerCheckOID(unsigned char *, SPNEGO_MECH_OID, long, long *);
long smbfs_ASNDerCalcTokenLength(long, long);
long smbfs_ASNDerCalcElementLength(long, long *);
long smbfs_ASNDerCalcMechListLength(SPNEGO_MECH_OID, long *);
int smbfs_ASNDerWriteToken(unsigned char *, unsigned char, unsigned char *,
long);
int smbfs_ASNDerWriteOID(unsigned char *, SPNEGO_MECH_OID);
long smbfs_ASNDerWriteMechList(unsigned char *, SPNEGO_MECH_OID);
int smbfs_ASNDerWriteElement(unsigned char *, unsigned char,
unsigned char, unsigned char *, long);
/* C++ Specific */
#if defined(__cplusplus)
}
#endif
#endif /* __DERPARSE_H__ */