summaryrefslogtreecommitdiffstats
path: root/net/base/ssl_config_service.cc
diff options
context:
space:
mode:
authorinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 22:42:52 +0000
committerinitial.commit <initial.commit@0039d316-1c4b-4281-b951-d872f2087c98>2008-07-26 22:42:52 +0000
commit586acc5fe142f498261f52c66862fa417c3d52d2 (patch)
treec98b3417a883f2477029c8cd5888f4078681e24e /net/base/ssl_config_service.cc
parenta814a8d55429605fe6d7045045cd25b6bf624580 (diff)
downloadchromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.zip
chromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.tar.gz
chromium_src-586acc5fe142f498261f52c66862fa417c3d52d2.tar.bz2
Add net to the repository.
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/ssl_config_service.cc')
-rw-r--r--net/base/ssl_config_service.cc129
1 files changed, 129 insertions, 0 deletions
diff --git a/net/base/ssl_config_service.cc b/net/base/ssl_config_service.cc
new file mode 100644
index 0000000..14dad5f
--- /dev/null
+++ b/net/base/ssl_config_service.cc
@@ -0,0 +1,129 @@
+// Copyright 2008, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include "net/base/ssl_config_service.h"
+
+#include "base/registry.h"
+
+namespace net {
+
+static const int kConfigUpdateInterval = 10; // seconds
+
+static const wchar_t kInternetSettingsSubKeyName[] =
+ L"Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings";
+
+static const wchar_t kRevocationValueName[] = L"CertificateRevocation";
+
+static const wchar_t kProtocolsValueName[] = L"SecureProtocols";
+
+// In SecureProtocols, each SSL version is represented by a bit:
+// SSL 2.0: 0x08
+// SSL 3.0: 0x20
+// TLS 1.0: 0x80
+// The bits are OR'ed to form the DWORD value. So 0xa0 means SSL 3.0 and
+// TLS 1.0.
+enum {
+ SSL2 = 0x08,
+ SSL3 = 0x20,
+ TLS1 = 0x80
+};
+
+// If CertificateRevocation or SecureProtocols is missing, IE uses a default
+// value. Unfortunately the default is IE version specific. We use WinHTTP's
+// default.
+enum {
+ REVOCATION_DEFAULT = 0,
+ PROTOCOLS_DEFAULT = SSL3 | TLS1
+};
+
+SSLConfigService::SSLConfigService() {
+ UpdateConfig(TimeTicks::Now());
+}
+
+SSLConfigService::SSLConfigService(TimeTicks now) {
+ UpdateConfig(now);
+}
+
+void SSLConfigService::GetSSLConfigAt(SSLConfig* config, TimeTicks now) {
+ if (now - config_time_ > TimeDelta::FromSeconds(kConfigUpdateInterval))
+ UpdateConfig(now);
+ *config = config_info_;
+}
+
+// static
+bool SSLConfigService::GetSSLConfigNow(SSLConfig* config) {
+ RegKey internet_settings;
+ if (!internet_settings.Open(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_READ))
+ return false;
+
+ DWORD revocation;
+ if (!internet_settings.ReadValueDW(kRevocationValueName, &revocation))
+ revocation = REVOCATION_DEFAULT;
+
+ DWORD protocols;
+ if (!internet_settings.ReadValueDW(kProtocolsValueName, &protocols))
+ protocols = PROTOCOLS_DEFAULT;
+
+ config->rev_checking_enabled = (revocation != 0);
+ config->ssl2_enabled = ((protocols & SSL2) != 0);
+ config->ssl3_enabled = ((protocols & SSL3) != 0);
+ config->tls1_enabled = ((protocols & TLS1) != 0);
+
+ return true;
+}
+
+// static
+void SSLConfigService::SetRevCheckingEnabled(bool enabled) {
+ DWORD value = enabled;
+ RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_WRITE);
+ internet_settings.WriteValue(kRevocationValueName, value);
+}
+
+// static
+void SSLConfigService::SetSSL2Enabled(bool enabled) {
+ RegKey internet_settings(HKEY_CURRENT_USER, kInternetSettingsSubKeyName,
+ KEY_READ | KEY_WRITE);
+ DWORD value;
+ if (!internet_settings.ReadValueDW(kProtocolsValueName, &value))
+ value = PROTOCOLS_DEFAULT;
+ if (enabled)
+ value |= SSL2;
+ else
+ value &= ~SSL2;
+ internet_settings.WriteValue(kProtocolsValueName, value);
+}
+
+void SSLConfigService::UpdateConfig(TimeTicks now) {
+ GetSSLConfigNow(&config_info_);
+ config_time_ = now;
+}
+
+} // namespace net