aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/curl_ntlm.c47
-rw-r--r--lib/curl_ntlm.h12
-rw-r--r--lib/http_ntlm.c65
3 files changed, 47 insertions, 77 deletions
diff --git a/lib/curl_ntlm.c b/lib/curl_ntlm.c
index b555f5ab6..ea8936eb3 100644
--- a/lib/curl_ntlm.c
+++ b/lib/curl_ntlm.c
@@ -684,28 +684,25 @@ static void unicodecpy(unsigned char *dest,
/*
* Curl_ntlm_create_type1_message()
*
- * This is used to generate a ntlm type-1 message ready for encoding
- * and sending to the recipient, be it a: HTTP, SMTP or POP3 server,
+ * This is used to generate an already encoded NTLM type-1 message ready
+ * for sending to the recipient, be it a: HTTP, SMTP or POP3 server,
* using the appropriate compile time crypo API.
*
* Parameters:
*
* userp [in] - The user name in the format User or Domain\User.
* passdwp [in] - The user's password.
- * ntlm [in] - The ntlm data struct being used and modified.
- * ntlmbuf [in] - Pointer to preallocated buffer to receive message.
- * sizep [out] - Size of message written into output buffer.
+ * ntlm [in/out] - The ntlm data struct being used and modified.
+ * outptr [in/out] - The adress where a pointer to newly allocated memory
+ * holding the result will be stored upon completion.
*
* Returns CURLE_OK on success.
*/
CURLcode Curl_ntlm_create_type1_message(const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
- unsigned char *ntlmbuf,
- size_t *sizep)
+ char **outptr)
{
- size_t size;
-
/* NTLM type-1 message structure:
Index Description Content
@@ -720,6 +717,10 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
(*) -> Optional
*/
+ unsigned char ntlmbuf[NTLM_BUFSIZE];
+ size_t base64_sz = 0;
+ size_t size;
+
#ifdef USE_WINDOWS_SSPI
SecBuffer buf;
@@ -895,17 +896,15 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
fprintf(stderr, "\n****\n");
});
- /* Return the message size */
- *sizep = size;
-
- return CURLE_OK;
+ /* Return with binary blob encoded into base64 */
+ return Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, &base64_sz);
}
/*
* Curl_ntlm_create_type3_message()
*
- * This is used to generate a ntlm type-3 message ready for encoding
- * and sending to the recipient, be it a: HTTP, SMTP or POP3 server,
+ * This is used to generate an already encoded NTLM type-3 message ready
+ * for sending to the recipient, be it a: HTTP, SMTP or POP3 server,
* using the appropriate compile time crypo API.
*
* Parameters:
@@ -913,9 +912,9 @@ CURLcode Curl_ntlm_create_type1_message(const char *userp,
* data [in] - The session handle.
* userp [in] - The user name in the format User or Domain\User.
* passdwp [in] - The user's password.
- * ntlm [in] - The ntlm data struct being used and modified.
- * ntlmbuf [in] - Pointer to preallocated buffer to receive message.
- * sizep [out] - Size of message written into output buffer.
+ * ntlm [in/out] - The ntlm data struct being used and modified.
+ * outptr [in/out] - The adress where a pointer to newly allocated memory
+ * holding the result will be stored upon completion.
*
* Returns CURLE_OK on success.
*/
@@ -923,8 +922,7 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
- unsigned char *ntlmbuf,
- size_t *sizep)
+ char **outptr)
{
/* NTLM type-3 message structure:
@@ -944,7 +942,8 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
(*) -> Optional
*/
-
+ unsigned char ntlmbuf[NTLM_BUFSIZE];
+ size_t base64_sz = 0;
size_t size;
#ifdef USE_WINDOWS_SSPI
@@ -1294,10 +1293,8 @@ CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
#endif
- /* Return the message size */
- *sizep = size;
-
- return CURLE_OK;
+ /* Return with binary blob encoded into base64 */
+ return Curl_base64_encode(NULL, (char *)ntlmbuf, size, outptr, &base64_sz);
}
#endif /* USE_NTLM */
diff --git a/lib/curl_ntlm.h b/lib/curl_ntlm.h
index 24021033a..ef3dfc1e4 100644
--- a/lib/curl_ntlm.h
+++ b/lib/curl_ntlm.h
@@ -24,22 +24,20 @@
#ifdef USE_NTLM
-/* This is to generate a ntlm type-1 message */
+/* This is to generate a base64 encoded NTLM type-1 message */
CURLcode Curl_ntlm_create_type1_message(const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
- unsigned char *ntlmbuf,
- size_t *size);
+ char **outptr);
-/* This is to generate a ntlm type-3 message */
+/* This is to generate a base64 encoded NTLM type-3 message */
CURLcode Curl_ntlm_create_type3_message(struct SessionHandle *data,
const char *userp,
const char *passwdp,
struct ntlmdata *ntlm,
- unsigned char *ntlmbuf,
- size_t *size);
+ char **outptr);
-/* This is to decode a ntlm type-2 message */
+/* This is to decode a NTLM type-2 message */
CURLcode Curl_ntlm_decode_type2_message(struct SessionHandle *data,
const char* header,
struct ntlmdata* ntlm);
diff --git a/lib/http_ntlm.c b/lib/http_ntlm.c
index c5ee679a9..6e07fe977 100644
--- a/lib/http_ntlm.c
+++ b/lib/http_ntlm.c
@@ -453,13 +453,10 @@ CURLcode Curl_output_ntlm_sso(struct connectdata *conn,
CURLcode Curl_output_ntlm(struct connectdata *conn,
bool proxy)
{
- size_t size = 0;
char *base64 = NULL;
- size_t base64_sz = 0;
- unsigned char ntlmbuf[NTLM_BUFSIZE];
CURLcode error;
- /* point to the address of the pointer that holds the string to sent to the
+ /* point to the address of the pointer that holds the string to send to the
server, which is for a plain host or for a HTTP proxy */
char **allocuserpwd;
@@ -514,61 +511,39 @@ CURLcode Curl_output_ntlm(struct connectdata *conn,
switch(ntlm->state) {
case NTLMSTATE_TYPE1:
default: /* for the weird cases we (re)start here */
-
/* Create a type-1 message */
-
- error = Curl_ntlm_create_type1_message(userp, passwdp,
- ntlm, ntlmbuf, &size);
+ error = Curl_ntlm_create_type1_message(userp, passwdp, ntlm, &base64);
if(error)
return error;
- if(size > 0) {
- /* convert the binary blob into base64 */
- error = Curl_base64_encode(NULL, (char *)ntlmbuf, size,
- &base64, &base64_sz);
- if(error)
- return error;
-
- if(base64_sz > 0) {
- Curl_safefree(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
- proxy ? "Proxy-" : "",
- base64);
- DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
- free(base64);
- }
+ if(base64) {
+ Curl_safefree(*allocuserpwd);
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
+ proxy ? "Proxy-" : "",
+ base64);
+ DEBUG_OUT(fprintf(stderr, "**** Header %s\n ", *allocuserpwd));
+ free(base64);
}
-
break;
case NTLMSTATE_TYPE2:
/* We already received the type-2 message, create a type-3 message */
-
error = Curl_ntlm_create_type3_message(conn->data, userp, passwdp,
- ntlm, ntlmbuf, &size);
+ ntlm, &base64);
if(error)
return error;
- if(size > 0) {
- /* convert the binary blob into base64 */
- error = Curl_base64_encode(NULL, (char *)ntlmbuf, size,
- &base64, &base64_sz);
- if(error)
- return error;
-
- if(base64_sz > 0) {
- Curl_safefree(*allocuserpwd);
- *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
- proxy ? "Proxy-" : "",
- base64);
- DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
- free(base64);
-
- ntlm->state = NTLMSTATE_TYPE3; /* we sent a type-3 */
- authp->done = TRUE;
- }
- }
+ if(base64) {
+ Curl_safefree(*allocuserpwd);
+ *allocuserpwd = aprintf("%sAuthorization: NTLM %s\r\n",
+ proxy ? "Proxy-" : "",
+ base64);
+ DEBUG_OUT(fprintf(stderr, "**** %s\n ", *allocuserpwd));
+ free(base64);
+ ntlm->state = NTLMSTATE_TYPE3; /* we send a type-3 */
+ authp->done = TRUE;
+ }
break;
case NTLMSTATE_TYPE3: