15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/string_util.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/net_errors.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/test_completion_callback.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "net/http/http_auth_challenge_tokenizer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_auth_handler_digest.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/http/http_request_info.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char* const kSimpleChallenge =
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  "Digest realm=\"Oblivion\", nonce=\"nonce-value\"";
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RespondToChallenge creates an HttpAuthHandlerDigest for the specified
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |challenge|, and generates a response to the challenge which is returned in
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |token|.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The return value indicates whether the |token| was successfully created.
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// If |target| is HttpAuth::AUTH_PROXY, then |proxy_name| specifies the source
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of the |challenge|. Otherwise, the scheme and host and port of |request_url|
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// indicates the origin of the challenge.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RespondToChallenge(HttpAuth::Target target,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& proxy_name,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& request_url,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::string& challenge,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        std::string* token) {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Input validation.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (token == NULL) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE() << "|token| must be non-NULL";
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(target != HttpAuth::AUTH_PROXY || !proxy_name.empty());
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(request_url.empty());
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(challenge.empty());
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  token->clear();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerDigest::Factory());
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HttpAuthHandlerDigest::NonceGenerator* nonce_generator =
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerDigest::FixedNonceGenerator("client_nonce");
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  factory->set_nonce_generator(nonce_generator);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandler> handler;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a handler for a particular challenge.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url_origin(target == HttpAuth::AUTH_SERVER ? request_url : proxy_name);
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv_create = factory->CreateAuthHandlerFromString(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    challenge, target, url_origin.GetOrigin(), BoundNetLog(), &handler);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv_create != OK || handler.get() == NULL) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE() << "Unable to create auth handler.";
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a token in response to the challenge.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: HttpAuthHandlerDigest's implementation of GenerateAuthToken always
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // completes synchronously. That's why this test can get away with a
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TestCompletionCallback without an IO thread.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestCompletionCallback callback;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpRequestInfo> request(new HttpRequestInfo());
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  request->url = GURL(request_url);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  AuthCredentials credentials(base::ASCIIToUTF16("foo"),
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              base::ASCIIToUTF16("bar"));
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv_generate = handler->GenerateAuthToken(
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &credentials, request.get(), callback.callback(), token);
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (rv_generate != OK) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ADD_FAILURE() << "Problems generating auth token";
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigestTest, ParseChallenge) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const struct {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The challenge string.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* challenge;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Expected return value of ParseChallenge.
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool parsed_success;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The expected values that were parsed.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* parsed_realm;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* parsed_nonce;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* parsed_domain;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* parsed_opaque;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool parsed_stale;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parsed_algorithm;
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int parsed_qop;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Check that a minimal challenge works correctly.
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\"",
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Realm does not need to be quoted, even though RFC2617 requires it.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=ThunderBluff",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ThunderBluff",
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // We allow the realm to be omitted, and will default it to empty string.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // See http://crbug.com/20984.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\"",
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Try with realm set to empty string.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"\", nonce=\"xyz\"",
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Handle ISO-8859-1 character as part of the realm. The realm is converted
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // to UTF-8. However, the credentials will still use the original encoding.
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"foo-\xE5\"",
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foo-\xC3\xA5",
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // At a minimum, a nonce must be provided.
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Thunder Bluff\"",
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // The nonce does not need to be quoted, even though RFC2617
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // requires it.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=xyz, realm=\"Thunder Bluff\"",
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Unknown authentication parameters are ignored.
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", foo=\"bar\"",
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Check that when algorithm has an unsupported value, parsing fails.
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", algorithm=\"awezum\", realm=\"Thunder\"",
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The remaining values don't matter (but some have been set already).
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Check that algorithm's value is case insensitive, and that MD5 is
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // a supported algorithm.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", algorithm=\"mD5\", realm=\"Oblivion\"",
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_MD5,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Check that md5-sess is a supported algorithm.
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", algorithm=\"md5-sess\", realm=\"Oblivion\"",
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_MD5_SESS,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED,
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Check that qop's value is case insensitive, and that auth is known.
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"aUth\"",
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_AUTH
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // auth-int is not handled, but will fall back to default qop.
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth-int\"",
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Unknown qop values are ignored.
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth,foo\"",
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_AUTH
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // If auth-int is included with auth, then use auth.
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Oblivion\", qop=\"auth,auth-int\"",
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Oblivion",
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_AUTH
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Opaque parameter parsing should work correctly.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", opaque=\"foobar\"",
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foobar",
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Opaque parameters do not need to be quoted, even though RFC2617
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // seems to require it.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", opaque=foobar",
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foobar",
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Domain can be parsed.
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", "
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "domain=\"http://intranet.example.com/protection\"",
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://intranet.example.com/protection",
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // Multiple domains can be parsed.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest nonce=\"xyz\", realm=\"Thunder Bluff\", "
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "domain=\"http://intranet.example.com/protection http://www.google.com\"",
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Thunder Bluff",
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xyz",
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://intranet.example.com/protection http://www.google.com",
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // If a non-Digest scheme is somehow passed in, it should be rejected.
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Basic realm=\"foo\"",
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "",
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      false,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::ALGORITHM_UNSPECIFIED,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuthHandlerDigest::QOP_UNSPECIFIED
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin("http://www.example.com");
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerDigest::Factory());
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<HttpAuthHandler> handler;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv = factory->CreateAuthHandlerFromString(tests[i].challenge,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  HttpAuth::AUTH_SERVER,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  origin,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  BoundNetLog(),
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &handler);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (tests[i].parsed_success) {
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(OK, rv);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else {
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(OK, rv);
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_TRUE(handler.get() == NULL);
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      continue;
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(handler.get() != NULL);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpAuthHandlerDigest* digest =
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<HttpAuthHandlerDigest*>(handler.get());
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(tests[i].parsed_realm, digest->realm_.c_str());
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(tests[i].parsed_nonce, digest->nonce_.c_str());
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(tests[i].parsed_domain, digest->domain_.c_str());
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(tests[i].parsed_opaque, digest->opaque_.c_str());
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].parsed_stale, digest->stale_);
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].parsed_algorithm, digest->algorithm_);
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(tests[i].parsed_qop, digest->qop_);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler->encrypts_identity());
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(handler->is_connection_based());
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(handler->NeedsIdentity());
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(handler->AllowsDefaultCredentials());
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigestTest, AssembleCredentials) {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const struct {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* req_method;
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* req_path;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* challenge;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* username;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* password;
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* cnonce;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nonce_count;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char* expected_creds;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } tests[] = {
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // MD5 with username/password
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/test/drealm1",
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"DRealm1\", "
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\", "
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "algorithm=MD5, qop=\"auth\"",
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foo", "bar", // username/password
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "082c875dcb2ca740", // cnonce
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"foo\", realm=\"DRealm1\", "
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"claGgoRXBAA=7583377687842fdb7b56ba0555d175baa0b800e3\", "
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "uri=\"/test/drealm1\", algorithm=MD5, "
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"bcfaa62f1186a31ff1b474a19a17cf57\", "
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=auth, nc=00000001, cnonce=\"082c875dcb2ca740\""
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // MD5 with username but empty password. username has space in it.
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/test/drealm1/",
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"DRealm1\", "
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"Ure30oRXBAA=7eca98bbf521ac6642820b11b86bd2d9ed7edc70\", "
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "algorithm=MD5, qop=\"auth\"",
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "foo bar", "", // Username/password
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "082c875dcb2ca740", // cnonce
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"foo bar\", realm=\"DRealm1\", "
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"Ure30oRXBAA=7eca98bbf521ac6642820b11b86bd2d9ed7edc70\", "
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "uri=\"/test/drealm1/\", algorithm=MD5, "
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"93c9c6d5930af3b0eb26c745e02b04a0\", "
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=auth, nc=00000001, cnonce=\"082c875dcb2ca740\""
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // MD5 with no username.
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/test/drealm1/",
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"DRealm1\", "
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"7thGplhaBAA=41fb92453c49799cf353c8cd0aabee02d61a98a8\", "
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "algorithm=MD5, qop=\"auth\"",
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "", "pass", // Username/password
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "6509bc74daed8263", // cnonce
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"\", realm=\"DRealm1\", "
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"7thGplhaBAA=41fb92453c49799cf353c8cd0aabee02d61a98a8\", "
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "uri=\"/test/drealm1/\", algorithm=MD5, "
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"bc597110f41a62d07f8b70b6977fcb61\", "
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=auth, nc=00000001, cnonce=\"6509bc74daed8263\""
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // MD5 with no username and no password.
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/test/drealm1/",
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"DRealm1\", "
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"s3MzvFhaBAA=4c520af5acd9d8d7ae26947529d18c8eae1e98f4\", "
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "algorithm=MD5, qop=\"auth\"",
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "", "", // Username/password
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "1522e61005789929", // cnonce
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"\", realm=\"DRealm1\", "
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"s3MzvFhaBAA=4c520af5acd9d8d7ae26947529d18c8eae1e98f4\", "
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "uri=\"/test/drealm1/\", algorithm=MD5, "
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"22cfa2b30cb500a9591c6d55ec5590a8\", "
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=auth, nc=00000001, cnonce=\"1522e61005789929\""
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // No algorithm, and no qop.
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/",
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Oblivion\", nonce=\"nonce-value\"",
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "FooBar", "pass", // Username/password
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "", // cnonce
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"FooBar\", realm=\"Oblivion\", "
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"nonce-value\", uri=\"/\", "
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"f72ff54ebde2f928860f806ec04acd1b\""
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    },
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    { // MD5-sess
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "GET",
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "/",
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Challenge
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Baztastic\", nonce=\"AAAAAAAA\", "
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "algorithm=\"md5-sess\", qop=auth",
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "USER", "123", // Username/password
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "15c07961ed8575c4", // cnonce
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      1, // nc
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Authorization
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest username=\"USER\", realm=\"Baztastic\", "
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "nonce=\"AAAAAAAA\", uri=\"/\", algorithm=MD5-sess, "
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "response=\"cbc1139821ee7192069580570c541a03\", "
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=auth, nc=00000001, cnonce=\"15c07961ed8575c4\""
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin("http://www.example.com");
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerDigest::Factory());
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) {
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    scoped_ptr<HttpAuthHandler> handler;
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int rv = factory->CreateAuthHandlerFromString(tests[i].challenge,
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  HttpAuth::AUTH_SERVER,
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  origin,
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  BoundNetLog(),
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  &handler);
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(OK, rv);
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_TRUE(handler != NULL);
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HttpAuthHandlerDigest* digest =
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<HttpAuthHandlerDigest*>(handler.get());
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string creds =
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        digest->AssembleCredentials(tests[i].req_method,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].req_path,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    AuthCredentials(
5355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        base::ASCIIToUTF16(tests[i].username),
5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        base::ASCIIToUTF16(tests[i].password)),
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].cnonce,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    tests[i].nonce_count);
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_STREQ(tests[i].expected_creds, creds.c_str());
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, HandleAnotherChallenge) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandlerDigest::Factory> factory(
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new HttpAuthHandlerDigest::Factory());
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<HttpAuthHandler> handler;
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string default_challenge =
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Oblivion\", nonce=\"nonce-value\"";
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL origin("intranet.google.com");
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rv = factory->CreateAuthHandlerFromString(
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default_challenge, HttpAuth::AUTH_SERVER, origin, BoundNetLog(),
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &handler);
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(OK, rv);
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(handler.get() != NULL);
556a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HttpAuthChallengeTokenizer tok_default(default_challenge.begin(),
557a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                         default_challenge.end());
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT,
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler->HandleAnotherChallenge(&tok_default));
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string stale_challenge = default_challenge + ", stale=true";
562a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HttpAuthChallengeTokenizer tok_stale(stale_challenge.begin(),
563a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                       stale_challenge.end());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_STALE,
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler->HandleAnotherChallenge(&tok_stale));
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string stale_false_challenge = default_challenge + ", stale=false";
568a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HttpAuthChallengeTokenizer tok_stale_false(stale_false_challenge.begin(),
569a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                             stale_false_challenge.end());
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_REJECT,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler->HandleAnotherChallenge(&tok_stale_false));
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string realm_change_challenge =
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"SomethingElse\", nonce=\"nonce-value2\"";
575a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  HttpAuthChallengeTokenizer tok_realm_change(realm_change_challenge.begin(),
576a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                              realm_change_challenge.end());
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(HttpAuth::AUTHORIZATION_RESULT_DIFFERENT_REALM,
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            handler->HandleAnotherChallenge(&tok_realm_change));
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToServerChallenge) {
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_SERVER,
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.example.com/path/to/resource",
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"6779f90bd0d658f937c1af967614fe84\"",
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToHttpsServerChallenge) {
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_SERVER,
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "https://www.example.com/path/to/resource",
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"6779f90bd0d658f937c1af967614fe84\"",
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToProxyChallenge) {
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_PROXY,
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://proxy.intranet.corp.com:3128",
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.example.com/path/to/resource",
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
6195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"6779f90bd0d658f937c1af967614fe84\"",
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToProxyChallengeHttps) {
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_PROXY,
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://proxy.intranet.corp.com:3128",
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "https://www.example.com/path/to/resource",
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"www.example.com:443\", "
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"3270da8467afbe9ddf2334a48d46e9b9\"",
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToProxyChallengeWs) {
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_PROXY,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://proxy.intranet.corp.com:3128",
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ws://www.example.com/echo",
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"www.example.com:80\", "
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"aa1df184f68d5b6ab9d9aa4f88e41b4c\"",
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToProxyChallengeWss) {
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_PROXY,
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://proxy.intranet.corp.com:3128",
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "wss://www.example.com/echo",
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      kSimpleChallenge,
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"www.example.com:443\", "
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"3270da8467afbe9ddf2334a48d46e9b9\"",
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToChallengeAuthQop) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_SERVER,
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.example.com/path/to/resource",
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Oblivion\", nonce=\"nonce-value\", qop=\"auth\"",
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", "
6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "qop=auth, nc=00000001, cnonce=\"client_nonce\"",
6775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(HttpAuthHandlerDigest, RespondToChallengeOpaque) {
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string auth_token;
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(RespondToChallenge(
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      HttpAuth::AUTH_SERVER,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::string(),
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "http://www.example.com/path/to/resource",
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Digest realm=\"Oblivion\", nonce=\"nonce-value\", "
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "qop=\"auth\", opaque=\"opaque text\"",
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      &auth_token));
6895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("Digest username=\"foo\", realm=\"Oblivion\", "
6905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "nonce=\"nonce-value\", uri=\"/path/to/resource\", "
6915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "response=\"5b1459beda5cee30d6ff9e970a69c0ea\", "
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "opaque=\"opaque text\", "
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            "qop=auth, nc=00000001, cnonce=\"client_nonce\"",
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            auth_token);
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net
699