From be370380901c506bafe33e0fafd0592ebd73eea2 Mon Sep 17 00:00:00 2001 From: Hans Leidekker Date: Tue, 20 Jul 2010 14:49:52 +0200 Subject: [PATCH] winhttp: Add a partial implementation of WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT. --- dlls/winhttp/session.c | 40 ++++++++++++++++++++++++++++++++++++ dlls/winhttp/tests/winhttp.c | 12 +++++++++++ 2 files changed, 52 insertions(+) diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index 490da059e30..e0c1c2fed9f 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -559,6 +559,18 @@ static void str_to_buffer( WCHAR *buffer, const WCHAR *str, LPDWORD buflen ) *buflen = len * sizeof(WCHAR); } +static WCHAR *blob_to_str( DWORD encoding, CERT_NAME_BLOB *blob ) +{ + WCHAR *ret; + DWORD size, format = CERT_SIMPLE_NAME_STR | CERT_NAME_STR_CRLF_FLAG; + + size = CertNameToStrW( encoding, blob, format, NULL, 0 ); + if ((ret = LocalAlloc( 0, size * sizeof(WCHAR) ))) + CertNameToStrW( encoding, blob, format, ret, size ); + + return ret; +} + static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buffer, LPDWORD buflen ) { request_t *request = (request_t *)hdr; @@ -598,6 +610,34 @@ static BOOL request_query_option( object_header_t *hdr, DWORD option, LPVOID buf *buflen = sizeof(cert); return TRUE; } + case WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT: + { + const CERT_CONTEXT *cert; + WINHTTP_CERTIFICATE_INFO *ci = buffer; + + FIXME("partial stub\n"); + + if (!buffer || *buflen < sizeof(*ci)) + { + *buflen = sizeof(*ci); + set_last_error( ERROR_INSUFFICIENT_BUFFER ); + return FALSE; + } + if (!(cert = netconn_get_certificate( &request->netconn ))) return FALSE; + + ci->ftExpiry = cert->pCertInfo->NotAfter; + ci->ftStart = cert->pCertInfo->NotBefore; + ci->lpszSubjectInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Subject ); + ci->lpszIssuerInfo = blob_to_str( cert->dwCertEncodingType, &cert->pCertInfo->Issuer ); + ci->lpszProtocolName = NULL; + ci->lpszSignatureAlgName = NULL; + ci->lpszEncryptionAlgName = NULL; + ci->dwKeySize = 128; + + CertFreeCertificateContext( cert ); + *buflen = sizeof(*ci); + return TRUE; + } case WINHTTP_OPTION_SECURITY_KEY_BITNESS: { if (!buffer || *buflen < sizeof(DWORD)) diff --git a/dlls/winhttp/tests/winhttp.c b/dlls/winhttp/tests/winhttp.c index 05c548c5f65..21cc50152bf 100644 --- a/dlls/winhttp/tests/winhttp.c +++ b/dlls/winhttp/tests/winhttp.c @@ -770,6 +770,7 @@ static void test_secure_connection(void) DWORD size, status, policy, bitness; BOOL ret; CERT_CONTEXT *cert; + WINHTTP_CERTIFICATE_INFO info; ses = WinHttpOpen(test_useragent, 0, NULL, NULL, 0); ok(ses != NULL, "failed to open session %u\n", GetLastError()); @@ -823,6 +824,17 @@ static void test_secure_connection(void) ret = WinHttpQueryOption(req, WINHTTP_OPTION_SECURITY_KEY_BITNESS, &bitness, &size ); ok(ret, "failed to retrieve key bitness %u\n", GetLastError()); + size = sizeof(info); + ret = WinHttpQueryOption(req, WINHTTP_OPTION_SECURITY_CERTIFICATE_STRUCT, &info, &size ); + ok(ret, "failed to retrieve certificate info %u\n", GetLastError()); + + trace("lpszSubjectInfo %s\n", wine_dbgstr_w(info.lpszSubjectInfo)); + trace("lpszIssuerInfo %s\n", wine_dbgstr_w(info.lpszIssuerInfo)); + trace("lpszProtocolName %s\n", wine_dbgstr_w(info.lpszProtocolName)); + trace("lpszSignatureAlgName %s\n", wine_dbgstr_w(info.lpszSignatureAlgName)); + trace("lpszEncryptionAlgName %s\n", wine_dbgstr_w(info.lpszEncryptionAlgName)); + trace("dwKeySize %u\n", info.dwKeySize); + ret = WinHttpReceiveResponse(req, NULL); ok(ret, "failed to receive response %u\n", GetLastError());