1*12b65585SGordon Ross /* 2*12b65585SGordon Ross * Copyright (C) 2002 Microsoft Corporation 3*12b65585SGordon Ross * All rights reserved. 4*12b65585SGordon Ross * 5*12b65585SGordon Ross * THIS CODE AND INFORMATION IS PROVIDED "AS IS" 6*12b65585SGordon Ross * WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED 7*12b65585SGordon Ross * OR IMPLIED, INCLUDING BUT NOT LIMITED 8*12b65585SGordon Ross * TO THE IMPLIED WARRANTIES OF MERCHANTIBILITY 9*12b65585SGordon Ross * AND/OR FITNESS FOR A PARTICULAR PURPOSE. 10*12b65585SGordon Ross * 11*12b65585SGordon Ross * Date - 10/08/2002 12*12b65585SGordon Ross * Author - Sanj Surati 13*12b65585SGordon Ross */ 14*12b65585SGordon Ross 15*12b65585SGordon Ross /* 16*12b65585SGordon Ross * Copyright 2012 Nexenta Systems, Inc. All rights reserved. 17*12b65585SGordon Ross */ 18*12b65585SGordon Ross 19*12b65585SGordon Ross /* 20*12b65585SGordon Ross * spnego.h 21*12b65585SGordon Ross * 22*12b65585SGordon Ross * SPNEGO Token Handler Header File 23*12b65585SGordon Ross * 24*12b65585SGordon Ross * Contains the definitions required to interpret and create 25*12b65585SGordon Ross * SPNEGO tokens so that Kerberos GSS tokens can be 26*12b65585SGordon Ross * Unpackaged/packaged. 27*12b65585SGordon Ross */ 28*12b65585SGordon Ross 29*12b65585SGordon Ross #ifndef _SPNEGO_H 30*12b65585SGordon Ross #define _SPNEGO_H 31*12b65585SGordon Ross 32*12b65585SGordon Ross #ifdef __cplusplus 33*12b65585SGordon Ross extern "C" { 34*12b65585SGordon Ross #endif 35*12b65585SGordon Ross 36*12b65585SGordon Ross /* 37*12b65585SGordon Ross * Type Definitions 38*12b65585SGordon Ross */ 39*12b65585SGordon Ross 40*12b65585SGordon Ross /* 41*12b65585SGordon Ross * Users of SPNEGO Token Handler API will request 42*12b65585SGordon Ross * these as well as free them, 43*12b65585SGordon Ross */ 44*12b65585SGordon Ross typedef void* SPNEGO_TOKEN_HANDLE; 45*12b65585SGordon Ross 46*12b65585SGordon Ross /* 47*12b65585SGordon Ross * Defines the element types that are found 48*12b65585SGordon Ross * in each of the tokens. 49*12b65585SGordon Ross */ 50*12b65585SGordon Ross 51*12b65585SGordon Ross typedef enum spnego_element_type 52*12b65585SGordon Ross { 53*12b65585SGordon Ross spnego_element_min, /* Lower bound */ 54*12b65585SGordon Ross 55*12b65585SGordon Ross /* Init token elements */ 56*12b65585SGordon Ross spnego_init_mechtypes, 57*12b65585SGordon Ross spnego_init_reqFlags, 58*12b65585SGordon Ross spnego_init_mechToken, 59*12b65585SGordon Ross spnego_init_mechListMIC, 60*12b65585SGordon Ross 61*12b65585SGordon Ross /* Targ token elements */ 62*12b65585SGordon Ross spnego_targ_negResult, 63*12b65585SGordon Ross spnego_targ_supportedMech, 64*12b65585SGordon Ross spnego_targ_responseToken, 65*12b65585SGordon Ross spnego_targ_mechListMIC, 66*12b65585SGordon Ross 67*12b65585SGordon Ross spnego_element_max /* Upper bound */ 68*12b65585SGordon Ross 69*12b65585SGordon Ross } SPNEGO_ELEMENT_TYPE; 70*12b65585SGordon Ross 71*12b65585SGordon Ross /* 72*12b65585SGordon Ross * Token Element Availability. Elements in both 73*12b65585SGordon Ross * token types are optional. Since there are only 74*12b65585SGordon Ross * 4 elements in each Token, we will allocate space 75*12b65585SGordon Ross * to hold the information, but we need a way to 76*12b65585SGordon Ross * indicate whether or not an element is available 77*12b65585SGordon Ross */ 78*12b65585SGordon Ross 79*12b65585SGordon Ross #define SPNEGO_TOKEN_ELEMENT_UNAVAILABLE 0 80*12b65585SGordon Ross #define SPNEGO_TOKEN_ELEMENT_AVAILABLE 1 81*12b65585SGordon Ross 82*12b65585SGordon Ross /* 83*12b65585SGordon Ross * Token type values. SPNEGO has 2 token types: 84*12b65585SGordon Ross * NegTokenInit and NegTokenTarg 85*12b65585SGordon Ross */ 86*12b65585SGordon Ross 87*12b65585SGordon Ross #define SPNEGO_TOKEN_INIT 0 88*12b65585SGordon Ross #define SPNEGO_TOKEN_TARG 1 89*12b65585SGordon Ross 90*12b65585SGordon Ross /* 91*12b65585SGordon Ross * GSS Mechanism OID enumeration. We only really handle 92*12b65585SGordon Ross * 3 different OIDs. These are stored in an array structure 93*12b65585SGordon Ross * defined in the parsing code. 94*12b65585SGordon Ross */ 95*12b65585SGordon Ross 96*12b65585SGordon Ross typedef enum spnego_mech_oid 97*12b65585SGordon Ross { 98*12b65585SGordon Ross /* Init token elements */ 99*12b65585SGordon Ross spnego_mech_oid_Kerberos_V5_Legacy, /* Really V5, but OID off by 1 */ 100*12b65585SGordon Ross spnego_mech_oid_Kerberos_V5, 101*12b65585SGordon Ross spnego_mech_oid_Spnego, 102*12b65585SGordon Ross spnego_mech_oid_NTLMSSP, 103*12b65585SGordon Ross spnego_mech_oid_NotUsed = -1 104*12b65585SGordon Ross 105*12b65585SGordon Ross } SPNEGO_MECH_OID; 106*12b65585SGordon Ross 107*12b65585SGordon Ross /* 108*12b65585SGordon Ross * Defines the negResult values. 109*12b65585SGordon Ross */ 110*12b65585SGordon Ross 111*12b65585SGordon Ross typedef enum spnego_negResult 112*12b65585SGordon Ross { 113*12b65585SGordon Ross spnego_negresult_success, 114*12b65585SGordon Ross spnego_negresult_incomplete, 115*12b65585SGordon Ross spnego_negresult_rejected, 116*12b65585SGordon Ross spnego_negresult_NotUsed = -1 117*12b65585SGordon Ross } SPNEGO_NEGRESULT; 118*12b65585SGordon Ross 119*12b65585SGordon Ross /* 120*12b65585SGordon Ross * Context Flags in NegTokenInit 121*12b65585SGordon Ross */ 122*12b65585SGordon Ross 123*12b65585SGordon Ross /* 124*12b65585SGordon Ross * ContextFlags values MUST be zero or a combination 125*12b65585SGordon Ross * of the below 126*12b65585SGordon Ross */ 127*12b65585SGordon Ross 128*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_DELEG_FLAG 0x80 129*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_MUTUAL_FLAG 0x40 130*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_REPLAY_FLAG 0x20 131*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_SEQUENCE_FLAG 0x10 132*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_ANON_FLAG 0x8 133*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_CONF_FLAG 0x4 134*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_INTEG_FLAG 0x2 135*12b65585SGordon Ross 136*12b65585SGordon Ross /* 137*12b65585SGordon Ross * Mask to retrieve valid values. 138*12b65585SGordon Ross */ 139*12b65585SGordon Ross 140*12b65585SGordon Ross #define SPNEGO_NEGINIT_CONTEXT_MASK 0xFE 141*12b65585SGordon Ross 142*12b65585SGordon Ross /* 143*12b65585SGordon Ross * SPNEGO API return codes. 144*12b65585SGordon Ross */ 145*12b65585SGordon Ross 146*12b65585SGordon Ross /* API function was successful */ 147*12b65585SGordon Ross #define SPNEGO_E_SUCCESS 0 148*12b65585SGordon Ross 149*12b65585SGordon Ross /* The supplied Token was invalid */ 150*12b65585SGordon Ross #define SPNEGO_E_INVALID_TOKEN -1 151*12b65585SGordon Ross 152*12b65585SGordon Ross /* An invalid length was encountered */ 153*12b65585SGordon Ross #define SPNEGO_E_INVALID_LENGTH -2 154*12b65585SGordon Ross 155*12b65585SGordon Ross /* The Token Parse failed */ 156*12b65585SGordon Ross #define SPNEGO_E_PARSE_FAILED -3 157*12b65585SGordon Ross 158*12b65585SGordon Ross /* The requested value was not found */ 159*12b65585SGordon Ross #define SPNEGO_E_NOT_FOUND -4 160*12b65585SGordon Ross 161*12b65585SGordon Ross /* The requested element is not available */ 162*12b65585SGordon Ross #define SPNEGO_E_ELEMENT_UNAVAILABLE -5 163*12b65585SGordon Ross 164*12b65585SGordon Ross /* Out of Memory */ 165*12b65585SGordon Ross #define SPNEGO_E_OUT_OF_MEMORY -6 166*12b65585SGordon Ross 167*12b65585SGordon Ross /* Not Implemented */ 168*12b65585SGordon Ross #define SPNEGO_E_NOT_IMPLEMENTED -7 169*12b65585SGordon Ross 170*12b65585SGordon Ross /* Invalid Parameter */ 171*12b65585SGordon Ross #define SPNEGO_E_INVALID_PARAMETER -8 172*12b65585SGordon Ross 173*12b65585SGordon Ross /* Token Handler encountered an unexpected OID */ 174*12b65585SGordon Ross #define SPNEGO_E_UNEXPECTED_OID -9 175*12b65585SGordon Ross 176*12b65585SGordon Ross /* The requested token was not found */ 177*12b65585SGordon Ross #define SPNEGO_E_TOKEN_NOT_FOUND -10 178*12b65585SGordon Ross 179*12b65585SGordon Ross /* An unexpected type was encountered in the encoding */ 180*12b65585SGordon Ross #define SPNEGO_E_UNEXPECTED_TYPE -11 181*12b65585SGordon Ross 182*12b65585SGordon Ross /* The buffer was too small */ 183*12b65585SGordon Ross #define SPNEGO_E_BUFFER_TOO_SMALL -12 184*12b65585SGordon Ross 185*12b65585SGordon Ross /* A Token Element was invalid (e.g. improper length or value) */ 186*12b65585SGordon Ross #define SPNEGO_E_INVALID_ELEMENT -13 187*12b65585SGordon Ross 188*12b65585SGordon Ross /* Miscelaneous API Functions */ 189*12b65585SGordon Ross 190*12b65585SGordon Ross /* Frees opaque data */ 191*12b65585SGordon Ross void spnegoFreeData(SPNEGO_TOKEN_HANDLE hSpnegoToken); 192*12b65585SGordon Ross 193*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure from DER encoded binary data */ 194*12b65585SGordon Ross int spnegoInitFromBinary(unsigned char *pbTokenData, unsigned long ulLength, 195*12b65585SGordon Ross SPNEGO_TOKEN_HANDLE* phSpnegoToken); 196*12b65585SGordon Ross 197*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenInit type */ 198*12b65585SGordon Ross int spnegoCreateNegTokenHint(SPNEGO_MECH_OID *pMechTypeList, int MechTypeCnt, 199*12b65585SGordon Ross unsigned char *pbPrincipal, SPNEGO_TOKEN_HANDLE* phSpnegoToken); 200*12b65585SGordon Ross 201*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenInit type */ 202*12b65585SGordon Ross int spnegoCreateNegTokenInit(SPNEGO_MECH_OID MechType, 203*12b65585SGordon Ross unsigned char ucContextFlags, unsigned char *pbMechToken, 204*12b65585SGordon Ross unsigned long ulMechTokenLen, unsigned char *pbMechTokenMIC, 205*12b65585SGordon Ross unsigned long ulMechTokenMIC, SPNEGO_TOKEN_HANDLE *phSpnegoToken); 206*12b65585SGordon Ross 207*12b65585SGordon Ross /* Initializes SPNEGO_TOKEN structure for a NegTokenTarg type */ 208*12b65585SGordon Ross int spnegoCreateNegTokenTarg(SPNEGO_MECH_OID MechType, 209*12b65585SGordon Ross SPNEGO_NEGRESULT spnegoNegResult, unsigned char *pbMechToken, 210*12b65585SGordon Ross unsigned long ulMechTokenLen, unsigned char *pbMechListMIC, 211*12b65585SGordon Ross unsigned long ulMechListMICLen, SPNEGO_TOKEN_HANDLE* phSpnegoToken); 212*12b65585SGordon Ross 213*12b65585SGordon Ross /* Copies binary representation of SPNEGO Data into user supplied buffer */ 214*12b65585SGordon Ross int spnegoTokenGetBinary(SPNEGO_TOKEN_HANDLE hSpnegoToken, 215*12b65585SGordon Ross unsigned char *pbTokenData, unsigned long *pulDataLen); 216*12b65585SGordon Ross 217*12b65585SGordon Ross /* Returns SPNEGO Token Type */ 218*12b65585SGordon Ross int spnegoGetTokenType(SPNEGO_TOKEN_HANDLE hSpnegoToken, int *piTokenType); 219*12b65585SGordon Ross 220*12b65585SGordon Ross /* Reading an Init Token */ 221*12b65585SGordon Ross 222*12b65585SGordon Ross /* Returns the Initial Mech Type in the MechList element in the NegInitToken. */ 223*12b65585SGordon Ross int spnegoIsMechTypeAvailable(SPNEGO_TOKEN_HANDLE hSpnegoToken, 224*12b65585SGordon Ross SPNEGO_MECH_OID MechOID, int *piMechTypeIndex); 225*12b65585SGordon Ross 226*12b65585SGordon Ross /* Returns the value from the context flags element in the NegInitToken */ 227*12b65585SGordon Ross int spnegoGetContextFlags(SPNEGO_TOKEN_HANDLE hSpnegoToken, 228*12b65585SGordon Ross unsigned char *pucContextFlags); 229*12b65585SGordon Ross 230*12b65585SGordon Ross /* Reading a Response Token */ 231*12b65585SGordon Ross 232*12b65585SGordon Ross /* 233*12b65585SGordon Ross * Returns the value from the negResult element 234*12b65585SGordon Ross * (Status code of GSS call - 0,1,2) 235*12b65585SGordon Ross */ 236*12b65585SGordon Ross int spnegoGetNegotiationResult(SPNEGO_TOKEN_HANDLE hSpnegoToken, 237*12b65585SGordon Ross SPNEGO_NEGRESULT* pnegResult); 238*12b65585SGordon Ross 239*12b65585SGordon Ross /* Returns the Supported Mech Type from the NegTokenTarg. */ 240*12b65585SGordon Ross int spnegoGetSupportedMechType(SPNEGO_TOKEN_HANDLE hSpnegoToken, 241*12b65585SGordon Ross SPNEGO_MECH_OID* pMechOID); 242*12b65585SGordon Ross 243*12b65585SGordon Ross /* Reading either Token Type */ 244*12b65585SGordon Ross 245*12b65585SGordon Ross /* 246*12b65585SGordon Ross * Returns the actual Mechanism data from the token 247*12b65585SGordon Ross * (this is what is passed into GSS-API functions 248*12b65585SGordon Ross */ 249*12b65585SGordon Ross int spnegoGetMechToken(SPNEGO_TOKEN_HANDLE hSpnegoToken, 250*12b65585SGordon Ross unsigned char *pbTokenData, unsigned long *pulDataLen); 251*12b65585SGordon Ross 252*12b65585SGordon Ross /* Returns the Message Integrity BLOB in the token */ 253*12b65585SGordon Ross int spnegoGetMechListMIC(SPNEGO_TOKEN_HANDLE hSpnegoToken, 254*12b65585SGordon Ross unsigned char *pbMICData, unsigned long *pulDataLen); 255*12b65585SGordon Ross 256*12b65585SGordon Ross #ifdef __cplusplus 257*12b65585SGordon Ross } 258*12b65585SGordon Ross #endif 259*12b65585SGordon Ross 260*12b65585SGordon Ross #endif /* _SPNEGO_H */ 261