//+-----------------------------------------------------------------------
//
// File:        kerbsupp.h
//
// Contents:    prototypes for kerberos support routines
//
//
// History:
//
//------------------------------------------------------------------------

#ifndef _INC_KERBSUPP_
#define _INC_KERBSUPP_

#include <intkerb.h>
#include <tickets.h>
#include <crypto.h>
#include <samrpc.h>

//
// Global time constants
//
const TimeStamp tsInfinity = {0xFFFFFFFF, 0x7FFFFFFF};
const TimeStamp tsZero     = {0, 0};
const LONG      lInfinity  = 0x7FFFFFFF;

// Prototypes

#ifdef __cplusplus

class CAuthenticatorList;
class CLogonAccount;

//
// Contains domain account policies that are required for checking logon
// restrictions.
//
typedef struct _LogonPolicies {
   TimeStamp   MaxPasswordAge;
} LogonPolicies, *PLogonPolicies;


SECURITY_STATUS NTAPI
KerbCheckTicket(IN PKerbTicket                 pktTicket,
                IN PEncryptedData              pedAuth,
                IN const KerbKey&              kKey,
                IN OUT CAuthenticatorList&     alAuthenList,
                IN const TimeStamp&            tsSkew,
                IN const PWCHAR                pwzServiceName,
                OUT PKerbInternalTicket        pkitTicket,
                OUT PKerbInternalAuthenticator pkiaAuth,
                OUT PKerbKey                   pkSessionKey );

SECURITY_STATUS NTAPI
CheckLogonRestrictions( IN  SAMPR_HANDLE            UserHandle,
                        IN  const TimeStamp&        tsNow,
                        IN  const SECURITY_STRING&  sMachineName,
                        IN  PLogonPolicies          LogonData,
                        OUT PULONG                  pcLogonSeconds );


#endif // ifdef __cplusplus




#ifdef __cplusplus
extern "C" {
#endif

SECURITY_STATUS NTAPI
KerbPackTicket(     PKerbInternalTicket     pkitTicket,
                    PKerbKey                pkKey,
                    ULONG                   dwEncrType,
                    PKerbTicket *           ppktTicket);

SECURITY_STATUS NTAPI
KerbUnpackTicket(PKerbTicket, PKerbKey, PKerbInternalTicket);

SECURITY_STATUS NTAPI
KerbMakeKey(PKerbKey);

SECURITY_STATUS NTAPI
KerbRandomFill(PUCHAR, ULONG);

SECURITY_STATUS NTAPI
KerbCreateAuthenticator(IN  PKerbKey        pkKey,
                        IN  DWORD           dwEncrType,
                        IN  DWORD           dwSeq,
                        IN  PUNICODE_STRING ClientName,
                        IN  PUNICODE_STRING ClientDomainName,
                        IN  PTimeStamp      ptsTime,
                        IN  PKerbKey        pkSubKey,
                        IN OUT PULONG       pcbAuthenIn,
                        OUT PEncryptedData* ppedAuthenticator );

SECURITY_STATUS NTAPI
KerbUnpackAuthenticator(PKerbInternalTicket, PEncryptedData, PKerbInternalAuthenticator);

SECURITY_STATUS NTAPI
KerbPackKDCReply(PKerbKDCReply, PKerbKey, ULONG, PEncryptedData *);

SECURITY_STATUS NTAPI
KerbUnpackKDCReply(PEncryptedData, PKerbKey, PKerbKDCReply);

SECURITY_STATUS NTAPI
KerbFreeTicket( PKerbInternalTicket pkitTicket );

SECURITY_STATUS NTAPI
KerbFreeAuthenticator( PKerbInternalAuthenticator pkiaAuth );

SECURITY_STATUS NTAPI
KerbFreeKDCReply( PKerbKDCReply pkrReply );

void NTAPI
KerbHashPassword(PSECURITY_STRING, PKerbKey);

SECURITY_STATUS NTAPI
KIEncryptData(PEncryptedData, ULONG, ULONG, PKerbKey);

SECURITY_STATUS NTAPI
KIDecryptData(PEncryptedData, PKerbKey);

void * KerbSafeAlloc(unsigned long);
void KerbSafeFree(void *);


typedef struct _KerbScatterBlock {
    ULONG   cbData;
    PUCHAR  pbData;
} KerbScatterBlock, * PKerbScatterBlock;

#ifdef __CRYPTDLL_H__

SECURITY_STATUS NTAPI
KICheckSum( PUCHAR              pbData,
            ULONG               cbData,
            PCheckSumFunction   pcsfSum,
            PCheckSum           pcsCheckSum);


SECURITY_STATUS NTAPI
KICheckSumVerify(   PUCHAR       pbBuffer,
                    ULONG       cbBuffer,
                    PCheckSum   pcsCheck);


SECURITY_STATUS NTAPI
KIScatterEncrypt(   PUCHAR               pbHeader,
                    ULONG                cBlocks,
                    PKerbScatterBlock   psbList,
                    PCryptoSystem       pcsCrypt,
                    PCheckSumFunction   pcsfSum,
                    PKerbKey            pkKey);


SECURITY_STATUS NTAPI
KIScatterDecrypt(   PUCHAR              pbHeader,
                    ULONG               cBlocks,
                    PKerbScatterBlock   psbList,
                    PCryptoSystem       pcsCrypt,
                    PCheckSumFunction   pcsfSum,
                    PKerbKey            pkKey);

#endif // using CRYPTDLL.h defines

#ifdef __cplusplus
}   // extern "C"
#endif

#endif // _INC_KERBSUPP_