mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-15 00:02:17 +00:00
secur32: Added SECPKG_ATTR_SUPPORTED_ALGS tests.
This commit is contained in:
parent
0d2c6db9d2
commit
bca49f1403
|
@ -22,6 +22,7 @@
|
||||||
#include <windef.h>
|
#include <windef.h>
|
||||||
#include <winsock2.h>
|
#include <winsock2.h>
|
||||||
#include <ws2tcpip.h>
|
#include <ws2tcpip.h>
|
||||||
|
#include <stdio.h>
|
||||||
#define SECURITY_WIN32
|
#define SECURITY_WIN32
|
||||||
#include <security.h>
|
#include <security.h>
|
||||||
#include <schannel.h>
|
#include <schannel.h>
|
||||||
|
@ -114,6 +115,8 @@ static const BYTE selfSignedCert[] = {
|
||||||
0x0a, 0x8c, 0xb4, 0x5c, 0x34, 0x78, 0xe0, 0x3c, 0x9c, 0xe9, 0xf3, 0x30, 0x9f,
|
0x0a, 0x8c, 0xb4, 0x5c, 0x34, 0x78, 0xe0, 0x3c, 0x9c, 0xe9, 0xf3, 0x30, 0x9f,
|
||||||
0xa8, 0x76, 0x57, 0x92, 0x36 };
|
0xa8, 0x76, 0x57, 0x92, 0x36 };
|
||||||
|
|
||||||
|
static CHAR unisp_name_a[] = UNISP_NAME_A;
|
||||||
|
|
||||||
static void InitFunctionPtrs(void)
|
static void InitFunctionPtrs(void)
|
||||||
{
|
{
|
||||||
HMODULE advapi32dll;
|
HMODULE advapi32dll;
|
||||||
|
@ -153,6 +156,81 @@ static void InitFunctionPtrs(void)
|
||||||
#undef GET_PROC
|
#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)
|
static void test_strength(PCredHandle handle)
|
||||||
{
|
{
|
||||||
SecPkgCred_CipherStrengths strength = {-1,-1};
|
SecPkgCred_CipherStrengths strength = {-1,-1};
|
||||||
|
@ -190,6 +268,57 @@ static void test_supported_protocols(CredHandle *handle, unsigned exprots)
|
||||||
trace("Unknown flags: %x\n", protocols.grbitProtocol);
|
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)
|
static void testAcquireSecurityContext(void)
|
||||||
{
|
{
|
||||||
BOOL has_schannel = FALSE;
|
BOOL has_schannel = FALSE;
|
||||||
|
@ -202,7 +331,6 @@ static void testAcquireSecurityContext(void)
|
||||||
SCHANNEL_CRED schanCred;
|
SCHANNEL_CRED schanCred;
|
||||||
PCCERT_CONTEXT certs[2];
|
PCCERT_CONTEXT certs[2];
|
||||||
HCRYPTPROV csp;
|
HCRYPTPROV csp;
|
||||||
static CHAR unisp_name_a[] = UNISP_NAME_A;
|
|
||||||
WCHAR ms_def_prov_w[MAX_PATH];
|
WCHAR ms_def_prov_w[MAX_PATH];
|
||||||
BOOL ret;
|
BOOL ret;
|
||||||
HCRYPTKEY key;
|
HCRYPTKEY key;
|
||||||
|
@ -286,13 +414,8 @@ static void testAcquireSecurityContext(void)
|
||||||
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
|
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
|
||||||
NULL, NULL, NULL, NULL, &cred, NULL);
|
NULL, NULL, NULL, NULL, &cred, NULL);
|
||||||
ok(st == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", st);
|
ok(st == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", st);
|
||||||
if(st == SEC_E_OK) {
|
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);
|
|
||||||
pFreeCredentialsHandle(&cred);
|
pFreeCredentialsHandle(&cred);
|
||||||
}
|
|
||||||
memset(&cred, 0, sizeof(cred));
|
memset(&cred, 0, sizeof(cred));
|
||||||
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
|
st = pAcquireCredentialsHandleA(NULL, unisp_name_a, SECPKG_CRED_OUTBOUND,
|
||||||
NULL, NULL, NULL, NULL, &cred, &exp);
|
NULL, NULL, NULL, NULL, &cred, &exp);
|
||||||
|
@ -523,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 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)
|
static void init_buffers(SecBufferDesc *desc, unsigned count, unsigned size)
|
||||||
{
|
{
|
||||||
desc->ulVersion = SECBUFFER_VERSION;
|
desc->ulVersion = SECBUFFER_VERSION;
|
||||||
|
@ -678,6 +784,7 @@ static void test_communication(void)
|
||||||
|
|
||||||
/* Create client credentials */
|
/* Create client credentials */
|
||||||
init_cred(&cred);
|
init_cred(&cred);
|
||||||
|
cred.grbitEnabledProtocols = SP_PROT_TLS1_CLIENT;
|
||||||
cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION;
|
cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS|SCH_CRED_MANUAL_CRED_VALIDATION;
|
||||||
|
|
||||||
status = pAcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL,
|
status = pAcquireCredentialsHandleA(NULL, (SEC_CHAR *)UNISP_NAME_A, SECPKG_CRED_OUTBOUND, NULL,
|
||||||
|
@ -685,8 +792,6 @@ static void test_communication(void)
|
||||||
ok(status == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", status);
|
ok(status == SEC_E_OK, "AcquireCredentialsHandleA failed: %08x\n", status);
|
||||||
if (status != SEC_E_OK) return;
|
if (status != SEC_E_OK) return;
|
||||||
|
|
||||||
test_supported_protocols(&cred_handle, SP_PROT_TLS1_CLIENT);
|
|
||||||
|
|
||||||
/* Initialize the connection */
|
/* Initialize the connection */
|
||||||
init_buffers(&buffers[0], 4, buf_size);
|
init_buffers(&buffers[0], 4, buf_size);
|
||||||
init_buffers(&buffers[1], 4, buf_size);
|
init_buffers(&buffers[1], 4, buf_size);
|
||||||
|
@ -916,6 +1021,7 @@ START_TEST(schannel)
|
||||||
{
|
{
|
||||||
InitFunctionPtrs();
|
InitFunctionPtrs();
|
||||||
|
|
||||||
|
test_cread_attrs();
|
||||||
testAcquireSecurityContext();
|
testAcquireSecurityContext();
|
||||||
test_communication();
|
test_communication();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue