Fix bugs in the digest handling.
authorJuho Vähä-Herttua <juhovh@iki.fi>
Tue, 20 Mar 2012 20:00:14 +0000 (22:00 +0200)
committerJuho Vähä-Herttua <juhovh@iki.fi>
Wed, 16 May 2012 21:33:32 +0000 (00:33 +0300)
src/lib/digest.c
src/lib/digest.h
src/lib/raop.c

index 132f27e33b2f7c9aa0db3f7541f893b5d6b921fc..78c916ea51dd03e94575fb53db00abc7bc4e69ee 100644 (file)
@@ -73,14 +73,14 @@ digest_generate_nonce(char *result, int resultlen)
        MD5_Final(md5buf, &md5ctx);
        digest_md5_to_hex(md5buf, md5hex);
 
+       memset(result, 0, resultlen);
        strncpy(result, md5hex, resultlen-1);
-       result[resultlen-1] = '\0';
 }
 
 int
 digest_is_valid(const char *our_realm, const char *password,
                 const char *our_nonce, const char *method,
-                const char *authorization)
+                const char *our_uri, const char *authorization)
 {
        char *auth;
        char *current;
@@ -140,6 +140,13 @@ digest_is_valid(const char *our_realm, const char *password,
                        response = first+10;
        }
 
+       if (!username || !realm || !nonce || !uri || !response) {
+               return 0;
+       }
+       if (strcmp(realm, our_realm) || strcmp(nonce, our_nonce) || strcmp(uri, our_uri)) {
+               return 0;
+       }
+
        /* Calculate our response */
        memset(our_response, 0, sizeof(our_response));
        digest_get_response(username, realm, password, nonce,
index f4b46e7212cb1645b02610837df89ecff800d56d..aa52afba0121cb4ea669a8edf89e2ce67b0a73b4 100644 (file)
@@ -4,6 +4,6 @@
 void digest_generate_nonce(char *result, int resultlen);
 int digest_is_valid(const char *our_realm, const char *password,
                     const char *our_nonce, const char *method,
-                    const char *authorization);
+                    const char *our_uri, const char *authorization);
 
 #endif
index 9aafe65b18ef654e01303b7060e96629862cbae3..1994ed373e833d18399ab079ac0fddcad17a29aa 100644 (file)
@@ -36,7 +36,7 @@
 #define MAX_PASSWORD_LEN 64
 
 /* MD5 as hex fits here */
-#define MAX_NONCE_LEN 33
+#define MAX_NONCE_LEN 32
 
 struct raop_s {
        /* Callbacks for audio */
@@ -143,9 +143,10 @@ conn_request(void *ptr, http_request_t *request, http_response_t **response)
 
                authorization = http_request_get_header(request, "Authorization");
                if (authorization) {
+                       logger_log(&conn->raop->logger, LOGGER_DEBUG, "Our nonce: %s\n", conn->nonce);
                        logger_log(&conn->raop->logger, LOGGER_DEBUG, "Authorization: %s\n", authorization);
                }
-               if (!digest_is_valid("AppleTV", raop->password, conn->nonce, method, authorization)) {
+               if (!digest_is_valid("AppleTV", raop->password, conn->nonce, method, http_request_get_url(request), authorization)) {
                        char *authstr;
                        int authstrlen;