secur32: Implement QueryContextAttributes. Add tests.
This commit is contained in:
parent
f1b1fe63f6
commit
9d5e09d748
|
@ -31,7 +31,7 @@
|
|||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(secur32);
|
||||
|
||||
#define NTLM_MAX_BUF 2010
|
||||
#define NTLM_MAX_BUF 1904
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -935,22 +935,42 @@ static SECURITY_STATUS SEC_ENTRY ntlm_DeleteSecurityContext(PCtxtHandle phContex
|
|||
static SECURITY_STATUS SEC_ENTRY ntlm_QueryContextAttributesW(PCtxtHandle phContext,
|
||||
unsigned long ulAttribute, void *pBuffer)
|
||||
{
|
||||
SECURITY_STATUS ret;
|
||||
|
||||
/* FIXME: From reading wrapper.h, I think the dwUpper part of a context is
|
||||
* the SecurePackage part and the dwLower part is the actual context
|
||||
* handle. It should be easy to extract the context attributes from that.
|
||||
*/
|
||||
TRACE("%p %ld %p\n", phContext, ulAttribute, pBuffer);
|
||||
if (phContext)
|
||||
if (!phContext)
|
||||
return SEC_E_INVALID_HANDLE;
|
||||
|
||||
switch(ulAttribute)
|
||||
{
|
||||
ret = SEC_E_UNSUPPORTED_FUNCTION;
|
||||
#define _x(x) case (x) : FIXME(#x" stub\n"); break
|
||||
_x(SECPKG_ATTR_ACCESS_TOKEN);
|
||||
_x(SECPKG_ATTR_AUTHORITY);
|
||||
_x(SECPKG_ATTR_DCE_INFO);
|
||||
_x(SECPKG_ATTR_FLAGS);
|
||||
_x(SECPKG_ATTR_KEY_INFO);
|
||||
_x(SECPKG_ATTR_LIFESPAN);
|
||||
_x(SECPKG_ATTR_NAMES);
|
||||
_x(SECPKG_ATTR_NATIVE_NAMES);
|
||||
_x(SECPKG_ATTR_NEGOTIATION_INFO);
|
||||
_x(SECPKG_ATTR_PACKAGE_INFO);
|
||||
_x(SECPKG_ATTR_PASSWORD_EXPIRY);
|
||||
_x(SECPKG_ATTR_SESSION_KEY);
|
||||
case SECPKG_ATTR_SIZES:
|
||||
{
|
||||
PSecPkgContext_Sizes spcs = (PSecPkgContext_Sizes)pBuffer;
|
||||
spcs->cbMaxToken = NTLM_MAX_BUF;
|
||||
spcs->cbMaxSignature = 16;
|
||||
spcs->cbBlockSize = 1;
|
||||
spcs->cbSecurityTrailer = 16;
|
||||
return SEC_E_OK;
|
||||
}
|
||||
_x(SECPKG_ATTR_STREAM_SIZES);
|
||||
_x(SECPKG_ATTR_TARGET_INFORMATION);
|
||||
#undef _x
|
||||
default:
|
||||
TRACE("Unknown value %ld passed for ulAttribute\n", ulAttribute);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = SEC_E_INVALID_HANDLE;
|
||||
}
|
||||
return ret;
|
||||
|
||||
return SEC_E_UNSUPPORTED_FUNCTION;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
|
|
|
@ -46,6 +46,7 @@ static SECURITY_STATUS (SEC_ENTRY * pAcceptSecurityContext)(PCredHandle, PCtxtHa
|
|||
PULONG, PTimeStamp);
|
||||
static SECURITY_STATUS (SEC_ENTRY * pFreeCredentialsHandle)(PCredHandle);
|
||||
static SECURITY_STATUS (SEC_ENTRY * pDeleteSecurityContext)(PCtxtHandle);
|
||||
static SECURITY_STATUS (SEC_ENTRY * pQueryContextAttributesA)(PCtxtHandle, ULONG, PVOID);
|
||||
|
||||
typedef struct _SspiData {
|
||||
PCredHandle cred;
|
||||
|
@ -77,6 +78,7 @@ void InitFunctionPtrs(void)
|
|||
pAcceptSecurityContext = (PVOID)GetProcAddress(secdll, "AcceptSecurityContext");
|
||||
pFreeCredentialsHandle = (PVOID)GetProcAddress(secdll, "FreeCredentialsHandle");
|
||||
pDeleteSecurityContext = (PVOID)GetProcAddress(secdll, "DeleteSecurityContext");
|
||||
pQueryContextAttributesA = (PVOID)GetProcAddress(secdll, "QueryContextAttributesA");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -554,6 +556,7 @@ void testAuth(SEC_CHAR* sec_pkg_name, ULONG data_rep)
|
|||
BOOL first = TRUE;
|
||||
SspiData client, server;
|
||||
SEC_WINNT_AUTH_IDENTITY id;
|
||||
SecPkgContext_Sizes ctxt_sizes;
|
||||
|
||||
if(setupPackageA(sec_pkg_name, &pkg_info) == SEC_E_OK)
|
||||
{
|
||||
|
@ -611,7 +614,31 @@ void testAuth(SEC_CHAR* sec_pkg_name, ULONG data_rep)
|
|||
trace("Looping\n");
|
||||
first = FALSE;
|
||||
}
|
||||
|
||||
|
||||
if(!strcmp(sec_pkg_name, "NTLM"))
|
||||
{
|
||||
sec_status = pQueryContextAttributesA(server.ctxt,
|
||||
SECPKG_ATTR_SIZES, &ctxt_sizes);
|
||||
|
||||
ok(sec_status == SEC_E_OK,
|
||||
"pQueryContextAttributesA(SECPKG_ATTR_SIZES) returned %s\n",
|
||||
getSecError(sec_status));
|
||||
ok(ctxt_sizes.cbMaxToken == 1904,
|
||||
"cbMaxToken should be 1904 but is %lu\n",
|
||||
ctxt_sizes.cbMaxToken);
|
||||
ok(ctxt_sizes.cbMaxSignature == 16,
|
||||
"cbMaxSignature should be 16 but is %lu\n",
|
||||
ctxt_sizes.cbMaxSignature);
|
||||
ok(ctxt_sizes.cbSecurityTrailer == 16,
|
||||
"cbSecurityTrailer should be 16 but is %lu\n",
|
||||
ctxt_sizes.cbSecurityTrailer);
|
||||
ok(ctxt_sizes.cbBlockSize == 1,
|
||||
"cbBlockSize should be 1 but is %lu\n",
|
||||
ctxt_sizes.cbBlockSize);
|
||||
}
|
||||
else
|
||||
trace("Unknown sec package %s\n", sec_pkg_name);
|
||||
|
||||
cleanupBuffers(&client);
|
||||
cleanupBuffers(&server);
|
||||
|
||||
|
|
Loading…
Reference in New Issue