diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c index cf3c8eb..c981bf2 100644 (file) --- a/dlls/secur32/schannel.c +++ b/dlls/secur32/schannel.c @@ -653,128 +653,17 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW( PSecBufferDesc pInput, ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput, ULONG *pfContextAttr, PTimeStamp ptsExpiry) { - struct schan_context *ctx; - struct schan_buffers *out_buffers; - struct schan_credentials *cred; - struct schan_transport transport; - int err; - - TRACE("%p %p %s %d %d %d %p %d %p %p %p %p\n", phCredential, phContext, - debugstr_w(pszTargetName), fContextReq, Reserved1, TargetDataRep, pInput, - Reserved1, phNewContext, pOutput, pfContextAttr, ptsExpiry); - - dump_buffer_desc(pInput); - dump_buffer_desc(pOutput); - - if (!phContext) + SECURITY_STATUS ret; + if (phCredential) { - ULONG_PTR handle; - - if (!phCredential) return SEC_E_INVALID_HANDLE; - - cred = schan_get_object(phCredential->dwLower, SCHAN_HANDLE_CRED); - if (!cred) return SEC_E_INVALID_HANDLE; - - if (!(cred->credential_use & SECPKG_CRED_OUTBOUND)) - { - WARN("Invalid credential use %#x\n", cred->credential_use); - return SEC_E_INVALID_HANDLE; - } - - ctx = HeapAlloc(GetProcessHeap(), 0, sizeof(*ctx)); - if (!ctx) return SEC_E_INSUFFICIENT_MEMORY; - - handle = schan_alloc_handle(ctx, SCHAN_HANDLE_CTX); - if (handle == SCHAN_INVALID_HANDLE) - { - HeapFree(GetProcessHeap(), 0, ctx); - return SEC_E_INTERNAL_ERROR; - } - - err = pgnutls_init(&ctx->session, GNUTLS_CLIENT); - if (err != GNUTLS_E_SUCCESS) - { - pgnutls_perror(err); - schan_free_handle(handle, SCHAN_HANDLE_CTX); - HeapFree(GetProcessHeap(), 0, ctx); - return SEC_E_INTERNAL_ERROR; - } - - /* FIXME: We should be using the information from the credentials here. */ - FIXME("Using hardcoded \"NORMAL\" priority\n"); - err = pgnutls_set_default_priority(ctx->session); - if (err != GNUTLS_E_SUCCESS) - { - pgnutls_perror(err); - pgnutls_deinit(ctx->session); - schan_free_handle(handle, SCHAN_HANDLE_CTX); - HeapFree(GetProcessHeap(), 0, ctx); - } - - err = pgnutls_credentials_set(ctx->session, GNUTLS_CRD_CERTIFICATE, cred->credentials); - if (err != GNUTLS_E_SUCCESS) - { - pgnutls_perror(err); - pgnutls_deinit(ctx->session); - schan_free_handle(handle, SCHAN_HANDLE_CTX); - HeapFree(GetProcessHeap(), 0, ctx); - } - - pgnutls_transport_set_pull_function(ctx->session, schan_pull); - pgnutls_transport_set_push_function(ctx->session, schan_push); - - phNewContext->dwLower = handle; - phNewContext->dwUpper = 0; + FIXME("stub\n"); + ret = SEC_E_UNSUPPORTED_FUNCTION; } else { - ctx = schan_get_object(phContext->dwLower, SCHAN_HANDLE_CTX); - } - - ctx->req_ctx_attr = fContextReq; - - transport.ctx = ctx; - init_schan_buffers(&transport.in, pInput, schan_init_sec_ctx_get_next_buffer); - init_schan_buffers(&transport.out, pOutput, schan_init_sec_ctx_get_next_buffer); - pgnutls_transport_set_ptr(ctx->session, &transport); - - /* Perform the TLS handshake */ - err = pgnutls_handshake(ctx->session); - - out_buffers = &transport.out; - if (out_buffers->current_buffer_idx != -1) - { - SecBuffer *buffer = &out_buffers->desc->pBuffers[out_buffers->current_buffer_idx]; - buffer->cbBuffer = out_buffers->offset; - } - - *pfContextAttr = 0; - if (ctx->req_ctx_attr & ISC_REQ_ALLOCATE_MEMORY) - *pfContextAttr |= ISC_RET_ALLOCATED_MEMORY; - - switch(err) - { - case GNUTLS_E_SUCCESS: - TRACE("Handshake completed\n"); - return SEC_E_OK; - - case GNUTLS_E_AGAIN: - TRACE("Continue...\n"); - return SEC_I_CONTINUE_NEEDED; - - case GNUTLS_E_WARNING_ALERT_RECEIVED: - case GNUTLS_E_FATAL_ALERT_RECEIVED: - { - gnutls_alert_description_t alert = pgnutls_alert_get(ctx->session); - const char *alert_name = pgnutls_alert_get_name(alert); - WARN("ALERT: %d %s\n", alert, alert_name); - return SEC_E_INTERNAL_ERROR; - } - - default: - pgnutls_perror(err); - return SEC_E_INTERNAL_ERROR; + ret = SEC_E_INVALID_HANDLE; } + return ret; } /***********************************************************************