Aric Stewart : wininet: INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT
work.
Alexandre Julliard
julliard at wine.codeweavers.com
Fri Jan 20 13:20:29 CST 2006
Module: wine
Branch: refs/heads/master
Commit: 8b0883576ee7c691cc57d68af6f5050fea981827
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=8b0883576ee7c691cc57d68af6f5050fea981827
Author: Aric Stewart <aric at codeweavers.com>
Date: Fri Jan 20 20:16:56 2006 +0100
wininet: INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT work.
Beginning of framework to implement handling of InternetQueryOption
for INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT.
---
dlls/wininet/Makefile.in | 1 +
dlls/wininet/internet.c | 36 ++++++++++++++++++++++++++++++
dlls/wininet/internet.h | 1 +
dlls/wininet/netconnection.c | 51 ++++++++++++++++++++++++++++++++++++++++++
4 files changed, 89 insertions(+), 0 deletions(-)
diff --git a/dlls/wininet/Makefile.in b/dlls/wininet/Makefile.in
index 5b33c13..e3ff75e 100644
--- a/dlls/wininet/Makefile.in
+++ b/dlls/wininet/Makefile.in
@@ -6,6 +6,7 @@ VPATH = @srcdir@
MODULE = wininet.dll
IMPORTLIB = libwininet.$(IMPLIBEXT)
IMPORTS = mpr shlwapi shell32 user32 advapi32 kernel32 ntdll
+DELAYIMPORTS = crypt32
EXTRALIBS = $(LIBUNICODE) @SOCKETLIBS@
C_SRCS = \
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index dcc6f91..abb0825 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -66,6 +66,7 @@
#include "resource.h"
#include "wine/unicode.h"
+#include "wincrypt.h"
WINE_DEFAULT_DEBUG_CHANNEL(wininet);
@@ -2242,6 +2243,41 @@ static BOOL INET_QueryOptionHelper(BOOL
FIXME("INTERNET_OPTION_SECURITY_FLAGS: Stub\n");
break;
+ case INTERNET_OPTION_SECURITY_CERTIFICATE_STRUCT:
+ if (*lpdwBufferLength < sizeof(INTERNET_CERTIFICATE_INFOW))
+ {
+ *lpdwBufferLength = sizeof(INTERNET_CERTIFICATE_INFOW);
+ INTERNET_SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ }
+ else if (lpwhh->htype == WH_HHTTPREQ)
+ {
+ LPWININETHTTPREQW lpwhr;
+ PCCERT_CONTEXT context;
+
+ lpwhr = (LPWININETHTTPREQW)lpwhh;
+ context = (PCCERT_CONTEXT)NETCON_GetCert(&(lpwhr->netConnection));
+ if (context)
+ {
+ LPINTERNET_CERTIFICATE_INFOW info = (LPINTERNET_CERTIFICATE_INFOW)lpBuffer;
+ memset(info,0,sizeof(INTERNET_CERTIFICATE_INFOW));
+ info->ftExpiry = context->pCertInfo->NotAfter;
+ info->ftStart = context->pCertInfo->NotBefore;
+ /*
+ * CertNameToStr implement requred for
+ * lpszSubjectInfo
+ * lpszIssuerInfo
+ *
+ * also need to set:
+ * lpszProtocolName
+ * lpszSignatureAlgName
+ * lpszEncryptionAlgName
+ * dwKeySize
+ */
+ CertFreeCertificateContext(context);
+ bSuccess = TRUE;
+ }
+ }
+ break;
default:
FIXME("Stub! %ld\n", dwOption);
break;
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index ab03236..6df7e31 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -480,6 +480,7 @@ BOOL NETCON_send(WININET_NETCONNECTION *
BOOL NETCON_recv(WININET_NETCONNECTION *connection, void *buf, size_t len, int flags,
int *recvd /* out */);
BOOL NETCON_getNextLine(WININET_NETCONNECTION *connection, LPSTR lpszBuffer, LPDWORD dwBuffer);
+LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection);
extern void URLCacheContainers_CreateDefaults(void);
extern void URLCacheContainers_DeleteAll(void);
diff --git a/dlls/wininet/netconnection.c b/dlls/wininet/netconnection.c
index f488d69..97608b6 100644
--- a/dlls/wininet/netconnection.c
+++ b/dlls/wininet/netconnection.c
@@ -52,6 +52,7 @@
#include "wine/debug.h"
#include "internet.h"
+#include "wincrypt.h"
#define RESPONSE_TIMEOUT 30 /* FROM internet.c */
@@ -100,6 +101,7 @@ MAKE_FUNCPTR(SSL_get_peer_certificate);
MAKE_FUNCPTR(SSL_CTX_get_timeout);
MAKE_FUNCPTR(SSL_CTX_set_timeout);
MAKE_FUNCPTR(SSL_CTX_set_default_verify_paths);
+MAKE_FUNCPTR(i2d_X509);
/* OpenSSL's libcrypto functions that we use */
MAKE_FUNCPTR(BIO_new_fp);
@@ -162,6 +164,7 @@ void NETCON_init(WININET_NETCONNECTION *
DYNSSL(SSL_CTX_get_timeout);
DYNSSL(SSL_CTX_set_timeout);
DYNSSL(SSL_CTX_set_default_verify_paths);
+ DYNSSL(i2d_X509);
#undef DYNSSL
#define DYNCRYPTO(x) \
@@ -658,3 +661,51 @@ BOOL NETCON_getNextLine(WININET_NETCONNE
#endif
}
}
+
+
+LPCVOID NETCON_GetCert(WININET_NETCONNECTION *connection)
+{
+
+#if defined HAVE_OPENSSL_SSL_H && defined HAVE_OPENSSL_ERR_H
+ X509* cert;
+ unsigned char* buffer,*p;
+ INT len;
+ BOOL malloced = FALSE;
+ LPCVOID r = NULL;
+
+ if (!connection->useSSL)
+ return NULL;
+
+ cert = pSSL_get_peer_certificate(connection->ssl_s);
+ p = NULL;
+ len = pi2d_X509(cert,&p);
+ /*
+ * SSL 0.9.7 and above malloc the buffer if it is null.
+ * however earlier version do not and so we would need to alloc the buffer.
+ *
+ * see the i2d_X509 man page for more details.
+ */
+ if (!p)
+ {
+ buffer = HeapAlloc(GetProcessHeap(),0,len);
+ p = buffer;
+ len = pi2d_X509(cert,&p);
+ }
+ else
+ {
+ buffer = p;
+ malloced = TRUE;
+ }
+
+ r = CertCreateCertificateContext(X509_ASN_ENCODING,buffer,len);
+
+ if (malloced)
+ free(buffer);
+ else
+ HeapFree(GetProcessHeap(),0,buffer);
+
+ return r;
+#else
+ return NULL;
+#endif
+}
More information about the wine-cvs
mailing list