Mention NTLM support in http.c.
+2005-04-18 Hrvoje Niksic <hniksic@xemacs.org>
+
+ * utils.c (base64_encode): Use the parameter order that makes more
+ sense. Return the length of the base64 written. Updated all
+ callers.
+
2005-04-17 Hrvoje Niksic <hniksic@xemacs.org>
* http.c (request_set_header): Free NAME when VALUE is NULL and
2005-04-17 Hrvoje Niksic <hniksic@xemacs.org>
* http.c (request_set_header): Free NAME when VALUE is NULL and
size = 32 + hostlen + domlen;
base64 = (char *) alloca (BASE64_LENGTH (size) + 1);
size = 32 + hostlen + domlen;
base64 = (char *) alloca (BASE64_LENGTH (size) + 1);
- base64_encode (ntlmbuf, base64, size);
+ base64_encode (ntlmbuf, size, base64);
output = concat_strings ("NTLM ", base64, (char *) 0);
break;
output = concat_strings ("NTLM ", base64, (char *) 0);
break;
/* convert the binary blob into base64 */
base64 = (char *) alloca (BASE64_LENGTH (size) + 1);
/* convert the binary blob into base64 */
base64 = (char *) alloca (BASE64_LENGTH (size) + 1);
- base64_encode (ntlmbuf, base64, size);
+ base64_encode (ntlmbuf, size, base64);
output = concat_strings ("NTLM ", base64, (char *) 0);
output = concat_strings ("NTLM ", base64, (char *) 0);
-/* Authorization support: We support two authorization schemes:
+/* Authorization support: We support three authorization schemes:
* `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
* `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
consisting of answering to the server's challenge with the proper
* `Basic' scheme, consisting of base64-ing USER:PASSWORD string;
* `Digest' scheme, added by Junio Hamano <junio@twinsun.com>,
consisting of answering to the server's challenge with the proper
+ MD5 digests.
+
+ * `NTLM' ("NT Lan Manager") scheme, based on code written by Daniel
+ Stenberg for libcurl. Like digest, NTLM is based on a
+ challenge-response mechanism, but unlike digest, it is non-standard
+ (authenticates TCP connections rather than requests), undocumented
+ and Microsoft-specific. */
/* Create the authentication header contents for the `Basic' scheme.
This is done by encoding the string `USER:PASS' in base64 and
prepending `HEADER: Basic ' to it. */
/* Create the authentication header contents for the `Basic' scheme.
This is done by encoding the string `USER:PASS' in base64 and
prepending `HEADER: Basic ' to it. */
static char *
basic_authentication_encode (const char *user, const char *passwd)
{
char *t1, *t2;
int len1 = strlen (user) + 1 + strlen (passwd);
static char *
basic_authentication_encode (const char *user, const char *passwd)
{
char *t1, *t2;
int len1 = strlen (user) + 1 + strlen (passwd);
- int len2 = BASE64_LENGTH (len1);
t1 = (char *)alloca (len1 + 1);
sprintf (t1, "%s:%s", user, passwd);
t1 = (char *)alloca (len1 + 1);
sprintf (t1, "%s:%s", user, passwd);
- t2 = (char *)alloca (len2 + 1);
- base64_encode (t1, t2, len1);
+ t2 = (char *)alloca (BASE64_LENGTH (len1) + 1);
+ base64_encode (t1, len1, t2);
return concat_strings ("Basic ", t2, (char *) 0);
}
return concat_strings ("Basic ", t2, (char *) 0);
}
#endif /* not WINDOWS */
/* Encode the string S of length LENGTH to base64 format and place it
#endif /* not WINDOWS */
/* Encode the string S of length LENGTH to base64 format and place it
- to STORE. STORE will be 0-terminated, and must point to a writable
- buffer of at least 1+BASE64_LENGTH(length) bytes. */
+ to B64STORE. The output will be \0-terminated, and must point to a
+ writable buffer of at least 1+BASE64_LENGTH(length) bytes. It
+ returns the length of the resulting base64 data, not counting the
+ terminating zero.
-void
-base64_encode (const char *s, char *store, int length)
+ This implementation will not emit newlines after 76 characters of
+ base64 data. */
+
+int
+base64_encode (const char *s, int length, char *b64store)
{
/* Conversion table. */
static char tbl[64] = {
{
/* Conversion table. */
static char tbl[64] = {
'4','5','6','7','8','9','+','/'
};
int i;
'4','5','6','7','8','9','+','/'
};
int i;
- unsigned char *p = (unsigned char *)store;
+ unsigned char *p = (unsigned char *) b64store;
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
for (i = 0; i < length; i += 3)
/* Transform the 3x8 bits to 4x6 bits, as required by base64. */
for (i = 0; i < length; i += 3)
*p++ = tbl[s[2] & 0x3f];
s += 3;
}
*p++ = tbl[s[2] & 0x3f];
s += 3;
}
/* Pad the result if necessary... */
if (i == length + 1)
*(p - 1) = '=';
else if (i == length + 2)
*(p - 1) = *(p - 2) = '=';
/* Pad the result if necessary... */
if (i == length + 1)
*(p - 1) = '=';
else if (i == length + 2)
*(p - 1) = *(p - 2) = '=';
/* ...and zero-terminate it. */
*p = '\0';
/* ...and zero-terminate it. */
*p = '\0';
+
+ return p - (unsigned char *) b64store;
}
#define IS_ASCII(c) (((c) & 0x80) == 0)
}
#define IS_ASCII(c) (((c) & 0x80) == 0)
int
base64_decode (const char *base64, char *to)
{
int
base64_decode (const char *base64, char *to)
{
- /* Table of base64 values for first 128 characters. */
+ /* Table of base64 values for first 128 characters. Note that this
+ assumes ASCII (but so does Wget in other places). */
static short base64_char_to_value[128] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
static short base64_char_to_value[128] =
{
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /* 0- 9 */
/* How many bytes it will take to store LEN bytes in base64. */
#define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
/* How many bytes it will take to store LEN bytes in base64. */
#define BASE64_LENGTH(len) (4 * (((len) + 2) / 3))
-void base64_encode PARAMS ((const char *, char *, int));
+int base64_encode PARAMS ((const char *, int, char *));
int base64_decode PARAMS ((const char *, char *));
#endif /* UTILS_H */
int base64_decode PARAMS ((const char *, char *));
#endif /* UTILS_H */