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