195 lines
7.8 KiB
C
195 lines
7.8 KiB
C
// 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
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
//
|
|
// DERPARSE.H
|
|
//
|
|
// 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_SUPPORTEDMECH SEQ_ELM(SPNEGO_NEGTARG_SUPPORTEDMECH)
|
|
// ResponseToken element is 0xa2
|
|
#define SPNEGO_NEGTARG_ELEMENT_RESPONSETOKEN 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 and identifier
|
|
int iActualDataLen; // Length of the actual OID
|
|
SPNEGO_MECH_OID eMechanismOID; // Which OID is this?
|
|
} MECH_OID;
|
|
|
|
|
|
//
|
|
// ASN Der functions
|
|
//
|
|
|
|
static int ASNDerGetLength(unsigned char* pbLengthData, unsigned short nBoundaryLength, unsigned short* pnLength,
|
|
unsigned short* pnNumLengthBytes);
|
|
int ASNDerCheckToken(unsigned char* pbTokenData, unsigned char nToken,
|
|
unsigned short nCheckLength, unsigned short nBoundaryLength, unsigned short* pnLength,
|
|
unsigned short* pnTokenLength);
|
|
int ASNDerCheckOID(unsigned char* pbTokenData, SPNEGO_MECH_OID nMechOID, unsigned short nBoundaryLength,
|
|
unsigned short* pnTokenLength);
|
|
static unsigned short ASNDerCalcNumLengthBytes(unsigned short nLength);
|
|
unsigned short ASNDerCalcTokenLength(unsigned short nLength, unsigned short nDataLength);
|
|
unsigned short ASNDerCalcElementLength(unsigned short nDataLength, unsigned short* pnInternalLength);
|
|
unsigned short ASNDerCalcMechListLength(SPNEGO_MECH_OID mechoid, unsigned short* pnInternalLength);
|
|
static unsigned short ASNDerWriteLength(unsigned char* pbData, unsigned short nLength);
|
|
unsigned short ASNDerWriteToken(unsigned char* pbData, unsigned char ucType,
|
|
unsigned char* pbTokenValue, unsigned short nLength);
|
|
int ASNDerWriteOID(unsigned char* pbData, SPNEGO_MECH_OID eMechOID);
|
|
unsigned short ASNDerWriteMechList(unsigned char* pbData, SPNEGO_MECH_OID mechoid);
|
|
unsigned short ASNDerWriteElement(unsigned char* pbData, unsigned char ucElementSequence,
|
|
unsigned char ucType, unsigned char* pbTokenValue, unsigned short nLength);
|
|
|
|
|
|
// C++ Specific
|
|
#if defined(__cplusplus)
|
|
}
|
|
#endif
|
|
|
|
#endif
|