#ifndef _SPNEGO_H
#define _SPNEGO_H
#ifdef __cplusplus
extern "C" {
#endif
typedef void* SPNEGO_TOKEN_HANDLE;
typedef enum spnego_element_type
{
spnego_element_min,
spnego_init_mechtypes,
spnego_init_reqFlags,
spnego_init_mechToken,
spnego_init_mechListMIC,
spnego_targ_negResult,
spnego_targ_supportedMech,
spnego_targ_responseToken,
spnego_targ_mechListMIC,
spnego_element_max
} SPNEGO_ELEMENT_TYPE;
#define SPNEGO_TOKEN_ELEMENT_UNAVAILABLE 0
#define SPNEGO_TOKEN_ELEMENT_AVAILABLE 1
#define SPNEGO_TOKEN_INIT 0
#define SPNEGO_TOKEN_TARG 1
typedef enum spnego_mech_oid
{
spnego_mech_oid_Kerberos_V5_Legacy,
spnego_mech_oid_Kerberos_V5,
spnego_mech_oid_Spnego,
spnego_mech_oid_NTLMSSP,
spnego_mech_oid_NotUsed = -1
} SPNEGO_MECH_OID;
typedef enum spnego_negResult
{
spnego_negresult_success,
spnego_negresult_incomplete,
spnego_negresult_rejected,
spnego_negresult_request_mic,
spnego_negresult_NotUsed = -1
} SPNEGO_NEGRESULT;
#define SPNEGO_NEGINIT_CONTEXT_DELEG_FLAG 0x80
#define SPNEGO_NEGINIT_CONTEXT_MUTUAL_FLAG 0x40
#define SPNEGO_NEGINIT_CONTEXT_REPLAY_FLAG 0x20
#define SPNEGO_NEGINIT_CONTEXT_SEQUENCE_FLAG 0x10
#define SPNEGO_NEGINIT_CONTEXT_ANON_FLAG 0x8
#define SPNEGO_NEGINIT_CONTEXT_CONF_FLAG 0x4
#define SPNEGO_NEGINIT_CONTEXT_INTEG_FLAG 0x2
#define SPNEGO_NEGINIT_CONTEXT_MASK 0xFE
#define SPNEGO_E_SUCCESS 0
#define SPNEGO_E_INVALID_TOKEN -1
#define SPNEGO_E_INVALID_LENGTH -2
#define SPNEGO_E_PARSE_FAILED -3
#define SPNEGO_E_NOT_FOUND -4
#define SPNEGO_E_ELEMENT_UNAVAILABLE -5
#define SPNEGO_E_OUT_OF_MEMORY -6
#define SPNEGO_E_NOT_IMPLEMENTED -7
#define SPNEGO_E_INVALID_PARAMETER -8
#define SPNEGO_E_UNEXPECTED_OID -9
#define SPNEGO_E_TOKEN_NOT_FOUND -10
#define SPNEGO_E_UNEXPECTED_TYPE -11
#define SPNEGO_E_BUFFER_TOO_SMALL -12
#define SPNEGO_E_INVALID_ELEMENT -13
void spnegoFreeData(SPNEGO_TOKEN_HANDLE hSpnegoToken);
int spnegoInitFromBinary(unsigned char *pbTokenData, unsigned long ulLength,
SPNEGO_TOKEN_HANDLE* phSpnegoToken);
int spnegoCreateNegTokenHint(SPNEGO_MECH_OID *pMechTypeList, int MechTypeCnt,
unsigned char *pbPrincipal, SPNEGO_TOKEN_HANDLE* phSpnegoToken);
int spnegoCreateNegTokenInit(SPNEGO_MECH_OID MechType,
unsigned char ucContextFlags, unsigned char *pbMechToken,
unsigned long ulMechTokenLen, unsigned char *pbMechTokenMIC,
unsigned long ulMechTokenMIC, SPNEGO_TOKEN_HANDLE *phSpnegoToken);
int spnegoCreateNegTokenTarg(SPNEGO_MECH_OID MechType,
SPNEGO_NEGRESULT spnegoNegResult, unsigned char *pbMechToken,
unsigned long ulMechTokenLen, unsigned char *pbMechListMIC,
unsigned long ulMechListMICLen, SPNEGO_TOKEN_HANDLE* phSpnegoToken);
int spnegoTokenGetBinary(SPNEGO_TOKEN_HANDLE hSpnegoToken,
unsigned char *pbTokenData, unsigned long *pulDataLen);
int spnegoGetTokenType(SPNEGO_TOKEN_HANDLE hSpnegoToken, int *piTokenType);
int spnegoIsMechTypeAvailable(SPNEGO_TOKEN_HANDLE hSpnegoToken,
SPNEGO_MECH_OID MechOID, int *piMechTypeIndex);
int spnegoGetContextFlags(SPNEGO_TOKEN_HANDLE hSpnegoToken,
unsigned char *pucContextFlags);
int spnegoGetNegotiationResult(SPNEGO_TOKEN_HANDLE hSpnegoToken,
SPNEGO_NEGRESULT* pnegResult);
int spnegoGetSupportedMechType(SPNEGO_TOKEN_HANDLE hSpnegoToken,
SPNEGO_MECH_OID* pMechOID);
int spnegoGetMechToken(SPNEGO_TOKEN_HANDLE hSpnegoToken,
unsigned char *pbTokenData, unsigned long *pulDataLen);
int spnegoGetMechListMIC(SPNEGO_TOKEN_HANDLE hSpnegoToken,
unsigned char *pbMICData, unsigned long *pulDataLen);
#ifdef __cplusplus
}
#endif
#endif