diff options
Diffstat (limited to 'net/base')
49 files changed, 5511 insertions, 462 deletions
diff --git a/net/base/cert_database.h b/net/base/cert_database.h index 377c0a8..7915cc6 100644 --- a/net/base/cert_database.h +++ b/net/base/cert_database.h @@ -67,7 +67,7 @@ class CertDatabase { // the platform cert database, or possibly other network error codes. int AddUserCert(X509Certificate* cert); -#if defined(USE_NSS) +#if defined(USE_NSS) || defined(USE_OPENSSL) // Get a list of unique certificates in the certificate database. (One // instance of all certificates.) void ListCerts(CertificateList* certs); @@ -124,6 +124,9 @@ class CertDatabase { // Returns true on success or false on failure. // |cert| is still valid when this function returns. bool DeleteCertAndKey(const X509Certificate* cert); + + // Check whether cert is stored in a readonly slot. + bool IsReadOnly(const X509Certificate* cert) const; #endif private: diff --git a/net/base/cert_database_nss.cc b/net/base/cert_database_nss.cc index 8445d4d..a32a7a3 100644 --- a/net/base/cert_database_nss.cc +++ b/net/base/cert_database_nss.cc @@ -168,7 +168,6 @@ unsigned int CertDatabase::GetCertTrust( trust.HasTrustedCA(PR_FALSE, PR_TRUE, PR_FALSE) * TRUSTED_EMAIL + trust.HasTrustedCA(PR_FALSE, PR_FALSE, PR_TRUE) * TRUSTED_OBJ_SIGN; case SERVER_CERT: - case EMAIL_CERT: return trust.HasTrustedPeer(PR_TRUE, PR_FALSE, PR_FALSE) * TRUSTED_SSL + trust.HasTrustedPeer(PR_FALSE, PR_TRUE, PR_FALSE) * TRUSTED_EMAIL + trust.HasTrustedPeer(PR_FALSE, PR_FALSE, PR_TRUE) * TRUSTED_OBJ_SIGN; @@ -205,4 +204,9 @@ bool CertDatabase::DeleteCertAndKey(const X509Certificate* cert) { return true; } +bool CertDatabase::IsReadOnly(const X509Certificate* cert) const { + PK11SlotInfo* slot = cert->os_cert_handle()->slot; + return slot && PK11_IsReadOnly(slot); +} + } // namespace net diff --git a/net/base/cert_test_util.cc b/net/base/cert_test_util.cc index cb7f9a8..1042d50 100644 --- a/net/base/cert_test_util.cc +++ b/net/base/cert_test_util.cc @@ -26,9 +26,27 @@ namespace net { #if defined(USE_OPENSSL) -X509Certificate* LoadTemporaryRootCert(const FilePath& filename) { +X509Certificate* AddTemporaryRootCertToStore(X509* x509_cert) { OpenSSLInitSingleton* openssl_init = GetOpenSSLInitSingleton(); + if (!X509_STORE_add_cert(openssl_init->x509_store(), x509_cert)) { + unsigned long error_code = ERR_get_error(); + if (ERR_GET_LIB(error_code) != ERR_LIB_X509 || + ERR_GET_REASON(error_code) != X509_R_CERT_ALREADY_IN_HASH_TABLE) { + do { + LOG(ERROR) << "X509_STORE_add_cert error: " << error_code; + } while ((error_code = ERR_get_error()) != 0); + return NULL; + } + } + return X509Certificate::CreateFromHandle( + x509_cert, X509Certificate::SOURCE_LONE_CERT_IMPORT, + X509Certificate::OSCertHandles()); +} + +X509Certificate* LoadTemporaryRootCert(const FilePath& filename) { + EnsureOpenSSLInit(); + std::string rawcert; if (!file_util::ReadFileToString(filename, &rawcert)) { LOG(ERROR) << "Can't load certificate " << filename.value(); @@ -43,27 +61,21 @@ X509Certificate* LoadTemporaryRootCert(const FilePath& filename) { return NULL; } - ScopedSSL<X509, X509_free> x509_cert(PEM_read_bio_X509(cert_bio.get(), - NULL, NULL, NULL)); - if (!x509_cert.get()) { - LOG(ERROR) << "Can't parse certificate " << filename.value(); - return NULL; - } - - if (!X509_STORE_add_cert(openssl_init->x509_store(), x509_cert.get())) { - unsigned long error_code = ERR_get_error(); - if (ERR_GET_LIB(error_code) != ERR_LIB_X509 || - ERR_GET_REASON(error_code) != X509_R_CERT_ALREADY_IN_HASH_TABLE) { - do { - LOG(ERROR) << "X509_STORE_add_cert error: " << error_code; - } while ((error_code = ERR_get_error()) != 0); - return NULL; - } - } - - return X509Certificate::CreateFromHandle( - x509_cert.get(), X509Certificate::SOURCE_LONE_CERT_IMPORT, - X509Certificate::OSCertHandles()); + ScopedSSL<X509, X509_free> pem_cert(PEM_read_bio_X509(cert_bio.get(), + NULL, NULL, NULL)); + if (pem_cert.get()) + return AddTemporaryRootCertToStore(pem_cert.get()); + + // File does not contain PEM data, let's try DER. + const unsigned char* der_data = + reinterpret_cast<const unsigned char*>(rawcert.c_str()); + int der_length = rawcert.length(); + ScopedSSL<X509, X509_free> der_cert(d2i_X509(NULL, &der_data, der_length)); + if (der_cert.get()) + return AddTemporaryRootCertToStore(der_cert.get()); + + LOG(ERROR) << "Can't parse certificate " << filename.value(); + return NULL; } #elif defined(USE_NSS) X509Certificate* LoadTemporaryRootCert(const FilePath& filename) { diff --git a/net/base/cert_test_util.h b/net/base/cert_test_util.h index 45c8ed3..8709156 100644 --- a/net/base/cert_test_util.h +++ b/net/base/cert_test_util.h @@ -14,7 +14,7 @@ namespace net { class X509Certificate; -#if defined(USE_NSS) || defined(OS_MACOSX) +#if defined(USE_NSS) || defined(OS_MACOSX) || defined(USE_OPENSSL) // Loads and trusts a root CA certificate (stored in a file) temporarily. // TODO(wtc): Implement this function on Windows (http://crbug.com/8470). X509Certificate* LoadTemporaryRootCert(const FilePath& filename); diff --git a/net/base/cert_type.h b/net/base/cert_type.h index fbe4339..d9cb8a5 100644 --- a/net/base/cert_type.h +++ b/net/base/cert_type.h @@ -11,16 +11,14 @@ namespace net { // This is only used in the context of CertDatabase, but is defined outside to // avoid an awkwardly long type name. // The type is a combination of intrinsic properties, such as the presense of an -// email address or Certificate Authority Basic Constraint, and assigned trust -// values. For example, a cert with no email address, basic constraints, or -// trust, would be classified as UNKNOWN_CERT. If that cert is then trusted -// with SetCertTrust(cert, SERVER_CERT, TRUSTED_SSL), it would become a -// SERVER_CERT. +// Certificate Authority Basic Constraint, and assigned trust values. For +// example, a cert with no basic constraints or trust would be classified as +// UNKNOWN_CERT. If that cert is then trusted with SetCertTrust(cert, +// SERVER_CERT, TRUSTED_SSL), it would become a SERVER_CERT. enum CertType { UNKNOWN_CERT, CA_CERT, USER_CERT, - EMAIL_CERT, SERVER_CERT, NUM_CERT_TYPES }; diff --git a/net/base/connection_type_histograms.h b/net/base/connection_type_histograms.h index e6c2a59..e3e4a84 100644 --- a/net/base/connection_type_histograms.h +++ b/net/base/connection_type_histograms.h @@ -30,6 +30,11 @@ enum ConnectionType { // in the certificate chain (excluding root) CONNECTION_HTTP = 7, // An HTTP connection CONNECTION_SPDY = 8, // A SPDY connection + CONNECTION_SSL_SSL2 = 9, // An SSL connection that uses SSL 2.0 + CONNECTION_SSL_SSL3 = 10, // An SSL connection that uses SSL 3.0 + CONNECTION_SSL_TLS1 = 11, // An SSL connection that uses TLS 1.0 + CONNECTION_SSL_TLS1_1 = 12, // An SSL connection that uses TLS 1.1 + CONNECTION_SSL_TLS1_2 = 13, // An SSL connection that uses TLS 1.2 NUM_OF_CONNECTION_TYPES }; diff --git a/net/base/cookie_monster.cc b/net/base/cookie_monster.cc index de00016..2fb8d0f 100644 --- a/net/base/cookie_monster.cc +++ b/net/base/cookie_monster.cc @@ -90,6 +90,13 @@ struct OrderByCreationTimeDesc { } }; +// Constants for use in VLOG +const int kVlogPerCookieMonster = 1; +const int kVlogPeriodic = 3; +const int kVlogGarbageCollection = 5; +const int kVlogSetCookies = 7; +const int kVlogGetCookies = 9; + } // namespace // static @@ -724,7 +731,8 @@ bool CookieMonster::HasCookieableScheme(const GURL& url) { } // The scheme didn't match any in our whitelist. - DVLOG(1) << "WARNING: Unsupported cookie scheme: " << url.scheme(); + VLOG(kVlogPerCookieMonster) << "WARNING: Unsupported cookie scheme: " + << url.scheme(); return false; } @@ -747,7 +755,7 @@ bool CookieMonster::SetCookieWithCreationTimeAndOptions( const CookieOptions& options) { lock_.AssertAcquired(); - DVLOG(1) << "SetCookie() line: " << cookie_line; + VLOG(kVlogSetCookies) << "SetCookie() line: " << cookie_line; Time creation_time = creation_time_or_null; if (creation_time.is_null()) { @@ -759,12 +767,12 @@ bool CookieMonster::SetCookieWithCreationTimeAndOptions( ParsedCookie pc(cookie_line); if (!pc.IsValid()) { - DVLOG(1) << "WARNING: Couldn't parse cookie"; + VLOG(kVlogSetCookies) << "WARNING: Couldn't parse cookie"; return false; } if (options.exclude_httponly() && pc.IsHttpOnly()) { - DVLOG(1) << "SetCookie() not setting httponly cookie"; + VLOG(kVlogSetCookies) << "SetCookie() not setting httponly cookie"; return false; } @@ -785,7 +793,7 @@ bool CookieMonster::SetCookieWithCreationTimeAndOptions( !cookie_expires.is_null(), cookie_expires)); if (!cc.get()) { - DVLOG(1) << "WARNING: Failed to allocate CanonicalCookie"; + VLOG(kVlogSetCookies) << "WARNING: Failed to allocate CanonicalCookie"; return false; } return SetCanonicalCookie(&cc, creation_time, options); @@ -839,11 +847,12 @@ bool CookieMonster::SetCanonicalCookie(scoped_ptr<CanonicalCookie>* cc, const CookieOptions& options) { const std::string key(GetKey((*cc)->Domain())); if (DeleteAnyEquivalentCookie(key, **cc, options.exclude_httponly())) { - DVLOG(1) << "SetCookie() not clobbering httponly cookie"; + VLOG(kVlogSetCookies) << "SetCookie() not clobbering httponly cookie"; return false; } - DVLOG(1) << "SetCookie() key: " << key << " cc: " << (*cc)->DebugString(); + VLOG(kVlogSetCookies) << "SetCookie() key: " << key << " cc: " + << (*cc)->DebugString(); // Realize that we might be setting an expired cookie, and the only point // was to delete the cookie which we've already done. @@ -906,7 +915,7 @@ void CookieMonster::InternalDeleteCookie(CookieMap::iterator it, histogram_cookie_deletion_cause_->Add(deletion_cause); CanonicalCookie* cc = it->second; - DVLOG(1) << "InternalDeleteCookie() cc: " << cc->DebugString(); + VLOG(kVlogSetCookies) << "InternalDeleteCookie() cc: " << cc->DebugString(); if (cc->IsPersistent() && store_ && sync_to_store) store_->DeleteCookie(*cc); @@ -973,7 +982,8 @@ static bool FindLeastRecentlyAccessed( std::vector<CookieMonster::CookieMap::iterator>* cookie_its) { DCHECK_LE(num_purge, num_max); if (cookie_its->size() > num_max) { - DVLOG(1) << "FindLeastRecentlyAccessed() Deep Garbage Collect."; + VLOG(kVlogGarbageCollection) + << "FindLeastRecentlyAccessed() Deep Garbage Collect."; num_purge += cookie_its->size() - num_max; DCHECK_GT(cookie_its->size(), num_purge); @@ -1020,7 +1030,7 @@ int CookieMonster::GarbageCollect(const Time& current, // Collect garbage for this key. if (cookies_.count(key) > kDomainMaxCookies) { - DVLOG(1) << "GarbageCollect() key: " << key; + VLOG(kVlogGarbageCollection) << "GarbageCollect() key: " << key; std::vector<CookieMap::iterator> cookie_its; num_deleted += GarbageCollectExpired( @@ -1056,7 +1066,7 @@ int CookieMonster::GarbageCollect(const Time& current, (expiry_and_key_scheme_ == EKS_DISCARD_RECENT_AND_PURGE_DOMAIN || earliest_access_time_ < Time::Now() - TimeDelta::FromDays(kSafeFromGlobalPurgeDays))) { - DVLOG(1) << "GarbageCollect() everything"; + VLOG(kVlogGarbageCollection) << "GarbageCollect() everything"; std::vector<CookieMap::iterator> cookie_its; base::Time oldest_left; num_deleted += GarbageCollectExpired( @@ -1067,7 +1077,7 @@ int CookieMonster::GarbageCollect(const Time& current, Time oldest_safe_cookie( expiry_and_key_scheme_ == EKS_KEEP_RECENT_AND_PURGE_ETLDP1 ? (Time::Now() - TimeDelta::FromDays(kSafeFromGlobalPurgeDays)) : - Time::Now()); + Time()); // Null time == ignore access time. int num_evicted = GarbageCollectDeleteList( current, oldest_safe_cookie, @@ -1259,7 +1269,7 @@ std::string CookieMonster::GetCookiesWithOptions(const GURL& url, histogram_time_get_->AddTime(TimeTicks::Now() - start_time); - DVLOG(1) << "GetCookies() result: " << cookie_line; + VLOG(kVlogGetCookies) << "GetCookies() result: " << cookie_line; return cookie_line; } @@ -1497,8 +1507,9 @@ void CookieMonster::RecordPeriodicStats(const base::Time& current_time) { it_key = its_cookies.second; } - DVLOG(1) << "Time for recording cookie stats (us): " - << (TimeTicks::Now() - beginning_of_time).InMicroseconds(); + VLOG(kVlogPeriodic) + << "Time for recording cookie stats (us): " + << (TimeTicks::Now() - beginning_of_time).InMicroseconds(); last_statistic_record_time_ = current_time; } diff --git a/net/base/cookie_monster_perftest.cc b/net/base/cookie_monster_perftest.cc index c006128..8c64d9a 100644 --- a/net/base/cookie_monster_perftest.cc +++ b/net/base/cookie_monster_perftest.cc @@ -283,10 +283,10 @@ TEST(CookieMonsterTest, TestGCTimes) { }; for (int ci = 0; ci < static_cast<int>(ARRAYSIZE_UNSAFE(test_cases)); ++ci) { const TestCase& test_case(test_cases[ci]); - scoped_refptr<CookieMonster> cm = + scoped_refptr<CookieMonster> cm( CreateMonsterFromStoreForGC( test_case.num_cookies, test_case.num_old_cookies, - CookieMonster::kSafeFromGlobalPurgeDays * 2); + CookieMonster::kSafeFromGlobalPurgeDays * 2)); GURL gurl("http://google.com"); std::string cookie_line("z=3"); diff --git a/net/base/cookie_monster_unittest.cc b/net/base/cookie_monster_unittest.cc index 80d58ed..751b255 100644 --- a/net/base/cookie_monster_unittest.cc +++ b/net/base/cookie_monster_unittest.cc @@ -1852,7 +1852,7 @@ TEST(CookieMonsterTest, BackingStoreCommunication) { // Create new cookies and flush them to the store. { - scoped_refptr<net::CookieMonster> cmout = new CookieMonster(store, NULL); + scoped_refptr<net::CookieMonster> cmout(new CookieMonster(store, NULL)); for (const CookiesInputInfo* p = input_info; p < &input_info[ARRAYSIZE_UNSAFE(input_info)]; p++) { EXPECT_TRUE(cmout->SetCookieWithDetails(GURL(p->gurl), p->name, p->value, @@ -1866,7 +1866,7 @@ TEST(CookieMonsterTest, BackingStoreCommunication) { // Create a new cookie monster and make sure that everything is correct { - scoped_refptr<net::CookieMonster> cmin = new CookieMonster(store, NULL); + scoped_refptr<net::CookieMonster> cmin(new CookieMonster(store, NULL)); CookieMonster::CookieList cookies(cmin->GetAllCookies()); ASSERT_EQ(2u, cookies.size()); // Ordering is path length, then creation time. So second cookie @@ -1895,7 +1895,7 @@ TEST(CookieMonsterTest, BackingStoreCommunication) { TEST(CookieMonsterTest, CookieOrdering) { // Put a random set of cookies into a monster and make sure // they're returned in the right order. - scoped_refptr<net::CookieMonster> cm = new CookieMonster(NULL, NULL); + scoped_refptr<net::CookieMonster> cm(new CookieMonster(NULL, NULL)); EXPECT_TRUE(cm->SetCookie(GURL("http://d.c.b.a.google.com/aa/x.html"), "c=1")); EXPECT_TRUE(cm->SetCookie(GURL("http://b.a.google.com/aa/bb/cc/x.html"), @@ -1953,13 +1953,12 @@ static net::CookieMonster* CreateMonsterForGC(int num_cookies) { // get rid of cookies when we should). The perftest is probing for // whether garbage collection happens when it shouldn't. See comments // before that test for more details. -// Flaky as per http://crbug.com/60015 -TEST(CookieMonsterTest, FLAKY_GarbageCollectionTriggers) { +TEST(CookieMonsterTest, GarbageCollectionTriggers) { // First we check to make sure that a whole lot of recent cookies // doesn't get rid of anything after garbage collection is checked for. { - scoped_refptr<net::CookieMonster> cm = - CreateMonsterForGC(CookieMonster::kMaxCookies * 2); + scoped_refptr<net::CookieMonster> cm( + CreateMonsterForGC(CookieMonster::kMaxCookies * 2)); EXPECT_EQ(CookieMonster::kMaxCookies * 2, cm->GetAllCookies().size()); cm->SetCookie(GURL("http://newdomain.com"), "b=2"); EXPECT_EQ(CookieMonster::kMaxCookies * 2 + 1, cm->GetAllCookies().size()); @@ -2017,10 +2016,10 @@ TEST(CookieMonsterTest, FLAKY_GarbageCollectionTriggers) { recent_scheme < static_cast<int>(ARRAYSIZE_UNSAFE(schemes)); recent_scheme++) { const TestCase *test_case = &test_cases[ci]; - scoped_refptr<net::CookieMonster> cm = + scoped_refptr<net::CookieMonster> cm( CreateMonsterFromStoreForGC( test_case->num_cookies, test_case->num_old_cookies, - CookieMonster::kSafeFromGlobalPurgeDays * 2); + CookieMonster::kSafeFromGlobalPurgeDays * 2)); cm->SetExpiryAndKeyScheme(schemes[recent_scheme]); EXPECT_EQ(test_case->expected_initial_cookies, static_cast<int>(cm->GetAllCookies().size())) diff --git a/net/base/directory_lister_unittest.cc b/net/base/directory_lister_unittest.cc index f75d8d8..5607bc5 100644 --- a/net/base/directory_lister_unittest.cc +++ b/net/base/directory_lister_unittest.cc @@ -77,8 +77,8 @@ TEST(DirectoryListerTest, BigDirTest) { ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); ListerDelegate delegate(false); - scoped_refptr<net::DirectoryLister> lister = - new net::DirectoryLister(path, &delegate); + scoped_refptr<net::DirectoryLister> lister( + new net::DirectoryLister(path, &delegate)); lister->Start(); @@ -92,11 +92,11 @@ TEST(DirectoryListerTest, BigDirRecursiveTest) { ASSERT_TRUE(PathService::Get(base::DIR_EXE, &path)); ListerDelegate delegate(true); - scoped_refptr<net::DirectoryLister> lister = + scoped_refptr<net::DirectoryLister> lister( new net::DirectoryLister(path, true, net::DirectoryLister::FULL_PATH, - &delegate); + &delegate)); lister->Start(); @@ -110,8 +110,8 @@ TEST(DirectoryListerTest, CancelTest) { ASSERT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &path)); ListerDelegate delegate(false); - scoped_refptr<net::DirectoryLister> lister = - new net::DirectoryLister(path, &delegate); + scoped_refptr<net::DirectoryLister> lister( + new net::DirectoryLister(path, &delegate)); lister->Start(); lister->Cancel(); diff --git a/net/base/ev_root_ca_metadata.cc b/net/base/ev_root_ca_metadata.cc index 7c1c96a..7de971b 100644 --- a/net/base/ev_root_ca_metadata.cc +++ b/net/base/ev_root_ca_metadata.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -9,6 +9,8 @@ #include <pkcs11n.h> #include <secerr.h> #include <secoid.h> +#elif defined(OS_WIN) +#include <stdlib.h> #endif #include "base/logging.h" @@ -251,6 +253,36 @@ static const EVMetadata ev_root_ca_metadata[] = { } }; +#if defined(OS_WIN) +// static +const EVRootCAMetadata::PolicyOID EVRootCAMetadata::policy_oids_[] = { + // The OIDs must be sorted in ascending order. + "1.2.392.200091.100.721.1", + "1.3.6.1.4.1.14370.1.6", + "1.3.6.1.4.1.22234.2.5.2.3.1", + "1.3.6.1.4.1.23223.1.1.1", + "1.3.6.1.4.1.34697.2.1", + "1.3.6.1.4.1.34697.2.2", + "1.3.6.1.4.1.34697.2.3", + "1.3.6.1.4.1.34697.2.4", + "1.3.6.1.4.1.4146.1.1", + "1.3.6.1.4.1.6334.1.100.1", + "1.3.6.1.4.1.6449.1.2.1.5.1", + "1.3.6.1.4.1.782.1.2.1.8.1", + "1.3.6.1.4.1.8024.0.2.100.1.2", + "2.16.528.1.1001.1.1.1.12.6.1.1.1", + "2.16.756.1.89.1.2.1.1", + "2.16.840.1.113733.1.7.23.6", + "2.16.840.1.113733.1.7.48.1", + "2.16.840.1.114028.10.1.2", + "2.16.840.1.114171.500.9", + "2.16.840.1.114404.1.1.2.4.1", + "2.16.840.1.114412.2.1", + "2.16.840.1.114413.1.7.23.3", + "2.16.840.1.114414.1.7.23.3", +}; +#endif + // static EVRootCAMetadata* EVRootCAMetadata::GetInstance() { return Singleton<EVRootCAMetadata>::get(); @@ -266,6 +298,35 @@ bool EVRootCAMetadata::GetPolicyOID( return true; } +#if defined(OS_WIN) +static int PolicyOIDCmp(const void* keyval, const void* datum) { + const char* oid1 = reinterpret_cast<const char*>(keyval); + const char* const* oid2 = reinterpret_cast<const char* const*>(datum); + return strcmp(oid1, *oid2); +} + +bool EVRootCAMetadata::IsEVPolicyOID(PolicyOID policy_oid) const { + return bsearch(policy_oid, &policy_oids_[0], num_policy_oids_, + sizeof(PolicyOID), PolicyOIDCmp) != NULL; +} +#else +bool EVRootCAMetadata::IsEVPolicyOID(PolicyOID policy_oid) const { + for (size_t i = 0; i < policy_oids_.size(); ++i) { + if (PolicyOIDsAreEqual(policy_oid, policy_oids_[i])) + return true; + } + return false; +} +#endif + +bool EVRootCAMetadata::HasEVPolicyOID(const SHA1Fingerprint& fingerprint, + PolicyOID policy_oid) const { + PolicyOID ev_policy_oid; + if (!GetPolicyOID(fingerprint, &ev_policy_oid)) + return false; + return PolicyOIDsAreEqual(ev_policy_oid, policy_oid); +} + EVRootCAMetadata::EVRootCAMetadata() { // Constructs the object from the raw metadata in ev_root_ca_metadata. #if defined(USE_NSS) @@ -293,6 +354,18 @@ EVRootCAMetadata::EVRootCAMetadata() { ev_policy_[metadata.fingerprint] = policy; policy_oids_.push_back(policy); } +#elif defined(OS_WIN) + num_policy_oids_ = arraysize(policy_oids_); + // Verify policy_oids_ is in ascending order. + for (int i = 0; i < num_policy_oids_ - 1; i++) + CHECK(strcmp(policy_oids_[i], policy_oids_[i + 1]) < 0); + + for (size_t i = 0; i < arraysize(ev_root_ca_metadata); i++) { + const EVMetadata& metadata = ev_root_ca_metadata[i]; + ev_policy_[metadata.fingerprint] = metadata.policy_oid; + // Verify policy_oids_ contains every EV policy OID. + DCHECK(IsEVPolicyOID(metadata.policy_oid)); + } #else for (size_t i = 0; i < arraysize(ev_root_ca_metadata); i++) { const EVMetadata& metadata = ev_root_ca_metadata[i]; @@ -308,4 +381,13 @@ EVRootCAMetadata::EVRootCAMetadata() { EVRootCAMetadata::~EVRootCAMetadata() { } +// static +bool EVRootCAMetadata::PolicyOIDsAreEqual(PolicyOID a, PolicyOID b) { +#if defined(USE_NSS) + return a == b; +#else + return !strcmp(a, b); +#endif +} + } // namespace net diff --git a/net/base/ev_root_ca_metadata.h b/net/base/ev_root_ca_metadata.h index e9e8130..e0961f3 100644 --- a/net/base/ev_root_ca_metadata.h +++ b/net/base/ev_root_ca_metadata.h @@ -1,4 +1,4 @@ -// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Copyright (c) 2010 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -40,21 +40,40 @@ class EVRootCAMetadata { PolicyOID* policy_oid) const; const PolicyOID* GetPolicyOIDs() const { return &policy_oids_[0]; } +#if defined(OS_WIN) + int NumPolicyOIDs() const { return num_policy_oids_; } +#else int NumPolicyOIDs() const { return policy_oids_.size(); } +#endif - private: - EVRootCAMetadata(); - ~EVRootCAMetadata(); + // Returns true if policy_oid is an EV policy OID of some root CA. + bool IsEVPolicyOID(PolicyOID policy_oid) const; + + // Returns true if the root CA with the given certificate fingerprint has + // the EV policy OID policy_oid. + bool HasEVPolicyOID(const SHA1Fingerprint& fingerprint, + PolicyOID policy_oid) const; + private: friend struct DefaultSingletonTraits<EVRootCAMetadata>; typedef std::map<SHA1Fingerprint, PolicyOID, SHA1FingerprintLessThan> PolicyOidMap; + EVRootCAMetadata(); + ~EVRootCAMetadata(); + + static bool PolicyOIDsAreEqual(PolicyOID a, PolicyOID b); + // Maps an EV root CA cert's SHA-1 fingerprint to its EV policy OID. PolicyOidMap ev_policy_; +#if defined(OS_WIN) + static const PolicyOID policy_oids_[]; + int num_policy_oids_; +#else std::vector<PolicyOID> policy_oids_; +#endif DISALLOW_COPY_AND_ASSIGN(EVRootCAMetadata); }; diff --git a/net/base/host_resolver.h b/net/base/host_resolver.h index 2fb7067..471ad8a 100644 --- a/net/base/host_resolver.h +++ b/net/base/host_resolver.h @@ -20,6 +20,7 @@ namespace net { class AddressList; class BoundNetLog; class HostResolverImpl; +class HostResolverProc; class NetLog; // This class represents the task of resolving hostnames (or IP address @@ -230,13 +231,13 @@ class SingleRequestHostResolver { DISALLOW_COPY_AND_ASSIGN(SingleRequestHostResolver); }; -// Creates a HostResolver implementation that queries the underlying system. -// (Except if a unit-test has changed the global HostResolverProc using -// ScopedHostResolverProc to intercept requests to the system). -// |max_concurrent_resolves| is how many resolve requests will be allowed to -// run in parallel. Pass HostResolver::kDefaultParallelism to choose a -// default value. +// Creates a HostResolver implementation using |resolver_proc| as resolver, +// (which if NULL, will default to getaddrinfo() wrapper) that queries the +// underlying system, |max_concurrent_resolves| is how many resolve +// requests will be allowed to run in parallel. Pass +// HostResolver::kDefaultParallelism to choose a default value. HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, + HostResolverProc* resolver_proc, NetLog* net_log); } // namespace net diff --git a/net/base/host_resolver_impl.cc b/net/base/host_resolver_impl.cc index 37063af..5812d17 100644 --- a/net/base/host_resolver_impl.cc +++ b/net/base/host_resolver_impl.cc @@ -16,7 +16,8 @@ #include "base/basictypes.h" #include "base/compiler_specific.h" -#include "base/debug_util.h" +#include "base/debug/debugger.h" +#include "base/debug/stack_trace.h" #include "base/lock.h" #include "base/message_loop.h" #include "base/metrics/field_trial.h" @@ -71,7 +72,9 @@ HostCache* CreateDefaultCache() { } // anonymous namespace HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, + HostResolverProc* resolver_proc, NetLog* net_log) { +<<<<<<< HEAD // Maximum of 50 concurrent threads. // TODO(eroman): Adjust this, do some A/B experiments. #ifdef ANDROID @@ -80,6 +83,13 @@ HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, #else static const size_t kDefaultMaxJobs = 50u; #endif +======= + // Maximum of 8 concurrent resolver threads. + // Some routers (or resolvers) appear to start to provide host-not-found if + // too many simultaneous resolutions are pending. This number needs to be + // further optimized, but 8 is what FF currently does. + static const size_t kDefaultMaxJobs = 8u; +>>>>>>> chromium.org at r65505 if (max_concurrent_resolves == HostResolver::kDefaultParallelism) max_concurrent_resolves = kDefaultMaxJobs; @@ -93,7 +103,7 @@ HostResolver* CreateSystemHostResolver(size_t max_concurrent_resolves, return systemResolver; #else HostResolverImpl* resolver = - new HostResolverImpl(NULL, CreateDefaultCache(), + new HostResolverImpl(resolver_proc, CreateDefaultCache(), max_concurrent_resolves, net_log); return resolver; @@ -369,9 +379,10 @@ class HostResolverImpl::Job had_non_speculative_request_(false), net_log_(BoundNetLog::Make(net_log, NetLog::SOURCE_HOST_RESOLVER_IMPL_JOB)) { - net_log_.BeginEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, - new JobCreationParameters(key.hostname, - source_net_log.source())); + net_log_.BeginEvent( + NetLog::TYPE_HOST_RESOLVER_IMPL_JOB, + make_scoped_refptr( + new JobCreationParameters(key.hostname, source_net_log.source()))); } // Attaches a request to this job. The job takes ownership of |req| and will @@ -379,7 +390,8 @@ class HostResolverImpl::Job void AddRequest(Request* req) { req->request_net_log().BeginEvent( NetLog::TYPE_HOST_RESOLVER_IMPL_JOB_ATTACH, - new NetLogSourceParameter("source_dependency", net_log_.source())); + make_scoped_refptr(new NetLogSourceParameter( + "source_dependency", net_log_.source()))); req->set_job(this); requests_.push_back(req); @@ -1082,7 +1094,7 @@ void HostResolverImpl::CancelRequest(RequestHandle req_handle) { // Because we destroy outstanding requests during Shutdown(), // |req_handle| is already cancelled. LOG(ERROR) << "Called HostResolverImpl::CancelRequest() after Shutdown()."; - StackTrace().PrintBacktrace(); + base::debug::StackTrace().PrintBacktrace(); return; } Request* req = reinterpret_cast<Request*>(req_handle); @@ -1251,11 +1263,13 @@ void HostResolverImpl::OnStartRequest(const BoundNetLog& source_net_log, const RequestInfo& info) { source_net_log.BeginEvent( NetLog::TYPE_HOST_RESOLVER_IMPL, - new NetLogSourceParameter("source_dependency", request_net_log.source())); + make_scoped_refptr(new NetLogSourceParameter( + "source_dependency", request_net_log.source()))); request_net_log.BeginEvent( NetLog::TYPE_HOST_RESOLVER_IMPL_REQUEST, - new RequestInfoParameters(info, source_net_log.source())); + make_scoped_refptr(new RequestInfoParameters( + info, source_net_log.source()))); // Notify the observers of the start. if (!observers_.empty()) { @@ -1384,7 +1398,7 @@ void HostResolverImpl::ProcessQueuedRequests() { if (!top_req) return; - scoped_refptr<Job> job = CreateAndStartJob(top_req); + scoped_refptr<Job> job(CreateAndStartJob(top_req)); // Search for any other pending request which can piggy-back off this job. for (size_t pool_i = 0; pool_i < POOL_COUNT; ++pool_i) { @@ -1414,8 +1428,8 @@ HostResolverImpl::Job* HostResolverImpl::CreateAndStartJob(Request* req) { req->request_net_log().AddEvent(NetLog::TYPE_HOST_RESOLVER_IMPL_CREATE_JOB, NULL); - scoped_refptr<Job> job = new Job(next_job_id_++, this, key, - req->request_net_log(), net_log_); + scoped_refptr<Job> job(new Job(next_job_id_++, this, key, + req->request_net_log(), net_log_)); job->AddRequest(req); AddOutstandingJob(job); job->Start(); diff --git a/net/base/host_resolver_impl_unittest.cc b/net/base/host_resolver_impl_unittest.cc index 07e00bf..f3bdb74 100644 --- a/net/base/host_resolver_impl_unittest.cc +++ b/net/base/host_resolver_impl_unittest.cc @@ -259,8 +259,8 @@ TEST_F(HostResolverImplTest, SynchronousLookup) { AddressList addrlist; const int kPortnum = 80; - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AddRule("just.testing", "192.168.1.42"); scoped_ptr<HostResolver> host_resolver( @@ -291,8 +291,8 @@ TEST_F(HostResolverImplTest, AsynchronousLookup) { AddressList addrlist; const int kPortnum = 80; - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AddRule("just.testing", "192.168.1.42"); scoped_ptr<HostResolver> host_resolver( @@ -328,8 +328,8 @@ TEST_F(HostResolverImplTest, AsynchronousLookup) { } TEST_F(HostResolverImplTest, CanceledAsynchronousLookup) { - scoped_refptr<WaitingHostResolverProc> resolver_proc = - new WaitingHostResolverProc(NULL); + scoped_refptr<WaitingHostResolverProc> resolver_proc( + new WaitingHostResolverProc(NULL)); CapturingNetLog net_log(CapturingNetLog::kUnbounded); CapturingBoundNetLog log(CapturingNetLog::kUnbounded); @@ -390,8 +390,8 @@ TEST_F(HostResolverImplTest, CanceledAsynchronousLookup) { TEST_F(HostResolverImplTest, NumericIPv4Address) { // Stevens says dotted quads with AI_UNSPEC resolve to a single sockaddr_in. - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AllowDirectLookup("*"); scoped_ptr<HostResolver> host_resolver( @@ -413,8 +413,8 @@ TEST_F(HostResolverImplTest, NumericIPv4Address) { } TEST_F(HostResolverImplTest, NumericIPv6Address) { - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AllowDirectLookup("*"); // Resolve a plain IPv6 address. Don't worry about [brackets], because @@ -445,8 +445,8 @@ TEST_F(HostResolverImplTest, NumericIPv6Address) { } TEST_F(HostResolverImplTest, EmptyHost) { - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AllowDirectLookup("*"); scoped_ptr<HostResolver> host_resolver( @@ -459,8 +459,8 @@ TEST_F(HostResolverImplTest, EmptyHost) { } TEST_F(HostResolverImplTest, LongHost) { - scoped_refptr<RuleBasedHostResolverProc> resolver_proc = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> resolver_proc( + new RuleBasedHostResolverProc(NULL)); resolver_proc->AllowDirectLookup("*"); scoped_ptr<HostResolver> host_resolver( @@ -523,8 +523,8 @@ class DeDupeRequestsVerifier : public ResolveRequest::Delegate { TEST_F(HostResolverImplTest, DeDupeRequests) { // Use a capturing resolver_proc, since the verifier needs to know what calls // reached Resolve(). Also, the capturing resolver_proc is initially blocked. - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); scoped_ptr<HostResolver> host_resolver( CreateHostResolverImpl(resolver_proc)); @@ -574,8 +574,8 @@ TEST_F(HostResolverImplTest, CancelMultipleRequests) { // Use a capturing resolver_proc, since the verifier needs to know what calls // reached Resolver(). Also, the capturing resolver_proc is initially // blocked. - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); scoped_ptr<HostResolver> host_resolver( CreateHostResolverImpl(resolver_proc)); @@ -661,8 +661,8 @@ TEST_F(HostResolverImplTest, CancelWithinCallback) { // Use a capturing resolver_proc, since the verifier needs to know what calls // reached Resolver(). Also, the capturing resolver_proc is initially // blocked. - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); scoped_ptr<HostResolver> host_resolver( CreateHostResolverImpl(resolver_proc)); @@ -718,8 +718,8 @@ TEST_F(HostResolverImplTest, DeleteWithinCallback) { // Use a capturing resolver_proc, since the verifier needs to know what calls // reached Resolver(). Also, the capturing resolver_proc is initially // blocked. - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); // The class will receive callbacks for when each resolve completes. It // checks that the right things happened. Note that the verifier holds the @@ -773,8 +773,8 @@ TEST_F(HostResolverImplTest, StartWithinCallback) { // Use a capturing resolver_proc, since the verifier needs to know what calls // reached Resolver(). Also, the capturing resolver_proc is initially // blocked. - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); // Turn off caching for this host resolver. scoped_ptr<HostResolver> host_resolver( @@ -1105,8 +1105,8 @@ TEST_F(HostResolverImplTest, FlushCacheOnIPAddressChange) { // Test that IP address changes send ERR_ABORTED to pending requests. TEST_F(HostResolverImplTest, AbortOnIPAddressChanged) { - scoped_refptr<WaitingHostResolverProc> resolver_proc = - new WaitingHostResolverProc(NULL); + scoped_refptr<WaitingHostResolverProc> resolver_proc( + new WaitingHostResolverProc(NULL)); HostCache* cache = CreateDefaultCache(); scoped_ptr<HostResolver> host_resolver( new HostResolverImpl(resolver_proc, cache, kMaxJobs, NULL)); @@ -1130,8 +1130,8 @@ TEST_F(HostResolverImplTest, AbortOnIPAddressChanged) { // Obey pool constraints after IP address has changed. TEST_F(HostResolverImplTest, ObeyPoolConstraintsAfterIPAddressChange) { - scoped_refptr<WaitingHostResolverProc> resolver_proc = - new WaitingHostResolverProc(NULL); + scoped_refptr<WaitingHostResolverProc> resolver_proc( + new WaitingHostResolverProc(NULL)); scoped_ptr<MockHostResolver> host_resolver(new MockHostResolver()); host_resolver->Reset(resolver_proc); @@ -1202,8 +1202,8 @@ class ResolveWithinCallback : public CallbackRunner< Tuple1<int> > { }; TEST_F(HostResolverImplTest, OnlyAbortExistingRequestsOnIPAddressChange) { - scoped_refptr<WaitingHostResolverProc> resolver_proc = - new WaitingHostResolverProc(NULL); + scoped_refptr<WaitingHostResolverProc> resolver_proc( + new WaitingHostResolverProc(NULL)); scoped_ptr<MockHostResolver> host_resolver(new MockHostResolver()); host_resolver->Reset(resolver_proc); @@ -1227,8 +1227,8 @@ TEST_F(HostResolverImplTest, OnlyAbortExistingRequestsOnIPAddressChange) { // Tests that when the maximum threads is set to 1, requests are dequeued // in order of priority. TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); // This HostResolverImpl will only allow 1 outstanding resolve at a time. size_t kMaxJobs = 1u; @@ -1312,8 +1312,8 @@ TEST_F(HostResolverImplTest, HigherPriorityRequestsStartedFirst) { // Try cancelling a request which has not been attached to a job yet. TEST_F(HostResolverImplTest, CancelPendingRequest) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); // This HostResolverImpl will only allow 1 outstanding resolve at a time. const size_t kMaxJobs = 1u; @@ -1375,8 +1375,8 @@ TEST_F(HostResolverImplTest, CancelPendingRequest) { // Test that when too many requests are enqueued, old ones start to be aborted. TEST_F(HostResolverImplTest, QueueOverflow) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(NULL); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(NULL)); // This HostResolverImpl will only allow 1 outstanding resolve at a time. const size_t kMaxOutstandingJobs = 1u; @@ -1453,8 +1453,8 @@ TEST_F(HostResolverImplTest, QueueOverflow) { // Tests that after changing the default AddressFamily to IPV4, requests // with UNSPECIFIED address family map to IPV4. TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv4) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(new EchoingHostResolverProc); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(new EchoingHostResolverProc)); // This HostResolverImpl will only allow 1 outstanding resolve at a time. const size_t kMaxOutstandingJobs = 1u; @@ -1521,8 +1521,8 @@ TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv4) { // of requests 0 and 1 is flipped, and the default is set to IPv6 in place of // IPv4. TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(new EchoingHostResolverProc); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(new EchoingHostResolverProc)); // This HostResolverImpl will only allow 1 outstanding resolve at a time. const size_t kMaxOutstandingJobs = 1u; @@ -1588,8 +1588,8 @@ TEST_F(HostResolverImplTest, SetDefaultAddressFamily_IPv6) { // This tests that the default address family is respected for synchronous // resolutions. TEST_F(HostResolverImplTest, SetDefaultAddressFamily_Synchronous) { - scoped_refptr<CapturingHostResolverProc> resolver_proc = - new CapturingHostResolverProc(new EchoingHostResolverProc); + scoped_refptr<CapturingHostResolverProc> resolver_proc( + new CapturingHostResolverProc(new EchoingHostResolverProc)); const size_t kMaxOutstandingJobs = 10u; scoped_ptr<HostResolverImpl> host_resolver(new HostResolverImpl( diff --git a/net/base/listen_socket.cc b/net/base/listen_socket.cc index 0cb529d..c964ec9 100644 --- a/net/base/listen_socket.cc +++ b/net/base/listen_socket.cc @@ -121,8 +121,8 @@ SOCKET ListenSocket::Accept(SOCKET s) { void ListenSocket::Accept() { SOCKET conn = Accept(socket_); if (conn != kInvalidSocket) { - scoped_refptr<ListenSocket> sock = - new ListenSocket(conn, socket_delegate_); + scoped_refptr<ListenSocket> sock( + new ListenSocket(conn, socket_delegate_)); // it's up to the delegate to AddRef if it wants to keep it around #if defined(OS_POSIX) sock->WatchSocket(WAITING_READ); diff --git a/net/base/mime_util.cc b/net/base/mime_util.cc index a580997..ddcfc4b 100644 --- a/net/base/mime_util.cc +++ b/net/base/mime_util.cc @@ -82,6 +82,7 @@ static const MimeInfo primary_mappings[] = { { "text/xml", "xml" }, { "image/gif", "gif" }, { "image/jpeg", "jpeg,jpg" }, + { "image/webp", "webp" }, { "image/png", "png" }, { "video/mp4", "mp4,m4v" }, { "audio/x-m4a", "m4a" }, @@ -192,6 +193,7 @@ static const char* const supported_image_types[] = { "image/jpeg", "image/pjpeg", "image/jpg", + "image/webp", "image/png", "image/gif", "image/bmp", @@ -547,6 +549,7 @@ static const char* kStandardImageTypes[] = { "image/gif", "image/ief", "image/jpeg", + "image/webp", "image/pict", "image/pipeg", "image/png", @@ -660,7 +663,6 @@ void HashSetToVector(base::hash_set<T>* source, std::vector<T>* target) { target->at(old_target_size + i) = *iter; } } - } void GetImageExtensions(std::vector<FilePath::StringType>* extensions) { diff --git a/net/base/mock_host_resolver.cc b/net/base/mock_host_resolver.cc index 9c82f93..9ee5c53 100644 --- a/net/base/mock_host_resolver.cc +++ b/net/base/mock_host_resolver.cc @@ -80,8 +80,8 @@ void MockHostResolverBase::Reset(HostResolverProc* interceptor) { synchronous_mode_ = false; // At the root of the chain, map everything to localhost. - scoped_refptr<RuleBasedHostResolverProc> catchall = - new RuleBasedHostResolverProc(NULL); + scoped_refptr<RuleBasedHostResolverProc> catchall( + new RuleBasedHostResolverProc(NULL)); catchall->AddRule("*", "127.0.0.1"); // Next add a rules-based layer the use controls. diff --git a/net/base/net_error_list.h b/net/base/net_error_list.h index d7ae9d1..96b19ad 100644 --- a/net/base/net_error_list.h +++ b/net/base/net_error_list.h @@ -50,7 +50,7 @@ NET_ERROR(FILE_TOO_BIG, -8) // invalid assumption. NET_ERROR(UNEXPECTED, -9) -// Permission to access a resource was denied. +// Permission to access a resource, other than the network, was denied. NET_ERROR(ACCESS_DENIED, -10) // The operation failed because of unimplemented functionality. @@ -66,7 +66,7 @@ NET_ERROR(OUT_OF_MEMORY, -13) // from the expectation. NET_ERROR(UPLOAD_FILE_CHANGED, -14) -// The socket is not connected +// The socket is not connected. NET_ERROR(SOCKET_NOT_CONNECTED, -15) // A connection was closed (corresponding to a TCP FIN). @@ -191,10 +191,7 @@ NET_ERROR(SSL_SNAP_START_NPN_MISPREDICTION, -131) // give the user a helpful error message rather than have the connection hang. NET_ERROR(ESET_ANTI_VIRUS_SSL_INTERCEPTION, -132) -// We detected NetNanny intercepting our HTTPS connections. Since this product -// is False Start intolerant, we return this error so that we can give the user -// a helpful error message rather than have the connection hang. -NET_ERROR(NETNANNY_SSL_INTERCEPTION, -133) +// Missing -133. Feel free to reuse in the future. // The permission to use the SSL client certificate's private key was denied. NET_ERROR(SSL_CLIENT_AUTH_PRIVATE_KEY_ACCESS_DENIED, -134) @@ -208,6 +205,11 @@ NET_ERROR(PROXY_CERTIFICATE_INVALID, -136) // An error occurred when trying to do a name resolution (DNS). NET_ERROR(NAME_RESOLUTION_FAILED, -137) +// Permission to access the network was denied. This is used to distinguish +// errors that were most likely caused by a firewall from other access denied +// errors. See also ERR_ACCESS_DENIED. +NET_ERROR(NETWORK_ACCESS_DENIED, -138) + // Certificate error codes // // The values of certificate error codes must be consecutive. diff --git a/net/base/net_log_event_type_list.h b/net/base/net_log_event_type_list.h index 398f7c1..6183749 100644 --- a/net/base/net_log_event_type_list.h +++ b/net/base/net_log_event_type_list.h @@ -334,6 +334,17 @@ EVENT_TYPE(SSL_HANDSHAKE_ERROR) EVENT_TYPE(SSL_READ_ERROR) EVENT_TYPE(SSL_WRITE_ERROR) +// An SSL Snap Start was attempted +// The following parameters are attached to the event: +// { +// "type": <Integer code for the Snap Start result>, +// } +EVENT_TYPE(SSL_SNAP_START) + +// We found that our prediction of the server's certificates was correct and +// we merged the verification with the SSLHostInfo. +EVENT_TYPE(SSL_VERIFICATION_MERGED) + // An SSL error occurred while calling an NSS function not directly related to // one of the above activities. Can also be used when more information than // is provided by just an error code is needed: diff --git a/net/base/net_test_suite.h b/net/base/net_test_suite.h index eab3a53..00d9844 100644 --- a/net/base/net_test_suite.h +++ b/net/base/net_test_suite.h @@ -9,7 +9,9 @@ #include "base/message_loop.h" #include "base/ref_counted.h" #include "base/test/test_suite.h" +#include "build/build_config.h" #include "net/base/mock_host_resolver.h" +#include "net/ocsp/nss_ocsp.h" class NetTestSuite : public base::TestSuite { public: @@ -39,6 +41,10 @@ class NetTestSuite : public base::TestSuite { } virtual void Shutdown() { +#if defined(OS_LINUX) + net::ShutdownOCSP(); +#endif // defined(OS_LINUX) + // We want to destroy this here before the TestSuite continues to tear down // the environment. message_loop_.reset(); diff --git a/net/base/net_util.cc b/net/base/net_util.cc index c1f769e..5afba6f 100644 --- a/net/base/net_util.cc +++ b/net/base/net_util.cc @@ -181,7 +181,7 @@ STR GetSpecificHeaderT(const STR& headers, const STR& name) { typename STR::const_iterator begin = search(headers.begin(), headers.end(), match.begin(), match.end(), - CaseInsensitiveCompareASCII<typename STR::value_type>()); + base::CaseInsensitiveCompareASCII<typename STR::value_type>()); if (begin == headers.end()) return STR(); @@ -374,9 +374,7 @@ bool DecodeWord(const std::string& encoded_word, // it should be Ok because we're not an email client but a // web browser. - // What IE6/7 does: %-escaped UTF-8. We could extend this to - // support a rudimentary form of RFC 2231 with charset label, but - // it'd gain us little in terms of compatibility. + // What IE6/7 does: %-escaped UTF-8. tmp = UnescapeURLComponent(encoded_word, UnescapeRule::SPACES); if (IsStringUTF8(tmp)) { output->swap(tmp); @@ -425,11 +423,12 @@ bool DecodeParamValue(const std::string& input, // TODO(mpcomplete): This is a quick and dirty implementation for now. I'm // sure this doesn't properly handle all (most?) cases. template<typename STR> -STR GetHeaderParamValueT(const STR& header, const STR& param_name) { +STR GetHeaderParamValueT(const STR& header, const STR& param_name, + QuoteRule::Type quote_rule) { // This assumes args are formatted exactly like "bla; arg1=value; arg2=value". typename STR::const_iterator param_begin = search(header.begin(), header.end(), param_name.begin(), param_name.end(), - CaseInsensitiveCompareASCII<typename STR::value_type>()); + base::CaseInsensitiveCompareASCII<typename STR::value_type>()); if (param_begin == header.end()) return STR(); @@ -448,7 +447,7 @@ STR GetHeaderParamValueT(const STR& header, const STR& param_name) { return STR(); typename STR::const_iterator param_end; - if (*param_begin == '"') { + if (*param_begin == '"' && quote_rule == QuoteRule::REMOVE_OUTER_QUOTES) { param_end = find(param_begin+1, header.end(), '"'); if (param_end == header.end()) return STR(); // poorly formatted param? @@ -1096,29 +1095,86 @@ std::string GetSpecificHeader(const std::string& headers, return GetSpecificHeaderT(headers, name); } +bool DecodeCharset(const std::string& input, + std::string* decoded_charset, + std::string* value) { + StringTokenizer t(input, "'"); + t.set_options(StringTokenizer::RETURN_DELIMS); + std::string temp_charset; + std::string temp_value; + int numDelimsSeen = 0; + while (t.GetNext()) { + if (t.token_is_delim()) { + ++numDelimsSeen; + continue; + } else { + switch (numDelimsSeen) { + case 0: + temp_charset = t.token(); + break; + case 1: + // Language is ignored. + break; + case 2: + temp_value = t.token(); + break; + default: + return false; + } + } + } + if (numDelimsSeen != 2) + return false; + if (temp_charset.empty() || temp_value.empty()) + return false; + decoded_charset->swap(temp_charset); + value->swap(temp_value); + return true; +} + std::string GetFileNameFromCD(const std::string& header, const std::string& referrer_charset) { - std::string param_value = GetHeaderParamValue(header, "filename"); + std::string decoded; + std::string param_value = GetHeaderParamValue(header, "filename*", + QuoteRule::KEEP_OUTER_QUOTES); + if (!param_value.empty()) { + if (param_value.find('"') == std::string::npos) { + std::string charset; + std::string value; + if (DecodeCharset(param_value, &charset, &value)) { + // RFC 5987 value should be ASCII-only. + if (!IsStringASCII(value)) + return std::string(); + std::string tmp = UnescapeURLComponent(value, UnescapeRule::SPACES); + if (base::ConvertToUtf8AndNormalize(tmp, charset, &decoded)) + return decoded; + } + } + } + param_value = GetHeaderParamValue(header, "filename", + QuoteRule::REMOVE_OUTER_QUOTES); if (param_value.empty()) { // Some servers use 'name' parameter. - param_value = GetHeaderParamValue(header, "name"); + param_value = GetHeaderParamValue(header, "name", + QuoteRule::REMOVE_OUTER_QUOTES); } if (param_value.empty()) return std::string(); - std::string decoded; if (DecodeParamValue(param_value, referrer_charset, &decoded)) return decoded; return std::string(); } std::wstring GetHeaderParamValue(const std::wstring& field, - const std::wstring& param_name) { - return GetHeaderParamValueT(field, param_name); + const std::wstring& param_name, + QuoteRule::Type quote_rule) { + return GetHeaderParamValueT(field, param_name, quote_rule); } std::string GetHeaderParamValue(const std::string& field, - const std::string& param_name) { - return GetHeaderParamValueT(field, param_name); + const std::string& param_name, + QuoteRule::Type quote_rule) { + return GetHeaderParamValueT(field, param_name, quote_rule); } // TODO(brettw) bug 734373: check the scripts for each host component and @@ -1681,10 +1737,11 @@ void SetExplicitlyAllowedPorts(const std::string& allowed_ports) { (allowed_ports[i] != kComma)) return; if (i == size || allowed_ports[i] == kComma) { - size_t length = i - last; - if (length > 0) { + if (i > last) { int port; - base::StringToInt(allowed_ports.substr(last, length), &port); + base::StringToInt(allowed_ports.begin() + last, + allowed_ports.begin() + i, + &port); ports.insert(port); } last = i + 1; diff --git a/net/base/net_util.h b/net/base/net_util.h index f5a6151..4b87c70 100644 --- a/net/base/net_util.h +++ b/net/base/net_util.h @@ -42,6 +42,18 @@ namespace net { typedef uint32 FormatUrlType; typedef uint32 FormatUrlTypes; +// Used by GetHeaderParamValue to determine how to handle quotes in the value. +class QuoteRule { + public: + enum Type { + KEEP_OUTER_QUOTES, + REMOVE_OUTER_QUOTES, + }; + + private: + QuoteRule(); +}; + // Nothing is ommitted. extern const FormatUrlType kFormatUrlOmitNothing; @@ -124,23 +136,26 @@ std::string GetSpecificHeader(const std::string& headers, // 'param_name'. Returns the empty string if the parameter is not found or is // improperly formatted. std::wstring GetHeaderParamValue(const std::wstring& field, - const std::wstring& param_name); + const std::wstring& param_name, + QuoteRule::Type quote_rule); std::string GetHeaderParamValue(const std::string& field, - const std::string& param_name); + const std::string& param_name, + QuoteRule::Type quote_rule); // Return the filename extracted from Content-Disposition header. The following // formats are tried in order listed below: // -// 1. RFC 2047 -// 2. Raw-8bit-characters : +// 1. RFC 5987 +// 2. RFC 2047 +// 3. Raw-8bit-characters : // a. UTF-8, b. referrer_charset, c. default os codepage. -// 3. %-escaped UTF-8. +// 4. %-escaped UTF-8. // -// In step 2, if referrer_charset is empty(i.e. unknown), 2b is skipped. -// In step 3, the fallback charsets tried in step 2 are not tried. We +// In step 3, if referrer_charset is empty(i.e. unknown), 3b is skipped. +// In step 4, the fallback charsets tried in step 3 are not tried. We // can consider doing that later. // -// When a param value is ASCII, but is not in format #1 or format #3 above, +// When a param value is ASCII, but is not in format #2 or format #4 above, // it is returned as it is unless it's pretty close to two supported // formats but not well-formed. In that case, an empty string is returned. // diff --git a/net/base/net_util_unittest.cc b/net/base/net_util_unittest.cc index ad7ccad..77d3a00 100644 --- a/net/base/net_util_unittest.cc +++ b/net/base/net_util_unittest.cc @@ -711,7 +711,8 @@ TEST(NetUtilTest, GetHeaderParamValue) { std::wstring header_value = net::GetSpecificHeader(google_headers, tests[i].header_name); std::wstring result = - net::GetHeaderParamValue(header_value, tests[i].param_name); + net::GetHeaderParamValue(header_value, tests[i].param_name, + net::QuoteRule::REMOVE_OUTER_QUOTES); EXPECT_EQ(result, tests[i].expected); } @@ -719,11 +720,38 @@ TEST(NetUtilTest, GetHeaderParamValue) { std::wstring header_value = net::GetSpecificHeader(L"", tests[i].header_name); std::wstring result = - net::GetHeaderParamValue(header_value, tests[i].param_name); + net::GetHeaderParamValue(header_value, tests[i].param_name, + net::QuoteRule::REMOVE_OUTER_QUOTES); EXPECT_EQ(result, std::wstring()); } } +TEST(NetUtilTest, GetHeaderParamValueQuotes) { + struct { + const char* header; + const char* expected_with_quotes; + const char* expected_without_quotes; + } tests[] = { + {"filename=foo", "foo", "foo"}, + {"filename=\"foo\"", "\"foo\"", "foo"}, + {"filename=foo\"", "foo\"", "foo\""}, + {"filename=fo\"o", "fo\"o", "fo\"o"}, + }; + + for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { + std::string actual_with_quotes = + net::GetHeaderParamValue(tests[i].header, "filename", + net::QuoteRule::KEEP_OUTER_QUOTES); + std::string actual_without_quotes = + net::GetHeaderParamValue(tests[i].header, "filename", + net::QuoteRule::REMOVE_OUTER_QUOTES); + EXPECT_EQ(tests[i].expected_with_quotes, actual_with_quotes) + << "Failed while processing: " << tests[i].header; + EXPECT_EQ(tests[i].expected_without_quotes, actual_without_quotes) + << "Failed while processing: " << tests[i].header; + } +} + TEST(NetUtilTest, GetFileNameFromCD) { const FileNameCDCase tests[] = { // Test various forms of C-D header fields emitted by web servers. @@ -762,7 +790,7 @@ TEST(NetUtilTest, GetFileNameFromCD) { "_3=2Epng?=", "", L"\U00010330 3.png"}, {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=e9_=2epng?=\"", "", L"caf\x00e9 .png"}, - // Space after an encode word should be removed. + // Space after an encoded word should be removed. {"Content-Disposition: inline; filename=\"=?iso88591?Q?caf=E9_?= .png\"", "", L"caf\x00e9 .png"}, // Two encoded words with different charsets (not very likely to be emitted @@ -812,11 +840,92 @@ TEST(NetUtilTest, GetFileNameFromCD) { // Two RFC 2047 encoded words in a row without a space is an error. {"Content-Disposition: attachment; filename==?windows-1252?Q?caf=E3?=" "=?iso-8859-7?b?4eIucG5nCg==?=", "", L""}, + + // RFC 5987 tests with Filename* : see http://tools.ietf.org/html/rfc5987 + {"Content-Disposition: attachment; filename*=foo.html", "", L""}, + {"Content-Disposition: attachment; filename*=foo'.html", "", L""}, + {"Content-Disposition: attachment; filename*=''foo'.html", "", L""}, + {"Content-Disposition: attachment; filename*=''foo.html'", "", L""}, + {"Content-Disposition: attachment; filename*=''f\"oo\".html'", "", L""}, + {"Content-Disposition: attachment; filename*=bogus_charset''foo.html'", + "", L""}, + {"Content-Disposition: attachment; filename*='en'foo.html'", "", L""}, + {"Content-Disposition: attachment; filename*=iso-8859-1'en'foo.html", "", + L"foo.html"}, + {"Content-Disposition: attachment; filename*=utf-8'en'foo.html", "", + L"foo.html"}, + // charset cannot be omitted. + {"Content-Disposition: attachment; filename*='es'f\xfa.html'", "", L""}, + // Non-ASCII bytes are not allowed. + {"Content-Disposition: attachment; filename*=iso-8859-1'es'f\xfa.html", "", + L""}, + {"Content-Disposition: attachment; filename*=utf-8'es'f\xce\xba.html", "", + L""}, + // TODO(jshin): Space should be %-encoded, but currently, we allow + // spaces. + {"Content-Disposition: inline; filename*=iso88591''cafe foo.png", "", + L"cafe foo.png"}, + + // Filename* tests converted from Q-encoded tests above. + {"Content-Disposition: attachment; filename*=EUC-JP''%B7%DD%BD%D13%2Epng", + "", L"\x82b8\x8853" L"3.png"}, + {"Content-Disposition: attachment; filename*=utf-8''" + "%E8%8A%B8%E8%A1%93%203%2Epng", "", L"\x82b8\x8853 3.png"}, + {"Content-Disposition: attachment; filename*=utf-8''%F0%90%8C%B0 3.png", "", + L"\U00010330 3.png"}, + {"Content-Disposition: inline; filename*=Euc-Kr'ko'%BF%B9%BC%FA%2Epng", "", + L"\xc608\xc220.png"}, + {"Content-Disposition: attachment; filename*=windows-1252''caf%E9.png", "", + L"caf\x00e9.png"}, + + // http://greenbytes.de/tech/tc2231/ filename* test cases. + // attwithisofn2231iso + {"Content-Disposition: attachment; filename*=iso-8859-1''foo-%E4.html", "", + L"foo-\xe4.html"}, + // attwithfn2231utf8 + {"Content-Disposition: attachment; filename*=" + "UTF-8''foo-%c3%a4-%e2%82%ac.html", "", L"foo-\xe4-\x20ac.html"}, + // attwithfn2231noc : no encoding specified but UTF-8 is used. + {"Content-Disposition: attachment; filename*=''foo-%c3%a4-%e2%82%ac.html", + "", L""}, + // attwithfn2231utf8comp + {"Content-Disposition: attachment; filename*=UTF-8''foo-a%cc%88.html", "", + L"foo-\xe4.html"}, +#ifdef ICU_SHOULD_FAIL_CONVERSION_ON_INVALID_CHARACTER + // This does not work because we treat ISO-8859-1 synonymous with + // Windows-1252 per HTML5. For HTTP, in theory, we're not + // supposed to. + // attwithfn2231utf8-bad + {"Content-Disposition: attachment; filename*=" + "iso-8859-1''foo-%c3%a4-%e2%82%ac.html", "", L""}, +#endif + // attwithfn2231ws1 + {"Content-Disposition: attachment; filename *=UTF-8''foo-%c3%a4.html", "", + L""}, + // attwithfn2231ws2 + {"Content-Disposition: attachment; filename*= UTF-8''foo-%c3%a4.html", "", + L"foo-\xe4.html"}, + // attwithfn2231ws3 + {"Content-Disposition: attachment; filename* =UTF-8''foo-%c3%a4.html", "", + L"foo-\xe4.html"}, + // attwithfn2231quot + {"Content-Disposition: attachment; filename*=\"UTF-8''foo-%c3%a4.html\"", + "", L""}, + // attfnboth + {"Content-Disposition: attachment; filename=\"foo-ae.html\"; " + "filename*=UTF-8''foo-%c3%a4.html", "", L"foo-\xe4.html"}, + // attfnboth2 + {"Content-Disposition: attachment; filename*=UTF-8''foo-%c3%a4.html; " + "filename=\"foo-ae.html\"", "", L"foo-\xe4.html"}, + // attnewandfn + {"Content-Disposition: attachment; foobar=x; filename=\"foo.html\"", "", + L"foo.html"}, }; for (size_t i = 0; i < ARRAYSIZE_UNSAFE(tests); ++i) { EXPECT_EQ(tests[i].expected, UTF8ToWide(net::GetFileNameFromCD(tests[i].header_field, - tests[i].referrer_charset))); + tests[i].referrer_charset))) + << "Failed on input: " << tests[i].header_field; } } diff --git a/net/base/network_config_watcher_mac.cc b/net/base/network_config_watcher_mac.cc index 365859e..dd93067 100644 --- a/net/base/network_config_watcher_mac.cc +++ b/net/base/network_config_watcher_mac.cc @@ -8,12 +8,10 @@ #include <SystemConfiguration/SCSchemaDefinitions.h> #include <algorithm> +#include "base/compiler_specific.h" #include "base/thread.h" #include "base/mac/scoped_cftyperef.h" -// We only post tasks to a child thread we own, so we don't need refcounting. -DISABLE_RUNNABLE_METHOD_REFCOUNT(net::NetworkConfigWatcherMac); - namespace net { namespace { @@ -27,48 +25,59 @@ void DynamicStoreCallback(SCDynamicStoreRef /* store */, net_config_delegate->OnNetworkConfigChange(changed_keys); } -} // namespace +class NetworkConfigWatcherMacThread : public base::Thread { + public: + NetworkConfigWatcherMacThread(NetworkConfigWatcherMac::Delegate* delegate); + virtual ~NetworkConfigWatcherMacThread(); -NetworkConfigWatcherMac::NetworkConfigWatcherMac( - Delegate* delegate) - : notifier_thread_(new base::Thread("NetworkConfigWatcher")), - delegate_(delegate) { - // We create this notifier thread because the notification implementation - // needs a thread with a CFRunLoop, and there's no guarantee that - // MessageLoop::current() meets that criterion. - base::Thread::Options thread_options(MessageLoop::TYPE_UI, 0); - notifier_thread_->StartWithOptions(thread_options); + protected: + // base::Thread + virtual void Init(); + virtual void CleanUp(); + + private: + // The SystemConfiguration calls in this function can lead to contention early + // on, so we invoke this function later on in startup to keep it fast. + void InitNotifications(); + + base::mac::ScopedCFTypeRef<CFRunLoopSourceRef> run_loop_source_; + NetworkConfigWatcherMac::Delegate* const delegate_; + ScopedRunnableMethodFactory<NetworkConfigWatcherMacThread> method_factory_; + + DISALLOW_COPY_AND_ASSIGN(NetworkConfigWatcherMacThread); +}; + +NetworkConfigWatcherMacThread::NetworkConfigWatcherMacThread( + NetworkConfigWatcherMac::Delegate* delegate) + : base::Thread("NetworkConfigWatcher"), + delegate_(delegate), + ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {} + +NetworkConfigWatcherMacThread::~NetworkConfigWatcherMacThread() { + Stop(); +} + +void NetworkConfigWatcherMacThread::Init() { // TODO(willchan): Look to see if there's a better signal for when it's ok to // initialize this, rather than just delaying it by a fixed time. - const int kNotifierThreadInitializationDelayMS = 1000; - notifier_thread_->message_loop()->PostDelayedTask( + const int kInitializationDelayMS = 1000; + message_loop()->PostDelayedTask( FROM_HERE, - NewRunnableMethod(this, &NetworkConfigWatcherMac::Init), - kNotifierThreadInitializationDelayMS); -} - -NetworkConfigWatcherMac::~NetworkConfigWatcherMac() { - // We don't need to explicitly Stop(), but doing so allows us to sanity- - // check that the notifier thread shut down properly. - notifier_thread_->Stop(); - DCHECK(run_loop_source_ == NULL); + method_factory_.NewRunnableMethod( + &NetworkConfigWatcherMacThread::InitNotifications), + kInitializationDelayMS); } -void NetworkConfigWatcherMac::WillDestroyCurrentMessageLoop() { - DCHECK(notifier_thread_ != NULL); - // We can't check the notifier_thread_'s message_loop(), as it's now 0. - // DCHECK_EQ(notifier_thread_->message_loop(), MessageLoop::current()); +void NetworkConfigWatcherMacThread::CleanUp() { + if (!run_loop_source_.get()) + return; - DCHECK(run_loop_source_ != NULL); CFRunLoopRemoveSource(CFRunLoopGetCurrent(), run_loop_source_.get(), kCFRunLoopCommonModes); run_loop_source_.reset(); } -void NetworkConfigWatcherMac::Init() { - DCHECK(notifier_thread_ != NULL); - DCHECK_EQ(notifier_thread_->message_loop(), MessageLoop::current()); - +void NetworkConfigWatcherMacThread::InitNotifications() { // Add a run loop source for a dynamic store to the current run loop. SCDynamicStoreContext context = { 0, // Version 0. @@ -86,8 +95,19 @@ void NetworkConfigWatcherMac::Init() { // Set up notifications for interface and IP address changes. delegate_->SetDynamicStoreNotificationKeys(store.get()); +} + +} // namespace - MessageLoop::current()->AddDestructionObserver(this); +NetworkConfigWatcherMac::NetworkConfigWatcherMac(Delegate* delegate) + : notifier_thread_(new NetworkConfigWatcherMacThread(delegate)) { + // We create this notifier thread because the notification implementation + // needs a thread with a CFRunLoop, and there's no guarantee that + // MessageLoop::current() meets that criterion. + base::Thread::Options thread_options(MessageLoop::TYPE_UI, 0); + notifier_thread_->StartWithOptions(thread_options); } +NetworkConfigWatcherMac::~NetworkConfigWatcherMac() {} + } // namespace net diff --git a/net/base/network_config_watcher_mac.h b/net/base/network_config_watcher_mac.h index f9f9d36..3bd55f9 100644 --- a/net/base/network_config_watcher_mac.h +++ b/net/base/network_config_watcher_mac.h @@ -19,7 +19,7 @@ class Thread; namespace net { // Base class for watching the Mac OS system network settings. -class NetworkConfigWatcherMac : public MessageLoop::DestructionObserver { +class NetworkConfigWatcherMac { public: // NOTE: The lifetime of Delegate is expected to exceed the lifetime of // NetworkConfigWatcherMac. @@ -41,24 +41,11 @@ class NetworkConfigWatcherMac : public MessageLoop::DestructionObserver { virtual ~NetworkConfigWatcherMac(); private: - // MessageLoop::DestructionObserver: - virtual void WillDestroyCurrentMessageLoop(); - - // Called on the notifier thread to initialize the notification - // implementation. The SystemConfiguration calls in this function can lead to - // contention early on, so we invoke this function later on in startup to keep - // it fast. - void Init(); - // The thread used to listen for notifications. This relays the notification // to the registered observers without posting back to the thread the object // was created on. scoped_ptr<base::Thread> notifier_thread_; - base::mac::ScopedCFTypeRef<CFRunLoopSourceRef> run_loop_source_; - - Delegate* const delegate_; - DISALLOW_COPY_AND_ASSIGN(NetworkConfigWatcherMac); }; diff --git a/net/base/openssl_util.cc b/net/base/openssl_util.cc index fcdc3a1..51797ac 100644 --- a/net/base/openssl_util.cc +++ b/net/base/openssl_util.cc @@ -59,6 +59,10 @@ OpenSSLInitSingleton* GetOpenSSLInitSingleton() { return Singleton<OpenSSLInitSingleton>::get(); } +void EnsureOpenSSLInit() { + Singleton<OpenSSLInitSingleton>::get(); +} + // static void OpenSSLInitSingleton::LockingCallback(int mode, int n, diff --git a/net/base/openssl_util.h b/net/base/openssl_util.h index 4218a89..d4603c6 100644 --- a/net/base/openssl_util.h +++ b/net/base/openssl_util.h @@ -25,7 +25,7 @@ class ScopedSSL { }; // Singleton for initializing / cleaning up OpenSSL and holding a X509 store. -// Access it via EnsureOpenSSLInit(). +// Access it via GetOpenSSLInitSingleton(). class OpenSSLInitSingleton { public: SSL_CTX* ssl_ctx() const { return ssl_ctx_.get(); } @@ -49,5 +49,11 @@ class OpenSSLInitSingleton { OpenSSLInitSingleton* GetOpenSSLInitSingleton(); +// Initialize OpenSSL if it isn't already initialized. This must be called +// before any other OpenSSL functions (except GetOpenSSLInitSingleton above). +// This function is thread-safe, and OpenSSL will only ever be initialized once. +// OpenSSL will be properly shut down on program exit. +void EnsureOpenSSLInit(); + } // namespace net diff --git a/net/base/ssl_cipher_suite_names.cc b/net/base/ssl_cipher_suite_names.cc index 2db9a4b..39efd1c 100644 --- a/net/base/ssl_cipher_suite_names.cc +++ b/net/base/ssl_cipher_suite_names.cc @@ -6,6 +6,8 @@ #include <stdlib.h> +#include "base/logging.h" +#include "net/base/ssl_connection_status_flags.h" // Rather than storing the names of all the ciphersuites we eliminate the // redundancy and break each cipher suite into a key exchange method, cipher @@ -346,4 +348,28 @@ void SSLCompressionToString(const char** name, uint8 compresssion) { } } +void SSLVersionToString(const char** name, int ssl_version) { + switch (ssl_version) { + case SSL_CONNECTION_VERSION_SSL2: + *name = "SSL 2.0"; + break; + case SSL_CONNECTION_VERSION_SSL3: + *name = "SSL 3.0"; + break; + case SSL_CONNECTION_VERSION_TLS1: + *name = "TLS 1.0"; + break; + case SSL_CONNECTION_VERSION_TLS1_1: + *name = "TLS 1.1"; + break; + case SSL_CONNECTION_VERSION_TLS1_2: + *name = "TLS 1.2"; + break; + default: + NOTREACHED(); + *name = "???"; + break; + } +} + } // namespace net diff --git a/net/base/ssl_cipher_suite_names.h b/net/base/ssl_cipher_suite_names.h index cd61471..9241c1b 100644 --- a/net/base/ssl_cipher_suite_names.h +++ b/net/base/ssl_cipher_suite_names.h @@ -25,6 +25,12 @@ void SSLCipherSuiteToStrings(const char** key_exchange_str, // If the algorithm is unknown, |name| is set to "???". void SSLCompressionToString(const char** name, uint8 compression_method); +// SSLVersionToString returns the name of the SSL protocol version +// specified by |ssl_version|, which is defined in +// net/base/ssl_connection_status_flags.h. +// If the version is unknown, |name| is set to "???". +void SSLVersionToString(const char** name, int ssl_version); + } // namespace net #endif // NET_BASE_SSL_CIPHER_SUITE_NAMES_H_ diff --git a/net/base/ssl_config_service.cc b/net/base/ssl_config_service.cc index d8ecb0b..5c38f97 100644 --- a/net/base/ssl_config_service.cc +++ b/net/base/ssl_config_service.cc @@ -99,6 +99,7 @@ static bool g_dnssec_enabled = false; static bool g_false_start_enabled = true; static bool g_mitm_proxies_allowed = false; static bool g_snap_start_enabled = false; +static bool g_dns_cert_provenance_checking = false; // static void SSLConfigService::SetSSLConfigFlags(SSLConfig* ssl_config) { @@ -106,6 +107,8 @@ void SSLConfigService::SetSSLConfigFlags(SSLConfig* ssl_config) { ssl_config->false_start_enabled = g_false_start_enabled; ssl_config->mitm_proxies_allowed = g_mitm_proxies_allowed; ssl_config->snap_start_enabled = g_snap_start_enabled; + ssl_config->dns_cert_provenance_checking_enabled = + g_dns_cert_provenance_checking; } // static @@ -148,6 +151,16 @@ bool SSLConfigService::mitm_proxies_allowed() { return g_mitm_proxies_allowed; } +// static +void SSLConfigService::EnableDNSCertProvenanceChecking() { + g_dns_cert_provenance_checking = true; +} + +// static +bool SSLConfigService::dns_cert_provenance_checking_enabled() { + return g_dns_cert_provenance_checking; +} + void SSLConfigService::AddObserver(Observer* observer) { observer_list_.AddObserver(observer); } diff --git a/net/base/ssl_config_service.h b/net/base/ssl_config_service.h index 0ab88b2..be50097 100644 --- a/net/base/ssl_config_service.h +++ b/net/base/ssl_config_service.h @@ -28,6 +28,8 @@ struct SSLConfig { bool tls1_enabled; // True if TLS 1.0 is enabled. bool dnssec_enabled; // True if we'll accept DNSSEC chains in certificates. bool snap_start_enabled; // True if we'll try Snap Start handshakes. + // True if we'll do async checks for certificate provenance using DNS. + bool dns_cert_provenance_checking_enabled; // True if we allow this connection to be MITM attacked. This sounds a little // worse than it is: large networks sometimes MITM attack all SSL connections @@ -144,6 +146,10 @@ class SSLConfigService : public base::RefCountedThreadSafe<SSLConfigService> { // True if we use False Start for SSL and TLS. static bool false_start_enabled(); + // Enables DNS side checks for certificates. + static void EnableDNSCertProvenanceChecking(); + static bool dns_cert_provenance_checking_enabled(); + // Add an observer of this service. void AddObserver(Observer* observer); diff --git a/net/base/ssl_config_service_win.cc b/net/base/ssl_config_service_win.cc index 14c4d24..debea7d 100644 --- a/net/base/ssl_config_service_win.cc +++ b/net/base/ssl_config_service_win.cc @@ -4,6 +4,7 @@ #include "net/base/ssl_config_service_win.h" +#include "base/thread_restrictions.h" #include "base/win/registry.h" using base::TimeDelta; @@ -59,6 +60,9 @@ void SSLConfigServiceWin::GetSSLConfigAt(SSLConfig* config, TimeTicks now) { // static bool SSLConfigServiceWin::GetSSLConfigNow(SSLConfig* config) { + // This registry access goes to disk and will slow down the IO thread. + // http://crbug.com/61455 + base::ThreadRestrictions::ScopedAllowIO allow_io; RegKey internet_settings; if (!internet_settings.Open(HKEY_CURRENT_USER, kInternetSettingsSubKeyName, KEY_READ)) @@ -83,6 +87,8 @@ bool SSLConfigServiceWin::GetSSLConfigNow(SSLConfig* config) { // static void SSLConfigServiceWin::SetRevCheckingEnabled(bool enabled) { + // This registry access goes to disk and will slow down the IO thread. + // http://crbug.com/61455 DWORD value = enabled; RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName, KEY_WRITE); @@ -108,6 +114,8 @@ void SSLConfigServiceWin::SetTLS1Enabled(bool enabled) { // static void SSLConfigServiceWin::SetSSLVersionEnabled(int version, bool enabled) { + // This registry access goes to disk and will slow down the IO thread. + // http://crbug.com/61455 RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName, KEY_READ | KEY_WRITE); DWORD value; diff --git a/net/base/ssl_connection_status_flags.h b/net/base/ssl_connection_status_flags.h index 1b7640c..9596f00 100644 --- a/net/base/ssl_connection_status_flags.h +++ b/net/base/ssl_connection_status_flags.h @@ -27,10 +27,28 @@ enum { // library that doesn't report it, like SChannel.) SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION = 1 << 19, + // The next three bits are reserved for the SSL version. + SSL_CONNECTION_VERSION_SHIFT = 20, + SSL_CONNECTION_VERSION_MASK = 7, + // 1 << 31 (the sign bit) is reserved so that the SSL connection status will // never be negative. }; +// NOTE: the SSL version enum constants must be between 0 and +// SSL_CONNECTION_VERSION_MASK, inclusive. +enum { + SSL_CONNECTION_VERSION_UNKNOWN = 0, // Unknown SSL version. + SSL_CONNECTION_VERSION_SSL2 = 1, + SSL_CONNECTION_VERSION_SSL3 = 2, + SSL_CONNECTION_VERSION_TLS1 = 3, + SSL_CONNECTION_VERSION_TLS1_1 = 4, + SSL_CONNECTION_VERSION_TLS1_2 = 5, + SSL_CONNECTION_VERSION_MAX, +}; +COMPILE_ASSERT(SSL_CONNECTION_VERSION_MAX - 1 <= SSL_CONNECTION_VERSION_MASK, + SSL_CONNECTION_VERSION_MASK_too_small); + inline int SSLConnectionStatusToCipherSuite(int connection_status) { return (connection_status >> SSL_CONNECTION_CIPHERSUITE_SHIFT) & SSL_CONNECTION_CIPHERSUITE_MASK; @@ -41,6 +59,11 @@ inline int SSLConnectionStatusToCompression(int connection_status) { SSL_CONNECTION_COMPRESSION_MASK; } +inline int SSLConnectionStatusToVersion(int connection_status) { + return (connection_status >> SSL_CONNECTION_VERSION_SHIFT) & + SSL_CONNECTION_VERSION_MASK; +} + } // namespace net #endif // NET_BASE_SSL_CONNECTION_STATUS_FLAGS_H_ diff --git a/net/base/ssl_false_start_blacklist.cc b/net/base/ssl_false_start_blacklist.cc index 9e0f309..b57826b 100644 --- a/net/base/ssl_false_start_blacklist.cc +++ b/net/base/ssl_false_start_blacklist.cc @@ -12,8 +12,8 @@ bool SSLFalseStartBlacklist::IsMember(const char* host) { if (!last_two_labels) return false; const unsigned bucket = Hash(last_two_labels) & (kBuckets - 1); - const uint16 start = kHashTable[bucket]; - const uint16 end = kHashTable[bucket + 1]; + const uint32 start = kHashTable[bucket]; + const uint32 end = kHashTable[bucket + 1]; const size_t len = strlen(host); for (size_t i = start; i < end;) { diff --git a/net/base/ssl_false_start_blacklist.h b/net/base/ssl_false_start_blacklist.h index 1d44d0a..d0b10e2 100644 --- a/net/base/ssl_false_start_blacklist.h +++ b/net/base/ssl_false_start_blacklist.h @@ -81,7 +81,7 @@ class SSLFalseStartBlacklist { // kHashTable contains an offset into |kHashData| for each bucket. The // additional element at the end contains the length of |kHashData|. - static const uint16 kHashTable[kBuckets + 1]; + static const uint32 kHashTable[kBuckets + 1]; // kHashData contains the contents of the hash table. |kHashTable| indexes // into this array. Each bucket consists of zero or more, 8-bit length // prefixed strings. Each string is a DNS name in dotted form. For a given diff --git a/net/base/ssl_false_start_blacklist.txt b/net/base/ssl_false_start_blacklist.txt index c718618..d782b5b 100644 --- a/net/base/ssl_false_start_blacklist.txt +++ b/net/base/ssl_false_start_blacklist.txt @@ -8,504 +8,4896 @@ # This is included for unit tests: example.com +008880.com +1-plus.com +111112.com 123.cht.com.tw +123people.com +155551.com +233332.com +24sevenselfstorage.com +2ndc.dk +2whateverittakes.com +333332.com +333337.com +365days.jp +38shop.jp +3mfx.three.com.hk +48pickup.com 4science.net +4ward.asia +50pickupnow.com +622222.com +6ftoverhead.com +911twenty.com +a-star.edu.sg +a.eap-net.com +a.thatsping.com +aaa.grh.org +aaastationreports.com +aanmelden.bjaa.nl +aaucm.org +abacustech.co.jp abangdani.wordpress.com +abc.attendseurope.com +abcirclenow.com +abdr.blood.gov.au +abeno-tennoji.jp +ablwebmail.com +abrocket.com +abrocketpilates.com +abrocketpowertrainer.com +abtserver.com +abtwebxpress.com +ac-besancon.fr +ac-caen.fr +ac-guyane.fr +ac-lille.fr +ac-limoges.fr +ac-lyon.fr +ac-nice.fr +ac-orleans-tours.fr +ac-paris.fr +ac-poitiers.fr +ac-reims.fr +ac-strasbourg.fr +ac-versailles.fr +acad1.dlit.edu.tw +academicclub.org +acams.dhs.gov access.arkansas.gov +access.coinstar.com +access.csn.edu +access.moric.org +access.opco.com +access.sullivanandassoc.com +access.vch.ca +access1.spokesman.com accessgeneral.com accessingram.com +accesswr.bannerhealth.com accorservicesdirect.net +account.payclick.com.au +accounts.jelhi.net +accu-doc.ch +acea.de +acebenefitsplus.co.uk +acheteremerycat.ca +acheterpalmwallet.ca +achs.org.au +acidesign.com +acommit.ch +acs-inc.com +acsi.eu +actionpoint.ch +activase.com +adcenter.msn.com.sg +adcouncil.tv adfox.cz +adhbcn.net +adhdtreatmenttoday.com +admin.centerpoint.jelecos.com +admin.iot.dtag.de +admin.webcast.fi +admin2.bloosky.com +administaffservices.com +adoptionscentrum.se +adox.sk +adplacer.com.au ads.bridgetrack.com +adtran.com adult.dl.rakuten.co.jp adulthire.com advanceautoparts.com +advisorpracticeconsulting.com +advocates.org.uk +aecc.ac.uk +aecom.com +aemc.net +aerosped.org +afconsult.com +afeyewear.com +affinitycircles.com +afflelou.net +afflinkservice.com +afflinksource.com +afternic.com +afterpayroll.com +aftonxchange.com +ag.729972.com +ag.ibc88.com +agencywow.com agents.nationalsecuritygroup.com +aggis.com.br +agir-recouvrement.com +agreemanager.net +agriinfo.copa-cogeca.be +agriinfo.copa-cogeca.eu +agromercantil.com.gt +ahanw.org +ahika.com +akabis.com +akershus-fk.no +aktionsplan-allergien.de alamode.com algoritam.hr +algvpn.algonquincollege.com +alinean.com +alle-inklusive.behindertenbeauftragte.de +allianz.hr +alliedliquor.co.nz +allmyaccounts.bankofamerica.com +alltours.at +alltours.de +alltours.info +almliquor.com.au +alperton.brent.sch.uk +alpinecapitalbank.com alsformalwear.com alucmo.com +alvo.com +alwaysillinois.org +am.cmc.com amail.centrum.cz +american-summit-flood.com +americanchia.com +americanexpress.hu +americanreliefcard.com +americanreliefcard.net +amesbank.com amexweb.com.mx +amf-assurances.fr +amgusa.com +ammail.edwards.com +amo-20happy.com +amo-happy-patients.com +amo-signature.net +amo-top.net +ampecommerce.com amsi.alliedgroup.net amwaylive.com +analytics.sonymusic.com +animate-onlineshop.jp +annssl01.fticonsulting.com anntaylor.recruitmax.com +anoka.k12.mn.us +anpassung.net +anshin-access.ezweb.ne.jp +antispam.hireahit.com +apex.utpa.edu +api.gogrid.com +api.rapleaf.com +apo-vpn-02.apotex.com +app.actre.it +app.audit-navigator.nl +app.elal.co.il +applicaties.tln.nl +appliedi.net +applymarketforce.com +applyshopnchek.ca +applyshopnchek.com +appraisalzone.lendervend.com +apps.caa.qld.gov.au apps.revenuecycle.com +appsgate.com +aproposgeschenk.de aps2.toshiba-tro.de apus.edu +ara.bahamaselectricity.com +aravo.com +arc.org.uk +archivedata.com +arena.highview.org aribabuyer.us.dell.com ariston.es +arizona.edu +arkansas.gov +arkona.com +arnecommunity.thomsonreuters.com +arowanacapital.com +arts.ac.uk +arvidsvensson.net +asa-seattle-1.adobe.com +asa01.svccorp.com +asacitrix.ccgh.org asb.dk +aschc.com ashgate.com ashleymadison.com +ashleyportal.com +asiandating.com +asklepios.com +asmconnects.com +asn.advolution.de asp.fm-pc.com +aspentrack.com +aspraytshirt.com +asthmamatters.com +astral.com +asugroup.com atari.com +athenasweb.brynmawr.edu +atl-c1.goodrich.com +atlas.fd.com ats.openhire.com +att.com attask-ondemand.com attask.com +attaskbeta.com +attendsguiden.se +audittool.bdoasf.com +auone.jp +aus-vpn.amd.com +auslandsschulwesen.de +authentication.accorhotels.com +autodiscover.barron.com.pe +autodiscover.dwvsolutions.com +autodiscover.eternalnetworx.com +autodiscover.montco.com +autodiscover.net +autodiscover.nimbus.nl +autodiscover.wrinklebrain.com +autopalvelut.kuusakoski.fi +autoradiostore.be +autoradiostore.nl +avastin.com +avgrewards.com +avlk.dishmail.net +avondale.org +avs.de +awesomearmsnow.com +awvn.nl axa.co.uk +axess.telcordia.com +axiamail.phoenix.edu +aza-lite.com +azurance.com +b-tracker.com +b2b.aksel.com.tr +b2b.mammut.ch +babyfoonstore.be +babyfoonstore.nl +babylon.inverso.de +backend02.d1g.com +backup.datassur.net +backupumbrella.net +bafin.de +bag-mail.de +bahmueller.de +bam.com.gt +bamf.de +bank4u.bancapopolare.it +bank4u.volksbank.it +bankadviser.com banking.ing-diba.at +bankingon.com baptisthealth.net +barakhosting.com +barclaystravelinsurance.co.uk +barelifts.tv barkoff.tv +barkoffspecialoffer.com barracudaserver.com +barrierepoker.fr barronscatalog.com +bartletthospital.org +bartoncreek.com +basco.com +basf-farefinder.com +baua.de +baxter.com bb3.utc.edu +bboardtest.nsula.edu +bbsihq.com +bcbsal.org bcbsfl.recruitmax.com +bdmp.com +beamercenter.be +beamercenter.nl +beanfun.com +bedfordschool.org.uk +beespace.issukraine.com +behindertenbeauftragter.de +bel.com.bz +belvis.swibi.ch +ben.billing.com.au +bendarooscreativity.com +bendaroosglow.com +benderball.tv +benefitsconnect.net +benendenschool.net +bennett.kent.sch.uk bentley.edu +berg-hansen.no +berger-meditec.com +berryworld.co.uk +bestobamacoin.com +bestpossiblequotes.com +bestwhole.com +beta-lighting.com +beta.algodeal.com +beta.ekool.eu +betcloud.com +betlegion.com +bettertrades.com +bevoelkerungsschutz-portal.de +bevoelkerungsschutz.de +beztakcorp.com +bfarm.de +bfu.ch +bhinc.com +bi.com +bib-demografie.de +bid53.com +bidclay.com biddingforgood.com +bidmc.org +bidokaloosa.com biffalo.net +bigcityslider.com +biglobe.ne.jp +bigwintracking.com bilder.buecher.de +billing.ntt-east.co.jp +billonline.com +biloxiregional.net +biooncology.com +biozid-portal.de +biprod01.mfsasp.com bishops.org.za +bisp-sportpsychologie.de bitfang.com +bitlasso.com +biz.portlandgeneral.com +bizneslink.pl +bizoubazart.com +blackmarble.co.uk +ble.de +blinkbox.com +blog.mudy.info +blog.neosec.dk blogger.huffingtonpost.com +blooads.com +bluearea.net +bluefinsolutions.com +blurayspelershop.be +blurayspelershop.nl +bmelv.de +bmwi-unternehmensportal.de +boaregistret.se +bockelman.org +bodycareshop.nl +bokuvpn.boku.ac.at +bonfils.org +book.lowestairfares.com +bookeo.org +bookitnow.mirabeauparkhotel.com +boormachinestore.be +boormachinestore.nl +bopowa.elcabop.org +born.ch +borsen.klasselotteriet.dk +bos.stidelivers.com +bosch-savingsystem.com +bottletops.tv +bowldvd.com +boxmedia.bredband.net +bp-platinum.com +brabantwater.nl +bradfordcollege.ac.uk +brainforce.nl +braintumorconnections.com +branders.com +brandon.ca +brcc.edu +brcn.edu +breastcancerconnections.com +brest-metropole-oceane.fr +bridgetrack.com +brighton.ac.uk +brightonsc.vic.edu.au brinksinc.com +britishmusicexperience.com +broadoak.n-somerset.sch.uk +broker.healthcompare.com +brookfield.hants.sch.uk +brookfieldservices.com +brookshealth.org +broomwellhealthwatch.com +brotheroffers.com +bs24.jp +bsal.com.au +bsi-fuer-buerger.de bsi.de +bskytracking.com +bsnparentnet.nl +bsnstaffnet.nl +bsp.bradfieldcollege.org.uk +bsprivat.de +btlaw.com +btracker.com +buckinghamhotel.com +budget.bmas.de buecher.de +bui.co.za buildings.com bund.de +bundesfinanzministerium.de +bundesgerichtshof.de +bundesgesundheitsministerium.de +bundespolizei.de +bundesrat.de +bundesversicherungsamt.de +burtsbeesacne.com +businessassetmanager.com +businessverifications.com +businessware.com +businesszone.quester.at bux.ee +buxtonbag.com +buxtoncartera.com +buxtonmicro.com +buxtonpalmwallet.com +buxtonwallet.com +buy1948pickup.com +buy1957caddy.com +buy33caddy.com +buy41flatbed.com +buy50pickupnow.com +buy57caddy.com +buyaquaglobes.tv +buyaspray.com +buybanoodle.com +buybeautifulworshipcd.com +buybenderballca.com +buybionicwrenchonline.com +buyblueplanet.com +buybombachop.com +buybumpit.tv +buychiaseedsnow.com +buycollegesuggies.com +buycucumbervine.com +buydesignersnuggie.com +buydomains.com +buyeasyreach.com +buyemagrece.com +buyfiftydollargold.com +buyflatbedfireset.com +buyflirtygirlfit.net +buyflirtygirlfit.tv +buyforemaneverydayandmore.com +buyfountainofyouthnow.com +buyfranklinmint.com +buygetitgreen.com +buygrandpa.com +buygrillglovetv.com +buygyrobowl.com +buygyrobowlset.com +buyhandyvalet.com +buyhangingstrawberry.com +buyhdvisionreaderssite.com +buyhdvisionultra.com +buyheeltastic.tv +buyhydroheel.com +buyidooffer.com +buylastmorgans.com +buymagicjacknow.com +buymagictarptv.com +buymagnetrim.com +buymightyfixit.com +buymightyputtynow.com +buymightyshine.com +buymightysuperpack.com +buymilitaryflatbed.com +buyminimaxnow.com +buymonstersteamjet.com +buymorgansilver.com +buymushroomkit.com +buymusiccristianaespanol.com +buymyarmyset.com +buymygianttomatoes.com +buymyhairblock.com +buymysportelec.com +buyoptic1050.com +buyoptic1050tv.com +buyoverthedoor.com +buypedegg.tv +buypedipaws.ca +buypedipistol.tv +buypestfree.tv +buypetmd.com +buyphilsdvdsnow.com +buypowerjuicerpro.com +buypowershaper.com +buyprofitfromrealestatenow.net +buyptpro.com +buypumpitfresh.com +buyquicklawnseed.com +buyrainbowpeppersnow.com +buyrazordock.com +buysamowraiblade.com +buysecretsolution.com buyshakeweightformen.com +buyshakeweightforwomen.com +buyshamwownow.com +buysideshowskillettv.com +buyslimmettes.com +buysnuggie.tv +buysnuggieforkids.tv +buysoftpullleash.com +buysongs4soldiers.com +buysteamjetnow.com +buystonenow.com +buyteddyspridesite.com +buytexastail.com +buythecrazycritters.com +buythecuttermouse.com +buythekingcoin.com +buythelittleredchef.com +buythemousechaser.com +buytheoptic1050.com +buytheperfectbutton.com +buythesnuggie.com +buythesteambuddy.com +buythinspin.com +buyticklemeplant.com +buytidytable.com +buytimelifeespanol.com +buytomatofactory.com +buytomatofactorynow.com +buytoolbandit.com +buytopsytree.com +buytopsyturvy.com +buytvhatnow.com +buyultimatetable.com +buyupsydaisytv.com +buywidgetlight.com +buywindshieldwonder.tv +buywonderhanger.com +buyzipdo.com +buzzcity.com +byebye.de +bzgs.ch +bzi-interlaken.ch +bzport.net +ca.gov +cachezone.cache.org.uk +cadizretail.co.za +cadizwealth.co.za cagreatamerica.com +caisse-epargne.fr +cal-x.net +calchoice.com +calchoiceplus.com +caldicott.com +call2.nl +callbe.com +callingcards.at +calvijn.nl +cambriancollege.ca +camelvpn.conncoll.edu +campasol.com +campus.himeji-du.ac.jp +campus.norquest.ca +campusharvest.org +canadaswonderland.com +canadianbenefits.com +cancer-test.com +cancerchampionprogram.org candydirect.com +caowa.altara.com +cap.dyntek.com +capellfarmfinance.com +capeplc.com.au +capgemini.com +capitalonedealsdone.com +capvpn.capilanou.ca +carcraft.co.uk +cardlabconnect.com cardsdirect.com +career.cdtechno.com +careers.hphood.com +careers.nicta.com.au +careers1.flagstar.com +careport.carilion.com +careylink.com.au +caridianbct.com +carilionlabs.com caringbridge.org +carintreggelandgroep.nl +carisbrookehighschool.net +carlislermc.com +carrinho.casashow.com.br +cas.freud.com +cas.grey.com cash.netmarble.net +cashexpress.com +cashpoint.com +catalog.synthes.com +cathflo.com +catholic.edu.au +catie.ac.cr +cave-kit.com +cbcag.edu +cbfive.com +cbsmail.constangy.com +ccisd.us ccmail.cc.gatech.edu +ccpb-basse-normandie.fr +ccpvpn.ccpdocs.com +cdcpoint.it +cdfbooks.com +cdmwsa.com +cdp.moduspec.com +cduvpn.cdu.edu.au +ce.byu.edu +cedardoc-cm.com +cedardoc-demo.com +cedardoc-dev.com +cei253e.com celebrateyourfaith.com +celebritysweatnelly.com +celtipharm.net +cemex.com +centralmississippimedicalcenter.com centralr.com +centrum.cz +centuriondirect.com +ceramicreview.com certs.zurich.co.uk +cespmi.org +ceuherning.dk +cfai-centre.net +cfliving.com +cfw.org +cgi.mbs.jp +ch.cutler-hammer.com champions-online.com +channeladvisor.com +chapmantripp.com +charlotteregional.com +charltonschool.net +chasslvpn.ecommunity.com +checkoutblog.com +cheizoo-sp.online-documents.net +chester.ac.uk +chesterregional.com +chevrolet-leadengine.de +chiaobama.ca +chiaobama.tv +chiba.jp +chill-n-go.com +chinookhosting.com +chinooknetworks.com +chl-peq.co.uk chnla.com +chocolatefactorytv.com +choicebuilder.com +churchill.n-somerset.sch.uk chw.recruitmax.com ciaoitalia.com +cic-valencia.org.ve +cifex.ethz.ch cinema.warnermycal.com circlesofwisdom.com +cisco.com cisr-ssl-vpn2.univ-lyon1.fr citi.bridgetrack.com +citicards.com +citiforward.com +citixcard.co.jp citizensfla.com +citonline.com +citynet.net +ckbmail.me +clarity.com claritycon.com +clarksoncollege.edu +claroline.lakato.net classbauth.austin.hp.com +classicsoftrock.com +classifiedventures.com +clayko.com.au +click.showcase-tv.jp +clickanalyzer.jp +client.neftex.com +client.uniastrum.ru +clients.mdmatic.com +clineavestudy.com +cloroxspss.com +cloud-mail.co.uk +cloud.carthagecsd.org +cloud.mvctc.com +cloud.santeesd.net +cloudconnectsd.net +cloudhoist.com +cloudmail.trustcld.com +cloudonestorage.peer1.com +cloudspeaker.fm +cloudworks.com +cm.commercehub.com +cmithun.dojiggy.com +cms.whereilive.com.au +cnw.albertaequestrian.com +cnw.hcbc.ca +codarts.nl +coddy.com cofunds.co.uk +cohowa.houstontx.gov +collaborate.sandia.gov +colorectalcancerconnections.com combattesting.com +commandaware.com +commentor.dk +commissies.ser.nl +commonwealth.int +communitylakes.com +compass.emmanuelschools.net +compass.oxiana.com.au compaxtrade.com -confirmit.suw.corp.google.com +compellent.com +complete180degree.com +comporium.com +comprabuxton.com +comprariddexpulse.com +comprasnuggie.com +compratastiwave.com +compreabrocket.com +compupaypartner.com +compus.de +computerstore.be +computerstore.nl +coms.industrialcontrolrepair.com +concat.de +concur.csmc.edu +conduxio.com +config.tplpbx.de +confluence.mediaspectrum.net +connect.bangor.ac.uk +connect.clearpointe.com +connect.coventry.ac.uk +connect.dpem.tas.gov.au +connect.plan-b-gmbh.com +connect.studygroup.com +connecta.se +consoleshop.be +consoleshop.nl +construction-ec.com +contitiremanagement.com +controlpanel.ch +coolblue.nl +coop-kobe.net coopervisionrebates.com +coorscup.com +copeskoal.com corporate.bpn.pt +corpset.com +correctionalbillingservices.com +correio.fdc.org.br +correio.ina.pt +correo.entelpcs.com +correo.orizonia.com +correo.psl.com.co +correo.tec.ac.cr correo.uft.cl +cortesoft.com +costco.com.mx +couplesnuggie.com +courriel.jlp.ca +courriel.journalmtl.com +courriel.lepisc.com +covlecremote.org +covnet.covenantretirement.org +coyoteportal.wc.edu +cozi.com +cp.billing.ru +cp.it2all.eu +cpas.cz +cportal.sechan.com +cprmc.com +cpsb.org +cpse.dundee.ac.uk +cranbrook.kent.sch.uk +crci.org.uk credinamico.programapar.com.br creditcards.citicards.com +creditunionon.com +creuna.dk +crew.transavia.com +criny.com +crmpartners.crmpartners.org +crnbc.ca +croc.ru +crossgatesriveroaks.com +cryptolab.org +crystalfunds.com +crystaltools.com +csaa.com +cscinfo.com +csp.cvut.cz +csst.qc.ca +ctasanywhere.centraltas.co.nz +ctdhe.org cts.vresp.com +cu.edu +cuatrecasas.com +cubewano.com cubizone.com +customer.comcast.com +customer.dgrefining.com +customer.gbs-consult.com customer.precash.com +customer.unicaresys.com +customerconnect.scholasticbookfairs.com +cusys.edu +cv.occstrategy.com cvintranet.classifiedventures.com +cwa.astra-honda.com +cwa.avanade.com +cwa.fandr.com +cwa.telecomputing.no +cwt.no +cwtnordic.com +cybershoppersonline.com +d-ikt.no +d-starjob.com +d115.de +d15email2010.d15.us d49.org +daidalos.nl +daiwa-bs.co.jp +dalinis.net +dallasregionalmedicalcenter.com +danks.com.au +daphne.gfk.com +dasa-dortmund.de +data.eglia.com +dataformas.com +dataliberation.com +datasettlement.com +datatel.com +davidson.edu +davisregional.com +dbpn.com +dc.myflorida.com +dc110.4shared.com +dcess.dallascounty.org +dcvpn.cov.com +de-mail.de +deadliestdvd.com +decc.gov.uk +dehaagsescholen.nl +deklimboom.nl +deloitte.com +deloitteresources.com +delorentz.nl +deltek.forceprotection.net +demo.crm4destinations.at +dentalxchange.com depo.ru +deshaw.com +design.cscape.com +design.nzzdomizil.ch +designersnuggie.com destinationlighting.com +deutsche-islam-konferenz.de +developer.smartapp.tw +development-school.jp +device.fancast.com +dexia.be +dexter.ansaldo-sts.us +df.co.kr +dfc.inovestor.com +dhhnet.dhh.louisiana.gov +dhs.edu.sa +diamail.diadubai.com +dice.com +dienstleistungszentrum.de +digi.mobilethink.net +digicamshop.be +digicamshop.nl +direct.msn.com +direct2wholesale.com +directv.com +disc.co.jp +discomp.cz +discovertotal.com +discovwww.waterford.k12.mi.us +dishnetwork.com +disneydigitalshare.com +dist113.org +district205.net djmmusic.com +dl.com dl.rakuten.co.jp dmgov.org +dmz.rgcweb.org +docmesa.com docstoc.com +docufide.com docuware.com +dodgeprojects.construction.com +doe.gov dokeos.ehb.be +dolandesigns.com +domain.amta.com +dosco.com.tw +dpwn-airlinesourcing.com +dr.rachisholm.com drammen.skole.d-ikt.no +drimanagement.com +drlists.com +drm.nl +droppstv.com +drs-digital.com drsha.com +drudeans.com dskdirect.bg +dsl-art.org +dsoguild.com +dtvce.com +dualforceaccessories.com +dualsaw.com +dualsawcanada.ca +dualsawspanish.com +dunamare.nl +dupnet.org +durham.ca +durringtonhigh.w-sussex.sch.uk +duvak.nl +dvlottery.state.gov dwarest.disc.co.jp +dws.com.au +dynamicscrm.asia +dynetics.com +e-billing.econgas.it +e-cap.fr +e-denpo.net +e-healthnet.mhlw.go.jp e-lotto.be +e-mechatronics.com +e-mergedata.net +e-quilibrium.net +e-state.co.jp +e-state.ne.jp +e-trade-center.com +e-usluge.rijeka.hr +e-valuer.com +e-zoa.com +earlybird.ae +earlyedcloud.net +earnplaza.com +earthclassmail.com +eastgate1.frontiercorp.com +eastgeorgiaregional.com +easv.dk +easweb.thecdmgroup.com easybillindia.in +easyhome.com.tw +easymovewithfios.com +easyreachoffer.com +easyreachtv.com easyswitch.nl +eaton.com +eazifleet.com ebb.ubb.bg +ebencom.com ebit.com.br +ec.broadom.net +ecafe.lahey.org +ecare.proctor.org echo.com +echostar.com echotrak.com +eclipse.molagers.org +ecom.peoples-bank.com +ecommerce.colsubsidio.com econda-monitor.de +ecwid.com edaccents.com +edenbrook.co.uk +edinet.cenet.ws +edu.on.ca +education.vic.gov.au edumail.tokem.fi +edumail.vic.gov.au eduportal.pl +eduweb.vic.gov.au +edziekanat.wsf.edu.pl +efo.adplan-tg.com +ehb.be +ehs.dk +ehub.dsionline.com +eiffel.nl +einfach-teilhaben.de +eisweb.enterinfo.com +eku.edu +elibrary.asdealernet.com +elibrary.comfortsite.com +elliottdevon.com elm.mcmaster.ca elmls.mcmaster.ca +elogistic.motorola.com +elpodercd.com +elproman.biz +els.cis.fukuoka-u.ac.jp +els.streetly.walsall.sch.uk +email-internet.pekao.com.pl +email.arbora-ausonia.com +email.campus.uvt.nl +email.cosan.com.br +email.eatoncounty.org +email.energy-northwest.com +email.frostburg.edu +email.fusionsys.com.mx +email.greatershepparton.com.au +email.hermos-vhm.de +email.jyu.fi email.manutouch.com.hk +email.masku.com +email.medianewsgroup.com +email.mycontact.co.nz +email.ndm.edu +email.phillynews.com +email.piraeusbank.gr +email.sjb.com.au +email.sjbcommunity.ca +email.starair.dk +email.stpeters.qld.edu.au +email.stpeters.sa.edu.au +email.svcfs.org +email.uk.betfair.com +email.unity.net.nz +email.usiu.ac.ke +email.wallawalla.edu +email.whgardiner.com email.wsd1.org email.yorksj.ac.uk +email2010.smu.edu.sg +emanet.com +embeddedwebserver.net +emea.archive.messaging.microsoft.com +emeamail.corp.salesforce.com +emedic.jp +emergenow.com +emericalinksite.com +emersonhosp.org +emerycat.ca +emerycat.com +emerycatrefill.ca +emerycatspecialoffer.com +emi.eu +emi.hu +emploi.sitq.com +employee.coastmountainbus.com employee.translink.bc.ca +empresas.bancobcr.com +enav.it +endlager-asse.de +endlager-konrad.de +endtoendsourcing.com +enhancedservices.paetec.com +enrol.ie ent.enteduc.fr +ent95.valdoise.fr enterprise.channeladvisor.com +envisionitsolutions.net +eod.teamcolts.net +eoir.com +eom.performance.gr +epaveiro.edu.pt +epistrofi-eurobank.gr epk.tv +eplus.jp +epm.com.co +eportal.fleetwoodhs.org.uk +eportal.shelfieldcommunityacademy.co.uk +epost.ha.kommune.no +epost.luftnett.com +epost.skola.ljungby.se +epost.uddevalla.se +epost.visma.no epoti.abanka.si +epsb.ca equippers.com +equitydriver.com +ercasharepoint.com +ereaderstore.be +ereaderstore.nl +erecruit.thechildrenshospital.org +ereg.biz +ergo.ergonomidesign.com +ergonet.pl +erhgroup.com +ericom.com +erivpn.eisai.com +eroom.arvato-systems.de +esabilgisayar.com.tr +esales.master.ca +esdlife.com +eshbelhost.com +eshbelsaas.co.il +eshbelsaas.com +esher.ac.uk +eskilstuna.se +esloo.nl +espaicambrabcn.org +especificacoes.com +esportivaparana.com.br +espprofitlink.com +estore.hpfairfield.com +estrellamountain.edu +etk.fi +etrack.teletrack.com +ettu.nl eumail.nov.com eurobank.pl +europ-assistance.pt +europa.eu +europass.cz +europlan.ru +eurotax.at +events.sainc.com +evergabe-online.info +evoline.net +evoraoralcaresite.com +evpn.techteam.com +ex.uni-paderborn.de +exadmin.rcs-mail.com +excels.org +exch-hub.cancer.dk +exch.naaco.ru +exchange.berden.nl exchange.chc.be +exchange.clarkslegal.com +exchange.clearwaterpaper.com +exchange.cs-soreltracy.qc.ca +exchange.datacom.com.au +exchange.dcpud.net +exchange.gilacountyaz.gov exchange.hostnet.nl +exchange.intranet.neumanpools.com +exchange.keyhie.org +exchange.khlim.be +exchange.knpc.net +exchange.mit.ie +exchange.netbit.ch +exchange.public.eibs.co.uk +exchange.raakict.nl +exchange.roteskreuz-tirol.at exchange.selco.info +exchange.tinozplace.com +exchange.uetcl.com +exchange.uniserver.nl +exchange.unitek.com +exchange4u.cz +existenzgruender.de +exmail.businesslinksoutheast.co.uk +exmail.med.uni-magdeburg.de +expesite.com +ext01.lifesouth.org +extclt.isatech.fr +extern.balslev.dk +external.piggott.wokingham.sch.uk external1.collaboration.hp.com extra.chrysler.de +extranet.4ward.it +extranet.calvis.com +extranet.cbr.nl extranet.cchmc.org +extranet.cec.org +extranet.chaco.com.bo +extranet.dialoggroup.biz +extranet.hbj-gw.com +extranet.infoproject.fr +extranet.jbdelasalle.com +extranet.lackverband.de +extranet.metabolomicscentre.nl +extranet.ministryofsound.com +extranet.mm-software.com +extranet.pandasoftware.com +extranet.portalsolutions.net +extranet.sysmex.com +extranet.transpondertech.com +extranet.ubgonline.net +extranet.winchester.com +eyelovelytv.com +eyeonamd.com +eyeonamd2.com +f-seneca.org +faberwebshop.nl +faimai.hcri.net +falcontrading.ro +falmouth.cornwall.sch.uk +fanclub.tokyodisneyresort.co.jp +fanniemae.com +farefinder.de +farsigeotech.com +fastmvr.com +fastsearch.com faxbetter.com +fcaamd.com fdc.org.br +fe-bud.mag-news.it +fedintel.net +feitest.com +felixlive.com +fema.gov +fenwalinc.com +ffis.es +fhvasa01.flhosp.org +filexchange.accarda.com financialengines.com +finansnet.dk +finn.no +fiosfriends.com +fire.tas.gov.au +firma.pcs.cz +firmaface.com firstam.net +firstassistinsurance.co.uk +firstassistinsurance.com +fish4.co.uk +fishermenshospital.com +fit.ba +fiu.edu +fiztrade.com +fjarvinna.grund.is +fleetwoodsc.org.uk +flhsmv.gov +flirtygirlfitca.com +floodlands.com +floodonline.com +floodplus.com +floodplus.net +flowerpowercds.com +flowersbelgium.hostbasket.com flydenver.com +fmglobal.com +fmpro.cati.com +fokusanalys.se +folkestonegirls.kent.sch.uk +footnote.com +footnotelibrary.com +ford.com +form-gic.altran.net +formassist.jp +forms.lasikmd.com +forms.techdata.net forums.champions-online.com forums.startrekonline.com +fossport.com +foto.mitlejerbo.dk +foxtix.com.au +fpcu.org +fr.powerjuicerpro.ca +frankfurt-oder.de +frankfurter-bankgesellschaft.ch +franklinregionalmedicalctr.com +freebioven.com +freegrillglovetv.com +freehandycaddy.com +freerejuvenateautotv.com +freerejuvenateca.com +freerejuvenatetv.com +freo.ne.jp +fridgelockertv.com +fs-efo.jp +ftp.cambridge-design.co.uk +ftp.lim.com +ftp.maedapat.co.jp +ftsportal.forensicsandediscovery.com +fubar.com fucam.ac.be +fuchs-datentechnik.de +fueldoctorcanada.ca +fueldoctorfd47.com +fueru.jp +fuji-ie.com fullseat.com +fultonschools.org +fusdaz.org futuretrails.com +fv-group.net +fw01.monheim.de +fx.sovereignbank.com +fxedge.trader.integral.net +fxinside.net +fye.com +g4s.se +gakushuin.ac.jp +gamania.com ganymede.chester.ac.uk +garconet.garco.com +garmin.com +gate.we-learn.org.uk +gatech.edu +gatekeeper2.aspectsecurity.com gateway.madisoncity.k12.al.us +gateway.sagemontchurch.org +gbssg.ch +gcc.edu +gcportal.guycarp.com +gda-portal.de +geicocard.com +geicocreditcardapplication.com +gemini-apx.com +gene.com +genentechaccesssolutions.com +genentechmm.com +geniusreport.com genuineonlinebank.com +geomant.com +geometrik.golder.se +geonosis.itsso.gc.ca +georgefox.edu +gepartsrebates.com +germfree.org +get1931roadster.com +get1933caddy.com +get2instantcover.com +get31roadster.com +get6weekbodymakeover.com +get911twentynow.com +getair-o-sage.com +getbendaroostv.com +getbestline.com +getboomaringnow.com +getcablecapture.com +getcan-air.com +getchefandgo.com +getclassicfriarsroast.com +getclassicsforrelaxation.com +getcomfortfurnace.com +getcozycolors.com +getdigitalbiblenow.com +geteasyreach.com +getefx.com +geteggiestv.com +getesiobev.com +geteyetality.com +getflexibrite.com +getflipperremote.com +getgianttomato.com +getglowbeam.com +getgreenbags.tv +getgyrobowl.com +gethandyvalet.com +gethealthsupplies.com +gethightenz.com +geticanonlyimaginecd.com +getiknowkey.com +getionpod.com +getirenewnow.com +getjupiterjack.com +getkuddles.com +getlesko1995.com +getmatthewleskoquickstart.com +getmightyputtynow.com +getmiracleplunger.com +getmonstersteamjet.com +getmorgans.com +getmpgreennow.com +getmy.com +getmybedsidetable.com +getmydreamtable.com +getmyt4.com +getmytaxform.com +getmyw2.com +getmyyobaby.com +getnazidvds.com +getnuwaveovennow.com +getopeneyesofmyheart.com +getoprydvd.com +getpalmwallet.ca +getparkbillstv.com +getpetmdnow.com +getpopmemories.com +getpuplight.com +getrejuvenate.com +getrejuvenateautotv.com +getrejuvenateca.com +getromancingthe70scds.com +getsanistep.com +getscrubglove.com +getseatwedgy.com +getsecretsolutiontv.com +getshakeweight.com +getshakeweightnow.com +getshockitclean.com +getslimts.com getslimtsnow.com +getswirlyclip.com +gettheemerycat.com +gettheturbosnakenow.com +getthewonderhanger.com +getultimaterockballadscds.com +geturinegone.com +getvibrobelt.com +getvietnamwardvds.com +getwiperwizardnow.com +getworkout180.com +getworldatwar.com +getworldatwarespanol.com +getworldofreading.com +getyourpajamajeans.com +getzasshu.com +getzerogerm.com +getznowonline.com +gezeb.cmpd.org +gfk-repinsight.com +gfkdaphne.com +ggu.edu +ggusd.us +ggy.com +gilmorehealth.com global2.mtsallstream.com +glove.mizunoballpark.com +glowinghealth.com.au +glueckkanja.net +gmb.org.uk +gmxy.org go.enbw.net +go.post.de goamp.com +gogamer.com +golan.wisela.org +goldflux.com +golfdo.com +golfersland.net gomopa.net +goodfellowbros.com +goodyear.com +goquickstart.com goredsea.com +gorm.tauron-pe.pl +got-root.ch gotobelfast.com +gotomypc.rareeditions.com +gov.on.ca +gpsshop.be +gpsshop.nl +gpz.it +gr-espel.com +graceselah.com +gradwellintra.net +graniteschools.org +greatsankey.org greenpower24.com +grillingadget.com +gripperglovestv.com +gristedes.com +grizridge.com +grmetrieve.com +grmorc.com +groenewelle.nl +grotiuscollege.nl +gruenderpreis-nominierung.de +grupalotos.pl +gsmstore.be +gu.se +guardiant.com +guardiantauto.com +guhsdaz.org +gw.alumni.iae.edu.ar gw2.fli.bund.de +gw2.vincentz.de +gynspecialistsorlando.com +gzb.info +ha.jmpextra.net +hadar.fr +hades.tens.pl haken.mynavi.jp +hakwr-neustadt.ac.at +halton.ca +hammerofgod.com +hancockbank.hb2go.mobi +hancockfabrics.com +handelwandel.com +handydryer.com +handyvalettv.com hangikredi.com +hapimag.com +happyoz.com +harborwholesale.com +harbottleonpremise.com.au +hardandheavycds.com +hardpoint.eu +harrisdseries.com +harrisvle.org.uk +hartonmedicalcenter.com +hartslagmetercenter.be +hartslagmetercenter.nl +harvard.edu +harvestbible.org hastingsdirect.com +hastingsessential.com +hatchearlychildhood.com +hcc-tripod.hoffmancorp.com +hccanet.org +hclab.jp +hcmysteryshop.com +headsetshop.be +headsetshop.nl +healthinsurance.org.au +healthportdirect.com hearablog.com +heartofflorida.com +heartoflancaster.com heavens-above.com +heeltasticpedeggpromo.com +heelusa.com +helinium.nl helpdesk.clear2pay.com +helpdesk.sarnt.co.uk +helpdesk.v-h.nl +helpdesk.yhc.edu helwanbb.com +henleycol.ac.uk +hensongroup.com +her2genes.com +herceptin.com hercle.com +herconnection.com +herculiteondemand.com +hesse-lignal.de +hetassink.nl +hhc.acerebates.com +highlandsregional.com +hillgatetravel.com +hillsgradprogram.com +hipcomputer.de +hire.acxiominsight.com +historybeat.com hivanet.hitachi-ies.co.jp +hj2.hjemmekontor.nhn.no +hma.com +hmc.it-ernity.nl +hmc.vdx.nl +hnvpn.hostnordic.com +hoganas.se +hoken-clinic.com hoken-clinic.info +hollywoodhobobagaccessories.com +hollywoodhobobagtv.com +home.ceadvisors.com homedepotrebates.com +homespot.dk honeybakedonline.com +honeywellusersgroup.com hood.com +hoodhomedelivery.com +hoodneighborhood.com +hoofdtelefoonstore.be +hoofdtelefoonstore.nl +hopline.net hostedjobs.openhire.com +hosting.privatehost.nl +hostpoint.ch +hosttraxx.com +hotelleriesuisse.ch +householdshop.nl +housingservices.com +houstonisd.org howtowritearesume.net +hox.biz +hq.eisenhowerlaw.com +hq.nimvpn.com +hq.totalengineering.biz +hqaccess.acs.org +hro-gate.aida.de +hrwow.com +hs.ct-net.nl +hsacalifornia.com +hubpen.biz +hull.ac.uk humana.recruitmax.com +humanadental.com +hurleymc.com hurmail01.hurriyet.com.tr +huronconsultinggroup.com +huttonhotel.com +hva.nl +hwinet.org hydra.cusys.edu +hypecits.com.au hz.nl +i-95alternatives.com +i-ecnet.co.il +i-teamroom.com +i485project.com +iata.invoiceworks.net +ibank.mpbsecure.com +ibank.sabank.hr +ibank.snoras.com +ibc123.com +ibc168.com +ibc4u.com +ibc818.com +ibc888.com +ibcbet.com +ibet888.net +ibqonline.com +ibweb.alphabank.ro +icc-cpi.int +icecream-money.com +iconnect4.interiorhealth.ca +ict.gov.qa +id.telecom.pt +identity.ppdi.com +identitymine.com +idrettsmail.no +ie.com +ifa.ch +ifraudalert.org +ifs.thaeles.nl +igaseguros.com.br +igc.infragard.org +igeinfo.com +igniterealestatesite.com +igweb.meridiana.it +ihale.gov.tr +iiarc.net il.systemb2b.com il2l.com +ilsole24ore.com +im-sc.com +im.its.iastate.edu +images.bdotickets.com.au +imageworksdisplay.com +imail.healtheast.org +imakenews.com +imediador.com +img.mspub1.com +imgroup.com +imgssl.shinsegae.com +imperva.com +ims.esdcar.org +imsbackyardfightclub.com +imsbi.com +imsbuyezcombs.tv +imsbuyquicklawn.com +imsbuyshoesunder.tv +imschools.org +imscleverclips.com +imsdualforce.com +imsfiftydollargold.com +imsfridgegenie.com +imsfueldoctor.com +imslappertrays.com +imsmightybite.com +imsmightybitetv.com +imspalmwallet.com +incircle.alphaomicronpi.org +incircle.alumni.american.edu +incircle.artcenter.edu +incircle.ato.org +incircle.cmualum.com +incircle.drexel.edu +incircle.lagrange.edu +incircle.mainealumni.com +incircle.sae.net +incircle.tridelta.org +incircle.umalumni.com +incircle.usfalumni.org +incircle.westwood.edu +incircle.wiu.edu +incirclepro.com +incolink.org.au indraweb.indra.es +indstate.edu +inetportals.com ineways.com +ineways.eu +inewayscanada.com +infineon-farefinder.com +info.broadsoft.com info.enet-japan.com +info.oebv.com +infobear.bridgew.edu infonet.hz.nl +infosupport.com +inframan.nl +ing-diba.at +ing-hipotecaria.mx +ingramentertainment.com +inlogin.com +innmarinsecure.com +inos.nl +inria.fr +insattningsgarantin.se +inscodico.com +inside.cod.edu +inside.consona.net inside.nhl.com +inside.santamariaworld.com insight.smartdm.com +insite.henrich.de +instantfisherman.com +instantintelligence.com +insurancebis.com integrishealth.recruitmax.com +intellilink.visa.com +intellium.co.nz +interact2.ird.govt.nz +interconnect.be +interhosting.interfree.it interiorsandsources.com +interlaken-congress.gosecure.ch +intern.abm-energie.de +intern.abm-service.de +intern.goebel.de +intern.med-bz.de +intern.svk.no internal.imaginets.com +internal.ppww.org +internal.razimports.com +internap.com +intersourcing.com +intex.com +intra.2at.net intra.billing.ru +intra.motion10.com +intra.nordfyns-gym.dk +intra.svendborg-gym.dk +intra.unbonn.org +intranet.1-first.com +intranet.2nsb.org.au +intranet.a3is.com +intranet.abesse.hu +intranet.bexleygs.co.uk +intranet.bhtc.sandwell.sch.uk +intranet.britishscienceassociation.org +intranet.carrel.fr +intranet.ceff.ch +intranet.chilcote.bham.sch.uk +intranet.espria.nl +intranet.frederikssund.dk +intranet.grupocopisa.com +intranet.hallwilcox.com.au +intranet.ipi-gmbh.com +intranet.itsduero.es +intranet.majedie.com +intranet.mhc.cc intranet.peckham.org +intranet.scriptum-site.nl +intranet.stanville.bham.sch.uk +intranet.uck.nl intranet.ucol.ac.nz +intranet.xperta.se +intuit.com +intuitrebates.com inverhills.edu +investissementsdavenir.agencerecherche.fr +inzicht.dfa.nl +ioffer.com iol.pt +iowaworkforce.org +ip.clubcorp.com +ipayables.net +ipi-interactive.com +ippo.net +iqmetrix.com iqsystem.irrc.co.jp +iraniansinglesconnection.com +iris.colum.edu +irrc.co.jp +ish-bridge.com +ishbs.com +isi-net.com +isic.hu +isstct.cz +issuemanager.myriad-it.com +istoreit.net +isupplier.americanlafrance.com +it-consult.net +itgroovehosting.com ito.org.tr +itoncloud.com +itrackit.net itrade.fhtrust.com.tw +itsfogo.com +itsyourview.com +itunescards.co.za +iva.de +ivoo.certiris.be +iwcc.edu iweb.thebankersbank.com +iyummy.com j-union.com +jac.go.jp +jamestownregional.com +japanpost.jp jasaga.or.jp +jasmenterprises.com +jazanu.edu.sa +jeddah.zfp.com +jennisondryden.com +jerseymanagedhosting.com +jerusalem.muni.il +jetblue.com +jgh.com.sg +jhop.jp +jmlexaktsaw.com +jmlfastfit.com +jmlmagiccarpet.com +jmlscratchremover.com +jmlsmoothit.com +jmltwisteze.com +jmsapps.jmsmucker.net jnet.agsys.sompo-japan.co.jp +joagift.com job.disc.co.jp job.nikkei.co.jp jobmgr.disc.co.jp +jobs.1800contacts.com +jobs.carlsonhotelsasiapacific.com +jobs.cas.org +jobs.sourcefire.com +jockjam.nl +joeys.org +journie.net +jr.com.au +jrfh.tsacorporation.com +js.joomlaservices.ca +js.metalinq.com +jsps.go.jp +jta.jtafla.com +jtasoutheast.com +jumbomortgage.citimortgage.com +juneau.billeo.com +juronghealth.com.sg +k12.al.us +k12.ks.us +k12.mo.us +k12.mt.us +k12.nm.us +k12.pa.us +k12.sc.us +k12.wa.us +k12.wi.us +k9glowguardtv.com +kabeldeutschland.com +kabukiza-kabu.com kahosl.be +kalender.nakskov-gym.dk +kanagawa.jp +kanjam.com +kaosmos.jp +karierasro.cz +katlehotrust.co.za +kawacki.com.br +kb.mbms.com +kbacmportal.net +kcc.com +kcn.jp +kddi.ne.jp keas.com +keitaipost.jp +kemi.se +kenkou-design.com +keybankdeveloper.com +kfz-versicherung.faz.net +kgh.on.ca +kicho.shoko-shimane.or.jp +kidneycancerconnections.com kimberlyclark.myvurv.com +kindenonderwijsrotterdam.nl king-invest.net kingsdominion.com +kingsize-bottle.com +kingsmail3.kings-ely.cambs.sch.uk kingsroadmerch.com +kingston-college.ac.uk +kinsou.com +kintetsu-bs.co.jp +kintetsu-hoken.co.jp +kipp.org +kirenet.com +kit.ac.jp +kkcom.co.jp +klc-ondemand.com +klerx.biz +klikbca.com +klive.kellogg.edu +klz.org.uk +kme.ch +knox.nsw.edu.au +koffiecenter.be +koffiecenter.nl +kohlaborate.com +kontor.polytec.no +kordia.net.nz +korowa.vic.edu.au +kpchoicesolution.com +kpos.melsc.co.jp +kramesondemand.com +kredinor.no +krungsricashlink.com +krungsrifileserver.com +krungsrimobile.com +ks.gov +ktr.com +ku.dk +kuanywhere.ku.edu +kuk-networks.de +kulturgutschutz-deutschland.de kwiktrip.com +kwv.nl +kyfb.com +kymweb.tokoha-jc.ac.jp +kymweb.tokoha-u.ac.jp +labs.arubanetworks.com +ladyphoneshop.be +ladyphoneshop.nl +lakecomm.com +lambertconsulting.ch +lamda.org.uk +lancasterregional.com +lancer.webhosting.uk.com +laprevisionmallorquina.com +laptoporder.wab.edu +laptopshop.be +laptopshop.nl +larix.cevak.cz +las.perkinelmer.ca +las.perkinelmer.co.uk +las.perkinelmer.com +latax.lacity.org +lavprisfly.no +lbiclaim.com +lbschools.net +lc.leics.sch.uk +lcgs.tas.edu.au +lead.rotary.nl +leadintelligence.co.uk +leadrouter.com +leap.neustar.biz +learningseat.com +learningseat.com.au +learnsheffield.com +leben-hat-gewicht.de leerlingmail.niftarlake.nl +legacy.lcpharma.com +legacy.medietilsynet.no legalconnection.com +legalease.jmls.edu +lehighregional.com +lendingpit.com +lendingtreeautos.com +leopards-den.us +leshamwowoffre.com +level.mol.hu +lexor.lsp.at +lexsan.vestingonline.nl +lh.k12.ar.us +library.failteireland.ie +liemerscollege.nl +lifeaction.net +lifeio.com +lifenetems.org +liftmonitoring.nl +liftnfix.com lightstone.co.za +limewire.com +lincoln-obama.com +linkmanager.shalink.com +linkservicepro.com +linkzeal.com +lion.wild.net +lipa.ac.uk +lisa.lpshp.fi +listech.com +lit.edu +liu.se +livegrades.com +livingwithcll.com +livingwithlymphoma.com +ljbc.wa.edu.au +lkmc.com +lks.jackhenry.com +lmmis.com +lms.kansaigaidai.ac.jp +lnrmc.com +loanet.net +loans.citifinancial.ca +loans.citifinancial.com +loanstowomen.com +localret.cat +lodge.maishima.co.jp +logica.com +logicnet.pc-ware.org login-pos.eurobank.pl login-raty.eurobank.pl +login.aderantpm.com +login.bcferries.com +login.bild.de +login.clientaccess.net +login.danskerhverv.dk +login.dtl.eu +login.skwich.com +login.smmj.com +login.visionalist.com +logixs.com +logowanie.osemka.pl +london.edu +loro.ch +loterie.ch +loucoll.ac.uk +louisianaappliancerebate.com +lpb.dueri.net +lsu.edu +lucentis.com +lucky-pantry.net +luckybuy.com.tw +ludus.greve-gym.dk +ludus.grindsted-gym.dk +ludus.maribo-gym.dk +ludus.midtfyns-gym.dk +ludus.roskilde.dk +ludus.vuc-vsn.dk +ludusweb.akat.dk +ludusweb.frberg-gym.dk +ludusweb.fredericia-gym.dk +ludusweb.herninghfogvuc.dk +ludusweb.horsenshfogvuc.dk +ludusweb.middelfart-gym.dk +ludusweb.roende-gym.dk +ludusweb.toender-gym.dk +ludusweb.tornbjerg-gym.dk +ludusweb.vejle.dk +ludusweb.vucaarhus.dk +ludusweb.vucfyn.dk +ludusweb.vucha.dk +ludusweb.vuckolding.dk +ludusweb.vucroskilde.dk +ludusweb.vucstor.dk +ludusweb.vuctm.dk +ludusweb.vucvest.dk +lukeassoc.net +lumalamps.com +lungcancerconnections.com +lusitania-cs.pt +luxoft.com +lvmpd.com +lvs1.com lxr.com +m.aafes.com +m.stackmedia.net +maandag.nl maartenluther.calvijn.nl +maastrichtuniversity.nl +macaw.nl +macihotline.com +maconomy.com +madisonregionalmedicalcenter.com magelo.com magtek.com +mail.abz.ch +mail.accretivehealth.com +mail.achap.org +mail.acousticalspecialties.com +mail.activision.co.uk +mail.aeat.co.uk +mail.albany.k12.ny.us +mail.albil.com.tr +mail.alexdejong.com +mail.almajles.gov.ae +mail.amrita-parus.ru +mail.anbank.com +mail.aocterra.nl +mail.aps.k12.co.us +mail.arcelormittal.kz +mail.asapnet.nl +mail.asascience.com +mail.asmnet.com +mail.auscampus.net +mail.avalonhealthcare.com +mail.avanquestusa.com +mail.axemusic.com +mail.axens.net +mail.banquemisr.com +mail.baptisthealth.net +mail.bb.softbank.co.jp +mail.bbms.no +mail.bedeck.co.uk +mail.behr.ch +mail.beveric.com +mail.bfds.com +mail.bfw-mainz.de +mail.bigfishgames.com +mail.bilia.net +mail.borgmanschool.nl +mail.bornholmstrafikken.dk +mail.bpsd.mb.ca +mail.burohappold.com +mail.cafuamanagement.com +mail.cardinalhume.com +mail.cba.edu.sa +mail.ccina.ro +mail.ccsmgr.com +mail.cdh.com +mail.ceat.in mail.centrum.cz +mail.chargoon.com +mail.charlton.greenwich.sch.uk +mail.charltonschool.com +mail.chenderit.northants.sch.uk +mail.childrens.com +mail.citizensmn.com +mail.citp.nl +mail.cm-sobral.pt +mail.cmalliance.org +mail.cmpunjab.gov.pk +mail.colegiodorosario.pt +mail.collab.uni.edu +mail.comeup-soft.de +mail.compuworx.hu +mail.configura.com +mail.congreso.gob.hn +mail.connectivityit.com.au +mail.cookcountyil.gov +mail.coopdefrance.coop +mail.cpnpr.org +mail.crestron.com +mail.cssaz.org +mail.cta.org +mail.cvd.nl +mail.cws.biz +mail.datagroup.de +mail.dearborncountyhospital.org +mail.depend.se +mail.desancta.nl +mail.dioceseofgreensburg.org +mail.doe.k12.de.us +mail.dollardcollege.nl +mail.dqc-hosting.net +mail.drivetime.com +mail.du.ae +mail.e-farmcredit.com +mail.eatough.net +mail.ebsi.com +mail.edwards-ind.com +mail.emailonline.net.br +mail.energy.gov.ab.ca +mail.escrotrans.com +mail.exchpro.dk +mail.expertsystems.net mail.extranet.hp.com +mail.ezeit.co.uk +mail.fachisthers.com +mail.faf.cuni.cz +mail.federalequipment.com +mail.fhconsulting.com.br +mail.footballaustralia.com.au +mail.fozzy.ua +mail.g4s.no +mail.gallowglass.co.uk +mail.gama.com.tr +mail.geninf.com +mail.ggi-sa.com +mail.ggs.vic.edu.au +mail.globeteam.com +mail.gmrgroup.in +mail.govwentworth.k12.nh.us +mail.gpworldwide.com +mail.grafil.com +mail.groupegt.ca +mail.gruppocredem.it +mail.gruppoveritas.it mail.gtri.gatech.edu +mail.guideone.com +mail.guidewire.com +mail.guk.org.uk mail.gunnebo.com +mail.haderslev-gym.dk +mail.hallrender.com +mail.hamptoncollege.org.uk +mail.harbourmsp.com +mail.harvestnaperville.org +mail.havantacademy.co.uk +mail.hemofarm.com +mail.hgs.n-yorks.sch.uk +mail.hib.no +mail.hoegh.com mail.hoover.k12.al.us +mail.horizonsd.org +mail.houdijk.com +mail.hsd153.org +mail.hsventures.org mail.hzeeland.nl +mail.iac.com.tw +mail.icepronav.ro mail.idera.com +mail.iimc.kyoto-u.ac.jp mail.ilsole24ore.com +mail.indiska.se +mail.insanity-inc.org +mail.ipswichschool.net +mail.isnsolutions.co.uk +mail.itc.mb.ca +mail.itc.net.sa +mail.itcs.com.ge +mail.iteam.se +mail.itgsolutions.com +mail.itility.us +mail.itu.queensu.ca +mail.janaf.hr +mail.jardboranir.is +mail.jarfalla.se mail.jetblue.com +mail.jjuc.no +mail.jordanhospital.org +mail.jus.cz +mail.justinho.com +mail.kairos-it.com +mail.karlsson.se +mail.kces.de +mail.kerners.com +mail.kidneyfund.org +mail.kik.gov.tr +mail.kingscollegeguildford.com +mail.kit.ae +mail.kks.se +mail.klingenberg.com +mail.kolektor.com +mail.kubota-kma.com +mail.kvanum.com +mail.labranche.net +mail.lancercatering.com +mail.lfhi.com +mail.lochem.nl +mail.loreto.nsw.edu.au +mail.lpbs.org.uk +mail.mandersconsulting.com +mail.maristcollege.school.nz +mail.mariuspedersen.cz +mail.marnixcollege.nl +mail.mauser-cabs.at +mail.mbsds.com +mail.mbvm.org +mail.mciblues.net +mail.mcx.pl +mail.mcycd.gov.ae +mail.meau.com +mail.metito.com +mail.metrostav.cz +mail.metrotrains.com.au +mail.meyernetconsulting.com +mail.mf.dk +mail.micronav.co.uk +mail.midco.net +mail.middevon.gov.uk +mail.midental.org +mail.mihs.org +mail.milesplatts.co.uk +mail.minsterlaw.co.uk +mail.mlhslancers.com +mail.moe.gov.my +mail.momatos.com +mail.moorsidehigh.com +mail.mosa.gov.qa +mail.mrcc.aast.edu +mail.msa-oost.nl +mail.mulhouse.fr +mail.mvsd.ca +mail.mygcx.org +mail.myrtuemedical.org +mail.mysterynet.mb.ca +mail.namwater.com.na +mail.nap.gsic.titech.ac.jp +mail.navitasworld.com +mail.neway.co.il +mail.nicor.com +mail.nkadd.org +mail.nli.no +mail.normandale.edu +mail.norsar.no +mail.notionsolutions.com +mail.npaid.org +mail.nty.m86security.com +mail.oakley.kent.sch.uk +mail.ocusd.net mail.officebroker.com +mail.ofg.lv mail.oma.nl +mail.omanair.aero +mail.optimum.bm +mail.oshochem.com +mail.ouc.ac.cy +mail.paratek.com +mail.pdb.se +mail.petranso.com +mail.petrex.com.pe +mail.pewsey-vale.wilts.sch.uk +mail.pflag.org +mail.pgesco.com +mail.pinecreeksd.mb.ca +mail.plainconcepts.com +mail.plpsd.mb.ca +mail.pmc-sierra.com +mail.polycom.co.il +mail.primevision.net +mail.prsdmb.ca +mail.pukzh.ch +mail.qataridiar.com +mail.ravenstone.co.uk mail.rawlinscollege.org.uk +mail.rca.gov.om mail.rcsdk12.org +mail.red-red.ru +mail.reiv.com.au +mail.rewar.com.br +mail.rexel.nl +mail.ribblesdale.org +mail.richardhicks.com +mail.ridgian.co.uk +mail.rittal.be +mail.rkbs-de-vlinder.nl +mail.rmc.com.au +mail.ruudlighting.com +mail.sage.com +mail.saic-dc.com +mail.sarasamerica.com +mail.savininsurance.com +mail.sd206.org +mail.seekeducation.org +mail.serralves.pt +mail.sigtuna.se mail.silmu.fi mail.sinclair.edu mail.skmc.gov.ae +mail.skov.com +mail.skp.com +mail.sli.com +mail.slt.com.lk +mail.smart3group.com +mail.smiddy.co.uk +mail.softlinesolutions.com.au +mail.spotlight.co.za +mail.ssb.eu +mail.ssi.com.vn +mail.stadsmissionen.se +mail.stallionoilfield.com +mail.stccs.ca +mail.stcg.net +mail.steel-line.com.au +mail.storstockholm.brand.se +mail.stuwebportal.net +mail.styletronix.net +mail.sv-com.de +mail.svsd.ca +mail.swmed.edu +mail.tegola.ru +mail.texasent.com +mail.tgn.com mail.the-ascott.com +mail.thomassabo.com +mail.tommoz.co.nz +mail.townsquaremedia.com mail.tox-us.com +mail.transunion.com +mail.tri-center.k12.ia.us +mail.tridenttech.edu +mail.trinco.de +mail.tunisiana.com +mail.tvfr.com +mail.ufonegsm.net mail.ugs.com +mail.um.sopot.pl +mail.umfmpookies.info +mail.unitil.com mail.uottawa.ca +mail.usd450.net +mail.ustboniface.mb.ca +mail.uvh.nl +mail.vakko.com.tr +mail.valdichienti.net +mail.vasallen.se +mail.vejlehs.dk +mail.versicherungsforen.net +mail.vertigo.com +mail.vestconsult.dk +mail.vicore.se +mail.viettel.com.vn +mail.vmkfb.se +mail.wasbol.nl +mail.wasserstudios.com +mail.wbd.ru +mail.wcc.vic.edu.au +mail.wellsway.bathnes.sch.uk +mail.wienholding.at +mail.wipfli.com +mail.wsdmi.org mail.yvc.ac.il +mail.zoloto585.ru +mail01.nct.ac.uk +mail1.asfourcrystal.com +mail1.sog.ga.gov mail2.law.stetson.edu +mail2.lisluanda.com +mail2.marqnet.com +mail2.nonlinear.ca mail2.skanetrafiken.se +mail3.gibsondunn.com +mailer.kuehnel-web.org +mailfilter.bowdoin.edu mailhub1.cpsb.org mailhub2.cpsb.org +maillab.state.nm.us +mailsrv.angelantoni.it +mailsrv.artax.cz +mailstation.ch +maisoku.co.jp +mall123.com.tw +mallorca.co.uk +manabo.chukyo-u.ac.jp +manchester.ac.uk +mandat24.de +mangawebstore.com +manifest5.craig-is.com +manmail.nice.org.uk +manmaruyoyaku2.jp +manukinvest.com +mapmfc.com +marathonfoto.com +maringeneral.org +maritimetacticalsecurity.com +marketforceshopper.com +mars.micex.ru marshallsonline.com +maruetsu.net +marymount.qld.edu.au +massdor.com massport.com +matgenie.com +matmut.fr +matricis.com +matsuzakaya.co.jp +mattel.com +mayvillestate.edu +mbanking.ncrwebhost.mobi +mbdvd.com +mc0.multimap.com +mc4me.mccd.edu +mc4u-ext.mcdonalds.fr +mch.io +mchscares.org +mchvpn01.midcoasthealth.com +mcostaff.com +md-whistleblower.com +meadsd.net +meagpower.org +meathvec.ie +medewerker.jouwregardz.nl +media.filas.pl +media.martignetti.com +media.wschiro.edu +media3.ignitemedia.com mediabistro.com +mediacentershop.be +mediacentershop.nl +mediafire.com +mediamaxonline.com +mediazp.cz +medicalcannabismanager.com +medicalert.co.nz +mediclinic.co.za +meinkonto.orf-gis.at +meltitofftv.com +member.marmar.com.tw member.yong-online.com.tw +memberadviser.com +members.bsrservices.biz +memory-express.co.uk +memoryshop.be +memoryshop.nl +memphis.edu +merchantcart.net merchantonlineapp.com +mercyhousing.org +meriden.nsw.edu.au +merlin.ca merrickbank.com +messaging.macmahon.com.au metalinq.com +metrogr.org +metrostarsystems.com +mexicancupid.com +mf-web.d2c.ne.jp +mg.afimilk.co.il +mhhitws.cahwnet.gov +mhric.org +mhs1.3f.dk +mhsecure.dmcontact.com +michelsville.com +midfloridacardiology.com +midnightcharm.com +midwayautosupply.com +midwestregional.com miele.co.uk +migdataengine.cms.hhs.gov +mightyblasttv.com +mightyfixit.com +mightymendittv.com +mightythirstynow.com +mightythirstytv.com +mijnrijnijssel.nl +milkmandelivers.com +mill-hillcollege.nl +milldtrack.com miller.co.jp +milsoftssl.com +mindbusiness.org +mingorp.hr +misd.net mishlohim.co.il +misim.gov.il +mitserv.com +mizuho-int.com +mizuno.co.jp +mizuno.jp +mizunonetorder.com mizunoshop.net +mmint.org +mmrpatientview.com +mmrpersonalhealthrecords.com +mnscu.edu +mobil.alfru.net +mobile.animate-shop.jp +mobile.xjt.com +mobilebankcardservices.co.uk +mochiads.com mochibot.com mochigames.com mochimedia.com +mochimedia.net +mochipass.com +mod.yodobashi.com +moe.gov.ae +mof.go.jp +mohawkeriesharepoint.com +molinosmodernos.com +monash.edu +monbureau.sophiaconseil.fr +monreglement.fr +monserviceconciergerie.com +montebello.ridgevineyards.net +montetrader.com +montiplaza.nl +montroseaccess.org.au +mopera.net +morainevalley.edu +moralesfamily.net +moreheadstate.edu +morganschaffer.net +mosalira.nl +moshtix.com moss.esher.ac.uk +moss.ise.de +moundsparkacademy.org +mp01.canon.jp +mp3shop.be +mp3shop.nl +mrc-ws.mrceweb.com +mrclaurentides.qc.ca +mrmrshandycaddy.com +mrus.co.uk +msauth.mainstreet.fiserv.net +msbmyndigheten.se +mscw.vic.edu.au msexchange.lyon.edu +msg.gov.hu +msimmunology.com msishopper.net +msmail.mvnu.edu +msu.edu +msvpn.wusm.wustl.edu +mtimail.metal-technologies.com +mtnpeaktrail.com mtsexchange.mtsn.org.uk +mtvninvoices.com mudy.info +mule.co.kr +musc.edu +mustangps.org +mwd.incontech.co.uk +mwn.de +mws.acculynk.net +mx.ahmadiyya.de +mx.twfp.com +mxs.at +mxs.deff.ru +my-aime.net +my-hammer.at +my-hammer.de +my-office.ro my.bentley.edu my.berkeleycollege.edu +my.bluebunny.com +my.ccu.edu +my.colby-sawyer.edu +my.comprehensivesleep.com +my.cpscorp.com +my.dhlglobalmail.com my.dover.edu my.ecwid.com +my.hillsdale.edu +my.ju.edu +my.proactiv.com.ph +my.sandi.net +my.siematic.de +my.snhu.edu +my.tfl.gov.uk +my.unifiedbrands.net my.wcupa.edu +myabakus.net +myaero.org +myameda.com +myapps.skiffmed.com +mybenetech.com +mybethanyranchhome.org +mybfffishfood.com +mybffnow.com +mybigcommerce.com +mybuxtonwallet.com +mycardprinter.com +mychart.carilionclinic.org +myclinicallogic.com mycls.cls.ch +mycoldfire.com +mycollaboration.sug.com +mycundus.com +myemail.com.sg +myemail.sg +myesafedepositbox.com +myevolver.com +myexterran.com +myfauquierhealth.org +myfldocs.com +myfloodonline.com +myfluvaccine.com +mygetmighytighty.com +mygiftregistry.co.za +myhdwraparoundstv.com +myholtca.com +mymail.brueggers.com +mymail.warnerconnect.com +mymccc.mc3.edu +mymcso.com +mymdc.mo.gov +mymedicallocker.com +mymedicalrecordsmd.com +mynavi.jp +mynha.com +mynhatest.com myoffice.eu.goodyear.com myoffice.na.goodyear.com myparceldelivery.com +myparkbillstv.com +mypoint.com +myportal.vhschicago.com +myr00t.com +myriad.com +myriddexpulse.com +myservices.suffolk.ac.uk +myshakeweight.com +mysheridan.shcr.com +mystarcentral.com +mystatebillstv.com +mysteryworldnet.com +mystorage.cloudleverage.com +mystudentsquare.com +mysullystore.com +mytdriver.com +mytravelersflood.com +myvpn.mdavisinc.com +myvpn.ubc.ca +mywagnercat.com +mze.cz +n-fukushi.ac.jp na.ntrsupport.com +naehmaschinen-welt.de +nagasaki.lg.jp +namg1.ipsos.com +nan.kujalleq.gl +napster.com naramail.nara.gov +nas.gov.ua +nasadvd.com +nat.tribalddb.net +natchezcommunityhospital.com +national-preferred.com +nationalparkbillstv.com +nationalsecuritygroup.com +natlloyds-flood.com +navicast.jp +navysealsfund.org +nbch.com.ar +nbrc.org +nbst.org.uk +nccrimecontrol.org +ncm-c.org +ncmpay.com +ncmstl.com +ncst.com +ndcconsultants.co.uk +ndl.qc.ca +ndr.nu +nebraska.gov +nectarwallet.com +nelson.azdamiaan.be neospeech.com +net4.saga-ja.jp +netcafe.ft.dk +netdocuments.com +netleasing.ersteleasing.hu +netmail.nmh.org +netmailing.liderexpress.hr +netnfu.ne.jp +netorder.sogo-seibu.co.jp +netpractice.com.au +netstorm.no +nettkirken.no nettkontoret.kredinor.no +nettobank.ch +netview.nu +network.directrelief.org +networkrail.rapport-online.com +nevada.edu +never-was.com +new2u.us neways.com newaysonline.com +newcollege.ac.uk +newmarket.com +news.nzzexecutive.ch newvistalive.com +nexusos.net +nfipservices.com +ngenx.net +nhc.ac.uk +nhk-ep.com +nhs.uk +nhselearning.co.uk +nhtv.nl +nicovideo.jp +niftarlake.nl +nightingaleconant.co.uk +nihon-u.ac.jp +nikkei.co.jp +niktec.com +nimbus.peru.edu +nintex.com +njreflood.com +nmsmp.alsok.co.jp +noc.touchnoc.com nochex.com +nomade.etu.univ-nantes.fr noridian.totalonboarding.com +nortcoll.ac.uk +norwich-union.com +notebookbuffer.com +notes.parliament.qld.gov.au noticiastelemicro.com +notleyhigh.com +nousinfo.com +novabase.pt +novocorreio.ultra.com.br +nowa.ntelos.com nr.edu +nraesafe.com +nrwbank.com +ns002.toshiba-sol.co.jp +ns11mm.sept11mm.org +nsw.gov.au +nswmentors.com +ntdira.com +ntstaxonline.com +ntx.at +nubod.com +nuii.com +nuskin.com +nutropin.com +nuungolf.com nuwaveoven.com +nuwaveovennow.com +nwhc.ac.uk +nyvpn.conifersecurities.com +nzmail.deloitte.co.nz +nzz.ch +oasen.nl +oasiswebvpn.net +oasystems.co.nz +obdp.org +obsmail.com +ocean.ac-toulouse.fr +odlmarkets.com +odlsecurities.com +offertool.galenos.ch +office.mls.lib.il.us +office.occ.on.ca +office.rooscs.nl +office.tatemono.com +office.wacom.de +officemd.net +ogdenbancshares.com +oha.com +oit.ac.jp +olchs.org +ollusa.edu +olmsted.mn.us +oma.nl +omnidualsaw.ca +on-linepojisteni.cz +on-nets.com +one-info.net +onecoin.tayoreru.com +onee.se +onefmcremote.com +onesies.com.au +onestop.gsi.go.jp +oneuso.org +onforce.com +online-processingcenter.com +online.alpha-web.jp +online.alphabank.com.cy +online.americanbus.com +online.clalcredit.co.il online.eurobank.pl +online.julbo-rx.com +online.mycontoso.de +online.shamir.es +online.shamir.fr +online.shamirlens.co.uk +online.steens.dk +onlinebanking.bankofalbuquerque.com +onlinebanking.bankofarizona.com +onlinebanking.bankofarkansas.com +onlinebanking.bankofkansascity.com +onlinebanking.bankofoklahoma.com +onlinebanking.bankoftexas.com +onlinebanking.csbt.com +onlinebill.fl1.li +onlinebt.de +onlineclient.nyscorporate.com +onlinelibrary.wiley.com +onlineticket.jp +onmail.dk +onmyo.com +ontarioinsco.com +ontimeweb.itfocus.co.nz onyxinv.com +opel-leadengine.de +openhire.com +operations.nvmp.nl +oppassessment.eu.com +oppenheimerfunds.com +oppy.com +opsource.net +oralchirurgie-ehingen.de +orchardworld.co.uk +ordemenfermeiros.pt +order.fujifilm.com +order.pvpl.com +orderdiscoabs.com +ordermonster1200.com +orderoxyclinical.com +orderpacecoach.com +orderpopmemories.com +orders.airculinaireinternational.com +orders.caterlinkworldwide.com +ordina.nl +oreckvac.ca orix-sumai.jp +orixliving.jp +osaki-eweb.com +oscar.gov.au +oss.schuster-gmbh.de +osuvpn.okstate.edu osvinc.com +otodok.com otpbank.hu +otpcafeteria.hu +otppenztarak.hu +otsuka-shokai.co.jp +outdoorchristmaslighting.co.uk +outlook.belam.lv +outlook.bolthouse.com +outlook.bosleyconsulting.com +outlook.cgw.com.au +outlook.delichtenvoorde.nl +outlook.effix.be +outlook.fritzhansen.net +outlook.haarlem.nl +outlook.hfwu.de +outlook.hillcrest.vic.edu.au +outlook.it-service-schwadorf.de +outlook.kennedykrieger.org +outlook.probil.com.tr +outlook.t-online.de +outlook.wcsr.com +outlook.y-tech.co.il +outlook1.wilshire.com +outlookonline.nl +outlookpremium.com +outside.cmworks.com +outspark.com +overblick.se +overthedoor.com +ovo-zaanstad.nl +owa.aas.ru +owa.acbl.net +owa.addon.de +owa.afridata.net +owa.asp.ruf.ch +owa.belnet.de +owa.bushbros.com +owa.byui.edu +owa.cancom.de +owa.caritas.at +owa.cimt-ag.de +owa.cms-hs.com +owa.consilium-uk.com +owa.consortioservices.com +owa.dannenbaum.com +owa.db-international.de +owa.dbr.com +owa.dish.com owa.dist113.org +owa.dunnhumby.com +owa.dyrbergkern.com +owa.edipresse.ch +owa.electric-house.com +owa.eneco.eu +owa.esn.at +owa.eucnordvest.dk +owa.exe.it +owa.executrain.com +owa.fh-jena.de +owa.gfe.com +owa.gft.com +owa.gtlaw.com.au +owa.hcuge.ch +owa.helsingborg.se +owa.iadt.ie +owa.ic3.gov +owa.isl-automotive.com +owa.itsindy.com +owa.iwco.com +owa.jabirumetals.com.au +owa.jacksonkelly.com +owa.jetstar.com owa.kajak.fi owa.kan.se +owa.kromannreumert.com +owa.kwfdn.org +owa.lamy-lexel.com +owa.lfb.fr +owa.lrgs.org.uk +owa.mainroads.wa.gov.au +owa.matrix.co.il +owa.mdx.ac.uk +owa.midroc.se +owa.namfg.com +owa.narsaq.gl +owa.nd.edu.au owa.nordakademie.de +owa.orangecoastcollege.net +owa.oranim.ac.il +owa.otani.ac.jp +owa.ouc.com +owa.palama.gov.za +owa.parlement.nl +owa.peak-it.nl +owa.perceptis.com +owa.pinklotusbreastcenter.com +owa.prgparking.com +owa.prinbox.com +owa.priorsfieldschool.com +owa.qaqortoq.gl +owa.qortex.com +owa.rbs1.com +owa.rcha.net +owa.rochesterathleticclub.com +owa.roeverbroenner.de +owa.rrpub.com +owa.rtc-mailing.de +owa.rtix.com +owa.sirc.co.il +owa.sktf.se +owa.slagelse.dk +owa.smh.ca +owa.spservicing.com +owa.st-benetbiscop.org.uk owa.tecnicasreunidas.es +owa.terremark.com +owa.uni.lu +owa.uniten.edu.my +owa.vetmeduni.ac.at +owa.wdm-ia.com +owa.westoncolorado.com +owa.windmobile.ca +owa.witstor.de +owa2.earthfare.com owa2k3.bhw.de +owamail.calu.edu +owenscorning.com +oztravel.com +p2pia.com +pagos.uveritas.ac.cr +pagport.jp +painel.mtv.com.br +painel.onlinesol.com.br +pajamajeans.com +pamperedchefconsultantcardapplication.com +pandorahost.net +paperlessemployee.com parfumdreams.de +parkbillstv.com +parkcity.org +parking.bristolairport.co.uk +parrishmed.com +partille.se partner.buzzcity.com +partnerhosted.com +partners.carnegieam.dk partners.conocophillipsalaska.com +partners.org +partners.sitesense-oo.com +partners.smartname.com +pascoregionalmc.com pastel.co.za +pastelincheck.co.za +pasts.lattelecom.lv +pasts.riga.lv +pathfinder.woolworths.co.za +pathrocket.com +patsiprod.upr.edu +pay.cimbal.com +paybacktime.com +payment.soulultimatenation.com.tw +payments.abm.com +paymyassociation.com +pbhrmc.com +pc-one.net +pc-soft.info +pcpobr.nl +pct.edu +pdashop.be +pdashop.nl +pdgm.com +peacecorps.gov +peaceriverregional.com +peckham.org +pedirefills.ca +pedvd.com +peelpolice.ca +penncommons.com +pent-valley.kent.sch.uk +perfectbrownie.tv perfectmoney.com +perimeter.eiu.edu +perkinelmergenetics.com +perse.co.uk +personalausweisportal.de +perspectica.telmetrics.com +perspektive-it.de +pest.griffsoft.hu +pestfreetv.com +petfinder.com +pethairpicksytv.com +petshed.com +pfizerpro.jp +pgcwl.com +pgfl.org.uk +pgi105.pacifica.edu +ph.book.airbypleasant.com +phfewic.org +photomask.com +phwebvpn.org +phwebvpn2.org +physiciansregional.net picnik.com +pictureitpostage.com +pieseautoaccesorii.com +pim.hypoport.de pimkie.de pimkie.es pimkie.fr pimkie.it pineconeresearch.com +piratenpartei-nrw.de +pittsborotransportationplan.com +piwik.healthplan.com +pixgate.fokus.fraunhofer.de +pizzutitrac.com +pl-fax.com +pl.wikidot.com +planapps.org planet-tachyon.com +plasmacool.ca +plasmacool.com +plasmaquebec.com +platform-one.suffolkone.org +playlsi.com playneverwinter.com +playnextlevel.com +plusuk01.smartsgroup.com +pluto.fipotex.com +plweb.evenflo.com +pmat3.com +pmptech.biz +pobal.ie pocket.matsui.co.jp +pocketchair.com +pocketu.jp +pocklingtonschool.com +poczta.adamed.com +poczta.barlinek.com.pl +poczta.km-net.pl +poczta.umwm.pl +pocztam.pap.pl +pods.thinkorswim.com pokervt.com +polautomatisering.nl +pooledmoneyinvestmentboard.com poolzconnect.singaporepools.com.sg +poplarbluffregional.com popularglasses.com portaal.nh1816.nl +portaal.steenbok.com +portaal.veenendaal.nl +portail.bienetrealacarte.com +portail.croix-rouge.fr +portail.ensai.fr +portail.mairie-blagnac.fr portail.mont-notre-dame.qc.ca +portal-dynamics.com +portal.aasa.ac.jp +portal.algoe-it.nl +portal.aquon.nl +portal.asms.sa.edu.au +portal.bisd.com +portal.brescia.co.za +portal.campverde.az.gov +portal.capital-tour.ru +portal.cmocpa.com +portal.coastalrange.ca +portal.collaborative.com +portal.colonialsd.org +portal.core.gb.com +portal.covenantsolutions.org +portal.crh-corp.net +portal.crtx.com portal.eduweb.vic.gov.au portal.eiffel.nl +portal.estridge.net +portal.flaglerschools.com +portal.gov.cz +portal.gses.l-3com.com +portal.halcyonit.com +portal.hallco.org +portal.hc-vlc.nl +portal.heel.com portal.hello.ch +portal.hpisd.org +portal.hud.de +portal.human-skills.com +portal.hutto.txed.net +portal.ijsselcollege.nl +portal.klinikum-niederlausitz.de portal.klz.org.uk portal.langara.bc.ca +portal.marchesschool.net portal.mariestad.se +portal.maryhare.org.uk +portal.mez.nl +portal.mhyork.org +portal.myabc.no +portal.netcuras.com +portal.nordavia.ru +portal.orlandoheart.com +portal.pascack.k12.nj.us portal.peckham.org portal.perse.co.uk +portal.riskrighter.com +portal.s1.com +portal.sangart.com +portal.sierrasystems.com +portal.sigmax.nl +portal.skbo.nl +portal.skitsap.wednet.edu +portal.stjansdal.nl +portal.svms.net +portal.tape-llc.com +portal.telefonbuchverlag-sutter.de portal.tku.ac.jp +portal.toreboda.se +portal.usgjuristen.nl +portal.yourithost.com +portal.zeidlerpartnership.com +portal2.znb.nl +portale.ervet.it +portam.jp +porthuronstclairsharepoint.com post.norwegian.no +post.simple.ru +post.socialrdg.dk +post.stortinget.no +post.time.kommune.no +post.wastecare.co.uk +posta.copma.it posta.dsi.gov.tr +posta.kolektor.si +posta.nuk.uni-lj.si +posti.hippos.fi +posti.pirko.fi +postkodlotteriet.se +postur.borgun.is +postur.hve.is powerschool.ccsdut.net +powerschool.com powerschool.lawrence.k12.ma.us +powershiftfastcash.com +powertoolshop.be +powertoolshop.nl +pph.peres-center.org +practika.ru +pragma-group.biz +precash.com +preferredhomecare.com +preishelden.de +premierinc.com +premiodestaque.com +primehhs.com +princeportal.com +princeton.edu +printershop.be +printershop.nl +private.stelizabeth.com +pro.mothers-auction.net +procapita.gfbs.se +procoder.aviacode.com +proexam.org profil.centrum.cz +profilecenter.ru +profitbuilderenroll.com +profitweb.afasgroep.nl projectinsight.cbre.com +projectserve.disti.com +promail.ru +proposalsystem.seic.com +provident.com +providentfunding.com +provider.dchpkids.com providers.tufts-health.com +prox-c.com ps.dvusd.org ps.glenbard.org ps.liberty.k12.mo.us +ps.meridianschools.org +psiwebmail.com psyquel.com +ptcube.de +ptstaxonline.com +ptw.qp.com.qa +public.myfwc.com +pufferfish.de +pulmozyme.com +puripo.jp +puser.centrum.sk pushentertainment.com +pvhs.org q8car.com +qbranch.se +qeliz.ac.uk +qenos.com +qenterprises.com +qeportal.co.uk +qewebmail.co.uk qisweb2-verw.uni-hohenheim.de +qmgs.walsall.sch.uk +qqweb.jp +qsquirrel.com +qt.sat.gob.mx +quickreg.ci.irvine.ca.us +quintogest.com +quon.asia quotien.onlinebank.com +qvc.jp +qvcliquidation.com +qwazy.net +r1.techpuls.hr +r4.musicstationonline.com +ra.budco.com +ra.hntb.com +ra.libertymgt.com +ra.pega.com +raasnet.com +raciborz.edu.pl +rahorizons.com +raildata.orr.gov.uk rainforest-alliance.org rakuraku-market.com +rakuten.co.jp +rampvpn.tessituranetwork.com +raona.com +raptiva.com +rasowa.ramairservices.com rbc.bridgetrack.com +rbsiseast.org.uk rc.kotoha.co.jp +rcssalem.com +rcxasa.watson.ibm.com +rd.rlcdn.com +rds.ilc.gov.au +reach-clp-helpdesk.de +reaktor.no +realsuperpass1.smartsubs.net +redbullcontentpool.com +redhawk.golfcart.com +region-view.com +register.daum.net +register.lynctrial.com +registration.gov.gg +regmurcia.com +rehabcare.com +rejuvenateautocanada.com +relaxtrade.com +releaseyourpotential.net +rem.clow.net.nz +remedy.justice.gov.za +remote.4tw.dk +remote.aa.net.nz +remote.aacl.com.au +remote.ap.asm.com +remote.bdmtexas.com +remote.capita.co.uk +remote.cftc.gov +remote.clickconsult.com +remote.clovertowing.com remote.cushingco.com +remote.daugherty.com +remote.dumasmining.com +remote.fhn.org +remote.fnh.no +remote.frog.se +remote.frontier-si.com +remote.fumcallen.org +remote.gndlaw.com +remote.graduateleverage.com +remote.hbcs.org +remote.hillvue.com +remote.hrjconsulting.com +remote.hselaw.com +remote.ilergroup.com +remote.inshuckch.com +remote.ipmotion.de +remote.keyorganics.net +remote.maybourne.com +remote.neighborimpact.org +remote.nexant.com +remote.nlogic.com +remote.nmcfd.com +remote.noyes-hospital.org +remote.opensolutions.com +remote.penton.com +remote.progpl.com +remote.queens.org +remote.reefdiver.de +remote.renouf-family.com +remote.rttg.co.uk +remote.sb-groep.nl +remote.senhoc.com +remote.sgsep.com.au +remote.shetland.gov.uk +remote.slalomdemo.com +remote.slfa.com +remote.starofhope.us +remote.sticares.org +remote.thechurchofgod.org +remote.unicorr.com +remote.unitedspinal.org +remote.utsystem.edu +remoteaccess.skaggs.net +remoteaccess.starkstate.net +remotecall.jp +remoteoutlook.webjet.com.au +remoteportal.nasonhospital.com +remotingcoders.com +rencap.com +reporthawk.com +reporting.accesshma.com +reporting.accessrga.com +reportingportal.com reprofinance.com +republiconline.republictt.com +resalesmart.com +resealandsave.com +research.majesticsteel.com +researchapoptosis.com +researcharchive.wintec.ac.nz +researchherpathways.com +researchvegf.com +reservations.encorelasvegas.com +reservations.wynnlasvegas.com +resource-ctr.com +ressu.ficora.fi restaurantwedding.jp +resurskontoret.se +retailer.gfkms.com +retention.nextpage.com +retina.org +revlonrunwalk.com +revonix.com +rewardgateway.co.uk +rewardplus.co.uk +rezitech.net +rgdata.com.ua +rgiexchange.net +rgiimail.com +rhwebmail.com +ricoh-usa.com +riddexcanada.com +riddexpulse.com +riddexpulsenow.com +rightathomehomestay.com +riksgalden.se +rileyhosp.com rio.edu +risesupport.com +risk-buster.com +rismail.rafflesis.com +ristken.com +rituxan.com +riverartsfestmemphis.org +riveroakshosp.com +riverviewregional.com +rk.sjdc.co.jp rlcdn.com +rlh-gmuend.at +rma.sensus.com rmg.i-grasp.com +rms.unlv.edu +rochester.edu +rockettesdvd.com +rocmondriaan.net +rodekruis.nl +rodino.ro +rome.faber.co.uk +rosalie.ciad.ch rosevalleyindia.com +rosey.ch +ross.fs.fed.us rotaban.ru +routercenter.be +routercenter.nl rozodoniy.com rpv.fbn.ca rr.com +rreporter.nl +rs.gov.br +rsasurveys.co.uk +rsg-nc.rsgsystems.com +rsmn.reschini.com +rsmoss.rsmedical.com +rsracing.com +rsu.lv +rt.rtoaster.jp +rtstr.netbk.co.jp +rumail.rockefeller.edu run.auone.jp runnet.jp +runraceresults.com +rush.edu +ryujus-netsuper.com +s-immobilien.de s-yoyaku.city.sagamihara.kanagawa.jp s-yoyaku.city.urayasu.chiba.jp +s.ixiaa.com +s.ncp.imrworldwide.com +s1defense.com +saab-leadengine.de +saas.dynamate.eu +saas.it-telcom.nl +saas.nines.nl safelinkwireless.com +safestream.com +safetekusa.com sail.iwcc.edu +saintvincenthealth.com +saksincorporated.com +salaris.acera-online.nl +sales.skipark.com +salvador-dali.org +sam.lst.se +sam.sesameworkshop.org samba.huji.ac.il samsami2u.wordpress.com +samsclub.com samstores.com +samworthenterpriseacademy.org +sandalsuperstore.com +sandingglovestv.com +sandiskdealpal.com +sandwellschools.org.uk +sanpasqualunion.net +santa-clarita.com sap.kenexa.com saratogaschools.org +sas.com +satalyst.com +satis.tcdd.gov.tr +savpn.sysadm.suny.edu +sbdc.uga.edu +sbiapps.sitesell.com +sbobet.com +sbr.shooti.jp +sbsgroupusa.com +sby.co.il +scad.edu +scarboroughcollege.co.uk +scartreatmentnow.com +scb.flysas.com +scca.com +sch.uk +schedulemyshot.vaxamerica.com +schicktech.com +schoolwebpages.com +schulstatistik-thueringen.de +scientia.sk scottsliquidgold.com +scu-vpn.scu.edu.au +sd68.bc.ca +sdt.tntpost.nl +sdx-ag.de +seanet.sbexp.com search.boox.jp search.petfinder.com +secep.net +secondmarket.com +secservizi.it +sectorzero.pt +secure-access.cne-siar.gov.uk +secure.3creditreportsinstantly.com +secure.aceinsurance.com.au +secure.anzmoneymanager.com +secure.asce.org +secure.astepsdiv.com +secure.atriacom.com +secure.atv.com +secure.bybox.com secure.cambrianc.on.ca +secure.citizenlink.com +secure.click2callu.com secure.court.gov.il +secure.cst.org +secure.cygnusresources.com secure.discountadvances.com secure.earthclassmail.com +secure.eastbayfellowship.org +secure.elcofduval.org +secure.frenell.com +secure.globalstar.com +secure.gway.org +secure.igliving.com +secure.keuzenkamp.eu +secure.makinglifebetter.com +secure.mbsbillingsolutions.com +secure.mcpa4you.org +secure.mdrc.org +secure.mededcoventry.com secure.merchantcart.net +secure.molapo.co.za +secure.motorcycle.com +secure.mrcad.co.uk +secure.my3creditreportsinstantly.com +secure.mybybox.com secure.mycashnow.com +secure.nicoga.jp secure.nochex.com +secure.nufactor.com +secure.passport.mnginteractive.com +secure.payconnect.net secure.paydaymax.com +secure.personalwatercraft.com +secure.pompvanhetvolk.be +secure.reboot.ca +secure.rfi-walmart.com +secure.rhodesfs.com +secure.sandhillsregional.com +secure.sbmonline.com +secure.sjpharmacal.com +secure.snowmobile.com +secure.softwarepursuits.com +secure.stuartelvish.com +secure.tempus-rex.com +secure.vivemejor.com +secure.www.contracostatimes.com +secure.www.dailybreeze.com +secure.www.dailybulletin.com +secure.www.dailynews.com secure.www.denverpost.com +secure.www.la.com secure.www.mercurynews.com +secure.www.montereyherald.com +secure.www.pasadenastarnews.com +secure.www.presstelegram.com +secure.www.redlandsdailyfacts.com +secure.www.santacruzsentinel.com +secure.www.sbsun.com +secure.www.sgvtribune.com +secure.www.siliconvalley.com secure.www.twincities.com +secure.www.whittierdailynews.com +secure.wzhi.net +secure.your3creditreportsinstantly.com secure.zeelandnet.nl secure.zoominfo.com secureaccess.cacu.com +secureconnect.shawgrp.com +secureconnect.uis.edu +secured.erdbeerli.ch +securedatacollection.com securedlogons.humanadental.com +securefeed.co.uk +securepayment.newapproachmarketing.co.za +securetrack.rebatetrack.com +securevtp.com +securible.com +securities.com +sedgemoor.gov.uk +seearprewards.com +sefinenlinea.jalisco.gob.mx seha.ae +seibu.jp +seibubus-gt.jp +seisentopbin.com +seizetheday.com selfcare.rr.com +selfservice.smartree.com +selfservice.vsource.com +semanticweb.com +sen-farefinder.com +send.group.com +senvpnen.senate.gov +sercel.com +serifrebates.com +serv.webhostnr1.com +server.alsautomotive.com +serveraccess.practice-it.co.uk +service.deutschepost.de +service.hkn.de +service.itatbusiness.de +servicebund.com +servicedesk.geoeye.com +servicelinkproonline.com +servicemagic.com +serviceportal.telekom.at services.bag-mail.de +services.canadoil.com +services.esc-pau.fr +services.gyc.ac.uk +servicingconnect.com +servizi.allianzbank.it +servizi.atime.it +sesameconnection.org +setnlift.com +sf-vpn01.embark.com +sfoon.com +sfsj.se +sftsrc.com +sgw.ngxo.trinity.ebay.co.uk +sgw.ngxo.trinity.ebay.com +sgw.ngxo.trinity.ebay.it shakeweight.com +shakeweight4men.com +shakeweighttimer.com +shaklee.com +shamir.pt +shamwowca.com +share.epeerless.com +sharepoint.centurionmp.com +sharepoint.convergys.com +sharepoint.exiis.net +sharepoint.rosasconstrutores.pt +sharepoint.smartit.ch +sharepoint.xformity.com +sharepointgermany.cinram.com +sharepointgurus.net +sharepointiichiprojects.iichi.org +sharkweekdvd.com +sharpmail.sharpamericas.com +shavematetv.com +shavershop.be +shavershop.nl +sheabuild.com shiki.gr.jp +shiki.jp +shinsei.kyoukaikenpo.or.jp +shochiku-kabu.com +shop.benningtonmuseum.org +shop.fatboy.co.uk +shop.fatboy.com +shop.fatboy.de +shop.fatboy.fr +shop.fatboy.nl +shop.foxxfoe.com +shop.ftv.com.tw +shop.kgcheck.com.tw +shop.lindora.com +shop.rcn.com +shop.whatsinyourcity.net +shop123.com.tw +shop4.vcomshop.com +shopbase.finetunes.net +shopnchekshopper.ca +shopnchekshopper.com +shopoutdoornebraska.ne.gov +shoptotalpillow.com +shortinsights.com +shortside.com showcase-tv.com +shr.ro +shsmail.swedish.org shsremote.solarishs.org +shutdown.cfs.iupui.edu sierranevada.com +sigmakudos.com +signup.cloudprofile.com +sildelaget.no +silkcloudservices.microfocus.com +silkroad.com +silverjoes.com +simonizfixittv.com +simonlyshop.nl +simplewebmanagement.com +sims.tanfieldschool.co.uk +sinergiefinancial.net +singtel.com +sip.ttcg.net +siriusxmrewards.com +sis.ais-r.edu.sa sis.ggusd.us +sis.gpc.edu sisense.com +sistema.giannetti.com.br +sjomannskirken.no +sjpremote.com +sjsualumninetwork.com +skills.luovi.fi +skivehs.dk +sklep.vitapertutti.com +skmm.gov.my +skogforsk.se +skyliner.ec.keisei.co.jp +slg.schools.nottscc.gov.uk +slinkprovider.com +slowemdownbowl.com smart.otpbanka.hr +smartdrv.com +smartmoptv.com +smartphoneshop.be +smartphoneshop.nl +smes.org +smoothawaysite.com +smtp.ikic.co.jp +smtp.ngatawa.school.nz +snuggie.ca +snuggiefordogs.com +snuggieforkids.com +snuggietv.com +snuggievarsity.com sobexinvest.com socketstore.co.uk +socrambanque.fr +sodexhovpn.com +sodexovpn.com +softsupercoolertv.com +sog.nl +sogo-gogo.com +sols.org +solutionsbiz.com +solvethatdebt.com +son.stellatravel.com.au +sonicwall.com +sonymusicd2c.com +soquij.qc.ca soundvision.com +southernwine.com +southlakecarroll.edu +sp.cti-w.com +sp.edu.sg +sp.hanoverva.gov +sp.se +sp1.zvw.uni-goettingen.de spalding.edu +sparinvest.dk +sparkasse.de +sparrapid.se +speedy2k3.viglen.co.uk +speedyspark.com +spilldaddy.com +spkgroup.com +spkhome.net +spknet.com +splogin.se +sports-nakama.com +sportundshop.de +spragueenergy.com +springer-sbm.com +springhillregional.net +springisd.org +sprint.com +sprint.net sprintrebates.com +sprooms.swiss.com +spss-asp.com squareup.com +sr-owa.walter.net.au +sra.com +src.sk.ca +srigold.com +srmcfl.com ss3.e-state.co.jp +ssl-vpn.multifa.com +ssl-vpn1.aau.dk ssl.arcsoft.com +ssl.clinique-pasteur.com +ssl.coig.pl +ssl.cpmc.columbia.edu +ssl.ksd.ch +ssl.levinglobal.com +ssl.siih5962.fr +ssl.walsworth.com +ssl.weniger-verbrauch.de +ssl.whoajack.com +ssl2.americanprogressaction.org +ssl3.costar.com +sslclient.runshaw.ac.uk +sslgw.emis-electrics.de +sslvpn.accent.nl +sslvpn.bentonpud.org sslvpn.broadcom.com +sslvpn.curtin.edu.au +sslvpn.emerson.com +sslvpn.mid.org +sslvpn.nyp.org +sslvpn.roedl.pl sslvpn.savannah.chatham.k12.ga.us +sslvpn.thrivent.com +sso.agglo-royan.fr +sso.collegeboard.com +sso.utilityservice.com +st.ig.com.au +stadspoort.asp4all.nl +staff.ftc.health-partners.org +staff1.f-i-f.co.uk staffmail.brighton.ac.uk +staffmail.ja.net +staffordschools.org staffportal.bne.catholic.edu.au +stage.sparksecure.com stapleseasyrebates.com +stapleseasyway.com +start.spro.no startnextweek.com.au +startrack.gfkrt.com startrekonline.com +starwoodresidenceclub.com +starwoodvacationownership.com +state.fl.us +state.ks.us +state.wy.us +static.brandsclub.com.br +static.collegeprowler.com +static.gebrauchtwagen.de +static.limewirestore.com +statistik.msb.se +statlerhotel.cornell.edu +stc.ac.uk +stcloudregional.com ste-exch1.nhc.ac.uk +steeleye.com +steelhorsecomputers.com +stemcellskintherapytv.com +stetson.edu +stichtingwillemvanoranje.nl +stihl.de +stilltracking.com +stlawrencecollege.ca +stleonards.vic.edu.au +stlogic.com +stofzuigerstore.be +stofzuigerstore.nl +stone-ware.com +stoneware.cloverdale.k12.in.us +store.homeheartbeat.com +store.sun.com +store.toto-dream.com stores.channeladvisor.com +stories.citi.com +stormgenius.com +stpats.vic.edu.au +straitservice.com +strapperfect.com +strapperfect.tv +stratfordhigh.org.uk strideeveryday.com +strijkijzerstore.be +strijkijzerstore.nl +stringfellowmemorial.com studentdata.warwick.ac.uk +studentinfo.trinityhigh.com +studmagic.com studynet.dem.hva.nl +stylio.jp subjectivemetrics.com +sug-spirit.net +suitespot.mynextsuite.com +summitmedicalcenter.net +summitshack.com +summitstrategies.com +sundahus.se +sunriseearthdvd.com +superhub.hk +support.ataretail.com +support.bsc-ideas.com +support.cryptas.com +support.dridefault.com +support.goshen.bluestarpro.com +support.landsteinar.nl +support.mcigb.com +support.orgmanager.de +support.rosebudtech.com +supportlink.net survey5.spss-asp.com surveys.itsyourview.com suvana.com +svc.aegmis.de svelvik.skole.d-ikt.no +sw.nvusd.k12.ca.us +sw.quirinale.it +sw4men.com +sw4menespanol.com +swartdev.net +sweden.icw.se +sweettracking.com +swiss-rx-login.ch +switch2verizonfios.com +swivelwonderhanger.com +swuhealth.org +sykehuspartner.no syllabus.doshisha.ac.jp +symetra.com +synergy.nma-ict.nl +synergy.workarea.nl sys.ins-uni.co.jp +syspro.com +system.cord.osaka-geidai.ac.jp +systemb2b.com +t-mobile.nl +taerobicsdvds.com +tahomasd.us +tai.com.tr +tamiflu.com +tandenborstelstore.be +tandenborstelstore.nl taocan777.com +tapapp.com +tarceva.com +tas-japan.com +tasgroup.cl +tasmanliquor.co.nz +tasmantest.sdc-online.net +tastiwave.ca +tastiwave.com +tastiwavepan.com +tatertornadotv.com +taxport.convey.com +taxslayer.com +taxslayerbooks.com +taxslayerpro.com +taxstatusnow.com +taxtes.com +tc4men.com +tco.cfbt-inspections.com +tcspost.thomassen.com +tdj.ac.jp +teachingpersonnel.com +teambrandon.ca +tecdlr.com +technology-security-associates.com +technologyandstrategy.com +techscaler.com +tecplot.com teetimesusa.com +teetroit.com +telaris.wlu.ca +telefoonshop.nl +teleplan.no +telifhaklari.gov.tr +tellabs.com +temptationscanada.com terrabanking.romexterra.ro +testdrivereward.com testdriveunlimited2.com +tewkesburyschool.org +tge.cl tgn.co.jp tgw.com +the-house.com +the-k-factor.com +theadspot.tv +thealabamacollegesnuggie.com +thealbany.biz +thebarkoff.com +thecarletonsheetscoachnetwork.com +thecharacter-classics.com thecinema.in +thecomfortfurnace.com thediamondstore.co.uk +thedownsschool.org +theezstringer.com +thefushigi.com +theglobalfund.org +thegreenspider.com +thehandyvalet.com +thehexlightsite.com +theknowledgeexchange.info +themicrowallet.com +themightysuperstore.com +theorphan.com +thepalmwallet.com +thepancakepuff.com +therockradionetwork.secure.myhosting.net +thesecuraoven.com +theshedd.org +thesource.freemanco.com +thesuperjuicer.com +thetotalcore.com +thewire.wynnresorts.com thor.movistar.com.co +threepalms.com +threescompany.com +thueringen.de +thuis.ckxs.com +thw.de thymes.com +thymesnet.com +ticket-web-shochiku.com +ticket.fast.no +ticketfly.com +tickets.carowinds.com +tickets.dorneypark.com +tickets.spoorwegmuseum.nl +tickets.valleyfair.com +tickets.worldsoffun.com +tidytweet.com +tieup.demae-can.com +tightboards.com +tigmail.tigdistributing.com +time.staffme.net +timken.com +timtrac.ca +tirerebatestatus.com +tis.co.jp +tis.jp +tixforkids.org +tjmaxx.com +tku.ac.jp tlfw01.fhsg.ch +tmgowa.pointsharp.net +tmsanalytics.com +tmsnervecenter.com +tnkase.com +tohmatsu.co.jp +toho-u.ac.jp +tokem.fi +token.vpn.mim.dk +tokyo.jp +toltestworld.com +tomategigantetv.com +tomwatsondvdtv.com +tondeusestore.be +tondeusestore.nl tools.med.nyu.edu +topearnmoney.com topfox.co.uk +toppenishhospital.com +topsytomatotree.com +topsytree.com +topsytreetv.com +toptvstuff.com +toranoana.jp +toranomon-ichiba.com +tosti-asia.com totalcore.com +touchnbrush.tv +toutatice.fr +tpmail.transplace.com tracs.txstate.edu +tradecollege.com.au +traderssupersummit.com +trans-cosmos.co.jp +transat.com +transmontaigne.com +transportationtomorrow.on.ca +travelersflood.com +travelerssaves.com +travelindochina.co.nz +travelindochina.co.uk +travelindochina.com +travelindochina.com.au +travelmoneynow.com +trebesin.cz +trendsource.com trialpay.com +tribune.com +tricarsales.com +tritium.ch +trusted.com +tryabcircle.com +tryabrocket.com +tryabrocket.tv +tryabrocketflexmaster.com +trycrunchlessabs.com +tryeasyfeet.com +tryeasyreach.com +tryeyemagic.com +tryfastfit.com +tryfreegrillglovetv.com +tryfreerejuvenate.com +trygianttomato.com +tryhealthinitiative.com +trymybffnow.com +trymytomatofactory.com +trypetmd.com tryshakeweight.com +tryshakeweightespanol.com +trysidesleeperpro.com +tryslimmersilhouette.com +tryslimtsnow.com +trytomatofactorynow.com trytotalpillow.com +ts.cadritech.com.br +ts.k14.net +ts.transsoft.dk +tsn.dataresolution.net +tss-j.co.jp +tsubuyaki.fx.dmm.com +tsuweb.pilgrimsoftware.com +tu-chemnitz.de +tu-dortmund.de +tuev-nord.de +tufts-health.com +tui.rewardgateway.ie +tulane.wisenbaker.com +tum.de +tunnel.ltu.edu +tunnel.services.wisc.edu +tutornet.com.br +tuvakademie.it +tuwien.ac.at tvspy.com tw.event.gamania.com +twinriversregional.com +twoa.ac.nz +twyford.ealing.sch.uk +twynhamschool.com +tx.maxim-ic.com +tylerisd.org +u-tokyo.ac.jp +uab.edu +uatoa.americanexpress.com +ube-ind.co.jp +ubi.pt +ucf.edu +uci.edu +uckac.edu ucol.ac.nz +ucr.edu +ucsd.edu +udsis.com +uemail.unitedelec.com +ufl.edu +ugyfelkapu.mindigtvextra.hu +uhk.cz +uillinois.edu ukblelite01.emea.aza-lite.com ukblelite02.emea.aza-lite.com +ukwebmail.markit.com +ultrapos.net +umea.se +umons.ac.be +umpcshop.nl +umsamofund.com +umweltbundesamt.at +umweltrat.de +un.org +unc.edu +uncg.edu +undercovermags.com +uni-career.jp +uni-hamburg.de uni-hohenheim.de +unibas.ch +unifymoffice.com +unionvpn.union.edu +unisanta.br +unitron.no +univ-lyon1.fr +universalfloodpr.com +universitymedicalcenter.com +unixnotes.wordpress.com +unlimity.biz +uno.edu +unr.edu +unv.org +uottawa.ca +update.com +upenn.edu +upgradeserver.coremobility.com +upstatecarolina.net +urclickthru.com +urlinkthru.com +uruanna.com +us.connect.newegg.net +us17action.com +us36managedlanetrafficandrevenue.com +usa800.net +usacapitol.com +usc.edu +uscg.gov +user.atlas.sk user.centrum.cz +userapp.waubonsee.edu +usfinancialsource.com usuwazavpn04.americas.aza-lite.com +uta.edu +utah.gov +uws.edu +v-da-001.dp-itsolutions.de +va.gov +vaderstad.com +valenciaport.com +valtech.se +vanfcog.org +vangent.com +vasttrafik.se +vaxjo.se +vbgov.com +vci.de +vcommerce.com vcsportal.viasyscs.com +vdvexchange.com +veluwsescholengroepcvo.nl +ven.softec.sk +veniceregional.com +venners.co.uk +verifiering.se +verint.com +versicherungsvergleich.payback.de +verticalresponse.com +vervoerzcn.nl +verwaltung-innovativ.de +vestedanet.com +vestedapartners.com +vetsfirstchoice.com +vfwsturgis.org +vhspoint.lt +vi.macromill.com +viacord.com +vic33.win.kennesaw.edu +video.actadvantage.org +videocamerashop.be +videocamerashop.nl +villeesch.lu +virtualexchange.nl +virtuall.nl +visualvault.com +vitalberry.eu +vivaldi.ru +vivid-trade.com +vivus.se vle.guilsborough.northants.sch.uk +vle.marling.gloucs.sch.uk +vle.saddleworthschool.org +vocalocity.com +vodamail.hu +voicerecordershop.be +voicerecordershop.nl voogd.com +vosdemarches.saintgermainenlaye.fr +vpdn.dlr.de vpn-01.houstonisd.org vpn-03.houstonisd.org vpn-04.houstonisd.org +vpn-ap2.infor.com +vpn-gw1.unbc.ca +vpn-indy.exacttarget.com +vpn-server.rrzn.uni-hannover.de +vpn-stud-ssl.hogent.be +vpn-testbetrieb.rus.uni-stuttgart.de +vpn-us-ssl.lionbridge.com +vpn-wv.mentorg.com +vpn.4j.lane.edu +vpn.agnesirwin.org +vpn.ahss.org +vpn.anl.gov +vpn.ats.edu +vpn.ausrad.com +vpn.barry.edu +vpn.bchydro.com +vpn.bonitahealthcenter.com +vpn.caltech.edu +vpn.cclswi.com +vpn.challenger.wa.edu.au +vpn.claas.com +vpn.cmu.edu +vpn.coasolutions.com +vpn.coffey.com.au +vpn.concur.com +vpn.dearborn.pcgcampbell.com +vpn.del-valle.k12.tx.us +vpn.diebold.com +vpn.doncaster.gov.uk +vpn.douglasesd.k12.or.us +vpn.ehu.es +vpn.eurecom.fr +vpn.fhi-berlin.mpg.de +vpn.gribskov.dk +vpn.gsorad.com +vpn.hbstubbs.com +vpn.hobokenumc.com +vpn.hppartners.com +vpn.ins-lua.com +vpn.interseco.nl +vpn.iridium.com +vpn.kleinandhoffman.com +vpn.kmcnetwork.org +vpn.l3stratis.com +vpn.lafayette.edu +vpn.lan.kth.se +vpn.liberty.edu +vpn.libertyregional.org +vpn.llproducts.eu +vpn.lrdc.com +vpn.mcgrathnicol.com +vpn.memorialsb.org +vpn.mercer.edu +vpn.minecofin.gov.rw +vpn.mobilearmor.com +vpn.msmc.la.edu +vpn.nbeavers.com +vpn.netprivateer.com +vpn.newpaltz.edu +vpn.pace.edu +vpn.pasadenaisd.org +vpn.pih.net +vpn.pxi.com +vpn.redbarchetta.com +vpn.reliablesprinkler.com +vpn.reykjavik.is +vpn.rmc.ca +vpn.rz.tu-clausthal.de +vpn.sausd.us +vpn.stadsdeel-osdorp.nl +vpn.stb.eu vpn.tarumanagara.com +vpn.tesd.net +vpn.tfh-wildau.de +vpn.ud-medien.ch +vpn.uiowa.edu +vpn.uni-giessen.de +vpn.univ-lr.fr +vpn.unizar.es +vpn.uoguelph.ca +vpn.uow.edu.au +vpn.utexas.edu +vpn.uwhealth.org +vpn.virteva.com +vpn.wrij.nl +vpn01.us-support.com +vpn02.nucomm.net +vpn1.dot.state.ga.us +vpn1.prvlimburg.nl +vpn1.sandyspringbank.com +vpn1.security-finance.com +vpn2.bakbone.com +vpn2.qualys.com +vpnaccess.sales-service.com +vpngate.tu-bs.de +vpngate.uni-koeln.de +vpngw.uni-wuerzburg.de +vpnssl.nwths.biz +vpnuk.oup.com vr.is +vresp.com +vrg.se +vserver.de +vtc.edu.hk vtrade.vincomsc.com.vn +vucvejle.dk +vyvxinview.com +vzw.getyourscores.com +wa.gov +wa.infrontsports.com +waffenamt.it +wakeside.com +walbeekgroep.com +walmartfaces.com +walmarthowwedoit.com +walmartstores.com +walsallcollege.ac.uk warranty.akeryards.as +warwick.ac.uk +was.org +wastis-eu.st.com +wcupa.edu +wcvpn.wartburg.edu +wdpartnersonline.com web-opas.osakaya.co.jp +web-pl.daikin.co.jp +web-vpn.hefr.ch +web.rbc.com +web.storen.ch +web.uc.atosorigin.com +web.vpn.finanzit.net +web01.de.amadee.net webaccess.7p-group.com +webaccess.atkearney.com webaccess.pvhs.org +webapp.dpd.nl +webapp.meredith.com +webapps.hudsonisd.org +webbdaf.com +webbmail.ssg.se webbt.banque-tahiti.pf +webcenc.com +webchat.unt.edu +webcomputer.nl +webdagbog.kvuc.dk +webdirect.jp +webenroll.accesstpa.com webforensics.co.uk +webgate.no +webinfra.nl +webmail.5sqc.com +webmail.aap.com.au +webmail.accentonline.com +webmail.action-inter.com +webmail.administaff.com +webmail.aguiabranca.com.br +webmail.ahs.ae +webmail.ak-normal.school.nz +webmail.akd.nl +webmail.akl.whk.co.nz +webmail.albertadoctors.org +webmail.alere.co.uk +webmail.alexmann.com +webmail.alturkigroup.net +webmail.ampvisualtv.tv +webmail.anacom.pt +webmail.apotex.ca +webmail.arbella.com +webmail.aritzia.com +webmail.arthurterry.bham.sch.uk webmail.asb.dk +webmail.asparis.fr +webmail.assembly.ab.ca +webmail.attendshealthcare.com +webmail.audencia.com webmail.austmus.gov.au +webmail.aventus.nl +webmail.awsg.at +webmail.azmedien.ch +webmail.barnet.ac.uk +webmail.bayamonpr.org +webmail.bg.fnv.nl +webmail.bggs.qld.edu.au +webmail.bie.edu +webmail.bife.ie +webmail.bluepointsolutions.com webmail.bne.catholic.edu.au webmail.bose.com +webmail.bravilor.com +webmail.bridgercapital.com +webmail.brigantine.atlnet.org +webmail.brinkgroep.nl +webmail.bwfc.co.uk +webmail.c-e.com +webmail.capacent.is +webmail.cardonald.ac.uk +webmail.carmelcollegesalland.nl +webmail.casgen.com +webmail.cavanvec.ie +webmail.cet.ac.il +webmail.cg68.fr +webmail.chmca.org webmail.choa.org +webmail.cineplex.com +webmail.citationair.com +webmail.cityofvancouver.us +webmail.cmslegal.at +webmail.corenet.se +webmail.corptax.com +webmail.cosmopolitanlasvegas.com +webmail.crchealth.com +webmail.creuna.com +webmail.croklaan.com +webmail.crow.nl webmail.csaa.com +webmail.dabs.com +webmail.davenportdiocese.org +webmail.debaak.nl +webmail.deckers.com +webmail.dibrosi.be +webmail.dongemondcollege.nl +webmail.donlen.com +webmail.dpsg.com +webmail.dwango.co.jp +webmail.e-boticario.com.br +webmail.ea.aku.edu +webmail.ecerdc.com.my +webmail.ecosystem.ca +webmail.edinburghacademy.org.uk +webmail.edita.se +webmail.ekero.se +webmail.emmahuis.nl +webmail.energimidt.dk +webmail.energyfutureholdings.com +webmail.enex-om.com.br +webmail.engevix.com.br +webmail.escortinc.com +webmail.etch.com +webmail.euroatlantic.pt +webmail.excanto.com +webmail.fdm.dk +webmail.ferroeste.com.br +webmail.finning.co.uk webmail.firstam.net +webmail.flydubai.com +webmail.francetv.fr +webmail.frederikshavn.dk +webmail.furuboda.se +webmail.gazprom-mt.com +webmail.gebalis.pt +webmail.genphysics.com +webmail.globalcloudservices.nl +webmail.gmh.edu +webmail.gorinchem.nl +webmail.guido.nl +webmail.haaga-helia.fi +webmail.hanno.dk +webmail.henrico.k12.va.us +webmail.hostedoutlook.be +webmail.howerter.org webmail.hrblock.com +webmail.icare.nl +webmail.icr-inc.net +webmail.ikno.nl webmail.ingbank.com.tr +webmail.insight-onsite.us +webmail.integrationsfonds.at +webmail.interwetten.com +webmail.intrinsec.com +webmail.ipzs.it +webmail.iqhs.nl +webmail.irdeto.com +webmail.isolve.co.za +webmail.ithaca.edu +webmail.ivoclarvivadent.com +webmail.javelindirect.com +webmail.jbc.nl +webmail.jmp.co.uk +webmail.jungfrau.ch webmail.kapsch.net +webmail.kentalis.nl +webmail.keuda.fi +webmail.kinder-stad.nl +webmail.knauf.fr +webmail.knighttrans.com +webmail.knvb.nl +webmail.komatsuforest.com +webmail.ku.edu.tr +webmail.lancashire.bm +webmail.lappia.fi +webmail.larkinhoffman.com +webmail.lett.dk +webmail.levillage1.be webmail.levinglobal.com +webmail.loginlogistica.com.br webmail.lolland.dk +webmail.macsstores.com +webmail.mahouse.gov +webmail.malvik.kommune.no +webmail.manheim.com +webmail.manpower.ch +webmail.mansion.com +webmail.marketing-asiapac.com +webmail.mcbdds.org +webmail.mdc.wa.edu.au +webmail.meca.se +webmail.med.uni-muenchen.de +webmail.medic911.com +webmail.menai.ac.uk +webmail.metalor.com +webmail.mioc.hr +webmail.mjncomputers.co.uk +webmail.modal.com.br +webmail.moeller.org +webmail.mof.gov.ae +webmail.moh.gov.sa +webmail.mondigroup.com +webmail.mondipackaging.com +webmail.monroecounty-fl.gov +webmail.montessoricollege.nl +webmail.monumentalsports.com webmail.mopera.net +webmail.morphosys.com +webmail.mr-daten.de webmail.mt.gov +webmail.mutter.se +webmail.myeasyoffice.nl +webmail.myfloridahouse.gov +webmail.mystructured.com +webmail.netdesign.dk +webmail.nettrust.ch webmail.newlook.net +webmail.nilu.no +webmail.nobel.nl +webmail.noelgroup.com +webmail.nordoc.no +webmail.normik.dk +webmail.nyfors.dk +webmail.odin-groep.nl +webmail.oecd.org +webmail.oem.dk +webmail.oensmurer.dk +webmail.offmadisonave.com +webmail.orbitone.se webmail.ordina.nl +webmail.ormiston.qld.edu.au +webmail.parametrix.com +webmail.pdtit.be +webmail.peacehealth.org webmail.peelpolice.ca +webmail.pinellascounty.org +webmail.plenarygroup.com +webmail.proag.com +webmail.psd.pt +webmail.pu-kumamoto.ac.jp +webmail.qinvest.com +webmail.quest.com +webmail.raiffeisenevolution.com +webmail.randaberg.kommune.no +webmail.rasmussen.edu +webmail.realtors.org +webmail.rebild.dk +webmail.reesmanley.com +webmail.regentcomm.com +webmail.renn4.nl +webmail.rgomiddelharnis.nl +webmail.rietlanden.nl +webmail.rijnijssel.nl +webmail.rodenstock.com +webmail.roe.ac.uk +webmail.rollins.edu +webmail.rta.ae +webmail.rtg.at +webmail.rtl.hr +webmail.rtp.pt +webmail.saintjohn.ca +webmail.sanoma-magazines.be +webmail.sbl.ch +webmail.schuleherisau.ch +webmail.seaservers.net +webmail.seha.ae +webmail.semtribe.com +webmail.shepleybulfinch.com +webmail.sicl.co.uk +webmail.skanderborg.dk +webmail.skilled.com.au +webmail.skm.gov.my +webmail.skogu.nl +webmail.sma.de +webmail.socu.dk +webmail.sotog.nl +webmail.span.hr webmail.springer-sbm.com +webmail.sprm.gov.my webmail.srhs.com +webmail.stavanger.kommune.no +webmail.struttandparker.com +webmail.stsmd.dk +webmail.stura.uni-halle.de +webmail.swafnet.com +webmail.swietelsky.com +webmail.sysco.com +webmail.t-atrium.nl +webmail.t-systems.dk +webmail.t26.dk +webmail.taarnby.dk +webmail.teaterskolen.dk +webmail.techcampus.org +webmail.tecnalia.com +webmail.teknowlogic.com +webmail.tfmc.co.za +webmail.tisq.nl webmail.toho-u.ac.jp +webmail.torshavn.fo +webmail.touricoholidays.com webmail.transat.com webmail.tribune.com webmail.tuev-nord.de +webmail.tv1.com.br +webmail.tys.fi +webmail.uatlantica.pt +webmail.uc4.com +webmail.unifiedvalve.com +webmail.unikom.se +webmail.unilu.ch +webmail.univ-catholyon.fr +webmail.unl.pt +webmail.usek.edu.lb +webmail.users.co.uk webmail.valamar.com +webmail.varnesregion.no +webmail.veghel.nl +webmail.vennesla.kommune.no +webmail.verkinderen.com +webmail.viridisit.com +webmail.vu.nl +webmail.washsports.com webmail.waterman-group.co.uk +webmail.wc.com webmail.wcupa.edu +webmail.whitireia.ac.nz +webmail.windstream.net +webmail.witc.edu +webmail.wpod.net +webmail.wtamu.edu +webmail.wuerth-phoenix.com +webmail.wuerth.at +webmail.ymcamke.org +webmail0.gifu-net.ed.jp +webmail1.finansforbundet.dk +webmail1.gmrmarketing.com +webmail1.go2uti.com +webmail2.ems-t.com +webmail2.factset.com webmaildata.rr.com +webmaileu.elcoteq.com +webmailwg.datacom.co.nz +webnet.cscdgr.on.ca +webos.bonsallusd.com +webportal.bmw.nl +webportal.simacict.nl +webportal2.cfisd.net +webprod4.hc-sc.gc.ca +webremote.grainger.com +webservicescitoyens.com webshop.weijntjes.nl +websis.unimedcuiaba.com.br +websupport.f5.com +webvpn.aamc.org webvpn.au.aecom.com webvpn.ben.edu +webvpn.botsford.org +webvpn.brmchealthcare.com +webvpn.coe.int +webvpn.colfaxcorp.com +webvpn.dm-drogeriemarkt.com +webvpn.doherty.co.uk +webvpn.dpsk12.org +webvpn.egyptianlng.com +webvpn.eso.org webvpn.eu.aecom.com +webvpn.evraz.com +webvpn.globant.com +webvpn.greywolfcapital.com +webvpn.ieua.org +webvpn.jccc.edu +webvpn.lexmed.com +webvpn.more.net +webvpn.ned.org +webvpn.oceanspray.com +webvpn.orionhealth.com +webvpn.progress-energy.com +webvpn.promon.com.br +webvpn.purdue.edu +webvpn.roosevelt.edu +webvpn.rz.tu-harburg.de +webvpn.scf.cc +webvpn.sebh.org +webvpn.steaknshake.com +webvpn.thegoodguys.com.au +webvpn.trademe.co.nz +webvpn.uni-leipzig.de webvpn.usaa.com webvpn.usps.gov +webvpn.vcu.edu +webvpn.wesleyan.edu +wecc.biz +wein7.de +wellspan.org welltrix.com +welly.sm werecoverdata.com +wessexlearning.org.uk +west.skofirm.com +westbuckland.devon.sch.uk +westcon.no wettstar.de +wha-asa5520.wilmingtonhealth.com +whataburgerfranchisees.com +whataburgervendors.com +whataburgerventures.com +whatwouldmillionairedo.com +wheelingil.gov +whitworth.edu +wholesale.starfinancial.com +whoosh.hk +whrsd.org +widgetbox.com +wiki.ngmoco.com +wiki.tradeext.com +wikipat.com +williamsonmemorial.net +winahome4you.com +winebow.com +winxnet.com +wish.org +wizardfinance.net +wm.valley.ne.jp +wms01.wimaxforum.org +wnp.waseda.jp +womanshospitalms.com +woodiesdiy.com +woodlynde.org +wordandbrown.com workhere.jetblue.com +world-direct.at +worldatwardvds.com +worldwaronecolor.com +wortech.ac.uk +worthington-portal.org wowbeez.com +wrpinfo.org ws.licenzji-vetturi.gov.mt +wsaaudit.com +wsasr520study.com +wsbe.org.uk +wsl.ch +wsu.edu +wt.gfi-informatik.de wtc.lxr.com +wtoutlook.wellcome.ac.uk +ww3.metroymca.org +www-new.epc-business.com +www-sys2.tax.state.oh.us www.accessgeneral.com www.accessingram.com www.adfox.cz @@ -654,21 +5046,71 @@ www.zenfolio.com www.zenryonetwork.com www.zoominfo.com www1.cat365.net +www1.hop.ana.co.jp www1.ticket-web-shochiku.com www2.fakton.nl +www2.hokepon.com +www2.kenkyosai.or.jp +www2.lcmcisd.org www2.proexam.org www2.secom-techno.co.jp +www2.tagmulimta.co.il +www2.tel-aviv.gov.il www2.ticket-web-shochiku.com +www2.webfactory-world.de +www3.bs-j.co.jp +www3.inferencedata.com +www3.myfloridacounty.com +www3.tv-tokyo.co.jp www6.hsmv.state.fl.us wwws.jp-bank.japanpost.jp +wwwssl.isd109.org +wwwx.oaklandcc.edu wwy01.shiki.gr.jp wynbilling.wyndhamworldwide.com +wyndhamworldwide.com wynnmacau.recruitmax.com +wza.nl +wzanet.nl xbox.redeemer.ab.ca +xchanging.com +xchg.int.t-mobile.at +xfinityhomesecurity.com +xmlic.payfuse.com +xmlrpc4.mollom.com +xnet.woodforest.com +xolair.com +xolairhcp.com +xpansions.com +xs4all.nl +xsightrewards.com +xtiva.net +xtremecardioonline.com +yahoo-vi.co.jp +yakimaregional.com +yaskawa.co.jp +yayoi-kk.co.jp +yes123.com.tw +ymca.net yodlee.com +yourownshoppingcart.com +yourperfectweightloss.com yourwirelessrebatecenter.com yoyaku.city.funabashi.chiba.jp yoyaku.city.hachioji.tokyo.jp +yoyaku.koto-sports.net +yoyaku.nasva.go.jp +yoyaku.parksweb.net +yuyu.medicarelife.com +zain.com zenfolio.com +zenryonetwork.com +zgraggen.homeserver.com +zinio.com +zis.ch +zivildienst.de +zoomienation.usafa.org zoominfo.com +zooomeee.com +zuidwester.org zumbafitness.com diff --git a/net/base/ssl_false_start_blacklist_process.cc b/net/base/ssl_false_start_blacklist_process.cc index 46b99af..634df6a 100644 --- a/net/base/ssl_false_start_blacklist_process.cc +++ b/net/base/ssl_false_start_blacklist_process.cc @@ -19,6 +19,8 @@ using net::SSLFalseStartBlacklist; static const unsigned kBuckets = SSLFalseStartBlacklist::kBuckets; +static bool verbose = false; + static int usage(const char* argv0) { fprintf(stderr, "Usage: %s <blacklist file> <output .c file>\n", argv0); @@ -48,7 +50,8 @@ static void RemoveDuplicateEntries(std::vector<std::string>* hosts) { for (std::vector<std::string>::const_iterator i = hosts->begin(); i != hosts->end(); i++) { if (hosts_set.count(*i)) { - fprintf(stderr, "Removing duplicate entry for %s\n", i->c_str()); + if (verbose) + fprintf(stderr, "Removing duplicate entry for %s\n", i->c_str()); continue; } hosts_set.insert(*i); @@ -93,7 +96,8 @@ static void RemoveRedundantEntries(std::vector<std::string>* hosts) { if (parent.empty()) { ret.push_back(*i); } else { - fprintf(stderr, "Removing %s as redundant\n", i->c_str()); + if (verbose) + fprintf(stderr, "Removing %s as redundant\n", i->c_str()); } } @@ -124,7 +128,7 @@ int main(int argc, char** argv) { const char* input_file = argv[1]; const char* output_file = argv[2]; - FILE* input = fopen(input_file, "r"); + FILE* input = fopen(input_file, "rb"); if (!input) { perror("open"); return usage(argv[0]); @@ -143,11 +147,16 @@ int main(int argc, char** argv) { } char* buffer = static_cast<char*>(malloc(input_size)); - if (fread(buffer, input_size, 1, input) != 1) { - perror("fread"); - free(buffer); - fclose(input); - return 1; + long done = 0; + while (done < input_size) { + size_t n = fread(buffer + done, 1, input_size - done, input); + if (n == 0) { + perror("fread"); + free(buffer); + fclose(input); + return 1; + } + done += n; } fclose(input); @@ -158,8 +167,12 @@ int main(int argc, char** argv) { bool non_whitespace_seen = false; for (long i = 0; i <= input_size; i++) { if (i == input_size || buffer[i] == '\n') { - if (!is_comment && non_whitespace_seen) - hosts.push_back(std::string(&buffer[line_start], i - line_start)); + if (!is_comment && non_whitespace_seen) { + long len = i - line_start; + if (i > 0 && buffer[i-1] == '\r') + len--; + hosts.push_back(std::string(&buffer[line_start], len)); + } is_comment = false; non_whitespace_seen = false; line_start = i + 1; @@ -168,7 +181,7 @@ int main(int argc, char** argv) { if (i == line_start && buffer[i] == '#') is_comment = true; - if (buffer[i] != ' ' && buffer[i] != '\t') + if (buffer[i] != ' ' && buffer[i] != '\t' && buffer[i] != '\r') non_whitespace_seen = true; } free(buffer); @@ -185,7 +198,7 @@ int main(int argc, char** argv) { } fprintf(stderr, "Using %d entry hash table\n", kBuckets); - uint16 table[kBuckets]; + uint32 table[kBuckets]; std::vector<std::string> buckets[kBuckets]; for (std::vector<std::string>::const_iterator @@ -199,11 +212,6 @@ int main(int argc, char** argv) { std::string table_data; unsigned max_bucket_size = 0; for (unsigned i = 0; i < kBuckets; i++) { - if (table_data.size() > 65535) { - fprintf(stderr, "Hash table overflowed a uint16_t index\n"); - return 3; - } - if (buckets[i].size() > max_bucket_size) max_bucket_size = buckets[i].size(); @@ -231,31 +239,24 @@ int main(int argc, char** argv) { fprintf(out, "#include \"base/basictypes.h\"\n\n"); fprintf(out, "#include \"net/base/ssl_false_start_blacklist.h\"\n\n"); fprintf(out, "namespace net {\n\n"); - fprintf(out, "const uint16 SSLFalseStartBlacklist::kHashTable[%d + 1] = {\n", + fprintf(out, "const uint32 SSLFalseStartBlacklist::kHashTable[%d + 1] = {\n", kBuckets); for (unsigned i = 0; i < kBuckets; i++) { - fprintf(out, " %d,\n", (int) table[i]); + fprintf(out, " %u,\n", (unsigned) table[i]); } - fprintf(out, " %d,\n", (int) table_data.size()); + fprintf(out, " %u,\n", (unsigned) table_data.size()); fprintf(out, "};\n\n"); - fprintf(out, "const char SSLFalseStartBlacklist::kHashData[] = \n"); + fprintf(out, "const char SSLFalseStartBlacklist::kHashData[] = {\n"); for (unsigned i = 0, line_length = 0; i < table_data.size(); i++) { if (line_length == 0) - fprintf(out, " \""); + fprintf(out, " "); uint8 c = static_cast<uint8>(table_data[i]); - if (c < 32 || c > 127 || c == '"') { - fprintf(out, "\\%c%c%c", '0' + ((c >> 6) & 7), '0' + ((c >> 3) & 7), - '0' + (c & 7)); - line_length += 4; - } else { - fprintf(out, "%c", c); - line_length++; - } + line_length += fprintf(out, "%d, ", c); if (i == table_data.size() - 1) { - fprintf(out, "\";\n"); + fprintf(out, "\n};\n"); } else if (line_length >= 70) { - fprintf(out, "\"\n"); + fprintf(out, "\n"); line_length = 0; } } diff --git a/net/base/ssl_info.h b/net/base/ssl_info.h index 1786b58..4c68f06 100644 --- a/net/base/ssl_info.h +++ b/net/base/ssl_info.h @@ -42,9 +42,8 @@ class SSLInfo { int security_bits; // Information about the SSL connection itself. See - // ssl_connection_status_flags.h for values. The ciphersuite and compression - // in use are encoded within. - // TODO(agl): also encode the protocol version used. + // ssl_connection_status_flags.h for values. The protocol version, + // ciphersuite, and compression in use are encoded within. int connection_status; }; diff --git a/net/base/transport_security_state.cc b/net/base/transport_security_state.cc index a0d2794..3014e21 100644 --- a/net/base/transport_security_state.cc +++ b/net/base/transport_security_state.cc @@ -142,7 +142,9 @@ bool TransportSecurityState::ParseHeader(const std::string& value, case AFTER_MAX_AGE_EQUALS: if (IsAsciiWhitespace(*tokenizer.token_begin())) continue; - if (!base::StringToInt(tokenizer.token(), &max_age_candidate)) + if (!base::StringToInt(tokenizer.token_begin(), + tokenizer.token_end(), + &max_age_candidate)) return false; if (max_age_candidate < 0) return false; @@ -408,6 +410,7 @@ bool TransportSecurityState::IsPreloadedSTS( {12, true, "\006jottit\003com"}, {19, true, "\015sunshinepress\003org"}, {21, false, "\003www\013noisebridge\003net"}, + {10, false, "\004neg9\003org"}, }; static const size_t kNumPreloadedSTS = ARRAYSIZE_UNSAFE(kPreloadedSTS); diff --git a/net/base/transport_security_state_unittest.cc b/net/base/transport_security_state_unittest.cc index c4a173c..2a06501 100644 --- a/net/base/transport_security_state_unittest.cc +++ b/net/base/transport_security_state_unittest.cc @@ -342,6 +342,9 @@ TEST_F(TransportSecurityStateTest, Preloaded) { EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "www.noisebridge.net")); EXPECT_FALSE(state->IsEnabledForHost(&domain_state, "noisebridge.net")); EXPECT_FALSE(state->IsEnabledForHost(&domain_state, "foo.noisebridge.net")); + + EXPECT_TRUE(state->IsEnabledForHost(&domain_state, "neg9.org")); + EXPECT_FALSE(state->IsEnabledForHost(&domain_state, "www.neg9.org")); } TEST_F(TransportSecurityStateTest, LongNames) { diff --git a/net/base/x509_certificate.cc b/net/base/x509_certificate.cc index e21a3bc..7bbce5c 100644 --- a/net/base/x509_certificate.cc +++ b/net/base/x509_certificate.cc @@ -153,6 +153,46 @@ X509Certificate* X509Certificate::CreateFromHandle( return cert; } +#if defined(OS_WIN) +static X509Certificate::OSCertHandle CreateOSCert(base::StringPiece der_cert) { + X509Certificate::OSCertHandle cert_handle = NULL; + BOOL ok = CertAddEncodedCertificateToStore( + X509Certificate::cert_store(), X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, + reinterpret_cast<const BYTE*>(der_cert.data()), der_cert.size(), + CERT_STORE_ADD_USE_EXISTING, &cert_handle); + return ok ? cert_handle : NULL; +} +#else +static X509Certificate::OSCertHandle CreateOSCert(base::StringPiece der_cert) { + return X509Certificate::CreateOSCertHandleFromBytes( + const_cast<char*>(der_cert.data()), der_cert.size()); +} +#endif + +// static +X509Certificate* X509Certificate::CreateFromDERCertChain( + const std::vector<base::StringPiece>& der_certs) { + if (der_certs.size() == 0) + return NULL; + + X509Certificate::OSCertHandles intermediate_ca_certs; + for (size_t i = 1; i < der_certs.size(); i++) { + OSCertHandle handle = CreateOSCert(der_certs[i]); + DCHECK(handle); + intermediate_ca_certs.push_back(handle); + } + + OSCertHandle handle = CreateOSCert(der_certs[0]); + DCHECK(handle); + X509Certificate* cert = + CreateFromHandle(handle, SOURCE_FROM_NETWORK, intermediate_ca_certs); + FreeOSCertHandle(handle); + for (size_t i = 0; i < intermediate_ca_certs.size(); i++) + FreeOSCertHandle(intermediate_ca_certs[i]); + + return cert; +} + // static X509Certificate* X509Certificate::CreateFromBytes(const char* data, int length) { @@ -249,11 +289,9 @@ X509Certificate::X509Certificate(OSCertHandle cert_handle, const OSCertHandles& intermediates) : cert_handle_(DupOSCertHandle(cert_handle)), source_(source) { -#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_OPENSSL) // Copy/retain the intermediate cert handles. for (size_t i = 0; i < intermediates.size(); ++i) intermediate_ca_certs_.push_back(DupOSCertHandle(intermediates[i])); -#endif // Platform-specific initialization. Initialize(); } @@ -276,10 +314,8 @@ X509Certificate::~X509Certificate() { X509Certificate::Cache::GetInstance()->Remove(this); if (cert_handle_) FreeOSCertHandle(cert_handle_); -#if defined(OS_MACOSX) || defined(OS_WIN) for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) FreeOSCertHandle(intermediate_ca_certs_[i]); -#endif } bool X509Certificate::HasExpired() const { diff --git a/net/base/x509_certificate.h b/net/base/x509_certificate.h index 577de92..68762e4 100644 --- a/net/base/x509_certificate.h +++ b/net/base/x509_certificate.h @@ -13,6 +13,7 @@ #include "base/gtest_prod_util.h" #include "base/ref_counted.h" +#include "base/string_piece.h" #include "base/time.h" #include "net/base/x509_cert_types.h" @@ -107,12 +108,20 @@ class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { // certificate cache prefers the handle from the network because our HTTP // cache isn't caching the corresponding intermediate CA certificates yet // (http://crbug.com/7065). - // The list of intermediate certificates is ignored under NSS (i.e. Linux.) // The returned pointer must be stored in a scoped_refptr<X509Certificate>. static X509Certificate* CreateFromHandle(OSCertHandle cert_handle, Source source, const OSCertHandles& intermediates); + // Create an X509Certificate from a chain of DER encoded certificates. The + // first certificate in the chain is the end-entity certificate to which a + // handle is returned. The other certificates in the chain are intermediate + // certificates. See the comment for |CreateFromHandle| about the |source| + // argument. + // The returned pointer must be stored in a scoped_refptr<X509Certificate>. + static X509Certificate* CreateFromDERCertChain( + const std::vector<base::StringPiece>& der_certs); + // Create an X509Certificate from the DER-encoded representation. // Returns NULL on failure. // @@ -173,14 +182,12 @@ class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { // now. bool HasExpired() const; -#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_OPENSSL) // Returns intermediate certificates added via AddIntermediateCertificate(). // Ownership follows the "get" rule: it is the caller's responsibility to // retain the elements of the result. const OSCertHandles& GetIntermediateCertificates() const { return intermediate_ca_certs_; } -#endif // Returns true if I already contain the given intermediate cert. bool HasIntermediateCertificate(OSCertHandle cert); @@ -213,6 +220,17 @@ class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { CFArrayRef CreateClientCertificateChain() const; #endif +#if defined(OS_WIN) + // Returns a handle to a global, in-memory certificate store. We use it for + // two purposes: + // 1. Import server certificates into this store so that we can verify and + // display the certificates using CryptoAPI. + // 2. Copy client certificates from the "MY" system certificate store into + // this store so that we can close the system store when we finish + // searching for client certificates. + static HCERTSTORE cert_store(); +#endif + // Verifies the certificate against the given hostname. Returns OK if // successful or an error code upon failure. // @@ -268,6 +286,10 @@ class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { // Common object initialization code. Called by the constructors only. void Initialize(); +#if defined(OS_WIN) + bool CheckEV(PCCERT_CHAIN_CONTEXT chain_context, + const char* policy_oid) const; +#endif bool VerifyEV() const; // Calculates the SHA-1 fingerprint of the certificate. Returns an empty @@ -292,11 +314,9 @@ class X509Certificate : public base::RefCountedThreadSafe<X509Certificate> { // A handle to the certificate object in the underlying crypto library. OSCertHandle cert_handle_; -#if defined(OS_MACOSX) || defined(OS_WIN) || defined(USE_OPENSSL) // Untrusted intermediate certificates associated with this certificate - // that may be needed for chain building. (NSS impl does not need these.) + // that may be needed for chain building. OSCertHandles intermediate_ca_certs_; -#endif #if defined(OS_MACOSX) // Blocks multiple threads from verifying the cert simultaneously. diff --git a/net/base/x509_certificate_mac.cc b/net/base/x509_certificate_mac.cc index 05fbe63..a2a0eea 100644 --- a/net/base/x509_certificate_mac.cc +++ b/net/base/x509_certificate_mac.cc @@ -694,6 +694,7 @@ int X509Certificate::Verify(const std::string& hostname, int flags, // Determine the certificate's EV status using SecTrustCopyExtendedResult(), // which we need to look up because the function wasn't added until // Mac OS X 10.5.7. + // Note: "ExtendedResult" means extended validation results. CFBundleRef bundle = CFBundleGetBundleWithIdentifier(CFSTR("com.apple.security")); if (bundle) { @@ -872,10 +873,10 @@ bool X509Certificate::IsIssuedBy( for (int i = 0; i < n; ++i) { SecCertificateRef cert_handle = reinterpret_cast<SecCertificateRef>( const_cast<void*>(CFArrayGetValueAtIndex(cert_chain, i))); - scoped_refptr<X509Certificate> cert = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert(X509Certificate::CreateFromHandle( cert_handle, X509Certificate::SOURCE_LONE_CERT_IMPORT, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); for (unsigned j = 0; j < valid_issuers.size(); j++) { if (cert->issuer().Matches(valid_issuers[j])) return true; diff --git a/net/base/x509_certificate_openssl.cc b/net/base/x509_certificate_openssl.cc index 668fd5f..a9ad39c 100644 --- a/net/base/x509_certificate_openssl.cc +++ b/net/base/x509_certificate_openssl.cc @@ -20,9 +20,12 @@ #include "net/base/cert_verify_result.h" #include "net/base/net_errors.h" #include "net/base/openssl_util.h" +#include "net/base/x509_openssl_util.h" namespace net { +namespace nxou = net::x509_openssl_util; + namespace { void CreateOSCertHandlesFromPKCS7Bytes( @@ -51,39 +54,13 @@ void CreateOSCertHandlesFromPKCS7Bytes( } } -bool ParsePrincipalFieldInternal(X509_NAME* name, - int index, - std::string* field) { - ASN1_STRING* data = - X509_NAME_ENTRY_get_data(X509_NAME_get_entry(name, index)); - if (!data) - return false; - - unsigned char* buf = NULL; - int len = ASN1_STRING_to_UTF8(&buf, data); - if (len <= 0) - return false; - - field->assign(reinterpret_cast<const char*>(buf), len); - OPENSSL_free(buf); - return true; -} - -void ParsePrincipalField(X509_NAME* name, int nid, std::string* field) { - int index = X509_NAME_get_index_by_NID(name, nid, -1); - if (index < 0) - return; - - ParsePrincipalFieldInternal(name, index, field); -} - -void ParsePrincipalFields(X509_NAME* name, +void ParsePrincipalValues(X509_NAME* name, int nid, std::vector<std::string>* fields) { for (int index = -1; (index = X509_NAME_get_index_by_NID(name, nid, index)) != -1;) { std::string field; - if (!ParsePrincipalFieldInternal(name, index, &field)) + if (!nxou::ParsePrincipalValueByIndex(name, index, &field)) break; fields->push_back(field); } @@ -95,58 +72,23 @@ void ParsePrincipal(X509Certificate::OSCertHandle cert, if (!x509_name) return; - ParsePrincipalFields(x509_name, NID_streetAddress, + ParsePrincipalValues(x509_name, NID_streetAddress, &principal->street_addresses); - ParsePrincipalFields(x509_name, NID_organizationName, + ParsePrincipalValues(x509_name, NID_organizationName, &principal->organization_names); - ParsePrincipalFields(x509_name, NID_organizationalUnitName, + ParsePrincipalValues(x509_name, NID_organizationalUnitName, &principal->organization_unit_names); - ParsePrincipalFields(x509_name, NID_domainComponent, + ParsePrincipalValues(x509_name, NID_domainComponent, &principal->domain_components); - ParsePrincipalField(x509_name, NID_commonName, &principal->common_name); - ParsePrincipalField(x509_name, NID_localityName, &principal->locality_name); - ParsePrincipalField(x509_name, NID_stateOrProvinceName, - &principal->state_or_province_name); - ParsePrincipalField(x509_name, NID_countryName, &principal->country_name); -} - -void ParseDate(ASN1_TIME* x509_time, base::Time* time) { - if (!x509_time || - (x509_time->type != V_ASN1_UTCTIME && - x509_time->type != V_ASN1_GENERALIZEDTIME)) - return; - - std::string str_date(reinterpret_cast<char*>(x509_time->data), - x509_time->length); - // UTCTime: YYMMDDHHMMSSZ - // GeneralizedTime: YYYYMMDDHHMMSSZ - size_t year_length = x509_time->type == V_ASN1_UTCTIME ? 2 : 4; - size_t fields_offset = x509_time->type == V_ASN1_UTCTIME ? 0 : 2; - - if (str_date.length() < 11 + year_length) - return; - - base::Time::Exploded exploded = {0}; - bool valid = base::StringToInt(str_date.substr(0, year_length), - &exploded.year); - if (valid && year_length == 2) - exploded.year += exploded.year < 50 ? 2000 : 1900; - - valid &= base::StringToInt(str_date.substr(2 + fields_offset, 2), - &exploded.month); - valid &= base::StringToInt(str_date.substr(4 + fields_offset, 2), - &exploded.day_of_month); - valid &= base::StringToInt(str_date.substr(6 + fields_offset, 2), - &exploded.hour); - valid &= base::StringToInt(str_date.substr(8 + fields_offset, 2), - &exploded.minute); - valid &= base::StringToInt(str_date.substr(10 + fields_offset, 2), - &exploded.second); - - DCHECK(valid); - - *time = base::Time::FromUTCExploded(exploded); + nxou::ParsePrincipalValueByNID(x509_name, NID_commonName, + &principal->common_name); + nxou::ParsePrincipalValueByNID(x509_name, NID_localityName, + &principal->locality_name); + nxou::ParsePrincipalValueByNID(x509_name, NID_stateOrProvinceName, + &principal->state_or_province_name); + nxou::ParsePrincipalValueByNID(x509_name, NID_countryName, + &principal->country_name); } void ParseSubjectAltNames(X509Certificate::OSCertHandle cert, @@ -351,8 +293,8 @@ void X509Certificate::Initialize() { fingerprint_ = CalculateFingerprint(cert_handle_); ParsePrincipal(cert_handle_, X509_get_subject_name(cert_handle_), &subject_); ParsePrincipal(cert_handle_, X509_get_issuer_name(cert_handle_), &issuer_); - ParseDate(X509_get_notBefore(cert_handle_), &valid_start_); - ParseDate(X509_get_notAfter(cert_handle_), &valid_expiry_); + nxou::ParseDate(X509_get_notBefore(cert_handle_), &valid_start_); + nxou::ParseDate(X509_get_notAfter(cert_handle_), &valid_expiry_); } SHA1Fingerprint X509Certificate::CalculateFingerprint(OSCertHandle cert) { diff --git a/net/base/x509_certificate_unittest.cc b/net/base/x509_certificate_unittest.cc index 9bb81cb..31173e4 100644 --- a/net/base/x509_certificate_unittest.cc +++ b/net/base/x509_certificate_unittest.cc @@ -252,9 +252,9 @@ void CheckGoogleCert(const scoped_refptr<X509Certificate>& google_cert, } TEST(X509CertificateTest, GoogleCertParsing) { - scoped_refptr<X509Certificate> google_cert = + scoped_refptr<X509Certificate> google_cert( X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(google_der), sizeof(google_der)); + reinterpret_cast<const char*>(google_der), sizeof(google_der))); CheckGoogleCert(google_cert, google_fingerprint, 1238192407, // Mar 27 22:20:07 2009 GMT @@ -262,8 +262,8 @@ TEST(X509CertificateTest, GoogleCertParsing) { } TEST(X509CertificateTest, WebkitCertParsing) { - scoped_refptr<X509Certificate> webkit_cert = X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); + scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes( + reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); ASSERT_NE(static_cast<X509Certificate*>(NULL), webkit_cert); @@ -318,8 +318,8 @@ TEST(X509CertificateTest, WebkitCertParsing) { } TEST(X509CertificateTest, ThawteCertParsing) { - scoped_refptr<X509Certificate> thawte_cert = X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); + scoped_refptr<X509Certificate> thawte_cert(X509Certificate::CreateFromBytes( + reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der))); ASSERT_NE(static_cast<X509Certificate*>(NULL), thawte_cert); @@ -379,10 +379,10 @@ TEST(X509CertificateTest, ThawteCertParsing) { } TEST(X509CertificateTest, PaypalNullCertParsing) { - scoped_refptr<X509Certificate> paypal_null_cert = + scoped_refptr<X509Certificate> paypal_null_cert( X509Certificate::CreateFromBytes( reinterpret_cast<const char*>(paypal_null_der), - sizeof(paypal_null_der)); + sizeof(paypal_null_der))); ASSERT_NE(static_cast<X509Certificate*>(NULL), paypal_null_cert); @@ -409,8 +409,8 @@ TEST(X509CertificateTest, PaypalNullCertParsing) { // This certificate will expire on 2011-09-08. TEST(X509CertificateTest, UnoSoftCertParsing) { FilePath certs_dir = GetTestCertsDirectory(); - scoped_refptr<X509Certificate> unosoft_hu_cert = - ImportCertFromFile(certs_dir, "unosoft_hu_cert.der"); + scoped_refptr<X509Certificate> unosoft_hu_cert( + ImportCertFromFile(certs_dir, "unosoft_hu_cert.der")); ASSERT_NE(static_cast<X509Certificate*>(NULL), unosoft_hu_cert); @@ -481,18 +481,18 @@ TEST(X509CertificateTest, Cache) { // certificate cache. google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( reinterpret_cast<const char*>(google_der), sizeof(google_der)); - scoped_refptr<X509Certificate> cert1 = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert1(X509Certificate::CreateFromHandle( google_cert_handle, X509Certificate::SOURCE_LONE_CERT_IMPORT, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); X509Certificate::FreeOSCertHandle(google_cert_handle); // Add a certificate from the same source (SOURCE_LONE_CERT_IMPORT). This // should return the cached certificate (cert1). google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( reinterpret_cast<const char*>(google_der), sizeof(google_der)); - scoped_refptr<X509Certificate> cert2 = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert2(X509Certificate::CreateFromHandle( google_cert_handle, X509Certificate::SOURCE_LONE_CERT_IMPORT, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); X509Certificate::FreeOSCertHandle(google_cert_handle); EXPECT_EQ(cert1, cert2); @@ -501,9 +501,9 @@ TEST(X509CertificateTest, Cache) { // cached certificate (cert1) and return a new certificate. google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( reinterpret_cast<const char*>(google_der), sizeof(google_der)); - scoped_refptr<X509Certificate> cert3 = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert3(X509Certificate::CreateFromHandle( google_cert_handle, X509Certificate::SOURCE_FROM_NETWORK, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); X509Certificate::FreeOSCertHandle(google_cert_handle); EXPECT_NE(cert1, cert3); @@ -512,43 +512,43 @@ TEST(X509CertificateTest, Cache) { // certificate (cert3). google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( reinterpret_cast<const char*>(google_der), sizeof(google_der)); - scoped_refptr<X509Certificate> cert4 = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert4(X509Certificate::CreateFromHandle( google_cert_handle, X509Certificate::SOURCE_FROM_NETWORK, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); X509Certificate::FreeOSCertHandle(google_cert_handle); EXPECT_EQ(cert3, cert4); google_cert_handle = X509Certificate::CreateOSCertHandleFromBytes( reinterpret_cast<const char*>(google_der), sizeof(google_der)); - scoped_refptr<X509Certificate> cert5 = X509Certificate::CreateFromHandle( + scoped_refptr<X509Certificate> cert5(X509Certificate::CreateFromHandle( google_cert_handle, X509Certificate::SOURCE_FROM_NETWORK, - X509Certificate::OSCertHandles()); + X509Certificate::OSCertHandles())); X509Certificate::FreeOSCertHandle(google_cert_handle); EXPECT_EQ(cert3, cert5); } TEST(X509CertificateTest, Pickle) { - scoped_refptr<X509Certificate> cert1 = X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(google_der), sizeof(google_der)); + scoped_refptr<X509Certificate> cert1(X509Certificate::CreateFromBytes( + reinterpret_cast<const char*>(google_der), sizeof(google_der))); Pickle pickle; cert1->Persist(&pickle); void* iter = NULL; - scoped_refptr<X509Certificate> cert2 = - X509Certificate::CreateFromPickle(pickle, &iter); + scoped_refptr<X509Certificate> cert2( + X509Certificate::CreateFromPickle(pickle, &iter)); EXPECT_EQ(cert1, cert2); } TEST(X509CertificateTest, Policy) { - scoped_refptr<X509Certificate> google_cert = X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(google_der), sizeof(google_der)); + scoped_refptr<X509Certificate> google_cert(X509Certificate::CreateFromBytes( + reinterpret_cast<const char*>(google_der), sizeof(google_der))); - scoped_refptr<X509Certificate> webkit_cert = X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); + scoped_refptr<X509Certificate> webkit_cert(X509Certificate::CreateFromBytes( + reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); CertPolicy policy; @@ -581,18 +581,18 @@ TEST(X509CertificateTest, Policy) { #if defined(OS_MACOSX) || defined(OS_WIN) TEST(X509CertificateTest, IntermediateCertificates) { - scoped_refptr<X509Certificate> webkit_cert = + scoped_refptr<X509Certificate> webkit_cert( X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der)); + reinterpret_cast<const char*>(webkit_der), sizeof(webkit_der))); - scoped_refptr<X509Certificate> thawte_cert = + scoped_refptr<X509Certificate> thawte_cert( X509Certificate::CreateFromBytes( - reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)); + reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der))); - scoped_refptr<X509Certificate> paypal_cert = + scoped_refptr<X509Certificate> paypal_cert( X509Certificate::CreateFromBytes( reinterpret_cast<const char*>(paypal_null_der), - sizeof(paypal_null_der)); + sizeof(paypal_null_der))); X509Certificate::OSCertHandle google_handle; // Create object with no intermediates: @@ -645,8 +645,8 @@ TEST(X509CertificateTest, IsIssuedBy) { FilePath certs_dir = GetTestCertsDirectory(); // Test a client certificate from MIT. - scoped_refptr<X509Certificate> mit_davidben_cert = - ImportCertFromFile(certs_dir, "mit.davidben.der"); + scoped_refptr<X509Certificate> mit_davidben_cert( + ImportCertFromFile(certs_dir, "mit.davidben.der")); ASSERT_NE(static_cast<X509Certificate*>(NULL), mit_davidben_cert); CertPrincipal mit_issuer; @@ -662,8 +662,8 @@ TEST(X509CertificateTest, IsIssuedBy) { EXPECT_TRUE(mit_davidben_cert->IsIssuedBy(mit_issuers)); // Test a client certificate from FOAF.ME. - scoped_refptr<X509Certificate> foaf_me_chromium_test_cert = - ImportCertFromFile(certs_dir, "foaf.me.chromium-test-cert.der"); + scoped_refptr<X509Certificate> foaf_me_chromium_test_cert( + ImportCertFromFile(certs_dir, "foaf.me.chromium-test-cert.der")); ASSERT_NE(static_cast<X509Certificate*>(NULL), foaf_me_chromium_test_cert); CertPrincipal foaf_issuer; diff --git a/net/base/x509_certificate_win.cc b/net/base/x509_certificate_win.cc index 380ff3c..9e018fd 100644 --- a/net/base/x509_certificate_win.cc +++ b/net/base/x509_certificate_win.cc @@ -291,48 +291,6 @@ void GetCertChainInfo(PCCERT_CHAIN_CONTEXT chain_context, } } -/////////////////////////////////////////////////////////////////////////// -// -// Functions used by X509Certificate::IsEV -// -/////////////////////////////////////////////////////////////////////////// - -// Constructs a certificate chain starting from the end certificate -// 'cert_context', matching any of the certificate policies. -// -// Returns the certificate chain context on success, or NULL on failure. -// The caller is responsible for freeing the certificate chain context with -// CertFreeCertificateChain. -PCCERT_CHAIN_CONTEXT ConstructCertChain( - PCCERT_CONTEXT cert_context, - const char* const* policies, - int num_policies) { - CERT_CHAIN_PARA chain_para; - memset(&chain_para, 0, sizeof(chain_para)); - chain_para.cbSize = sizeof(chain_para); - chain_para.RequestedUsage.dwType = USAGE_MATCH_TYPE_AND; - chain_para.RequestedUsage.Usage.cUsageIdentifier = 0; - chain_para.RequestedUsage.Usage.rgpszUsageIdentifier = NULL; // LPSTR* - chain_para.RequestedIssuancePolicy.dwType = USAGE_MATCH_TYPE_OR; - chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = num_policies; - chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = - const_cast<char**>(policies); - PCCERT_CHAIN_CONTEXT chain_context; - if (!CertGetCertificateChain( - NULL, // default chain engine, HCCE_CURRENT_USER - cert_context, - NULL, // current system time - cert_context->hCertStore, // search this store - &chain_para, - CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT | - CERT_CHAIN_CACHE_END_CERT, - NULL, // reserved - &chain_context)) { - return NULL; - } - return chain_context; -} - // Decodes the cert's certificatePolicies extension into a CERT_POLICIES_INFO // structure and stores it in *output. void GetCertPoliciesInfo(PCCERT_CONTEXT cert, @@ -362,18 +320,6 @@ void GetCertPoliciesInfo(PCCERT_CONTEXT cert, output->reset(policies_info); } -// Returns true if the policy is in the array of CERT_POLICY_INFO in -// the CERT_POLICIES_INFO structure. -bool ContainsPolicy(const CERT_POLICIES_INFO* policies_info, - const char* policy) { - int num_policies = policies_info->cPolicyInfo; - for (int i = 0; i < num_policies; i++) { - if (!strcmp(policies_info->rgPolicyInfo[i].pszPolicyIdentifier, policy)) - return true; - } - return false; -} - // Helper function to parse a principal from a WinInet description of that // principal. void ParsePrincipal(const std::string& description, @@ -575,6 +521,33 @@ void X509Certificate::GetDNSNames(std::vector<std::string>* dns_names) const { dns_names->push_back(subject_.common_name); } +class GlobalCertStore { + public: + HCERTSTORE cert_store() { + return cert_store_; + } + + private: + friend struct DefaultSingletonTraits<GlobalCertStore>; + + GlobalCertStore() + : cert_store_(CertOpenStore(CERT_STORE_PROV_MEMORY, 0, NULL, 0, NULL)) { + } + + ~GlobalCertStore() { + CertCloseStore(cert_store_, 0 /* flags */); + } + + const HCERTSTORE cert_store_; + + DISALLOW_COPY_AND_ASSIGN(GlobalCertStore); +}; + +// static +HCERTSTORE X509Certificate::cert_store() { + return Singleton<GlobalCertStore>::get()->cert_store(); +} + int X509Certificate::Verify(const std::string& hostname, int flags, CertVerifyResult* verify_result) const { @@ -610,6 +583,28 @@ int X509Certificate::Verify(const std::string& hostname, // EV requires revocation checking. flags &= ~VERIFY_EV_CERT; } + + // Get the certificatePolicies extension of the certificate. + scoped_ptr_malloc<CERT_POLICIES_INFO> policies_info; + LPSTR ev_policy_oid = NULL; + if (flags & VERIFY_EV_CERT) { + GetCertPoliciesInfo(cert_handle_, &policies_info); + if (policies_info.get()) { + EVRootCAMetadata* metadata = EVRootCAMetadata::GetInstance(); + for (DWORD i = 0; i < policies_info->cPolicyInfo; ++i) { + LPSTR policy_oid = policies_info->rgPolicyInfo[i].pszPolicyIdentifier; + if (metadata->IsEVPolicyOID(policy_oid)) { + ev_policy_oid = policy_oid; + chain_para.RequestedIssuancePolicy.dwType = USAGE_MATCH_TYPE_AND; + chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = 1; + chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = + &ev_policy_oid; + break; + } + } + } + } + PCCERT_CHAIN_CONTEXT chain_context; // IE passes a non-NULL pTime argument that specifies the current system // time. IE passes CERT_CHAIN_REVOCATION_CHECK_CHAIN_EXCLUDE_ROOT as the @@ -625,6 +620,24 @@ int X509Certificate::Verify(const std::string& hostname, &chain_context)) { return MapSecurityError(GetLastError()); } + if (chain_context->TrustStatus.dwErrorStatus & + CERT_TRUST_IS_NOT_VALID_FOR_USAGE) { + ev_policy_oid = NULL; + chain_para.RequestedIssuancePolicy.Usage.cUsageIdentifier = 0; + chain_para.RequestedIssuancePolicy.Usage.rgpszUsageIdentifier = NULL; + CertFreeCertificateChain(chain_context); + if (!CertGetCertificateChain( + NULL, // default chain engine, HCCE_CURRENT_USER + cert_handle_, + NULL, // current system time + cert_handle_->hCertStore, // search this store + &chain_para, + chain_flags, + NULL, // reserved + &chain_context)) { + return MapSecurityError(GetLastError()); + } + } ScopedCertChainContext scoped_chain_context(chain_context); GetCertChainInfo(chain_context, verify_result); @@ -729,8 +742,7 @@ int X509Certificate::Verify(const std::string& hostname, if (IsCertStatusError(verify_result->cert_status)) return MapCertStatusToNetError(verify_result->cert_status); - // TODO(ukai): combine regular cert verification and EV cert verification. - if ((flags & VERIFY_EV_CERT) && VerifyEV()) + if (ev_policy_oid && CheckEV(chain_context, ev_policy_oid)) verify_result->cert_status |= CERT_STATUS_IS_EV; return OK; } @@ -741,16 +753,8 @@ int X509Certificate::Verify(const std::string& hostname, // certificates in the certificate chain according to Section 7 (pp. 11-12) // of the EV Certificate Guidelines Version 1.0 at // http://cabforum.org/EV_Certificate_Guidelines.pdf. -bool X509Certificate::VerifyEV() const { - DCHECK(cert_handle_); - net::EVRootCAMetadata* metadata = net::EVRootCAMetadata::GetInstance(); - - PCCERT_CHAIN_CONTEXT chain_context = ConstructCertChain(cert_handle_, - metadata->GetPolicyOIDs(), metadata->NumPolicyOIDs()); - if (!chain_context) - return false; - ScopedCertChainContext scoped_chain_context(chain_context); - +bool X509Certificate::CheckEV(PCCERT_CHAIN_CONTEXT chain_context, + const char* policy_oid) const { DCHECK(chain_context->cChain != 0); // If the cert doesn't match any of the policies, the // CERT_TRUST_IS_NOT_VALID_FOR_USAGE bit (0x10) in @@ -771,19 +775,16 @@ bool X509Certificate::VerifyEV() const { // Look up the EV policy OID of the root CA. PCCERT_CONTEXT root_cert = element[num_elements - 1]->pCertContext; SHA1Fingerprint fingerprint = CalculateFingerprint(root_cert); - const char* ev_policy_oid = NULL; - if (!metadata->GetPolicyOID(fingerprint, &ev_policy_oid)) - return false; - DCHECK(ev_policy_oid); - - // Get the certificatePolicies extension of the end certificate. - PCCERT_CONTEXT end_cert = element[0]->pCertContext; - scoped_ptr_malloc<CERT_POLICIES_INFO> policies_info; - GetCertPoliciesInfo(end_cert, &policies_info); - if (!policies_info.get()) - return false; + EVRootCAMetadata* metadata = EVRootCAMetadata::GetInstance(); + return metadata->HasEVPolicyOID(fingerprint, policy_oid); +} - return ContainsPolicy(policies_info.get(), ev_policy_oid); +bool X509Certificate::VerifyEV() const { + // We don't call this private method, but we do need to implement it because + // it's defined in x509_certificate.h. We perform EV checking in the + // Verify() above. + NOTREACHED(); + return false; } // static diff --git a/net/base/x509_openssl_util.cc b/net/base/x509_openssl_util.cc new file mode 100644 index 0000000..22ab59a --- /dev/null +++ b/net/base/x509_openssl_util.cc @@ -0,0 +1,113 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/x509_openssl_util.h" + +#include "base/logging.h" +#include "base/string_number_conversions.h" +#include "base/string_piece.h" +#include "base/time.h" + +namespace net { + +namespace x509_openssl_util { + +namespace { + +// Helper for ParseDate. |*field| must contain at least |field_len| characters. +// |*field| will be advanced by |field_len| on exit. |*ok| is set to false if +// there is an error in parsing the number, but left untouched otherwise. +// Returns the parsed integer. +int ParseIntAndAdvance(const char** field, size_t field_len, bool* ok) { + int result = 0; + *ok &= base::StringToInt(*field, *field + field_len, &result); + *field += field_len; + return result; +} + +} // namespace + +bool ParsePrincipalKeyAndValueByIndex(X509_NAME* name, + int index, + std::string* key, + std::string* value) { + X509_NAME_ENTRY* entry = X509_NAME_get_entry(name, index); + if (!entry) + return false; + + if (key) { + ASN1_OBJECT* object = X509_NAME_ENTRY_get_object(entry); + key->assign(OBJ_nid2sn(OBJ_obj2nid(object))); + } + + ASN1_STRING* data = X509_NAME_ENTRY_get_data(entry); + if (!data) + return false; + + unsigned char* buf = NULL; + int len = ASN1_STRING_to_UTF8(&buf, data); + if (len <= 0) + return false; + + value->assign(reinterpret_cast<const char*>(buf), len); + OPENSSL_free(buf); + return true; +} + +bool ParsePrincipalValueByIndex(X509_NAME* name, + int index, + std::string* value) { + return ParsePrincipalKeyAndValueByIndex(name, index, NULL, value); +} + +bool ParsePrincipalValueByNID(X509_NAME* name, int nid, std::string* value) { + int index = X509_NAME_get_index_by_NID(name, nid, -1); + if (index < 0) + return false; + + return ParsePrincipalValueByIndex(name, index, value); +} + +bool ParseDate(ASN1_TIME* x509_time, base::Time* time) { + if (!x509_time || + (x509_time->type != V_ASN1_UTCTIME && + x509_time->type != V_ASN1_GENERALIZEDTIME)) + return false; + + base::StringPiece str_date(reinterpret_cast<const char*>(x509_time->data), + x509_time->length); + // UTCTime: YYMMDDHHMMSSZ + // GeneralizedTime: YYYYMMDDHHMMSSZ + size_t year_length = x509_time->type == V_ASN1_UTCTIME ? 2 : 4; + + if (str_date.length() < 11 + year_length) + return false; + + const char* field = str_date.data(); + bool valid = true; + base::Time::Exploded exploded = {0}; + + exploded.year = ParseIntAndAdvance(&field, year_length, &valid); + exploded.month = ParseIntAndAdvance(&field, 2, &valid); + exploded.day_of_month = ParseIntAndAdvance(&field, 2, &valid); + exploded.hour = ParseIntAndAdvance(&field, 2, &valid); + exploded.minute = ParseIntAndAdvance(&field, 2, &valid); + exploded.second = ParseIntAndAdvance(&field, 2, &valid); + if (valid && year_length == 2) + exploded.year += exploded.year < 50 ? 2000 : 1900; + + valid &= exploded.HasValidValues(); + + if (!valid) { + NOTREACHED() << "can't parse x509 date " << str_date; + return false; + } + + *time = base::Time::FromUTCExploded(exploded); + return true; +} + +} // namespace x509_openssl_util + +} // namespace net diff --git a/net/base/x509_openssl_util.h b/net/base/x509_openssl_util.h new file mode 100644 index 0000000..5ac511b --- /dev/null +++ b/net/base/x509_openssl_util.h @@ -0,0 +1,39 @@ +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_X509_OPENSSL_UTIL_H_ +#define NET_BASE_X509_OPENSSL_UTIL_H_ +#pragma once + +#include <openssl/asn1.h> +#include <openssl/x509v3.h> + +#include <string> + +namespace base { +class Time; +} // namespace base + +namespace net { + +// A collection of helper functions to fetch data from OpenSSL X509 certificates +// into more convenient std / base datatypes. +namespace x509_openssl_util { + +bool ParsePrincipalKeyAndValueByIndex(X509_NAME* name, + int index, + std::string* key, + std::string* value); + +bool ParsePrincipalValueByIndex(X509_NAME* name, int index, std::string* value); + +bool ParsePrincipalValueByNID(X509_NAME* name, int nid, std::string* value); + +bool ParseDate(ASN1_TIME* x509_time, base::Time* time); + +} // namespace x509_openssl_util + +} // namespace net + +#endif // NET_BASE_X509_OPENSSL_UTIL_H_ |
