blob: 367d69a45fa89edf42df9b24833c1783d71ee919 [file] [log] [blame]
Avi Drissman64595482022-09-14 20:52:291// Copyright 2009 The Chromium Authors
[email protected]56c866a22009-06-18 19:38:582// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]536fd0b2013-03-14 17:41:575#include "net/ssl/ssl_client_auth_cache.h"
[email protected]56c866a22009-06-18 19:38:586
David Benjaminb65b0732018-11-09 20:33:537#include <utility>
8
Avi Drissman41c4a412023-01-11 22:45:379#include "base/functional/callback.h"
[email protected]f002abb2013-06-28 02:30:2110#include "base/time/time.h"
[email protected]6e7845ae2013-03-29 21:48:1111#include "net/cert/x509_certificate.h"
svaldez7872fd02015-11-19 21:10:5412#include "net/ssl/ssl_private_key.h"
David Benjaminb65b0732018-11-09 20:33:5313#include "net/ssl/test_ssl_private_key.h"
rsleevif300d6832016-06-22 22:10:3914#include "net/test/cert_test_util.h"
15#include "net/test/test_data_directory.h"
[email protected]56c866a22009-06-18 19:38:5816#include "testing/gtest/include/gtest/gtest.h"
David Benjaminb65b0732018-11-09 20:33:5317#include "third_party/boringssl/src/include/openssl/evp.h"
[email protected]56c866a22009-06-18 19:38:5818
19namespace net {
20
David Benjaminb65b0732018-11-09 20:33:5321namespace {
22scoped_refptr<SSLPrivateKey> MakeMockKey() {
23 bssl::UniquePtr<EVP_PKEY> pkey(EVP_PKEY_new());
24 return WrapOpenSSLPrivateKey(std::move(pkey));
25}
26} // namespace
svaldez7872fd02015-11-19 21:10:5427
[email protected]56c866a22009-06-18 19:38:5828TEST(SSLClientAuthCacheTest, LookupAddRemove) {
29 SSLClientAuthCache cache;
30
[email protected]791879c2013-12-17 07:22:4131 HostPortPair server1("foo1", 443);
[email protected]56c866a22009-06-18 19:38:5832 scoped_refptr<X509Certificate> cert1(
rsleevif300d6832016-06-22 22:10:3933 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
34 ASSERT_TRUE(cert1);
[email protected]56c866a22009-06-18 19:38:5835
[email protected]791879c2013-12-17 07:22:4136 HostPortPair server2("foo2", 443);
[email protected]56c866a22009-06-18 19:38:5837 scoped_refptr<X509Certificate> cert2(
rsleevif300d6832016-06-22 22:10:3938 ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"));
39 ASSERT_TRUE(cert2);
[email protected]56c866a22009-06-18 19:38:5840
[email protected]791879c2013-12-17 07:22:4141 HostPortPair server3("foo3", 443);
[email protected]56c866a22009-06-18 19:38:5842 scoped_refptr<X509Certificate> cert3(
rsleevif300d6832016-06-22 22:10:3943 ImportCertFromFile(GetTestCertsDirectory(), "root_ca_cert.pem"));
44 ASSERT_TRUE(cert3);
[email protected]56c866a22009-06-18 19:38:5845
[email protected]ec229bc92010-11-22 09:51:4546 scoped_refptr<X509Certificate> cached_cert;
svaldez7872fd02015-11-19 21:10:5447 scoped_refptr<SSLPrivateKey> cached_pkey;
[email protected]56c866a22009-06-18 19:38:5848 // Lookup non-existent client certificate.
rsleevif300d6832016-06-22 22:10:3949 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5450 EXPECT_FALSE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]56c866a22009-06-18 19:38:5851
52 // Add client certificate for server1.
David Benjaminb65b0732018-11-09 20:33:5353 cache.Add(server1, cert1.get(), MakeMockKey());
rsleevif300d6832016-06-22 22:10:3954 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5455 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4556 EXPECT_EQ(cert1, cached_cert);
[email protected]56c866a22009-06-18 19:38:5857
58 // Add client certificate for server2.
David Benjaminb65b0732018-11-09 20:33:5359 cache.Add(server2, cert2.get(), MakeMockKey());
rsleevif300d6832016-06-22 22:10:3960 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5461 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
dchengc80fed2a2014-08-27 21:47:3662 EXPECT_EQ(cert1.get(), cached_cert.get());
rsleevif300d6832016-06-22 22:10:3963 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5464 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4565 EXPECT_EQ(cert2, cached_cert);
[email protected]56c866a22009-06-18 19:38:5866
67 // Overwrite the client certificate for server1.
David Benjaminb65b0732018-11-09 20:33:5368 cache.Add(server1, cert3.get(), MakeMockKey());
rsleevif300d6832016-06-22 22:10:3969 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5470 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4571 EXPECT_EQ(cert3, cached_cert);
rsleevif300d6832016-06-22 22:10:3972 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5473 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4574 EXPECT_EQ(cert2, cached_cert);
[email protected]56c866a22009-06-18 19:38:5875
76 // Remove client certificate of server1.
77 cache.Remove(server1);
rsleevif300d6832016-06-22 22:10:3978 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5479 EXPECT_FALSE(cache.Lookup(server1, &cached_cert, &cached_pkey));
rsleevif300d6832016-06-22 22:10:3980 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5481 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4582 EXPECT_EQ(cert2, cached_cert);
[email protected]56c866a22009-06-18 19:38:5883
84 // Remove non-existent client certificate.
85 cache.Remove(server1);
rsleevif300d6832016-06-22 22:10:3986 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5487 EXPECT_FALSE(cache.Lookup(server1, &cached_cert, &cached_pkey));
rsleevif300d6832016-06-22 22:10:3988 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:5489 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:4590 EXPECT_EQ(cert2, cached_cert);
[email protected]56c866a22009-06-18 19:38:5891}
92
93// Check that if the server differs only by port number, it is considered
94// a separate server.
95TEST(SSLClientAuthCacheTest, LookupWithPort) {
96 SSLClientAuthCache cache;
97
[email protected]791879c2013-12-17 07:22:4198 HostPortPair server1("foo", 443);
[email protected]56c866a22009-06-18 19:38:5899 scoped_refptr<X509Certificate> cert1(
rsleevif300d6832016-06-22 22:10:39100 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
101 ASSERT_TRUE(cert1);
[email protected]56c866a22009-06-18 19:38:58102
[email protected]791879c2013-12-17 07:22:41103 HostPortPair server2("foo", 8443);
[email protected]56c866a22009-06-18 19:38:58104 scoped_refptr<X509Certificate> cert2(
rsleevif300d6832016-06-22 22:10:39105 ImportCertFromFile(GetTestCertsDirectory(), "expired_cert.pem"));
106 ASSERT_TRUE(cert2);
[email protected]56c866a22009-06-18 19:38:58107
David Benjaminb65b0732018-11-09 20:33:53108 cache.Add(server1, cert1.get(), MakeMockKey());
109 cache.Add(server2, cert2.get(), MakeMockKey());
[email protected]56c866a22009-06-18 19:38:58110
[email protected]ec229bc92010-11-22 09:51:45111 scoped_refptr<X509Certificate> cached_cert;
svaldez7872fd02015-11-19 21:10:54112 scoped_refptr<SSLPrivateKey> cached_pkey;
113 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
dchengc80fed2a2014-08-27 21:47:36114 EXPECT_EQ(cert1.get(), cached_cert.get());
svaldez7872fd02015-11-19 21:10:54115 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
dchengc80fed2a2014-08-27 21:47:36116 EXPECT_EQ(cert2.get(), cached_cert.get());
[email protected]ec229bc92010-11-22 09:51:45117}
118
rsleevif300d6832016-06-22 22:10:39119// Check that the a nullptr certificate, indicating the user has declined to
120// send a certificate, is properly cached.
[email protected]ec229bc92010-11-22 09:51:45121TEST(SSLClientAuthCacheTest, LookupNullPreference) {
122 SSLClientAuthCache cache;
[email protected]ec229bc92010-11-22 09:51:45123
[email protected]791879c2013-12-17 07:22:41124 HostPortPair server1("foo", 443);
[email protected]ec229bc92010-11-22 09:51:45125 scoped_refptr<X509Certificate> cert1(
rsleevif300d6832016-06-22 22:10:39126 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
127 ASSERT_TRUE(cert1);
[email protected]ec229bc92010-11-22 09:51:45128
David Benjaminb65b0732018-11-09 20:33:53129 cache.Add(server1, nullptr, MakeMockKey());
[email protected]ec229bc92010-11-22 09:51:45130
131 scoped_refptr<X509Certificate> cached_cert(cert1);
svaldez7872fd02015-11-19 21:10:54132 scoped_refptr<SSLPrivateKey> cached_pkey;
rsleevif300d6832016-06-22 22:10:39133 // Make sure that |cached_cert| is updated to nullptr, indicating the user
[email protected]ec229bc92010-11-22 09:51:45134 // declined to send a certificate to |server1|.
svaldez7872fd02015-11-19 21:10:54135 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
rsleevif300d6832016-06-22 22:10:39136 EXPECT_EQ(nullptr, cached_cert.get());
[email protected]ec229bc92010-11-22 09:51:45137
138 // Remove the existing cached certificate.
139 cache.Remove(server1);
rsleevif300d6832016-06-22 22:10:39140 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:54141 EXPECT_FALSE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:45142
143 // Add a new preference for a specific certificate.
David Benjaminb65b0732018-11-09 20:33:53144 cache.Add(server1, cert1.get(), MakeMockKey());
rsleevif300d6832016-06-22 22:10:39145 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:54146 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]ec229bc92010-11-22 09:51:45147 EXPECT_EQ(cert1, cached_cert);
148
rsleevif300d6832016-06-22 22:10:39149 // Replace the specific preference with a nullptr certificate.
David Benjaminb65b0732018-11-09 20:33:53150 cache.Add(server1, nullptr, MakeMockKey());
rsleevif300d6832016-06-22 22:10:39151 cached_cert = nullptr;
svaldez7872fd02015-11-19 21:10:54152 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
rsleevif300d6832016-06-22 22:10:39153 EXPECT_EQ(nullptr, cached_cert.get());
[email protected]56c866a22009-06-18 19:38:58154}
155
David Benjaminbac8dff2019-08-07 01:30:41156// Check that the Clear() method removes all cache entries.
157TEST(SSLClientAuthCacheTest, Clear) {
[email protected]916f7182011-02-23 16:45:23158 SSLClientAuthCache cache;
[email protected]916f7182011-02-23 16:45:23159
[email protected]791879c2013-12-17 07:22:41160 HostPortPair server1("foo", 443);
[email protected]916f7182011-02-23 16:45:23161 scoped_refptr<X509Certificate> cert1(
rsleevif300d6832016-06-22 22:10:39162 ImportCertFromFile(GetTestCertsDirectory(), "ok_cert.pem"));
163 ASSERT_TRUE(cert1);
[email protected]916f7182011-02-23 16:45:23164
David Benjaminb65b0732018-11-09 20:33:53165 cache.Add(server1, cert1.get(), MakeMockKey());
[email protected]916f7182011-02-23 16:45:23166
[email protected]791879c2013-12-17 07:22:41167 HostPortPair server2("foo2", 443);
David Benjaminb65b0732018-11-09 20:33:53168 cache.Add(server2, nullptr, MakeMockKey());
[email protected]916f7182011-02-23 16:45:23169
170 scoped_refptr<X509Certificate> cached_cert;
svaldez7872fd02015-11-19 21:10:54171 scoped_refptr<SSLPrivateKey> cached_pkey;
[email protected]916f7182011-02-23 16:45:23172
173 // Demonstrate the set up is correct.
svaldez7872fd02015-11-19 21:10:54174 EXPECT_TRUE(cache.Lookup(server1, &cached_cert, &cached_pkey));
[email protected]916f7182011-02-23 16:45:23175 EXPECT_EQ(cert1, cached_cert);
176
svaldez7872fd02015-11-19 21:10:54177 EXPECT_TRUE(cache.Lookup(server2, &cached_cert, &cached_pkey));
rsleevif300d6832016-06-22 22:10:39178 EXPECT_EQ(nullptr, cached_cert.get());
[email protected]916f7182011-02-23 16:45:23179
David Benjaminbac8dff2019-08-07 01:30:41180 cache.Clear();
[email protected]916f7182011-02-23 16:45:23181
182 // Check that we no longer have entries for either server.
svaldez7872fd02015-11-19 21:10:54183 EXPECT_FALSE(cache.Lookup(server1, &cached_cert, &cached_pkey));
184 EXPECT_FALSE(cache.Lookup(server2, &cached_cert, &cached_pkey));
[email protected]916f7182011-02-23 16:45:23185}
186
[email protected]56c866a22009-06-18 19:38:58187} // namespace net