1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #ifndef NET_SSL_CLIENT_CERT_STORE_UNITTEST_INL_H_
6 #define NET_SSL_CLIENT_CERT_STORE_UNITTEST_INL_H_
11 #include "base/files/file_path.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/scoped_ptr.h"
14 #include "net/base/test_data_directory.h"
15 #include "net/test/cert_test_util.h"
16 #include "testing/gtest/include/gtest/gtest.h"
22 // "CN=B CA" - DER encoded DN of the issuer of client_1.pem
23 const unsigned char kAuthority1DN
[] = {
24 0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
25 0x04, 0x42, 0x20, 0x43, 0x41
28 // "CN=E CA" - DER encoded DN of the issuer of client_2.pem
29 unsigned char kAuthority2DN
[] = {
30 0x30, 0x0f, 0x31, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
31 0x04, 0x45, 0x20, 0x43, 0x41
36 // Use a templated test to provide common testcases for all the platform
37 // implementations of ClientCertStore. These cases test the client cert
38 // filtering behavior.
40 // NOTE: If any test cases are added, removed, or renamed, the
41 // REGISTER_TYPED_TEST_CASE_P macro at the bottom of this file must be updated.
43 // The type T provided as the third argument to INSTANTIATE_TYPED_TEST_CASE_P by
44 // the platform implementation should implement this method:
45 // bool SelectClientCerts(const CertificateList& input_certs,
46 // const SSLCertRequestInfo& cert_request_info,
47 // CertificateList* selected_certs);
49 class ClientCertStoreTest
: public ::testing::Test
{
54 TYPED_TEST_CASE_P(ClientCertStoreTest
);
56 TYPED_TEST_P(ClientCertStoreTest
, EmptyQuery
) {
57 std::vector
<scoped_refptr
<X509Certificate
> > certs
;
58 scoped_refptr
<SSLCertRequestInfo
> request(new SSLCertRequestInfo());
60 std::vector
<scoped_refptr
<X509Certificate
> > selected_certs
;
61 bool rv
= this->delegate_
.SelectClientCerts(
62 certs
, *request
.get(), &selected_certs
);
64 EXPECT_EQ(0u, selected_certs
.size());
67 // Verify that CertRequestInfo with empty |cert_authorities| matches all
68 // issuers, rather than no issuers.
69 TYPED_TEST_P(ClientCertStoreTest
, AllIssuersAllowed
) {
70 scoped_refptr
<X509Certificate
> cert(
71 ImportCertFromFile(GetTestCertsDirectory(), "client_1.pem"));
72 ASSERT_TRUE(cert
.get());
74 std::vector
<scoped_refptr
<X509Certificate
> > certs
;
75 certs
.push_back(cert
);
76 scoped_refptr
<SSLCertRequestInfo
> request(new SSLCertRequestInfo());
78 std::vector
<scoped_refptr
<X509Certificate
> > selected_certs
;
79 bool rv
= this->delegate_
.SelectClientCerts(
80 certs
, *request
.get(), &selected_certs
);
82 ASSERT_EQ(1u, selected_certs
.size());
83 EXPECT_TRUE(selected_certs
[0]->Equals(cert
.get()));
86 // Verify that certificates are correctly filtered against CertRequestInfo with
87 // |cert_authorities| containing only |authority_1_DN|.
88 TYPED_TEST_P(ClientCertStoreTest
, CertAuthorityFiltering
) {
89 scoped_refptr
<X509Certificate
> cert_1(
90 ImportCertFromFile(GetTestCertsDirectory(), "client_1.pem"));
91 ASSERT_TRUE(cert_1
.get());
92 scoped_refptr
<X509Certificate
> cert_2(
93 ImportCertFromFile(GetTestCertsDirectory(), "client_2.pem"));
94 ASSERT_TRUE(cert_2
.get());
96 std::vector
<std::string
> authority_1(
97 1, std::string(reinterpret_cast<const char*>(kAuthority1DN
),
98 sizeof(kAuthority1DN
)));
99 std::vector
<std::string
> authority_2(
100 1, std::string(reinterpret_cast<const char*>(kAuthority2DN
),
101 sizeof(kAuthority2DN
)));
102 EXPECT_TRUE(cert_1
->IsIssuedByEncoded(authority_1
));
103 EXPECT_FALSE(cert_1
->IsIssuedByEncoded(authority_2
));
104 EXPECT_TRUE(cert_2
->IsIssuedByEncoded(authority_2
));
105 EXPECT_FALSE(cert_2
->IsIssuedByEncoded(authority_1
));
107 std::vector
<scoped_refptr
<X509Certificate
> > certs
;
108 certs
.push_back(cert_1
);
109 certs
.push_back(cert_2
);
110 scoped_refptr
<SSLCertRequestInfo
> request(new SSLCertRequestInfo());
111 request
->cert_authorities
= authority_1
;
113 std::vector
<scoped_refptr
<X509Certificate
> > selected_certs
;
114 bool rv
= this->delegate_
.SelectClientCerts(
115 certs
, *request
.get(), &selected_certs
);
117 ASSERT_EQ(1u, selected_certs
.size());
118 EXPECT_TRUE(selected_certs
[0]->Equals(cert_1
.get()));
121 REGISTER_TYPED_TEST_CASE_P(ClientCertStoreTest
,
124 CertAuthorityFiltering
);
128 #endif // NET_SSL_CLIENT_CERT_STORE_UNITTEST_INL_H_