13345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copyright (c) 2010 The Chromium Authors. All rights reserved.
23345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Use of this source code is governed by a BSD-style license that can be
33345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// found in the LICENSE file.
43345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
53345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "net/base/ssl_false_start_blacklist.h"
63345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merricknamespace net {
83345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
93345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// static
103345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickbool SSLFalseStartBlacklist::IsMember(const char* host) {
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const char* last_two_labels = LastTwoLabels(host);
123345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  if (!last_two_labels)
133345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return false;
143345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const unsigned bucket = Hash(last_two_labels) & (kBuckets - 1);
15513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const uint32 start = kHashTable[bucket];
16513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  const uint32 end = kHashTable[bucket + 1];
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const size_t len = strlen(host);
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  for (size_t i = start; i < end;) {
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    const size_t blacklist_entry_len = static_cast<uint8>(kHashData[i]);
213345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (len >= blacklist_entry_len &&
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        memcmp(&host[len - blacklist_entry_len], &kHashData[i + 1],
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick               blacklist_entry_len) == 0 &&
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        (len == blacklist_entry_len ||
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick         host[len - blacklist_entry_len - 1] == '.')) {
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      return true;
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    }
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    i += blacklist_entry_len + 1;
293345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  return false;
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick}  // namespace net
35