/*
* // 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
*/
/*
* SPNEGOPARSE.H
*
* SPNEGO Token Parser Header File
*
* Contains the definitions required to properly parse a
* SPNEGO token using ASN.1 DER helpers.
*
*
*/
#ifndef __SPNEGOPARSE_H__
#define __SPNEGOPARSE_H__
/* C++ Specific */
#if defined(__cplusplus)
extern "C"
{
#endif
/* Indicates if we copy data when creating a SPNEGO_TOKEN structure or not */
#define SPNEGO_TOKEN_INTERNAL_COPYPTR 0
#define SPNEGO_TOKEN_INTERNAL_COPYDATA 0x1
/*
* Internal flag dictates whether or not we will free the binary data when
* the SPNEG_TOKEN structure is destroyed
*/
#define SPNEGO_TOKEN_INTERNAL_FLAG_FREEDATA 0x1
/*
* Each SPNEGO Token Type can be broken down into a max of 4 separate elements.
*/
#define MAX_NUM_TOKEN_ELEMENTS 4
/* Element offsets in the array */
/* INIT elements */
#define SPNEGO_INIT_MECHTYPES_ELEMENT 0
#define SPNEGO_INIT_REQFLAGS_ELEMENT 1
#define SPNEGO_INIT_MECHTOKEN_ELEMENT 2
#define SPNEGO_INIT_MECHLISTMIC_ELEMENT 3
/* Response elements */
#define SPNEGO_TARG_NEGRESULT_ELEMENT 0
#define SPNEGO_TARG_SUPPMECH_ELEMENT 1
#define SPNEGO_TARG_RESPTOKEN_ELEMENT 2
#define SPNEGO_TARG_MECHLISTMIC_ELEMENT 3
/* Defines an individual SPNEGO Token Element. */
typedef struct SpnegoElement
{
size_t nStructSize; /* Size of the element structure */
int iElementPresent;
/* SPNEGO_TOKEN_ELEMENT_UNAVAILABLE or SPNEGO_TOKEN_ELEMENT_AVAILABLE */
SPNEGO_ELEMENT_TYPE eElementType; /* The Element Type */
unsigned char type; /* Data Type */
unsigned char *pbData; /* Points to actual Data */
unsigned long nDatalength; /* Actual Data Length */
} SPNEGO_ELEMENT;
/* Structure size in case we later choose to extend the structure */
#define SPNEGO_ELEMENT_SIZE sizeof (SPNEGO_ELEMENT)
/*
* Packages a SPNEGO Token Encoding. There are two types of
* encodings: NegTokenInit and NegTokenTarg. Each encoding can
* contain up to four distinct, optional elements.
*/
typedef struct SpnegoToken
{
size_t nStructSize; /* Size of the Token structure */
unsigned long ulFlags; /* Internal Structure Flags, Reserved */
int ucTokenType;
/* SPNEGO_TOKEN_INIT or SPNEGO_TOKEN_TARG */
unsigned char *pbBinaryData; /* Points to binary token data */
unsigned long ulBinaryDataLen; /* Length of actual binary data */
int nNumElements; /* Number of elements */
SPNEGO_ELEMENT aElementArray [MAX_NUM_TOKEN_ELEMENTS]; /* elements */
} SPNEGO_TOKEN;
/* Structure size in case we later choose to extend the structure */
#define SPNEGO_TOKEN_SIZE sizeof (SPNEGO_TOKEN)
/* Function definitions */
void smbfs_FreeSpnegoToken(SPNEGO_TOKEN *);
int smbfs_FindMechOIDInMechList(SPNEGO_ELEMENT *, SPNEGO_MECH_OID, int *);
int smbfs_CalculateMinSpnegoInitTokenSize(long, long, SPNEGO_MECH_OID, int,
long *, long *);
int smbfs_CalculateMinSpnegoTargTokenSize(SPNEGO_MECH_OID, SPNEGO_NEGRESULT,
long, long, long *, long *);
int smbfs_CreateSpnegoInitToken(SPNEGO_MECH_OID, unsigned char, unsigned char *,
unsigned long, unsigned char *, unsigned long, unsigned char *, long, long);
int smbfs_CreateSpnegoTargToken(SPNEGO_MECH_OID, SPNEGO_NEGRESULT,
unsigned char *, unsigned long, unsigned char *, unsigned long,
unsigned char *, long, long);
int smbfs_IsValidMechOid(SPNEGO_MECH_OID);
int smbfs_IsValidContextFlags(unsigned char);
int smbfs_IsValidNegResult(SPNEGO_NEGRESULT);
int smbfs_IsValidSpnegoToken(SPNEGO_TOKEN *);
int smbfs_InitTokenFromBinary(unsigned char, unsigned long, unsigned char *,
unsigned long, SPNEGO_TOKEN **);
/* C++ Specific */
#if defined(__cplusplus)
}
#endif
#endif /* __SPNEGOPARSE_H__ */