Signed-off-by: Hans Leidekker hans@codeweavers.com --- dlls/secur32/tests/schannel.c | 82 +++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 3 deletions(-)
diff --git a/dlls/secur32/tests/schannel.c b/dlls/secur32/tests/schannel.c index b7f9d409d41..935f63ae727 100644 --- a/dlls/secur32/tests/schannel.c +++ b/dlls/secur32/tests/schannel.c @@ -574,12 +574,17 @@ static const char http_request[] = "GET /tests/clientcert/ HTTP/1.1\r\nHost: tes
static void init_buffers(SecBufferDesc *desc, unsigned count, unsigned size) { + unsigned int i; + desc->ulVersion = SECBUFFER_VERSION; desc->cBuffers = count; desc->pBuffers = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, count*sizeof(SecBuffer));
- desc->pBuffers[0].cbBuffer = size; - desc->pBuffers[0].pvBuffer = HeapAlloc(GetProcessHeap(), 0, size); + for (i = 0; i < count; i++) + { + desc->pBuffers[i].cbBuffer = size; + desc->pBuffers[i].pvBuffer = HeapAlloc(GetProcessHeap(), 0, size); + } }
static void reset_buffers(SecBufferDesc *desc) @@ -599,7 +604,8 @@ static void reset_buffers(SecBufferDesc *desc)
static void free_buffers(SecBufferDesc *desc) { - HeapFree(GetProcessHeap(), 0, desc->pBuffers[0].pvBuffer); + unsigned int i; + for (i = 0; i < desc->cBuffers; i++) HeapFree(GetProcessHeap(), 0, desc->pBuffers[i].pvBuffer); HeapFree(GetProcessHeap(), 0, desc->pBuffers); }
@@ -1517,6 +1523,75 @@ static void test_application_protocol_negotiation(void) closesocket(sock); }
+static void test_dtls(void) +{ + SECURITY_STATUS status; + TimeStamp exp; + SCHANNEL_CRED cred; + CredHandle cred_handle; + CtxtHandle ctx_handle; + SecBufferDesc buffers[3]; + ULONG flags_req, flags_ret, attr; + + init_cred( &cred ); + cred.grbitEnabledProtocols = SP_PROT_DTLS_CLIENT | SP_PROT_DTLS1_2_CLIENT; + cred.dwFlags = SCH_CRED_NO_DEFAULT_CREDS; + + status = AcquireCredentialsHandleA( NULL, unisp_name_a, SECPKG_CRED_OUTBOUND, NULL, &cred, NULL, NULL, + &cred_handle, &exp ); + if (status == SEC_E_ALGORITHM_MISMATCH) + { + win_skip( "no DTLS support\n" ); + return; + } + ok( status == SEC_E_OK, "got %08x\n", status ); + + flags_req = ISC_REQ_MANUAL_CRED_VALIDATION | ISC_REQ_EXTENDED_ERROR | ISC_REQ_DATAGRAM | ISC_REQ_USE_SUPPLIED_CREDS | + ISC_REQ_CONFIDENTIALITY | ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT; + + init_buffers( &buffers[0], 1, 128 ); + buffers[0].pBuffers[0].BufferType = SECBUFFER_DTLS_MTU; + *(WORD *)(buffers[0].pBuffers[0].pvBuffer) = 1024; + buffers[0].pBuffers[0].cbBuffer = 2; + + init_buffers( &buffers[1], 2, 2048 ); + buffers[1].pBuffers[0].BufferType = SECBUFFER_TOKEN; + buffers[1].pBuffers[0].cbBuffer = 1420; + buffers[1].pBuffers[1].BufferType = SECBUFFER_ALERT; + buffers[1].pBuffers[1].cbBuffer = 1024; + + attr = 0; + exp.LowPart = exp.HighPart = 0xdeadbeef; + status = InitializeSecurityContextA( &cred_handle, NULL, (SEC_CHAR *)"winetest", flags_req, 0, 16, &buffers[0], 0, + &ctx_handle, &buffers[1], &attr, &exp ); + ok( status == SEC_I_CONTINUE_NEEDED, "got %08x\n", status ); + + flags_ret = ISC_RET_MANUAL_CRED_VALIDATION | ISC_RET_STREAM | ISC_RET_EXTENDED_ERROR | ISC_RET_DATAGRAM | + ISC_RET_USED_SUPPLIED_CREDS | ISC_RET_CONFIDENTIALITY | ISC_RET_SEQUENCE_DETECT | ISC_RET_REPLAY_DETECT; + ok( attr == flags_ret, "got %08x\n", attr ); + ok( !exp.LowPart, "got %08x\n", exp.LowPart ); + ok( !exp.HighPart, "got %08x\n", exp.HighPart ); + + buffers[1].pBuffers[0].BufferType = SECBUFFER_TOKEN; + buffers[1].pBuffers[0].cbBuffer = 1420; + + attr = 0; + exp.LowPart = exp.HighPart = 0xdeadbeef; + status = InitializeSecurityContextA( &cred_handle, &ctx_handle, (SEC_CHAR *)"winetest", flags_req, 0, 16, NULL, 0, + &ctx_handle, &buffers[1], &attr, &exp ); + ok( status == SEC_E_INSUFFICIENT_MEMORY, "got %08x\n", status ); + + flags_ret = ISC_RET_CONFIDENTIALITY | ISC_RET_SEQUENCE_DETECT | ISC_RET_REPLAY_DETECT; + todo_wine ok( attr == flags_ret, "got %08x\n", attr ); + ok( !exp.LowPart, "got %08x\n", exp.LowPart ); + ok( !exp.HighPart, "got %08x\n", exp.HighPart ); + + free_buffers( &buffers[0] ); + free_buffers( &buffers[1] ); + DeleteSecurityContext( &ctx_handle ); + FreeCredentialsHandle( &cred_handle ); +} + START_TEST(schannel) { WSADATA wsa_data; @@ -1529,4 +1604,5 @@ START_TEST(schannel) test_InitializeSecurityContext(); test_communication(); test_application_protocol_negotiation(); + test_dtls(); }
Hi,
While running your changed tests, I think I found new failures. Being a bot and all I'm not very good at pattern recognition, so I might be wrong, but could you please double-check?
Full results can be found at: https://testbot.winehq.org/JobDetails.pl?Key=100956
Your paranoid android.
=== w1064 (32 bit report) ===
secur32: schannel.c:1366: Test failed: got 00090317 schannel.c:1376: Test failed: DecryptMessage failed: 80090317
=== w864 (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w1064v1507 (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w1064v1809 (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w1064 (64 bit report) ===
secur32: schannel.c:1366: Test failed: got 00090317 schannel.c:1376: Test failed: DecryptMessage failed: 80090317
=== w1064_2qxl (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w1064_tsign (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w10pro64 (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w10pro64_ar (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w10pro64_he (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w10pro64_ja (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)
=== w10pro64_zh_CN (64 bit report) ===
Report validation errors: secur32:schannel crashed (c0000374)