//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996-1998 // // File: server.h // // Contents: Hydra License Server Service Control Manager Interface // // History: 12-09-97 HueiWang Modified from MSDN RPC Service Sample // 07-27-98 HueiWang Port to JetBlue // //--------------------------------------------------------------------------- #ifndef __SERVER_H_ #define __SERVER_H_ #include #include #include #include #include #include #include "license.h" // // TLSDb // #include "JBDef.h" #include "JetBlue.h" #include "TLSDb.h" #include "backup.h" #include "KPDesc.h" #include "Licensed.h" #include "licpack.h" #include "version.h" #include "workitem.h" // // Current RPC interface // #include "tlsrpc.h" #include "tlsdef.h" #include "tlsapi.h" #include "tlsapip.h" #include "tlspol.h" // // #include "messages.h" #include "tlsassrt.h" #include "trust.h" #include "svcrole.h" #include "common.h" #include "lscommon.h" #include "Cryptkey.h" #include "licekpak.h" #include "clrhouse.h" #include "dblevel.h" #include "SrvDef.h" #include "policy.h" #include "wkspace.h" #include "tlsjob.h" #include "srvlist.h" #include "debug.h" #if DBG typedef enum { RPC_CALL_CONNECT, RPC_CALL_SEND_CERTIFICATE, RPC_CALL_GET_SERVERNAME, RPC_CALL_GET_SERVERSCOPE, RPC_CALL_GETINFO, RPC_CALL_GET_LASTERROR, RPC_CALL_ISSUEPLATFORMCHLLENGE, RPC_CALL_ALLOCATECONCURRENT, RPC_CALL_ISSUENEWLICENSE, RPC_CALL_UPGRADELICENSE, RPC_CALL_KEYPACKENUMBEGIN, RPC_CALL_KEYPACKENUMNEXT, RPC_CALL_KEYPACKENUMEND, RPC_CALL_KEYPACKADD, RPC_CALL_KEYPACKSETSTATUS, RPC_CALL_LICENSEENUMBEGIN, RPC_CALL_LICENSEENUMNEXT, RPC_CALL_LICENSEENUMEND, RPC_CALL_LICENSESETSTATUS, RPC_CALL_INSTALL_SERV_CERT, RPC_CALL_GETSERV_CERT, RPC_CALL_REGISTER_LICENSE_PACK, RPC_CALL_REQUEST_TERMSRV_CERT, RPC_CALL_RETRIEVE_TERMSRV_CERT, RPC_CALL_GETPKCS10CERT_REQUEST, RPC_CALL_ANNOUNCE_SERVER, RPC_CALL_SERVERLOOKUP, RPC_CALL_ANNOUNCELICENSEPACK, RPC_CALL_RETURNLICENSE, RPC_CALL_RETURNKEYPACK, RPC_CALL_GETPRIVATEDATA, RPC_CALL_SETPRIVATEDATA, RPC_CALL_CHALLENGESERVER, RPC_CALL_RESPONSESERVERCHALLENGE, RPC_CALL_TRIGGERREGENKEY, RPC_CALL_TELEPHONEREGISTERLKP, RPC_CALL_ALLOCATEINTERNETLICNESEEX, RPC_CALL_RETURNINTERNETLICENSEEX, RPC_CALL_RETURNINTERNETLICENSE } DBG_RPC_CALL; #endif //--------------------------------------------------------------------------- typedef enum { LSCERT_RDN_STRING_TYPE, LSCERT_RDN_NAME_INFO_TYPE, LSCERT_RDN_NAME_BLOB_TYPE, LSCERT_CLIENT_INFO_TYPE } TLSCLIENTCERTRDNTYPE; typedef struct __LSClientInfo { LPTSTR szUserName; LPTSTR szMachineName; PHWID pClientID; } TLSClientInfo, *PTLSClientInfo, *LPTLSClientInfo; typedef struct __LSClientCertRDN { TLSCLIENTCERTRDNTYPE type; union { LPTSTR szRdn; PCERT_NAME_INFO pCertNameInfo; TLSClientInfo ClientInfo; PCERT_NAME_BLOB pNameBlob; }; } TLSClientCertRDN, *PTLSClientCertRDN, *LPTLSClientCertRDN; //--------------------------------------------------------------------------- typedef struct _DbLicensedProduct { DWORD dwQuantity; ULARGE_INTEGER ulSerialNumber; DWORD dwKeyPackId; DWORD dwLicenseId; DWORD dwKeyPackLicenseId; DWORD dwNumLicenseLeft; HWID ClientHwid; FILETIME NotBefore; FILETIME NotAfter; BOOL bTemp; // temporary license // licensed product version DWORD dwProductVersion; // manufaturer name TCHAR szCompanyName[LSERVER_MAX_STRING_SIZE+1]; // licensed product Id TCHAR szLicensedProductId[LSERVER_MAX_STRING_SIZE+1]; // original license request product ID TCHAR szRequestProductId[LSERVER_MAX_STRING_SIZE+1]; TCHAR szUserName[LSERVER_MAX_STRING_SIZE+1]; TCHAR szMachineName[LSERVER_MAX_STRING_SIZE+1]; // DWORD dwLanguageID; DWORD dwPlatformID; PBYTE pbPolicyData; DWORD cbPolicyData; PCERT_PUBLIC_KEY_INFO pSubjectPublicKeyInfo; } TLSDBLICENSEDPRODUCT, *PTLSDBLICENSEDPRODUCT, *LPTLSDBLICENSEDPRODUCT; //--------------------------------------------------------------------------- typedef struct __TLSDbLicenseRequest { CTLSPolicy* pPolicy; PMHANDLE hClient; // // Product request // DWORD dwProductVersion; LPTSTR pszCompanyName; LPTSTR pszProductId; DWORD dwLanguageID; DWORD dwPlatformID; // // Client information // HWID hWid; PBYTE pbEncryptedHwid; DWORD cbEncryptedHwid; TCHAR szMachineName[MAX_COMPUTERNAME_LENGTH + 2]; TCHAR szUserName[MAXUSERNAMELENGTH+1]; // // detail of licensing chain WORD wLicenseDetail; // // special things to be put into certificate // PCERT_PUBLIC_KEY_INFO pClientPublicKey; TLSClientCertRDN clientCertRdn; DWORD dwNumExtensions; PCERT_EXTENSION pExtensions; // // Policy Extension Data // //PBYTE pbPolicyExtensionData; //DWORD cbPolicyExtensionData; PPMLICENSEREQUEST pClientLicenseRequest; // original client license request PPMLICENSEREQUEST pPolicyLicenseRequest; // policy adjusted license request // // To do ? // consider a callback routine but are we getting // into issuing certificate business. // } TLSDBLICENSEREQUEST, *PTLSDBLICENSEREQUEST, *LPTLSDBLICENSEREQUEST; typedef struct __ForwardNewLicenseRequest { CHALLENGE_CONTEXT m_ChallengeContext; TLSLICENSEREQUEST* m_pRequest; LPTSTR m_szMachineName; LPTSTR m_szUserName; DWORD m_cbChallengeResponse; PBYTE m_pbChallengeResponse; // no forward on request. } TLSForwardNewLicenseRequest, *PTLSForwardNewLicenseRequest, *LPTLSForwardNewLicenseRequest; typedef struct __ForwardUpgradeRequest { TLSLICENSEREQUEST* m_pRequest; CHALLENGE_CONTEXT m_ChallengeContext; DWORD m_cbChallengeResponse; PBYTE m_pbChallengeResponse; DWORD m_cbOldLicense; PBYTE m_pbOldLicense; } TLSForwardUpgradeLicenseRequest, *PTLSForwardUpgradeLicenseRequest, *LPTLSForwardUpgradeLicenseRequest; //--------------------------------------------------------------------------- // #define CLIENT_INFO_HYDRA_SERVER 0xFFFFFFFF typedef enum { CONTEXTHANDLE_EMPTY_TYPE=0, CONTEXTHANDLE_KEYPACK_ENUM_TYPE, CONTEXTHANDLE_LICENSE_ENUM_TYPE, CONTEXTHANDLE_CLIENTINFO_TYPE, CONTEXTHANDLE_CLIENTCHALLENGE_TYPE, CONTEXTHANDLE_HYDRA_REQUESTCERT_TYPE, CONTEXTHANDLE_CHALLENGE_SERVER_TYPE, CONTEXTHANDLE_CHALLENGE_LRWIZ_TYPE, CONTEXTHANDLE_CHALLENGE_TERMSRV_TYPE } CONTEXTHANDLE_TYPE; // No access #define CLIENT_ACCESS_NONE 0x00000000 // only keypack/license enumeration #define CLIENT_ACCESS_USER 0x00000001 // Administrator, can update value but can't // request license #define CLIENT_ACCESS_ADMIN 0x00000002 // Client can request license no update // database value #define CLIENT_ACCESS_REQUEST 0x00000004 // client is registration wizard // only install certificate #define CLIENT_ACCESS_LRWIZ 0x00000008 // client is license server, allow // full access #define CLIENT_ACCESS_LSERVER 0xFFFFFFFF #define CLIENT_ACCESS_DEFAULT CLIENT_ACCESS_USER typedef struct __ClientContext { #if DBG DWORD m_PreDbg[2]; // debug signature DBG_RPC_CALL m_LastCall; // last call #endif LPTSTR m_Client; long m_RefCount; DWORD m_ClientFlags; DWORD m_LastError; CONTEXTHANDLE_TYPE m_ContextType; HANDLE m_ContextHandle; // NEEDED - A list to store all memory/handle // allocated for the client #if DBG DWORD m_PostDbg[2]; // debug signature #endif } CLIENTCONTEXT, *LPCLIENTCONTEXT; //--------------------------------------------------------------- typedef struct __ENUMHANDLE { typedef enum { FETCH_NEXT_KEYPACK=1, FETCH_NEXT_KEYPACKDESC, FETCH_NEW_KEYPACKDESC } ENUM_FETCH_CODE; PTLSDbWorkSpace pbWorkSpace; TLSLICENSEPACK CurrentKeyPack; // current fetched keypack record LICPACKDESC KPDescSearchValue; // licensepack search value DWORD dwKPDescSearchParm; // licensepackdesc search parameter BOOL bKPDescMatchAll; // match all condition for keypackdesc CHAR chFetchState; } ENUMHANDLE, *LPENUMHANDLE; typedef struct __TERMSERVCERTREQHANDLE { PTLSHYDRACERTREQUEST pCertRequest; DWORD cbChallengeData; PBYTE pbChallengeData; } TERMSERVCERTREQHANDLE, *LPTERMSERVCERTREQHANDLE; typedef struct __ClientChallengeContext { DWORD m_ClientInfo; HANDLE m_ChallengeContext; } CLIENTCHALLENGECONTEXT, *LPCLIENTCHALLENGECONTEXT; typedef enum { ALLOCATE_EXACT_VERSION=0, ALLOCATE_ANY_GREATER_VERSION, ALLOCATE_LATEST_VERSION // not supported } LICENSE_ALLOCATION_SCHEME; typedef struct __AllocateRequest { UCHAR ucAgreementType; // keypack type LPTSTR szCompanyName; // company name LPTSTR szProductId; // product DWORD dwVersion; // version wanted DWORD dwPlatformId; // license platform DWORD dwLangId; // unused DWORD dwNumLicenses; // number of license wanted/returned LICENSE_ALLOCATION_SCHEME dwScheme; // TODO - CallBack function to let calling // function decide } TLSDBAllocateRequest, *PTLSDBAllocateRequest, *LPTLSDBAllocateRequest; typedef struct __LicenseAllocation { // array size for dwAllocationVector DWORD dwBufSize; // // Total license allocated DWORD dwTotalAllocated; // number of license allocate from // each keypack DWORD* pdwAllocationVector; // keypack that license allocate from PLICENSEPACK lpAllocateKeyPack; } TLSDBLicenseAllocation, *PTLSDBLicenseAllocation, *LPTLSDBLicenseAllocation; //--------------------------------------------------------------------- //---------------------------------------------------------------------------- #ifdef __cplusplus extern "C" { #endif BOOL WaitForMyTurnOrShutdown( HANDLE hHandle, DWORD dwWaitTime ); HANDLE GetServiceShutdownHandle(); void ServiceSignalShutdown(); void ServiceResetShutdownEvent(); BOOL AcquireRPCExclusiveLock( IN DWORD dwWaitTime ); void ReleaseRPCExclusiveLock(); BOOL AcquireAdministrativeLock( IN DWORD dwWaitTime ); void ReleaseAdministrativeLock(); DWORD TLSMapReturnCode(DWORD); unsigned int WINAPI MailSlotThread( void* ptr ); HANDLE ServerInit( BOOL bDebug ); DWORD InitNamedPipeThread(); DWORD InitMailSlotThread(); DWORD InitExpirePermanentThread(); BOOL IsServiceShuttingdown(); #ifdef __cplusplus } #endif void __cdecl trans_se_func( unsigned int u, _EXCEPTION_POINTERS* pExp ); #endif