27 #if !defined(CURL_DISABLE_CRYPTO_AUTH) 49 #if !defined(USE_WINDOWS_SSPI) 50 #define DIGEST_QOP_VALUE_AUTH (1 << 0) 51 #define DIGEST_QOP_VALUE_AUTH_INT (1 << 1) 52 #define DIGEST_QOP_VALUE_AUTH_CONF (1 << 2) 54 #define DIGEST_QOP_VALUE_STRING_AUTH "auth" 55 #define DIGEST_QOP_VALUE_STRING_AUTH_INT "auth-int" 56 #define DIGEST_QOP_VALUE_STRING_AUTH_CONF "auth-conf" 62 #define CURL_OUTPUT_DIGEST_CONV(a, b) \ 63 result = Curl_convert_to_network(a, (char *)b, strlen((const char *)b)); \ 74 bool starts_with_quote =
FALSE;
88 starts_with_quote =
TRUE;
104 if(!starts_with_quote) {
119 if(!escape && starts_with_quote) {
137 #if !defined(USE_WINDOWS_SSPI) 143 for(i = 0; i < 16; i++)
144 snprintf((
char *) &dest[i * 2], 3,
"%02x", source[i]);
151 const char *
s = source;
157 if(*s ==
'"' || *s ==
'\\') {
168 if(*s ==
'"' || *s ==
'\\') {
191 find_pos = strstr(chlg, key);
195 find_pos += strlen(key);
197 for(i = 0; *find_pos && *find_pos != end_char && i < max_val_len - 1; ++
i)
198 value[i] = *find_pos++;
208 char *tok_buf = NULL;
219 token =
strtok_r(tmp,
",", &tok_buf);
220 while(token != NULL) {
228 token =
strtok_r(NULL,
",", &tok_buf);
257 char *nonce,
size_t nlen,
258 char *realm,
size_t rlen,
259 char *alg,
size_t alen,
260 char *qop,
size_t qlen)
263 unsigned char *chlg = NULL;
265 size_t chlg64len = strlen(chlg64);
268 if(chlg64len && *chlg64 !=
'=') {
347 char **outptr,
size_t *outlen)
352 char *response = NULL;
360 char qop_options[64];
363 char nonceCount[] =
"00000001";
364 char method[] =
"AUTHENTICATE";
370 realm,
sizeof(realm),
371 algorithm,
sizeof(algorithm),
372 qop_options,
sizeof(qop_options));
377 if(strcmp(algorithm,
"md5-sess") != 0)
390 result =
Curl_rand_hex(data, (
unsigned char *)cnonce,
sizeof(cnonce));
424 snprintf(&HA1_hex[2 * i], 3,
"%02x", digest[i]);
447 snprintf(&HA2_hex[2 * i], 3,
"%02x", digest[i]);
457 Curl_MD5_update(ctxt, (
const unsigned char *) HA1_hex, 2 * MD5_DIGEST_LEN);
473 Curl_MD5_update(ctxt, (
const unsigned char *) HA2_hex, 2 * MD5_DIGEST_LEN);
477 snprintf(&resp_hash_hex[2 * i], 3,
"%02x", digest[i]);
480 response =
aprintf(
"username=\"%s\",realm=\"%s\",nonce=\"%s\"," 481 "cnonce=\"%s\",nc=\"%s\",digest-uri=\"%s\",response=%s," 484 cnonce, nonceCount, spn, resp_hash_hex, qop);
514 bool foundAuth =
FALSE;
515 bool foundAuthInt =
FALSE;
561 char *tok_buf = NULL;
568 token =
strtok_r(tmp,
",", &tok_buf);
569 while(token != NULL) {
576 token =
strtok_r(NULL,
",", &tok_buf);
588 else if(foundAuthInt) {
627 if(before && !digest->
stale)
660 const unsigned char *request,
661 const unsigned char *uripath,
663 char **outptr,
size_t *outlen)
666 unsigned char md5buf[16];
667 unsigned char request_digest[33];
668 unsigned char *md5this;
669 unsigned char ha1[33];
670 unsigned char ha2[33];
673 size_t cnonce_sz = 0;
675 char *response = NULL;
688 &cnonce, &cnonce_sz);
706 md5this = (
unsigned char *)
741 md5this = (
unsigned char *)
aprintf(
"%s:%s", request, uripath);
746 unsigned char *md5this2 = (
unsigned char *)
747 aprintf(
"%s:%s", md5this,
"d41d8cd98f00b204e9800998ecf8427e");
761 md5this = (
unsigned char *)
aprintf(
"%s:%s:%08x:%s:%s:%s",
770 md5this = (
unsigned char *)
aprintf(
"%s:%s:%s",
802 response =
aprintf(
"username=\"%s\", " 825 response =
aprintf(
"username=\"%s\", " 843 tmp =
aprintf(
"%s, opaque=\"%s\"", response, digest->
opaque);
863 *outlen = strlen(response);
#define DIGEST_QOP_VALUE_AUTH_INT
#define CURL_OUTPUT_DIGEST_CONV(a, b)
#define DIGEST_QOP_VALUE_AUTH_CONF
#define DIGEST_QOP_VALUE_AUTH
const MD5_params Curl_DIGEST_MD5[1]
CURLcode Curl_base64_decode(const char *src, unsigned char **outptr, size_t *outlen)
int Curl_MD5_update(MD5_context *context, const unsigned char *data, unsigned int len)
static CURLcode auth_digest_get_qop_values(const char *options, int *value)
MD5_context * Curl_MD5_init(const MD5_params *md5params)
CURLcode Curl_base64_encode(struct Curl_easy *data, const char *inputbuff, size_t insize, char **outptr, size_t *outlen)
#define DIGEST_QOP_VALUE_STRING_AUTH
#define DIGEST_QOP_VALUE_STRING_AUTH_INT
#define strcasecompare(a, b)
CURLcode Curl_auth_create_digest_http_message(struct Curl_easy *data, const char *userp, const char *passwdp, const unsigned char *request, const unsigned char *uripath, struct digestdata *digest, char **outptr, size_t *outlen)
UNITTEST_START int result
#define DIGEST_MAX_CONTENT_LENGTH
CURLcode Curl_auth_create_digest_md5_message(struct Curl_easy *data, const char *chlg64, const char *userp, const char *passwdp, const char *service, char **outptr, size_t *outlen)
CURLcode Curl_rand_hex(struct Curl_easy *data, unsigned char *rnd, size_t num)
void Curl_md5it(unsigned char *output, const unsigned char *input)
CURLcode Curl_auth_decode_digest_http_message(const char *chlg, struct digestdata *digest)
static bool auth_digest_get_key_value(const char *chlg, const char *key, char *value, size_t max_val_len, char end_char)
bool Curl_auth_is_digest_supported(void)
int Curl_MD5_final(MD5_context *context, unsigned char *result)
void Curl_auth_digest_cleanup(struct digestdata *digest)
unsigned int curlx_uztoui(size_t uznum)
#define DIGEST_QOP_VALUE_STRING_AUTH_CONF
#define Curl_safefree(ptr)
char * Curl_auth_build_spn(const char *service, const char *host, const char *realm)
UNITTEST_START int * value
#define DIGEST_MAX_VALUE_LENGTH
bool Curl_auth_digest_get_pair(const char *str, char *value, char *content, const char **endptr)
static CURLcode auth_decode_digest_md5_message(const char *chlg64, char *nonce, size_t nlen, char *realm, size_t rlen, char *alg, size_t alen, char *qop, size_t qlen)
static char * auth_digest_string_quoted(const char *source)
static void auth_digest_md5_to_ascii(unsigned char *source, unsigned char *dest)