[06/10] secur32: Implement MakeSignature for Kerberos.
Hans Leidekker
hans at codeweavers.com
Mon Oct 23 04:09:21 CDT 2017
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
dlls/secur32/kerberos.c | 41 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 39 insertions(+), 2 deletions(-)
diff --git a/dlls/secur32/kerberos.c b/dlls/secur32/kerberos.c
index b9eb149746..d46ede6ee5 100644
--- a/dlls/secur32/kerberos.c
+++ b/dlls/secur32/kerberos.c
@@ -49,6 +49,7 @@ static void *libgssapi_krb5_handle;
MAKE_FUNCPTR(gss_accept_sec_context);
MAKE_FUNCPTR(gss_acquire_cred);
MAKE_FUNCPTR(gss_delete_sec_context);
+MAKE_FUNCPTR(gss_get_mic);
MAKE_FUNCPTR(gss_import_name);
MAKE_FUNCPTR(gss_init_sec_context);
MAKE_FUNCPTR(gss_release_buffer);
@@ -74,6 +75,7 @@ static BOOL load_gssapi_krb5(void)
LOAD_FUNCPTR(gss_accept_sec_context)
LOAD_FUNCPTR(gss_acquire_cred)
LOAD_FUNCPTR(gss_delete_sec_context)
+ LOAD_FUNCPTR(gss_get_mic)
LOAD_FUNCPTR(gss_import_name)
LOAD_FUNCPTR(gss_init_sec_context)
LOAD_FUNCPTR(gss_release_buffer)
@@ -623,10 +625,45 @@ static SECURITY_STATUS SEC_ENTRY kerberos_RevertSecurityContext(CtxtHandle *phCo
/***********************************************************************
* MakeSignature
*/
-static SECURITY_STATUS SEC_ENTRY kerberos_MakeSignature(CtxtHandle *phContext, ULONG fQOP, SecBufferDesc *pMessage, ULONG MessageSeqNo)
+static SECURITY_STATUS SEC_ENTRY kerberos_MakeSignature( CtxtHandle *phContext, ULONG fQOP, SecBufferDesc *pMessage,
+ ULONG MessageSeqNo )
{
- FIXME("(%p %d %p %d)\n", phContext, fQOP, pMessage, MessageSeqNo);
+#ifdef SONAME_LIBGSSAPI_KRB5
+ OM_uint32 ret, minor_status;
+ gss_buffer_desc data_buffer, token_buffer;
+ gss_ctx_id_t ctxt_handle;
+ int data_idx, token_idx;
+
+ TRACE( "(%p 0x%08x %p %u)\n", phContext, fQOP, pMessage, MessageSeqNo );
+ if (fQOP) FIXME( "ignoring fQOP 0x%08x\n", fQOP );
+ if (MessageSeqNo) FIXME( "ignoring MessageSeqNo\n" );
+
+ if (!phContext) return SEC_E_INVALID_HANDLE;
+ ctxt_handle = ctxthandle_sspi_to_gss( phContext );
+
+ /* FIXME: multiple data buffers, read-only buffers */
+ if ((data_idx = get_buffer_index( pMessage, SECBUFFER_DATA )) == -1) return SEC_E_INVALID_TOKEN;
+ data_buffer.length = pMessage->pBuffers[data_idx].cbBuffer;
+ data_buffer.value = pMessage->pBuffers[data_idx].pvBuffer;
+
+ if ((token_idx = get_buffer_index( pMessage, SECBUFFER_TOKEN )) == -1) return SEC_E_INVALID_TOKEN;
+ token_buffer.length = 0;
+ token_buffer.value = NULL;
+
+ ret = pgss_get_mic( &minor_status, ctxt_handle, GSS_C_QOP_DEFAULT, &data_buffer, &token_buffer );
+ TRACE( "gss_get_mic returned %08x minor status %08x\n", ret, minor_status );
+ if (ret == GSS_S_COMPLETE)
+ {
+ memcpy( pMessage->pBuffers[token_idx].pvBuffer, token_buffer.value, token_buffer.length );
+ pMessage->pBuffers[token_idx].cbBuffer = token_buffer.length;
+ pgss_release_buffer( &minor_status, &token_buffer );
+ }
+
+ return status_gss_to_sspi( ret );
+#else
+ FIXME( "(%p 0x%08x %p %u)\n", phContext, fQOP, pMessage, MessageSeqNo );
return SEC_E_UNSUPPORTED_FUNCTION;
+#endif
}
/***********************************************************************
--
2.11.0
More information about the wine-patches
mailing list