gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] r12711 - libmicrohttpd/src/daemon


From: gnunet
Subject: [GNUnet-SVN] r12711 - libmicrohttpd/src/daemon
Date: Sun, 22 Aug 2010 17:03:32 +0200

Author: grothoff
Date: 2010-08-22 17:03:32 +0200 (Sun, 22 Aug 2010)
New Revision: 12711

Modified:
   libmicrohttpd/src/daemon/digestauth.c
Log:
indentation

Modified: libmicrohttpd/src/daemon/digestauth.c
===================================================================
--- libmicrohttpd/src/daemon/digestauth.c       2010-08-22 14:57:21 UTC (rev 
12710)
+++ libmicrohttpd/src/daemon/digestauth.c       2010-08-22 15:03:32 UTC (rev 
12711)
@@ -40,24 +40,26 @@
 
 /* convert bin to hex */
 static void
-cvthex(const unsigned char *bin, size_t len, char *hex)
+cvthex(const unsigned char *bin,
+       size_t len,
+       char *hex)
 {
-       size_t i;
-       unsigned int j;
+  size_t i;
+  unsigned int j;
+  
+  for (i = 0; i < len; ++i) {
+    j = (bin[i] >> 4) & 0x0f;
+    
+    hex[i * 2] = j <= 9 ? (j + '0') : (j + 'a' - 10);
+    
+    j = bin[i] & 0x0f;
+    
+    hex[i * 2 + 1] = j <= 9 ? (j + '0') : (j + 'a' - 10);
+  }  
+  hex[len * 2] = '\0';
+}
 
-       for (i = 0; i < len; ++i) {
-               j = (bin[i] >> 4) & 0x0f;
 
-               hex[i * 2] = j <= 9 ? (j + '0') : (j + 'a' - 10);
-
-               j = bin[i] & 0x0f;
-
-               hex[i * 2 + 1] = j <= 9 ? (j + '0') : (j + 'a' - 10);
-       }
-
-       hex[len * 2] = '\0';
-}
-
 /* calculate H(A1) as per RFC2617 spec */
 static int
 digest_calc_ha1(const char *alg,
@@ -68,160 +70,172 @@
                const char *cnonce,
                char *sessionkey)
 {
-       gcry_md_hd_t md5;
-       gcry_error_t gerror;
-       unsigned char *ha1;
-
-       gerror = gcry_md_open(&md5, GCRY_MD_MD5, GCRY_MD_FLAG_SECURE);
-
-       if (gerror) return gerror;
-
-       gcry_md_write(md5, username, strlen(username));
-       gcry_md_write(md5, ":", 1);
-       gcry_md_write(md5, realm, strlen(realm));
-       gcry_md_write(md5, ":", 1);
-       gcry_md_write(md5, password, strlen(password));
-       gcry_md_final(md5);
-
-       ha1 = gcry_md_read(md5, GCRY_MD_MD5);
-
-       if (strcasecmp(alg, "md5-sess") == 0) {
-               gcry_md_reset(md5);
-               gcry_md_write(md5, ha1, HASH_MD5_LEN);
-               gcry_md_write(md5, ":", 1);
-               gcry_md_write(md5, nonce, strlen(nonce));
-               gcry_md_write(md5, ":", 1);
-               gcry_md_write(md5, cnonce, strlen(cnonce));
-               gcry_md_final(md5);
-
-               ha1 = gcry_md_read(md5, GCRY_MD_MD5);
-       }
-
-       cvthex(ha1, HASH_MD5_LEN, sessionkey);
-       gcry_md_close(md5);
-
-       return 0;
+  gcry_md_hd_t md5;
+  gcry_error_t gerror;
+  unsigned char *ha1;
+  
+  gerror = gcry_md_open(&md5, GCRY_MD_MD5, GCRY_MD_FLAG_SECURE);  
+  if (gerror) 
+    return gerror;
+  gcry_md_write(md5, username, strlen(username));
+  gcry_md_write(md5, ":", 1);
+  gcry_md_write(md5, realm, strlen(realm));
+  gcry_md_write(md5, ":", 1);
+  gcry_md_write(md5, password, strlen(password));
+  gcry_md_final(md5); 
+  ha1 = gcry_md_read(md5, GCRY_MD_MD5);
+  if (strcasecmp(alg, "md5-sess") == 0) 
+    {
+      gcry_md_reset(md5);
+      gcry_md_write(md5, ha1, HASH_MD5_LEN);
+      gcry_md_write(md5, ":", 1);
+      gcry_md_write(md5, nonce, strlen(nonce));
+      gcry_md_write(md5, ":", 1);
+      gcry_md_write(md5, cnonce, strlen(cnonce));
+      gcry_md_final(md5);      
+      ha1 = gcry_md_read(md5, GCRY_MD_MD5);
+    }
+  cvthex(ha1, HASH_MD5_LEN, sessionkey);
+  gcry_md_close(md5);  
+  return 0;
 }
 
-/* calculate request-digest/response-digest as per RFC2617 spec */
+/**
+ * calculate request-digest/response-digest as per RFC2617 spec 
+ * 
+ * @param ha1 H(A1)
+ * @param nonce nonce from server
+ * @param noncecount 8 hex digits
+ * @param cnonce client nonce
+ * @param qop qop-value: "", "auth" or "auth-int"
+ * @param method method from request
+ * @param uri requested URL
+ * @param hentity H(entity body) if qop="auth-int"
+ * @param response request-digest or response-digest
+ * @return ???
+ */
 static int
-digest_calc_response(const char *ha1,                  /* H(A1) */
-                    const char *nonce,                 /* nonce from server */
-                    const char *noncecount,            /* 8 hex digits */
-                    const char *cnonce,                        /* client nonce 
*/
-                    const char *qop,                   /* qop-value: "", 
"auth", "auth-int" */
-                    const char *method,                        /* method from 
the request */
-                    const char *uri,                   /* requested URL */
-                    const char *hentity,               /* H(entity body) if 
qop="auth-int" */
-                    char *response                             /* 
request-digest or response-digest */
-                    )
+digest_calc_response(const char *ha1,
+                    const char *nonce,
+                    const char *noncecount,
+                    const char *cnonce,
+                    const char *qop,
+                    const char *method,
+                    const char *uri,
+                    const char *hentity,
+                    char *response)
 {
-       gcry_md_hd_t md5;
-       gcry_error_t gerror;
-       unsigned char *ha2;
-       unsigned char *resphash;
-       char ha2hex[HASH_MD5_HEX_LEN + 1];
-
-       gerror = gcry_md_open(&md5, GCRY_MD_MD5, GCRY_MD_FLAG_SECURE);
-
-       if (gerror) return gerror;
-
-       /*
-        * calculate H(A2)
-        */
-
-       gcry_md_write(md5, method, strlen(method));
-       gcry_md_write(md5, ":", 1);
-       gcry_md_write(md5, uri, strlen(uri));
-
-       if (strcasecmp(qop, "auth-int") == 0) {
-               gcry_md_write(md5, ":", 1);
-               gcry_md_write(md5, hentity, strlen(hentity));
-       }
-
-       gcry_md_final(md5);
-
-       ha2 = gcry_md_read(md5, GCRY_MD_MD5);
-
-       cvthex(ha2, HASH_MD5_LEN, ha2hex);
-       gcry_md_reset(md5);
-
-       /*
-        * calculate response
-        */
-
-       gcry_md_write(md5, ha1, HASH_MD5_HEX_LEN);
-       gcry_md_write(md5, ":", 1);
-       gcry_md_write(md5, nonce, strlen(nonce));
-       gcry_md_write(md5, ":", 1);
-
-       if (*qop) {
-               gcry_md_write(md5, noncecount, strlen(noncecount));
-               gcry_md_write(md5, ":", 1);
-               gcry_md_write(md5, cnonce, strlen(cnonce));
-               gcry_md_write(md5, ":", 1);
-               gcry_md_write(md5, qop, strlen(qop));
-               gcry_md_write(md5, ":", 1);
-       }
-
-       gcry_md_write(md5, ha2hex, HASH_MD5_HEX_LEN);
-       gcry_md_final(md5);
-
-       resphash = gcry_md_read(md5, GCRY_MD_MD5);
-
-       cvthex(resphash, HASH_MD5_LEN, response);
-       gcry_md_close(md5);
-
-       return 0;
+  gcry_md_hd_t md5;
+  gcry_error_t gerror;
+  unsigned char *ha2;
+  unsigned char *resphash;
+  char ha2hex[HASH_MD5_HEX_LEN + 1];
+  
+  gerror = gcry_md_open(&md5, GCRY_MD_MD5, GCRY_MD_FLAG_SECURE);  
+  if (gerror)
+    return gerror;
+  /*
+   * calculate H(A2)
+   */
+  
+  gcry_md_write(md5, method, strlen(method));
+  gcry_md_write(md5, ":", 1);
+  gcry_md_write(md5, uri, strlen(uri));
+  
+  if (strcasecmp(qop, "auth-int") == 0) 
+    {
+      gcry_md_write(md5, ":", 1);
+      gcry_md_write(md5, hentity, strlen(hentity));
+    }
+  
+  gcry_md_final(md5);
+  
+  ha2 = gcry_md_read(md5, GCRY_MD_MD5);
+  
+  cvthex(ha2, HASH_MD5_LEN, ha2hex);
+  gcry_md_reset(md5);
+  
+  /*
+   * calculate response
+   */
+  
+  gcry_md_write(md5, ha1, HASH_MD5_HEX_LEN);
+  gcry_md_write(md5, ":", 1);
+  gcry_md_write(md5, nonce, strlen(nonce));
+  gcry_md_write(md5, ":", 1);
+  
+  if (*qop) 
+    {
+      gcry_md_write(md5, noncecount, strlen(noncecount));
+      gcry_md_write(md5, ":", 1);
+      gcry_md_write(md5, cnonce, strlen(cnonce));
+      gcry_md_write(md5, ":", 1);
+      gcry_md_write(md5, qop, strlen(qop));
+      gcry_md_write(md5, ":", 1);
+    }
+  
+  gcry_md_write(md5, ha2hex, HASH_MD5_HEX_LEN);
+  gcry_md_final(md5);
+  
+  resphash = gcry_md_read(md5, GCRY_MD_MD5);
+  
+  cvthex(resphash, HASH_MD5_LEN, response);
+  gcry_md_close(md5);
+  
+  return 0;
 }
 
 static const char *
-lookup_sub_value(char *data, size_t len, const char *key)
+lookup_sub_value(char *data, 
+                size_t len,
+                const char *key)
 {
-       char *tmp = data;
-       char *value = NULL;
-       size_t keylen;
-       size_t i;
-
-       keylen = strlen(key);
-
-       for (i = 0; i < len; ++i) {
-               if (strncmp(tmp, key, keylen) == 0 &&
-                               strncmp(tmp + keylen, "=", 1) == 0) {
-                       tmp += keylen;
-                       break;
-               } else {
-                       tmp++;
-               }
-
-               if ((i + 1) == len) return NULL;
-       }
-
-       while (1) {
-               tmp++;
-
-               if (*tmp == '"' && *(tmp + 1) == ',') {
-                       *tmp = '\0';
-                       break;
-               }
-
-               if (*tmp == '"' && *(tmp + 1) == '\0') {
-                       *tmp = '\0';
-                       break;
-               }
-
-               if (*tmp == ',' || *tmp == '\0') {
-                       *tmp = '\0';
-                       break;
-               }
-
-               if (*tmp == '"') continue;
-
-               if (value == NULL)
-                       value = tmp;
-       }
-
-       return value;
+  char *tmp = data;
+  char *value = NULL;
+  size_t keylen;
+  size_t i;
+  
+  keylen = strlen(key);
+  for (i = 0; i < len; ++i) {
+    if (strncmp(tmp, key, keylen) == 0 &&
+       strncmp(tmp + keylen, "=", 1) == 0) 
+      {
+       tmp += keylen;
+       break;
+      }
+    else 
+      {
+       tmp++;
+      }    
+    if ((i + 1) == len) 
+      return NULL;
+  }  
+  while (1) 
+    {
+      tmp++;
+      
+      if (*tmp == '"' && *(tmp + 1) == ',') 
+       {
+         *tmp = '\0';
+         break;
+       }      
+      if (*tmp == '"' && *(tmp + 1) == '\0') 
+       {
+         *tmp = '\0';
+         break;
+       }      
+      if (*tmp == ',' || *tmp == '\0') 
+       {
+         *tmp = '\0';
+         break;
+       }      
+      if (*tmp == '"')
+       continue;      
+      if (value == NULL)
+       value = tmp;
+    }
+  
+  return value;
 }
 
 
@@ -235,41 +249,46 @@
 char *
 MHD_digest_auth_get_username(struct MHD_Connection *connection)
 {
-       size_t len;
-       size_t userlen;
-       char *buffer;
-       char *username;
-       const char *user;
-       const char *header;
-
-       header = MHD_lookup_connection_value(connection,
-                       MHD_HEADER_KIND, MHD_HTTP_HEADER_AUTHORIZATION);
-
-       if (header == NULL) return NULL;
-       if (strncmp(header, _BASE, strlen(_BASE)) != 0) return NULL;
-
-       len = strlen(header) - strlen(_BASE) + 1;
-       buffer = malloc(len);
-
-       if (buffer == NULL) return NULL;
-
-       strncpy(buffer, header + strlen(_BASE), len);
-
-       user = lookup_sub_value(buffer, len, "username");
-
-       if (user) {
-               userlen = strlen(user) + 1;
-               username = malloc(userlen);
-
-               if (username != NULL) {
-                       strncpy(username, user, userlen);
-                       free(buffer);
-                       return username;
-               }
+  size_t len;
+  size_t userlen;
+  char *buffer;
+  char *username;
+  const char *user;
+  const char *header;
+  
+  header = MHD_lookup_connection_value(connection,
+                                      MHD_HEADER_KIND, 
+                                      MHD_HTTP_HEADER_AUTHORIZATION);
+  
+  if (header == NULL)
+    return NULL;
+  if (strncmp(header, _BASE, strlen(_BASE)) != 0)
+    return NULL;
+  
+  len = strlen(header) - strlen(_BASE) + 1;
+  buffer = malloc(len);
+  
+  if (buffer == NULL) return NULL;
+  
+  strncpy(buffer, header + strlen(_BASE), len);
+  
+  user = lookup_sub_value(buffer, len, "username");
+  
+  if (user) 
+    {
+      userlen = strlen(user) + 1;
+      username = malloc(userlen);
+      
+      if (username != NULL) 
+       {
+         strncpy(username, user, userlen);
+         free(buffer);
+         return username;
        }
-
-       free(buffer);
-       return NULL;
+    }
+  
+  free(buffer);
+  return NULL;
 }
 
 /**
@@ -291,192 +310,197 @@
                      const char *password,
                      unsigned int nonce_timeout)
 {
-       int auth;
-       size_t len;
-       char *buffer;
-       const char *header;
-       const char *ret;
-       const char *nonce;
-       const char *cnonce;
-       const char *uri;
-       const char *qop;
-       const char *nc;
-       const char *response;
-       unsigned char *tmpnonce;
-       char *hentity = NULL; /* "auth-int" is not supported */
-       char timestamp[5];
-       char ha1[HASH_MD5_HEX_LEN + 1];
-       char respexp[HASH_MD5_HEX_LEN + 1];
-       char noncehashexp[HASH_SHA1_HEX_LEN + 9];
-       unsigned int nonce_time;
-       time_t t;
-       gcry_error_t gerror;
-       gcry_md_hd_t sha1;
+  int auth;
+  size_t len;
+  char *buffer;
+  const char *header;
+  const char *ret;
+  const char *nonce;
+  const char *cnonce;
+  const char *uri;
+  const char *qop;
+  const char *nc;
+  const char *response;
+  unsigned char *tmpnonce;
+  char *hentity = NULL; /* "auth-int" is not supported */
+  char timestamp[5];
+  char ha1[HASH_MD5_HEX_LEN + 1];
+  char respexp[HASH_MD5_HEX_LEN + 1];
+  char noncehashexp[HASH_SHA1_HEX_LEN + 9];
+  unsigned int nonce_time;
+  time_t t;
+  gcry_error_t gerror;
+  gcry_md_hd_t sha1;
+  
+  header = MHD_lookup_connection_value(connection,
+                                      MHD_HEADER_KIND,
+                                      MHD_HTTP_HEADER_AUTHORIZATION);  
+  if (header == NULL) 
+    return MHD_NO;
+  if (strncmp(header, _BASE, strlen(_BASE)) != 0) 
+    return MHD_NO;  
+  len = strlen(header) - strlen(_BASE) + 1;  
+  buffer = malloc(len);
+  
+  if (buffer == NULL) 
+    return MHD_NO;
+  strncpy(buffer, 
+         header + strlen(_BASE), 
+         len);
+  
+  ret = lookup_sub_value(buffer, len, "username");
+  
+  if ( (ret == NULL) || (strcmp(username, ret) != 0) ) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }  
+  ret = lookup_sub_value(buffer, len, "realm");
+  
+  if (ret == NULL || strcmp(realm, ret) != 0) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }  
+  if ((uri = lookup_sub_value(buffer, len, "uri")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  if ((nonce = lookup_sub_value(buffer, len, "nonce")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  /*
+   * 8 = 4 hexadecimal numbers for the timestamp
+   */
+  
+  nonce_time = strtoul(nonce + strlen(nonce) - 8, 0, 16);  
+  time(&t);
+  
+  /*
+   * First level vetting for the nonce validity
+   * if the timestamp attached to the nonce
+   * exceeds `nonce_timeout' then the nonce is
+   * invalid.
+   */
+  
+  if (t - nonce_time > nonce_timeout) 
+    {
+      free(buffer);
+      return MHD_INVALID_NONCE;
+    }
+  gerror = gcry_md_open(&sha1, GCRY_MD_SHA1, GCRY_MD_FLAG_SECURE);
+  if (gerror) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  timestamp[0] = (nonce_time & 0xff000000) >> 0x18;
+  timestamp[1] = (nonce_time & 0x00ff0000) >> 0x10;
+  timestamp[2] = (nonce_time & 0x0000ff00) >> 0x08;
+  timestamp[3] = nonce_time & 0x000000ff;
+  timestamp[4] = '\0';
+  
+  gcry_md_write(sha1, timestamp, 4);
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, connection->method, strlen(connection->method));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, password, strlen(password));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, uri, strlen(uri));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, realm, strlen(realm));
+  gcry_md_final(sha1);
+  
+  tmpnonce = gcry_md_read(sha1, GCRY_MD_SHA1);
+  
+  cvthex(tmpnonce, HASH_SHA1_LEN, noncehashexp);
+  gcry_md_close(sha1);
+  
+  strncat(noncehashexp, nonce + strlen(nonce) - 8, 8);
+  
+  /*
+   * Second level vetting for the nonce validity
+   * if the timestamp attached to the nonce is valid
+   * and possibility fabricated (in case of an attack)
+   * the attacker must also know the password to be
+   * able to generate a "sane" nonce, which if he does
+   * not, the nonce fabrication process going to be
+   * very hard to achieve.
+   */
+  
+  if (strncmp(nonce, noncehashexp, strlen(nonce)) != 0) 
+    {
+      free(buffer);
+      return MHD_INVALID_NONCE;
+    }
+  
+  if ((cnonce = lookup_sub_value(buffer, len, "cnonce")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  if ((qop = lookup_sub_value(buffer, len, "qop")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  if ((nc = lookup_sub_value(buffer, len, "nc")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  if ((response = lookup_sub_value(buffer, len, "response")) == NULL) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  auth = digest_calc_ha1("md5",
+                        username,
+                        realm,
+                        password,
+                        nonce,
+                        cnonce,
+                        ha1);
 
-       header = MHD_lookup_connection_value(
-                       connection, MHD_HEADER_KIND,
-                       MHD_HTTP_HEADER_AUTHORIZATION);
+  if (auth) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  auth = digest_calc_response(ha1,
+                             nonce,
+                             nc,
+                             cnonce,
+                             qop,
+                             connection->method,
+                             uri,
+                             hentity,
+                             respexp);
+  
+  if (auth) 
+    {
+      free(buffer);
+      return MHD_NO;
+    }
+  
+  auth = strcmp(response, respexp) == 0 ? MHD_YES : MHD_NO;
+  
+  free(buffer);
+  
+  return auth;
+}
 
-       if (header == NULL) return MHD_NO;
-       if (strncmp(header, _BASE, strlen(_BASE)) != 0) return MHD_NO;
 
-       len = strlen(header) - strlen(_BASE) + 1;
-
-       buffer = malloc(len);
-
-       if (buffer == NULL) return MHD_NO;
-
-       strncpy(buffer, header + strlen(_BASE), len);
-
-       ret = lookup_sub_value(buffer, len, "username");
-
-       if (ret == NULL || strcmp(username, ret) != 0) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       ret = lookup_sub_value(buffer, len, "realm");
-
-       if (ret == NULL || strcmp(realm, ret) != 0) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       if ((uri = lookup_sub_value(buffer, len, "uri")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       if ((nonce = lookup_sub_value(buffer, len, "nonce")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       /*
-        * 8 = 4 hexadecimal numbers for the timestamp
-        */
-
-       nonce_time = strtoul(nonce + strlen(nonce) - 8, 0, 16);
-
-       time(&t);
-
-       /*
-        * First level vetting for the nonce validity
-        * if the timestamp attached to the nonce
-        * exceeds `nonce_timeout' then the nonce is
-        * invalid.
-        */
-
-       if (t - nonce_time > nonce_timeout) {
-               free(buffer);
-               return MHD_INVALID_NONCE;
-       }
-
-       gerror = gcry_md_open(&sha1, GCRY_MD_SHA1, GCRY_MD_FLAG_SECURE);
-
-       if (gerror) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       timestamp[0] = (nonce_time & 0xff000000) >> 0x18;
-       timestamp[1] = (nonce_time & 0x00ff0000) >> 0x10;
-       timestamp[2] = (nonce_time & 0x0000ff00) >> 0x08;
-       timestamp[3] = nonce_time & 0x000000ff;
-       timestamp[4] = '\0';
-
-       gcry_md_write(sha1, timestamp, 4);
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, connection->method, strlen(connection->method));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, password, strlen(password));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, uri, strlen(uri));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, realm, strlen(realm));
-       gcry_md_final(sha1);
-
-       tmpnonce = gcry_md_read(sha1, GCRY_MD_SHA1);
-
-       cvthex(tmpnonce, HASH_SHA1_LEN, noncehashexp);
-       gcry_md_close(sha1);
-
-       strncat(noncehashexp, nonce + strlen(nonce) - 8, 8);
-
-       /*
-        * Second level vetting for the nonce validity
-        * if the timestamp attached to the nonce is valid
-        * and possibility fabricated (in case of an attack)
-        * the attacker must also know the password to be
-        * able to generate a "sane" nonce, which if he does
-        * not, the nonce fabrication process going to be
-        * very hard to achieve.
-        */
-
-       if (strncmp(nonce, noncehashexp, strlen(nonce)) != 0) {
-               free(buffer);
-               return MHD_INVALID_NONCE;
-       }
-
-       if ((cnonce = lookup_sub_value(buffer, len, "cnonce")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       if ((qop = lookup_sub_value(buffer, len, "qop")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       if ((nc = lookup_sub_value(buffer, len, "nc")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       if ((response = lookup_sub_value(buffer, len, "response")) == NULL) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       auth = digest_calc_ha1(
-                       "md5",
-                       username,
-                       realm,
-                       password,
-                       nonce,
-                       cnonce,
-                       ha1
-                       );
-
-       if (auth) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       auth = digest_calc_response(
-                       ha1,
-                       nonce,
-                       nc,
-                       cnonce,
-                       qop,
-                       connection->method,
-                       uri,
-                       hentity,
-                       respexp
-                       );
-
-       if (auth) {
-               free(buffer);
-               return MHD_NO;
-       }
-
-       auth = strcmp(response, respexp) == 0 ? MHD_YES : MHD_NO;
-
-       free(buffer);
-
-       return auth;
-}
-
 /**
  * Queues a response to request authentication from the client
  *
@@ -494,90 +518,91 @@
                             const char *opaque,
                             int signal_stale)
 {
-       int ret;
-       size_t hlen;
-       unsigned char *tmpnonce;
-       char *header;
-       unsigned char timestamp[5];
-       char timestamphex[9];
-       char nonce[HASH_SHA1_HEX_LEN + 9];
-       time_t t;
-       struct MHD_Response *response;
-       gcry_error_t gerror;
-       gcry_md_hd_t sha1;
-
-       response = MHD_create_response_from_data(0, NULL, MHD_NO, MHD_NO);
-
-       if (!response) return MHD_NO;
-
-       /*
-        * Generating the server nonce
-        */
-
-       gerror = gcry_md_open(&sha1, GCRY_MD_SHA1, GCRY_MD_FLAG_SECURE);
-
-       if (gerror) return MHD_NO;
-
-       time(&t);
-
-       timestamp[0] = (t & 0xff000000) >> 0x18;
-       timestamp[1] = (t & 0x00ff0000) >> 0x10;
-       timestamp[2] = (t & 0x0000ff00) >> 0x08;
-       timestamp[3] = t & 0x000000ff;
-       timestamp[4] = '\0';
-
-       gcry_md_write(sha1, timestamp, 4);
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, connection->method, strlen(connection->method));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, password, strlen(password));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, connection->url, strlen(connection->url));
-       gcry_md_write(sha1, ":", 1);
-       gcry_md_write(sha1, realm, strlen(realm));
-       gcry_md_final(sha1);
-
-       tmpnonce = gcry_md_read(sha1, GCRY_MD_SHA1);
-
-       cvthex(timestamp, 4, timestamphex);
-       cvthex(tmpnonce, HASH_SHA1_LEN, nonce);
-       strncat(nonce, timestamphex, 8);
-       gcry_md_close(sha1);
-
-       /*
-        * Building the authentication header
-        */
-       hlen = snprintf(NULL,
-                       0,
-                       "Digest 
realm=\"%s\",qop=\"auth\",nonce=\"%s\",opaque=\"%s\"%s",
-                       realm, 
-                       nonce,
-                       opaque,
-                       signal_stale ? ",stale=true" : "");
-       {
-         char header[hlen + 1];
-         snprintf(header,
-                  sizeof(header),
-                  "Digest 
realm=\"%s\",qop=\"auth\",nonce=\"%s\",opaque=\"%s\"%s",
-                  realm, 
-                  nonce,
-                  opaque,
-                  signal_stale ? ",stale=true" : "");
-         ret = MHD_add_response_header(response,
-                                       MHD_HTTP_HEADER_WWW_AUTHENTICATE, 
-                                       header);
-       }
-       if(!ret) 
-         {
-           MHD_destroy_response(response);
-           return MHD_NO;
-         }
-
-       ret = MHD_queue_response(connection, MHD_HTTP_UNAUTHORIZED, response);
-
-       MHD_destroy_response(response);
-
-       return ret;
+  int ret;
+  size_t hlen;
+  unsigned char *tmpnonce;
+  char *header;
+  unsigned char timestamp[5];
+  char timestamphex[9];
+  char nonce[HASH_SHA1_HEX_LEN + 9];
+  time_t t;
+  struct MHD_Response *response;
+  gcry_error_t gerror;
+  gcry_md_hd_t sha1;
+  
+  response = MHD_create_response_from_data(0, NULL, MHD_NO, MHD_NO);  
+  if (!response) 
+    return MHD_NO;
+  
+  /*
+   * Generating the server nonce
+   */
+  
+  gerror = gcry_md_open(&sha1, GCRY_MD_SHA1, GCRY_MD_FLAG_SECURE);
+  
+  if (gerror) 
+    return MHD_NO;
+  
+  time(&t);
+  
+  timestamp[0] = (t & 0xff000000) >> 0x18;
+  timestamp[1] = (t & 0x00ff0000) >> 0x10;
+  timestamp[2] = (t & 0x0000ff00) >> 0x08;
+  timestamp[3] = t & 0x000000ff;
+  timestamp[4] = '\0';
+  
+  gcry_md_write(sha1, timestamp, 4);
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, connection->method, strlen(connection->method));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, password, strlen(password));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, connection->url, strlen(connection->url));
+  gcry_md_write(sha1, ":", 1);
+  gcry_md_write(sha1, realm, strlen(realm));
+  gcry_md_final(sha1);
+  
+  tmpnonce = gcry_md_read(sha1, GCRY_MD_SHA1);
+  
+  cvthex(timestamp, 4, timestamphex);
+  cvthex(tmpnonce, HASH_SHA1_LEN, nonce);
+  strncat(nonce, timestamphex, 8);
+  gcry_md_close(sha1);
+  
+  /*
+   * Building the authentication header
+   */
+  hlen = snprintf(NULL,
+                 0,
+                 "Digest 
realm=\"%s\",qop=\"auth\",nonce=\"%s\",opaque=\"%s\"%s",
+                 realm, 
+                 nonce,
+                 opaque,
+                 signal_stale ? ",stale=true" : "");
+  {
+    char header[hlen + 1];
+    snprintf(header,
+            sizeof(header),
+            "Digest realm=\"%s\",qop=\"auth\",nonce=\"%s\",opaque=\"%s\"%s",
+            realm, 
+            nonce,
+            opaque,
+            signal_stale ? ",stale=true" : "");
+    ret = MHD_add_response_header(response,
+                                 MHD_HTTP_HEADER_WWW_AUTHENTICATE, 
+                                 header);
+  }
+  if(!ret) 
+    {
+      MHD_destroy_response(response);
+      return MHD_NO;
+    }
+  
+  ret = MHD_queue_response(connection, MHD_HTTP_UNAUTHORIZED, response);
+  
+  MHD_destroy_response(response);
+  
+  return ret;
 }
 
 /* end of digestauth.c */




reply via email to

[Prev in Thread] Current Thread [Next in Thread]