[SECUR32_WINETEST] Sync with Wine Staging 1.7.55. CORE-10536

svn path=/trunk/; revision=70137
This commit is contained in:
Amine Khaldi 2015-11-26 23:32:19 +00:00
parent 16d60ad9b4
commit 1583b86709
3 changed files with 255 additions and 34 deletions

View file

@ -262,6 +262,9 @@ static void test_authentication(void)
SecPkgInfoA *pi;
BOOL first = TRUE;
memset(&client, 0, sizeof(client));
memset(&server, 0, sizeof(server));
id.User = (unsigned char *)"user";
id.UserLength = strlen( "user" );
id.Domain = (unsigned char *)"domain";
@ -342,17 +345,29 @@ done:
cleanup_buffers( &client );
cleanup_buffers( &server );
status_c = pDeleteSecurityContext( &client.ctxt );
ok( status_c == SEC_E_OK, "DeleteSecurityContext returned %08x\n", status_c );
if (client.ctxt.dwLower || client.ctxt.dwUpper)
{
status_c = pDeleteSecurityContext( &client.ctxt );
ok( status_c == SEC_E_OK, "DeleteSecurityContext returned %08x\n", status_c );
}
status_s = pDeleteSecurityContext( &server.ctxt );
ok( status_s == SEC_E_OK, "DeleteSecurityContext returned %08x\n", status_s );
if (server.ctxt.dwLower || server.ctxt.dwUpper)
{
status_s = pDeleteSecurityContext( &server.ctxt );
ok( status_s == SEC_E_OK, "DeleteSecurityContext returned %08x\n", status_s );
}
status_c = pFreeCredentialsHandle( &client.cred );
ok( status_c == SEC_E_OK, "FreeCredentialsHandle returned %08x\n", status_c );
if (client.cred.dwLower || client.cred.dwUpper)
{
status_c = pFreeCredentialsHandle( &client.cred );
ok( status_c == SEC_E_OK, "FreeCredentialsHandle returned %08x\n", status_c );
}
status_s = pFreeCredentialsHandle(&server.cred);
ok( status_s == SEC_E_OK, "FreeCredentialsHandle returned %08x\n", status_s );
if (server.cred.dwLower || server.cred.dwUpper)
{
status_s = pFreeCredentialsHandle(&server.cred);
ok( status_s == SEC_E_OK, "FreeCredentialsHandle returned %08x\n", status_s );
}
}
START_TEST(negotiate)

View file

@ -115,6 +115,8 @@ static const BYTE selfSignedCert[] = {
0x0a, 0x8c, 0xb4, 0x5c, 0x34, 0x78, 0xe0, 0x3c, 0x9c, 0xe9, 0xf3, 0x30, 0x9f,
0xa8, 0x76, 0x57, 0x92, 0x36 };
static CHAR unisp_name_a[] = UNISP_NAME_A;
static void InitFunctionPtrs(void)
{
HMODULE advapi32dll;
@ -154,6 +156,81 @@ static void InitFunctionPtrs(void)
#undef GET_PROC
}
static const char *algid_to_str(ALG_ID alg)
{
static char buf[12];
switch(alg) {
#define X(x) case x: return #x
X(CALG_MD2);
X(CALG_MD4);
X(CALG_MD5);
X(CALG_SHA1); /* same as CALG_SHA */
X(CALG_MAC);
X(CALG_RSA_SIGN);
X(CALG_DSS_SIGN);
X(CALG_NO_SIGN);
X(CALG_RSA_KEYX);
X(CALG_DES);
X(CALG_3DES_112);
X(CALG_3DES);
X(CALG_DESX);
X(CALG_RC2);
X(CALG_RC4);
X(CALG_SEAL);
X(CALG_DH_SF);
X(CALG_DH_EPHEM);
X(CALG_AGREEDKEY_ANY);
X(CALG_KEA_KEYX);
X(CALG_HUGHES_MD5);
X(CALG_SKIPJACK);
X(CALG_TEK);
X(CALG_CYLINK_MEK);
X(CALG_SSL3_SHAMD5);
X(CALG_SSL3_MASTER);
X(CALG_SCHANNEL_MASTER_HASH);
X(CALG_SCHANNEL_MAC_KEY);
X(CALG_SCHANNEL_ENC_KEY);
X(CALG_PCT1_MASTER);
X(CALG_SSL2_MASTER);
X(CALG_TLS1_MASTER);
X(CALG_RC5);
X(CALG_HMAC);
X(CALG_TLS1PRF);
X(CALG_HASH_REPLACE_OWF);
X(CALG_AES_128);
X(CALG_AES_192);
X(CALG_AES_256);
X(CALG_AES);
X(CALG_SHA_256);
X(CALG_SHA_384);
X(CALG_SHA_512);
X(CALG_ECDH);
X(CALG_ECMQV);
X(CALG_ECDSA);
#undef X
}
sprintf(buf, "%x", alg);
return buf;
}
static void init_cred(SCHANNEL_CRED *cred)
{
cred->dwVersion = SCHANNEL_CRED_VERSION;
cred->cCreds = 0;
cred->paCred = 0;
cred->hRootStore = NULL;
cred->cMappers = 0;
cred->aphMappers = NULL;
cred->cSupportedAlgs = 0;
cred->palgSupportedAlgs = NULL;
cred->grbitEnabledProtocols = 0;
cred->dwMinimumCipherStrength = 0;
cred->dwMaximumCipherStrength = 0;
cred->dwSessionLifespan = 0;
cred->dwFlags = 0;
}
static void test_strength(PCredHandle handle)
{
SecPkgCred_CipherStrengths strength = {-1,-1};
@ -191,6 +268,57 @@ static void test_supported_protocols(CredHandle *handle, unsigned exprots)
trace("Unknown flags: %x\n", protocols.grbitProtocol);
}
static void test_supported_algs(CredHandle *handle)
{
SecPkgCred_SupportedAlgs algs;
SECURITY_STATUS status;
unsigned i;
status = pQueryCredentialsAttributesA(handle, SECPKG_ATTR_SUPPORTED_ALGS, &algs);
todo_wine ok(status == SEC_E_OK, "QueryCredentialsAttributes failed: %08x\n", status);
if(status != SEC_E_OK)
return;
trace("Supported algorithms (%d):\n", algs.cSupportedAlgs);
for(i=0; i < algs.cSupportedAlgs; i++)
trace(" %s\n", algid_to_str(algs.palgSupportedAlgs[i]));
pFreeContextBuffer(algs.palgSupportedAlgs);
}
static void test_cread_attrs(void)
{
SCHANNEL_CRED schannel_cred;
SECURITY_STATUS status;
CredHandle cred;
status = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
NULL, NULL, NULL, NULL, &cred, NULL);
ok(status == SEC_E_OK, "AcquireCredentialsHandleA failed: %x\n", status);
test_supported_protocols(&cred, 0);
test_supported_algs(&cred);
status = pQueryCredentialsAttributesA(&cred, SECPKG_ATTR_SUPPORTED_PROTOCOLS, NULL);
ok(status == SEC_E_INTERNAL_ERROR, "QueryCredentialsAttributes failed: %08x, expected SEC_E_INTERNAL_ERROR\n", status);
status = pQueryCredentialsAttributesA(&cred, SECPKG_ATTR_SUPPORTED_ALGS, NULL);
ok(status == SEC_E_INTERNAL_ERROR, "QueryCredentialsAttributes failed: %08x, expected SEC_E_INTERNAL_ERROR\n", status);
pFreeCredentialsHandle(&cred);
init_cred(&schannel_cred);
schannel_cred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT;
status = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
NULL, &schannel_cred, NULL, NULL, &cred, NULL);
ok(status == SEC_E_OK, "AcquireCredentialsHandleA failed: %x\n", status);
test_supported_protocols(&cred, SP_PROT_TLS1_CLIENT);
test_supported_algs(&cred);
pFreeCredentialsHandle(&cred);
}
static void testAcquireSecurityContext(void)
{
BOOL has_schannel = FALSE;
@ -203,7 +331,6 @@ static void testAcquireSecurityContext(void)
SCHANNEL_CRED schanCred;
PCCERT_CONTEXT certs[2];
HCRYPTPROV csp;
static CHAR unisp_name_a[] = UNISP_NAME_A;
WCHAR ms_def_prov_w[MAX_PATH];
BOOL ret;
HCRYPTKEY key;
@ -287,13 +414,8 @@ static void testAcquireSecurityContext(void)
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
NULL, NULL, NULL, NULL, &cred, NULL);
ok(st == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", st);
if(st == SEC_E_OK) {
st = pQueryCredentialsAttributesA(&cred, SECPKG_ATTR_SUPPORTED_PROTOCOLS, NULL);
ok(st == SEC_E_INTERNAL_ERROR, "QueryCredentialsAttributes failed: %08x, expected SEC_E_INTERNAL_ERROR\n", st);
test_supported_protocols(&cred, 0);
if(st == SEC_E_OK)
pFreeCredentialsHandle(&cred);
}
memset(&cred, 0, sizeof(cred));
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
NULL, NULL, NULL, NULL, &cred, &exp);
@ -524,23 +646,6 @@ static void test_remote_cert(PCCERT_CONTEXT remote_cert)
static const char http_request[] = "HEAD /test.html HTTP/1.1\r\nHost: www.winehq.org\r\nConnection: close\r\n\r\n";
static void init_cred(SCHANNEL_CRED *cred)
{
cred->dwVersion = SCHANNEL_CRED_VERSION;
cred->cCreds = 0;
cred->paCred = 0;
cred->hRootStore = NULL;
cred->cMappers = 0;
cred->aphMappers = NULL;
cred->cSupportedAlgs = 0;
cred->palgSupportedAlgs = NULL;
cred->grbitEnabledProtocols = SP_PROT_TLS1_CLIENT;
cred->dwMinimumCipherStrength = 0;
cred->dwMaximumCipherStrength = 0;
cred->dwSessionLifespan = 0;
cred->dwFlags = 0;
}
static void init_buffers(SecBufferDesc *desc, unsigned count, unsigned size)
{
desc->ulVersion = SECBUFFER_VERSION;
@ -679,6 +784,7 @@ static void test_communication(void)
/* Create client credentials */
init_cred(&cred);
cred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT;
cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION;
status = pAcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL,
@ -686,8 +792,6 @@ static void test_communication(void)
ok(status == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", status);
if (status != SEC_E_OK) return;
test_supported_protocols(&cred_handle, SP_PROT_TLS1_CLIENT);
/* Initialize the connection */
init_buffers(&buffers[0], 4, buf_size);
init_buffers(&buffers[1], 4, buf_size);
@ -917,6 +1021,7 @@ START_TEST(schannel)
{
InitFunctionPtrs();
test_cread_attrs();
testAcquireSecurityContext();
test_communication();

View file

@ -30,6 +30,17 @@
static HMODULE secdll;
static SECURITY_STATUS (SEC_ENTRY *pSspiEncodeAuthIdentityAsStrings)
(PSEC_WINNT_AUTH_IDENTITY_OPAQUE, PCWSTR *, PCWSTR *, PCWSTR *);
static SECURITY_STATUS (SEC_ENTRY *pSspiEncodeStringsAsAuthIdentity)
(PCWSTR, PCWSTR, PCWSTR, PSEC_WINNT_AUTH_IDENTITY_OPAQUE *);
static void (SEC_ENTRY *pSspiFreeAuthIdentity)
(PSEC_WINNT_AUTH_IDENTITY_OPAQUE);
static void (SEC_ENTRY *pSspiLocalFree)
(void *);
static void (SEC_ENTRY *pSspiZeroAuthIdentity)
(PSEC_WINNT_AUTH_IDENTITY_OPAQUE);
static BOOLEAN (WINAPI * pGetComputerObjectNameA)(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG lpnSize);
static BOOLEAN (WINAPI * pGetComputerObjectNameW)(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG lpnSize);
static BOOLEAN (WINAPI * pGetUserNameExA)(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG lpnSize);
@ -220,6 +231,90 @@ static void test_InitSecurityInterface(void)
ok(sftW->Reserved4 == sftW->DecryptMessage, "Reserved4 should be equal to DecryptMessage in the security function table\n");
}
static void test_SspiEncodeStringsAsAuthIdentity(void)
{
static const WCHAR username[] = {'u','s','e','r','n','a','m','e',0};
static const WCHAR domainname[] = {'d','o','m','a','i','n','n','a','m','e',0};
static const WCHAR password[] = {'p','a','s','s','w','o','r','d',0};
const WCHAR *username_ptr, *domainname_ptr, *password_ptr;
PSEC_WINNT_AUTH_IDENTITY_OPAQUE id;
SECURITY_STATUS status;
if (!pSspiEncodeStringsAsAuthIdentity)
{
win_skip( "SspiEncodeAuthIdentityAsStrings not exported by secur32.dll\n" );
return;
}
status = pSspiEncodeStringsAsAuthIdentity( NULL, NULL, NULL, NULL );
ok( status == SEC_E_INVALID_TOKEN, "got %08x\n", status );
id = (PSEC_WINNT_AUTH_IDENTITY_OPAQUE)0xdeadbeef;
status = pSspiEncodeStringsAsAuthIdentity( NULL, NULL, NULL, &id );
ok( status == SEC_E_INVALID_TOKEN, "got %08x\n", status );
ok( id == (PSEC_WINNT_AUTH_IDENTITY_OPAQUE)0xdeadbeef, "id set\n" );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( NULL, NULL, password, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
pSspiFreeAuthIdentity( id );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( NULL, domainname, password, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
pSspiFreeAuthIdentity( id );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( username, NULL, password, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
pSspiFreeAuthIdentity( id );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( username, NULL, NULL, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
pSspiFreeAuthIdentity( id );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( username, domainname, password, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
username_ptr = domainname_ptr = password_ptr = NULL;
status = pSspiEncodeAuthIdentityAsStrings( id, &username_ptr, &domainname_ptr, &password_ptr );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( !lstrcmpW( username, username_ptr ), "wrong username\n" );
ok( !lstrcmpW( domainname, domainname_ptr ), "wrong domainname\n" );
ok( !lstrcmpW( password, password_ptr ), "wrong password\n" );
pSspiZeroAuthIdentity( id );
pSspiLocalFree( (void *)username_ptr );
pSspiLocalFree( (void *)domainname_ptr );
pSspiLocalFree( (void *)password_ptr );
pSspiFreeAuthIdentity( id );
id = NULL;
status = pSspiEncodeStringsAsAuthIdentity( username, NULL, password, &id );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( id != NULL, "id not set\n" );
username_ptr = password_ptr = NULL;
domainname_ptr = (const WCHAR *)0xdeadbeef;
status = pSspiEncodeAuthIdentityAsStrings( id, &username_ptr, &domainname_ptr, &password_ptr );
ok( status == SEC_E_OK, "got %08x\n", status );
ok( !lstrcmpW( username, username_ptr ), "wrong username\n" );
ok( domainname_ptr == NULL, "domainname_ptr not cleared\n" );
ok( !lstrcmpW( password, password_ptr ), "wrong password\n" );
pSspiLocalFree( (void *)username_ptr );
pSspiLocalFree( (void *)password_ptr );
pSspiFreeAuthIdentity( id );
}
START_TEST(secur32)
{
secdll = LoadLibraryA("secur32.dll");
@ -229,6 +324,11 @@ START_TEST(secur32)
if (secdll)
{
pSspiEncodeAuthIdentityAsStrings = (void *)GetProcAddress(secdll, "SspiEncodeAuthIdentityAsStrings");
pSspiEncodeStringsAsAuthIdentity = (void *)GetProcAddress(secdll, "SspiEncodeStringsAsAuthIdentity");
pSspiFreeAuthIdentity = (void *)GetProcAddress(secdll, "SspiFreeAuthIdentity");
pSspiLocalFree = (void *)GetProcAddress(secdll, "SspiLocalFree");
pSspiZeroAuthIdentity = (void *)GetProcAddress(secdll, "SspiZeroAuthIdentity");
pGetComputerObjectNameA = (PVOID)GetProcAddress(secdll, "GetComputerObjectNameA");
pGetComputerObjectNameW = (PVOID)GetProcAddress(secdll, "GetComputerObjectNameW");
pGetUserNameExA = (PVOID)GetProcAddress(secdll, "GetUserNameExA");
@ -257,6 +357,7 @@ START_TEST(secur32)
win_skip("GetUserNameExW not exported by secur32.dll\n");
test_InitSecurityInterface();
test_SspiEncodeStringsAsAuthIdentity();
FreeLibrary(secdll);
}