|
|
/*++
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; }
|