windows-nt/Source/XPSP1/NT/inetcore/digest/digestw.cxx
2020-09-26 16:20:57 +08:00

367 lines
10 KiB
C++

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
digestw.cxx
Abstract:
sspi wide char interface for digest package.
Author:
Adriaan Canter (adriaanc) 01-Aug-1998
--*/
#include "include.hxx"
static SecurityFunctionTableW
SecTableW =
{
SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION,
EnumerateSecurityPackagesW,
NULL, // QueryCredentialsAttributesA
AcquireCredentialsHandleW,
FreeCredentialsHandle,
NULL, // SspiLogonUserA
InitializeSecurityContextW,
AcceptSecurityContext,
CompleteAuthToken,
DeleteSecurityContext,
ApplyControlToken,
QueryContextAttributesW,
ImpersonateSecurityContext,
RevertSecurityContext,
MakeSignature,
VerifySignature,
FreeContextBuffer,
QuerySecurityPackageInfoW,
NULL, // Reserved3
NULL, // Reserved4
NULL, // ExportSecurityContext
NULL, // ImportSecurityContextA
NULL, // Reserved7
NULL, // Reserved8
NULL, // QuerySecurityContextToken
NULL, // EncryptMessage
NULL // DecryptMessage
};
//--------------------------------------------------------------------------
//
// Function: InitSecurityInterfaceW
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
extern "C" PSecurityFunctionTableW SEC_ENTRY
InitSecurityInterfaceW(VOID)
{
PSecurityFunctionTableW pSecTableW = &SecTableW;
return pSecTableW;
}
//--------------------------------------------------------------------------
//
// Function: AcquireCredentialsHandleW
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
// HEINOUS SSPI HACK here: AcquireCredentialsHandle is called with the package
// name ("Digest") as the package identifier. When AcquireCredentialsHandle returns
// to the caller PCredHandle->dwLower is set by security.dll to be the index of
// the package returned. EnumerateSecurityPackages. This is how SSPI resolves the
// correct provider dll when subsequent calls are made through the dispatch table
// (PSecurityFunctionTale). Any credential *or* context handle handed out by the
// package must have the dwLower member set to this index so that subsequent calls
// can resolve the dll from the handle.
//
//--------------------------------------------------------------------------
extern "C" SECURITY_STATUS SEC_ENTRY
AcquireCredentialsHandleW(
LPWSTR wszPrincipal, // Name of principal
LPWSTR wszPackageName, // Name of package
DWORD dwCredentialUse, // Flags indicating use
VOID SEC_FAR * pvLogonId, // Pointer to logon ID
VOID SEC_FAR * pAuthData, // Package specific data
SEC_GET_KEY_FN pGetKeyFn, // Pointer to GetKey() func
VOID SEC_FAR * pvGetKeyArgument, // Value to pass to GetKey()
PCredHandle phCredential, // (out) Cred Handle
PTimeStamp ptsExpiry // (out) Lifetime (optional)
)
{
return SEC_E_UNSUPPORTED_FUNCTION;
#if 0
SECURITY_STATUS ssResult;
DWORD wcbPrincipal, cbPrincipal, wcbPackageName, cbPackageName;
wcbPrincipal = wszPrincipal ? wcslen(wszPrincipal) : 0;
cbPrincipal = wcbPrincipal / sizeof(WCHAR);
wcbPackageName = wszPackageName ? wcslen(wszPackageName) : 0;
cbPackageName = wcbPackageName / sizeof(WCHAR);
LPSTR szPrincipal;
LPSTR szPackageName;
szPrincipal = new CHAR[cbPrincipal];
szPackageName = new CHAR[cbPackageName];
WideCharToMultiByte(CP_ACP,0, wszPrincipal, wcbPrincipal,
szPrincipal, cbPrincipal, NULL,NULL);
WideCharToMultiByte(CP_ACP,0, wszPackageName, wcbPackageName,
szPackageName, cbPackageName, NULL,NULL);
ssResult = AcquireCredentialsHandleA(
szPrincipal, // Name of principal
szPackageName, // Name of package
dwCredentialUse, // Flags indicating use
pvLogonId, // Pointer to logon ID
pAuthData, // Package specific data
pGetKeyFn, // Pointer to GetKey() func
pvGetKeyArgument, // Value to pass to GetKey()
phCredential, // (out) Cred Handle
ptsExpiry // (out) Lifetime (optional)
);
delete szPrincipal;
delete szPackageName;
return ssResult;
#endif // 0
}
//--------------------------------------------------------------------------
//
// Function: InitializeSecurityContextA
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//--------------------------------------------------------------------------
extern "C" SECURITY_STATUS SEC_ENTRY
InitializeSecurityContextW(
PCredHandle phCredential, // Cred to base context
PCtxtHandle phContext, // Existing context (OPT)
LPWSTR wszTargetName, // Name of target
DWORD fContextReq, // Context Requirements
DWORD Reserved1, // Reserved, MBZ
DWORD TargetDataRep, // Data rep of target
PSecBufferDesc pInput, // Input Buffers
DWORD Reserved2, // Reserved, MBZ
PCtxtHandle phNewContext, // (out) New Context handle
PSecBufferDesc pOutput, // (inout) Output Buffers
DWORD SEC_FAR * pfContextAttr, // (out) Context attrs
PTimeStamp ptsExpiry // (out) Life span (OPT)
)
{
return SEC_E_UNSUPPORTED_FUNCTION;
#if 0
SECURITY_STATUS ssResult;
DWORD wcbTargetName, cbTargetName;
wcbTargetName = wszTargetName ? wcslen(wszTargetName) : 0;
cbTargetName = wcbTargetName / sizeof(WCHAR);
LPSTR szTargetName;
szTargetName = new CHAR[cbTargetName];
WideCharToMultiByte(CP_ACP,0, wszTargetName, wcbTargetName,
szTargetName, cbTargetName, NULL,NULL);
ssResult = InitializeSecurityContextA(
phCredential, // Cred to base context
phContext, // Existing context (OPT)
szTargetName, // Name of target
fContextReq, // Context Requirements
Reserved1, // Reserved, MBZ
TargetDataRep, // Data rep of target
pInput, // Input Buffers
Reserved2, // Reserved, MBZ
phNewContext, // (out) New Context handle
pOutput, // (inout) Output Buffers
pfContextAttr, // (out) Context attrs
ptsExpiry // (out) Life span (OPT)
);
delete szTargetName;
return ssResult;
#endif // 0
}
//--------------------------------------------------------------------------
//
// Function: EnumerateSecurityPackagesW
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY
EnumerateSecurityPackagesW(DWORD SEC_FAR *pcPackages,
PSecPkgInfoW SEC_FAR *ppSecPkgInfo)
{
SECURITY_STATUS ssResult;
ssResult = QuerySecurityPackageInfoW(PACKAGE_NAMEW, ppSecPkgInfo);
if (ssResult == SEC_E_OK)
{
*pcPackages = 1;
}
return ssResult;
}
//--------------------------------------------------------------------------
//
// Function: QuerySecurityPackageInfoW
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY
QuerySecurityPackageInfoW(LPWSTR wszPackageName,
PSecPkgInfoW SEC_FAR *ppSecPkgInfo)
{
PSecPkgInfoW pSecPkgInfo;
SECURITY_STATUS ssResult;
LPWSTR pwCur;
if (wcscmp(wszPackageName, PACKAGE_NAMEW))
{
ssResult = SEC_E_SECPKG_NOT_FOUND;
goto exit;
}
DWORD wcbSecPkgInfo, wcbstruct, wcbname, wcbcomment;
wcbstruct = sizeof(SecPkgInfoW);
wcbname = sizeof(PACKAGE_NAMEW);
wcbcomment = sizeof(PACKAGE_COMMENTW);
wcbSecPkgInfo = wcbstruct + wcbname + wcbcomment;
pSecPkgInfo = (PSecPkgInfoW) LocalAlloc(0,wcbSecPkgInfo);
if (!pSecPkgInfo)
{
ssResult = SEC_E_INSUFFICIENT_MEMORY;
goto exit;
}
pSecPkgInfo->fCapabilities = PACKAGE_CAPABILITIES;
pSecPkgInfo->wVersion = PACKAGE_VERSION;
pSecPkgInfo->wRPCID = PACKAGE_RPCID;
pSecPkgInfo->cbMaxToken = PACKAGE_MAXTOKEN;
pwCur = (LPWSTR) ((LPBYTE) (pSecPkgInfo) + sizeof(SecPkgInfoW));
pSecPkgInfo->Name = pwCur;
memcpy(pSecPkgInfo->Name, PACKAGE_NAMEW, sizeof(PACKAGE_NAMEW));
pwCur = (LPWSTR) ((LPBYTE) (pwCur) + sizeof(PACKAGE_NAMEW));
pSecPkgInfo->Comment = pwCur;
memcpy(pSecPkgInfo->Comment, PACKAGE_COMMENTW, sizeof(PACKAGE_COMMENTW));
*ppSecPkgInfo = pSecPkgInfo;
ssResult = SEC_E_OK;
exit:
return ssResult;
}
//--------------------------------------------------------------------------
//
// Function: QueryContextAttributesW
//
// Synopsis:
//
// Effects:
//
// Arguments:
//
// Requires:
//
// Returns:
//
// Notes:
//
//
//--------------------------------------------------------------------------
extern "C" SECURITY_STATUS SEC_ENTRY
QueryContextAttributesW(
PCtxtHandle phContext, // Context to query
unsigned long ulAttribute, // Attribute to query
void SEC_FAR * pBuffer // Buffer for attributes
)
{
return SEC_E_UNSUPPORTED_FUNCTION;
}