From: Hans Leidekker hans@codeweavers.com
--- dlls/secur32/schannel.c | 2 +- include/sspi.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index 34cd3ad9730..4699f79ac1f 100644 --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -1164,7 +1164,7 @@ static SECURITY_STATUS SEC_ENTRY schan_QueryContextAttributesW( stream_sizes->cbHeader = ctx->header_size; stream_sizes->cbTrailer = mac_size + 256; /* Max 255 bytes padding + 1 for padding size */ stream_sizes->cbMaximumMessage = message_size; - stream_sizes->cbBuffers = 4; + stream_sizes->cBuffers = 4; stream_sizes->cbBlockSize = block_size; }
diff --git a/include/sspi.h b/include/sspi.h index 1cd1e6e0035..e2da48cd720 100644 --- a/include/sspi.h +++ b/include/sspi.h @@ -521,7 +521,7 @@ typedef struct _SecPkgContext_StreamSizes ULONG cbHeader; ULONG cbTrailer; ULONG cbMaximumMessage; - ULONG cbBuffers; + ULONG cBuffers; ULONG cbBlockSize; } SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;
From: Hans Leidekker hans@codeweavers.com
--- dlls/msv1_0/main.c | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-)
diff --git a/dlls/msv1_0/main.c b/dlls/msv1_0/main.c index 77dcfa3b67d..8785754cd51 100644 --- a/dlls/msv1_0/main.c +++ b/dlls/msv1_0/main.c @@ -30,6 +30,7 @@ #include "ntsecpkg.h" #include "rpc.h" #include "wincred.h" +#include "wincrypt.h" #include "lmwksta.h" #include "lmapibuf.h" #include "lmerr.h" @@ -1134,7 +1135,6 @@ static NTSTATUS NTAPI ntlm_SpQueryContextAttributes( LSA_SEC_HANDLE handle, ULON X(SECPKG_ATTR_ACCESS_TOKEN); X(SECPKG_ATTR_AUTHORITY); X(SECPKG_ATTR_DCE_INFO); - X(SECPKG_ATTR_KEY_INFO); X(SECPKG_ATTR_LIFESPAN); X(SECPKG_ATTR_NAMES); X(SECPKG_ATTR_NATIVE_NAMES); @@ -1169,6 +1169,42 @@ static NTSTATUS NTAPI ntlm_SpQueryContextAttributes( LSA_SEC_HANDLE handle, ULON info->NegotiationState = SECPKG_NEGOTIATION_COMPLETE; return SEC_E_OK; } + case SECPKG_ATTR_KEY_INFO: + { + struct ntlm_ctx *ctx = (struct ntlm_ctx *)handle; + SecPkgContext_KeyInfoW *info = (SecPkgContext_KeyInfoW *)buf; + SEC_WCHAR *signature_alg; + ULONG signature_size, signature_algid; + + if (ctx->flags & FLAG_NEGOTIATE_KEY_EXCHANGE) + { + signature_alg = (SEC_WCHAR *)L"HMAC-MD5"; + signature_size = sizeof(L"HMAC-MD5"); + signature_algid = 0xffffff76; + } + else + { + signature_alg = (SEC_WCHAR *)L"RSADSI RC4-CRC32"; + signature_size = sizeof(L"RSADSI RC4-CRC32"); + signature_algid = 0xffffff7c; + } + + if (!(info->sSignatureAlgorithmName = RtlAllocateHeap( GetProcessHeap(), 0, signature_size ))) + return SEC_E_INSUFFICIENT_MEMORY; + wcscpy( info->sSignatureAlgorithmName, signature_alg ); + + if (!(info->sEncryptAlgorithmName = RtlAllocateHeap( GetProcessHeap(), 0, sizeof(L"RSADSI RC4") ))) + { + RtlFreeHeap( GetProcessHeap(), 0, info->sSignatureAlgorithmName ); + return SEC_E_INSUFFICIENT_MEMORY; + } + wcscpy( info->sEncryptAlgorithmName, L"RSADSI RC4" ); + + info->KeySize = sizeof(ctx->session_key) * 8; + info->SignatureAlgorithm = signature_algid; + info->EncryptAlgorithm = CALG_RC4; + return SEC_E_OK; + } #undef X default: FIXME( "unknown attribute %lu\n", attr );
From: Hans Leidekker hans@codeweavers.com
--- dlls/secur32/lsa.c | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-)
diff --git a/dlls/secur32/lsa.c b/dlls/secur32/lsa.c index adb8545c4c8..f69a2a74511 100644 --- a/dlls/secur32/lsa.c +++ b/dlls/secur32/lsa.c @@ -620,6 +620,31 @@ static SECURITY_STATUS nego_info_WtoA( const SecPkgContext_NegotiationInfoW *inf return SEC_E_OK; }
+static SECURITY_STATUS key_info_WtoA( const SecPkgContext_KeyInfoW *infoW, SecPkgContext_KeyInfoA *infoA ) +{ + int size; + + size = WideCharToMultiByte( CP_ACP, 0, infoW->sSignatureAlgorithmName, -1, NULL, 0, NULL, NULL ); + if (!(infoA->sSignatureAlgorithmName = RtlAllocateHeap( GetProcessHeap(), 0, size ))) + return SEC_E_INSUFFICIENT_MEMORY; + WideCharToMultiByte( CP_ACP, 0, infoW->sSignatureAlgorithmName, -1, infoA->sSignatureAlgorithmName, + size, NULL, NULL ); + + size = WideCharToMultiByte( CP_ACP, 0, infoW->sEncryptAlgorithmName, -1, NULL, 0, NULL, NULL ); + if (!(infoA->sEncryptAlgorithmName = RtlAllocateHeap( GetProcessHeap(), 0, size ))) + { + RtlFreeHeap( GetProcessHeap(), 0, infoA->sSignatureAlgorithmName ); + return SEC_E_INSUFFICIENT_MEMORY; + } + WideCharToMultiByte( CP_ACP, 0, infoW->sEncryptAlgorithmName, -1, infoA->sEncryptAlgorithmName, + size, NULL, NULL ); + + infoA->KeySize = infoW->KeySize; + infoA->SignatureAlgorithm = infoW->SignatureAlgorithm; + infoA->EncryptAlgorithm = infoW->EncryptAlgorithm; + return SEC_E_OK; +} + static SECURITY_STATUS WINAPI lsa_QueryContextAttributesA(CtxtHandle *context, ULONG attribute, void *buffer) { TRACE("%p %ld %p\n", context, attribute, buffer); @@ -642,12 +667,24 @@ static SECURITY_STATUS WINAPI lsa_QueryContextAttributesA(CtxtHandle *context, U FreeContextBuffer( infoW.PackageInfo ); return status; } + case SECPKG_ATTR_KEY_INFO: + { + SecPkgContext_KeyInfoW infoW; + SecPkgContext_KeyInfoA *infoA = (SecPkgContext_KeyInfoA *)buffer; + + SECURITY_STATUS status = lsa_QueryContextAttributesW( context, SECPKG_ATTR_KEY_INFO, &infoW ); + + if (status != SEC_E_OK) return status; + status = key_info_WtoA( &infoW, infoA ); + FreeContextBuffer( infoW.sSignatureAlgorithmName ); + FreeContextBuffer( infoW.sEncryptAlgorithmName ); + return status; + }
#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_KEY_INFO); X(SECPKG_ATTR_LIFESPAN); X(SECPKG_ATTR_NAMES); X(SECPKG_ATTR_NATIVE_NAMES);
From: Hans Leidekker hans@codeweavers.com
--- dlls/secur32/tests/ntlm.c | 52 +++++++++++++++++++++++++-------------- 1 file changed, 33 insertions(+), 19 deletions(-)
diff --git a/dlls/secur32/tests/ntlm.c b/dlls/secur32/tests/ntlm.c index 6665af6bb76..4accf4b2d79 100644 --- a/dlls/secur32/tests/ntlm.c +++ b/dlls/secur32/tests/ntlm.c @@ -33,6 +33,7 @@ #include <rpc.h> #include <rpcdce.h> #include <secext.h> +#include <wincrypt.h>
#include "wine/test.h"
@@ -819,8 +820,10 @@ static void testAuth(ULONG data_rep, BOOL fake) BOOL first = TRUE; SspiData client = {{0}}, server = {{0}}; SEC_WINNT_AUTH_IDENTITY_A id; - SecPkgContext_Sizes ctxt_sizes; + SecPkgContext_Sizes sizes; + SecPkgContext_StreamSizes stream_sizes; SecPkgContext_NegotiationInfoA info; + SecPkgContext_KeyInfoA key; SecPkgInfoA *pi;
if(pQuerySecurityPackageInfoA( sec_pkg_name, &pkg_info)!= SEC_E_OK) @@ -895,24 +898,35 @@ static void testAuth(ULONG data_rep, BOOL fake) goto tAuthend; }
- sec_status = pQueryContextAttributesA(&client.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) || (ctxt_sizes.cbMaxToken == 2888), - "cbMaxToken should be 1904 or 2888 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 == 0, - "cbBlockSize should be 0 but is %lu\n", - ctxt_sizes.cbBlockSize); + sec_status = pQueryContextAttributesA(&client.ctxt, SECPKG_ATTR_SIZES, &sizes); + ok(sec_status == SEC_E_OK, "pQueryContextAttributesA(SECPKG_ATTR_SIZES) returned %s\n", getSecError(sec_status)); + ok((sizes.cbMaxToken == 1904) || (sizes.cbMaxToken == 2888), "cbMaxToken should be 1904 or 2888 but is %lu\n", + sizes.cbMaxToken); + ok(sizes.cbMaxSignature == 16, "cbMaxSignature should be 16 but is %lu\n", sizes.cbMaxSignature); + ok(sizes.cbSecurityTrailer == 16, "cbSecurityTrailer should be 16 but is %lu\n", sizes.cbSecurityTrailer); + ok(sizes.cbBlockSize == 0, "cbBlockSize should be 0 but is %lu\n", sizes.cbBlockSize); + + sec_status = pQueryContextAttributesA(&client.ctxt, SECPKG_ATTR_STREAM_SIZES, &stream_sizes); + ok(sec_status == SEC_E_UNSUPPORTED_FUNCTION, "pQueryContextAttributesA(SECPKG_ATTR_STREAM_SIZES) returned %s\n", + getSecError(sec_status)); + + memset( &key, 0, sizeof(key) ); + sec_status = QueryContextAttributesA( &client.ctxt, SECPKG_ATTR_KEY_INFO, &key ); + ok( sec_status == SEC_E_OK, "pQueryContextAttributesA returned %08lx\n", sec_status ); + if (fake) + { + ok( !strcmp(key.sSignatureAlgorithmName, "RSADSI RC4-CRC32"), "got '%s'\n", key.sSignatureAlgorithmName ); + ok( !strcmp(key.sEncryptAlgorithmName, "RSADSI RC4"), "got '%s'\n", key.sEncryptAlgorithmName ); + ok( key.SignatureAlgorithm == 0xffffff7c, "got %#lx\n", key.SignatureAlgorithm ); + } + else + { + ok( !strcmp(key.sSignatureAlgorithmName, "HMAC-MD5"), "got '%s'\n", key.sSignatureAlgorithmName ); + ok( !strcmp(key.sEncryptAlgorithmName, "RSADSI RC4"), "got '%s'\n", key.sEncryptAlgorithmName ); + ok( key.SignatureAlgorithm == 0xffffff76, "got %#lx\n", key.SignatureAlgorithm ); + } + ok( key.KeySize == 128, "got %lu\n", key.KeySize ); + ok( key.EncryptAlgorithm == CALG_RC4, "got %#lx\n", key.EncryptAlgorithm );
memset(&info, 0, sizeof(info)); sec_status = QueryContextAttributesA(&client.ctxt, SECPKG_ATTR_NEGOTIATION_INFO, &info);