123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- #include "curl_setup.h"
- #if defined(USE_WINDOWS_SSPI) && !defined(CURL_DISABLE_CRYPTO_AUTH)
- #include <curl/curl.h>
- #include "curl_sasl.h"
- #include "urldata.h"
- #include "curl_base64.h"
- #include "warnless.h"
- #include "curl_memory.h"
- #define _MPRINTF_REPLACE
- #include <curl/mprintf.h>
- #include "memdebug.h"
- CURLcode Curl_sasl_create_digest_md5_message(struct SessionHandle *data,
- const char *chlg64,
- const char *userp,
- const char *passwdp,
- const char *service,
- char **outptr, size_t *outlen)
- {
- CURLcode result = CURLE_OK;
- char *spn = NULL;
- size_t chlglen = 0;
- unsigned char *chlg = NULL;
- unsigned char resp[1024];
- CredHandle handle;
- CtxtHandle ctx;
- PSecPkgInfo SecurityPackage;
- SEC_WINNT_AUTH_IDENTITY identity;
- SecBuffer chlg_buf;
- SecBuffer resp_buf;
- SecBufferDesc chlg_desc;
- SecBufferDesc resp_desc;
- SECURITY_STATUS status;
- unsigned long attrs;
- TimeStamp tsDummy;
-
- if(strlen(chlg64) && *chlg64 != '=') {
- result = Curl_base64_decode(chlg64, &chlg, &chlglen);
- if(result)
- return result;
- }
-
- if(!chlg)
- return CURLE_BAD_CONTENT_ENCODING;
-
- if(!userp || !*userp) {
- Curl_safefree(chlg);
- return CURLE_LOGIN_DENIED;
- }
-
- status = s_pSecFn->QuerySecurityPackageInfo((TCHAR *) TEXT("WDigest"),
- &SecurityPackage);
- if(status != SEC_E_OK) {
- Curl_safefree(chlg);
- return CURLE_NOT_BUILT_IN;
- }
-
- spn = aprintf("%s/%s", service, data->easy_conn->host.name);
- if(!spn)
- return CURLE_OUT_OF_MEMORY;
-
- result = Curl_create_sspi_identity(userp, passwdp, &identity);
- if(result) {
- Curl_safefree(spn);
- Curl_safefree(chlg);
- return result;
- }
-
- status = s_pSecFn->AcquireCredentialsHandle(NULL,
- (TCHAR *) TEXT("WDigest"),
- SECPKG_CRED_OUTBOUND, NULL,
- &identity, NULL, NULL,
- &handle, &tsDummy);
- if(status != SEC_E_OK) {
- Curl_sspi_free_identity(&identity);
- Curl_safefree(spn);
- Curl_safefree(chlg);
- return CURLE_OUT_OF_MEMORY;
- }
-
- chlg_desc.ulVersion = SECBUFFER_VERSION;
- chlg_desc.cBuffers = 1;
- chlg_desc.pBuffers = &chlg_buf;
- chlg_buf.BufferType = SECBUFFER_TOKEN;
- chlg_buf.pvBuffer = chlg;
- chlg_buf.cbBuffer = curlx_uztoul(chlglen);
-
- resp_desc.ulVersion = SECBUFFER_VERSION;
- resp_desc.cBuffers = 1;
- resp_desc.pBuffers = &resp_buf;
- resp_buf.BufferType = SECBUFFER_TOKEN;
- resp_buf.pvBuffer = resp;
- resp_buf.cbBuffer = sizeof(resp);
-
- status = s_pSecFn->InitializeSecurityContext(&handle,
- NULL,
- (TCHAR *) spn,
- 0, 0, 0,
- &chlg_desc,
- 0, &ctx,
- &resp_desc,
- &attrs, &tsDummy);
- if(status == SEC_I_COMPLETE_AND_CONTINUE ||
- status == SEC_I_CONTINUE_NEEDED)
- s_pSecFn->CompleteAuthToken(&handle, &resp_desc);
- else if(status != SEC_E_OK) {
- s_pSecFn->FreeCredentialsHandle(&handle);
- Curl_sspi_free_identity(&identity);
- Curl_safefree(spn);
- Curl_safefree(chlg);
- return CURLE_RECV_ERROR;
- }
-
- result = Curl_base64_encode(data, (char *)resp, resp_buf.cbBuffer, outptr,
- outlen);
-
- s_pSecFn->DeleteSecurityContext(&ctx);
- s_pSecFn->FreeCredentialsHandle(&handle);
-
- Curl_sspi_free_identity(&identity);
-
- Curl_safefree(spn);
-
- Curl_safefree(chlg);
- return result;
- }
- #endif
|