secur32: Implement QueryContextAttributes for SECPKG_ATTR_REMOTE_CERT_CONTEXT

Juan Lang juan.lang at gmail.com
Wed Aug 5 13:40:51 CDT 2009


Combined with http://www.winehq.org/pipermail/wine-patches/2009-August/076683.html
, fixes bug 19564.
--Juan
-------------- next part --------------
From df4aee9f49ffc88a083009e0f7203d2534d64eef Mon Sep 17 00:00:00 2001
From: Juan Lang <juan.lang at gmail.com>
Date: Wed, 5 Aug 2009 10:43:57 -0700
Subject: [PATCH 10/10] Implement QueryContextAttributes for SECPKG_ATTR_REMOTE_CERT_CONTEXT

---
 dlls/secur32/schannel.c |   25 +++++++++++++++++++++++++
 1 files changed, 25 insertions(+), 0 deletions(-)

diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index b9644e3..dc4f3b3 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -48,6 +48,7 @@ MAKE_FUNCPTR(gnutls_alert_get);
 MAKE_FUNCPTR(gnutls_alert_get_name);
 MAKE_FUNCPTR(gnutls_certificate_allocate_credentials);
 MAKE_FUNCPTR(gnutls_certificate_free_credentials);
+MAKE_FUNCPTR(gnutls_certificate_get_peers);
 MAKE_FUNCPTR(gnutls_cipher_get);
 MAKE_FUNCPTR(gnutls_credentials_set);
 MAKE_FUNCPTR(gnutls_deinit);
@@ -873,6 +874,27 @@ static SECURITY_STATUS SEC_ENTRY schan_QueryContextAttributesW(
             stream_sizes->cbBlockSize = block_size;
             return SEC_E_OK;
         }
+        case SECPKG_ATTR_REMOTE_CERT_CONTEXT:
+        {
+            unsigned int list_size;
+            const gnutls_datum_t *datum = pgnutls_certificate_get_peers(
+                    ctx->session, &list_size);
+
+            datum = pgnutls_certificate_get_peers(ctx->session, &list_size);
+            if (datum)
+            {
+                PCCERT_CONTEXT *cert = buffer;
+
+                *cert = CertCreateCertificateContext(X509_ASN_ENCODING,
+                        datum->data, datum->size);
+                if (!*cert)
+                    return GetLastError();
+                else
+                    return SEC_E_OK;
+            }
+            else
+                return SEC_E_INTERNAL_ERROR;
+        }
 
         default:
             FIXME("Unhandled attribute %#x\n", attribute);
@@ -890,6 +912,8 @@ static SECURITY_STATUS SEC_ENTRY schan_QueryContextAttributesA(
     {
         case SECPKG_ATTR_STREAM_SIZES:
             return schan_QueryContextAttributesW(context_handle, attribute, buffer);
+        case SECPKG_ATTR_REMOTE_CERT_CONTEXT:
+            return schan_QueryContextAttributesW(context_handle, attribute, buffer);
 
         default:
             FIXME("Unhandled attribute %#x\n", attribute);
@@ -1222,6 +1246,7 @@ void SECUR32_initSchannelSP(void)
     LOAD_FUNCPTR(gnutls_alert_get_name)
     LOAD_FUNCPTR(gnutls_certificate_allocate_credentials)
     LOAD_FUNCPTR(gnutls_certificate_free_credentials)
+    LOAD_FUNCPTR(gnutls_certificate_get_peers)
     LOAD_FUNCPTR(gnutls_cipher_get)
     LOAD_FUNCPTR(gnutls_credentials_set)
     LOAD_FUNCPTR(gnutls_deinit)
-- 
1.6.3.2


More information about the wine-patches mailing list