From 9d5e09d748c9558142f4b6ce3680f33adc65635b Mon Sep 17 00:00:00 2001 From: Kai Blin Date: Fri, 16 Jun 2006 06:59:48 +0000 Subject: [PATCH] secur32: Implement QueryContextAttributes. Add tests. --- dlls/secur32/ntlm.c | 48 +++++++++++++++++++++++++++++++++-------------- dlls/secur32/tests/main.c | 29 +++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 15 deletions(-) diff --git a/dlls/secur32/ntlm.c b/dlls/secur32/ntlm.c index 3554f672794..07beb391aa9 100644 --- a/dlls/secur32/ntlm.c +++ b/dlls/secur32/ntlm.c @@ -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) - { - ret = SEC_E_UNSUPPORTED_FUNCTION; - } - else + if (!phContext) + return SEC_E_INVALID_HANDLE; + + switch(ulAttribute) { - ret = SEC_E_INVALID_HANDLE; +#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); } - return ret; + + return SEC_E_UNSUPPORTED_FUNCTION; } /*********************************************************************** diff --git a/dlls/secur32/tests/main.c b/dlls/secur32/tests/main.c index a673b733bd6..0a00610f451 100644 --- a/dlls/secur32/tests/main.c +++ b/dlls/secur32/tests/main.c @@ -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); -- 2.11.4.GIT