Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: net/cert/x509_certificate_unittest.cc

Issue 2735733003: Disable commonName matching for certificates (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/cert/x509_certificate.h" 5 #include "net/cert/x509_certificate.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 const Time& valid_expiry = webkit_cert->valid_expiry(); 160 const Time& valid_expiry = webkit_cert->valid_expiry();
161 EXPECT_EQ(1300491319, valid_expiry.ToDoubleT()); // Mar 18 23:35:19 2011 GMT 161 EXPECT_EQ(1300491319, valid_expiry.ToDoubleT()); // Mar 18 23:35:19 2011 GMT
162 162
163 std::vector<std::string> dns_names; 163 std::vector<std::string> dns_names;
164 webkit_cert->GetDNSNames(&dns_names); 164 webkit_cert->GetDNSNames(&dns_names);
165 ASSERT_EQ(2U, dns_names.size()); 165 ASSERT_EQ(2U, dns_names.size());
166 EXPECT_EQ("*.webkit.org", dns_names[0]); 166 EXPECT_EQ("*.webkit.org", dns_names[0]);
167 EXPECT_EQ("webkit.org", dns_names[1]); 167 EXPECT_EQ("webkit.org", dns_names[1]);
168 168
169 // Test that the wildcard cert matches properly. 169 // Test that the wildcard cert matches properly.
170 bool unused = false; 170 EXPECT_TRUE(webkit_cert->VerifyNameMatch("www.webkit.org", false));
171 EXPECT_TRUE(webkit_cert->VerifyNameMatch("www.webkit.org", &unused)); 171 EXPECT_TRUE(webkit_cert->VerifyNameMatch("foo.webkit.org", false));
172 EXPECT_TRUE(webkit_cert->VerifyNameMatch("foo.webkit.org", &unused)); 172 EXPECT_TRUE(webkit_cert->VerifyNameMatch("webkit.org", false));
173 EXPECT_TRUE(webkit_cert->VerifyNameMatch("webkit.org", &unused)); 173 EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.webkit.com", false));
174 EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.webkit.com", &unused)); 174 EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.foo.webkit.com", false));
175 EXPECT_FALSE(webkit_cert->VerifyNameMatch("www.foo.webkit.com", &unused));
176 } 175 }
177 176
178 TEST(X509CertificateTest, ThawteCertParsing) { 177 TEST(X509CertificateTest, ThawteCertParsing) {
179 scoped_refptr<X509Certificate> thawte_cert(X509Certificate::CreateFromBytes( 178 scoped_refptr<X509Certificate> thawte_cert(X509Certificate::CreateFromBytes(
180 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der))); 179 reinterpret_cast<const char*>(thawte_der), sizeof(thawte_der)));
181 180
182 ASSERT_NE(static_cast<X509Certificate*>(NULL), thawte_cert.get()); 181 ASSERT_NE(static_cast<X509Certificate*>(NULL), thawte_cert.get());
183 182
184 const CertPrincipal& subject = thawte_cert->subject(); 183 const CertPrincipal& subject = thawte_cert->subject();
185 EXPECT_EQ("www.thawte.com", subject.common_name); 184 EXPECT_EQ("www.thawte.com", subject.common_name);
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
926 // The hostname to match. 925 // The hostname to match.
927 const char* hostname; 926 const char* hostname;
928 // Common name, may be used if |dns_names| or |ip_addrs| are empty. 927 // Common name, may be used if |dns_names| or |ip_addrs| are empty.
929 const char* common_name; 928 const char* common_name;
930 // Comma separated list of certificate names to match against. Any occurrence 929 // Comma separated list of certificate names to match against. Any occurrence
931 // of '#' will be replaced with a null character before processing. 930 // of '#' will be replaced with a null character before processing.
932 const char* dns_names; 931 const char* dns_names;
933 // Comma separated list of certificate IP Addresses to match against. Each 932 // Comma separated list of certificate IP Addresses to match against. Each
934 // address is x prefixed 16 byte hex code for v6 or dotted-decimals for v4. 933 // address is x prefixed 16 byte hex code for v6 or dotted-decimals for v4.
935 const char* ip_addrs; 934 const char* ip_addrs;
935 // Whether to disable matching against the commonName. This is a negative
936 // condition so that tests can omit one or more of the above fields and
937 // allow default initialization to handle this case.
938 bool disable_fallback;
936 }; 939 };
937 940
938 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how 941 // GTest 'magic' pretty-printer, so that if/when a test fails, it knows how
939 // to output the parameter that was passed. Without this, it will simply 942 // to output the parameter that was passed. Without this, it will simply
940 // attempt to print out the first twenty bytes of the object, which depending 943 // attempt to print out the first twenty bytes of the object, which depending
941 // on platform and alignment, may result in an invalid read. 944 // on platform and alignment, may result in an invalid read.
942 void PrintTo(const CertificateNameVerifyTestData& data, std::ostream* os) { 945 void PrintTo(const CertificateNameVerifyTestData& data, std::ostream* os) {
943 ASSERT_TRUE(data.hostname && data.common_name); 946 ASSERT_TRUE(data.hostname && data.common_name);
944 // Using StringPiece to allow for optional fields being NULL. 947 // Using StringPiece to allow for optional fields being NULL.
945 *os << " expected: " << data.expected 948 *os << " expected: " << data.expected
946 << "; hostname: " << data.hostname 949 << "; hostname: " << data.hostname
947 << "; common_name: " << data.common_name 950 << "; common_name: " << data.common_name
948 << "; dns_names: " << base::StringPiece(data.dns_names) 951 << "; dns_names: " << base::StringPiece(data.dns_names)
949 << "; ip_addrs: " << base::StringPiece(data.ip_addrs); 952 << "; ip_addrs: " << base::StringPiece(data.ip_addrs)
953 << "; disable_fallback: " << data.disable_fallback;
950 } 954 }
951 955
952 const CertificateNameVerifyTestData kNameVerifyTestData[] = { 956 const CertificateNameVerifyTestData kNameVerifyTestData[] = {
953 { true, "foo.com", "foo.com" }, 957 { true, "foo.com", "foo.com" },
954 { true, "f", "f" }, 958 { true, "f", "f" },
955 { false, "h", "i" }, 959 { false, "h", "i" },
956 { true, "bar.foo.com", "*.foo.com" }, 960 { true, "bar.foo.com", "*.foo.com" },
957 { true, "www.test.fr", "common.name", 961 { true, "www.test.fr", "common.name",
958 "*.test.com,*.test.co.uk,*.test.de,*.test.fr" }, 962 "*.test.com,*.test.co.uk,*.test.de,*.test.fr" },
959 { true, "wwW.tESt.fr", "common.name", 963 { true, "wwW.tESt.fr", "common.name",
960 ",*.*,*.test.de,*.test.FR,www" }, 964 ",*.*,*.test.de,*.test.FR,www" },
961 { false, "f.uk", ".uk" }, 965 { false, "f.uk", ".uk" },
962 { false, "w.bar.foo.com", "?.bar.foo.com" }, 966 { false, "w.bar.foo.com", "?.bar.foo.com" },
963 { false, "www.foo.com", "(www|ftp).foo.com" }, 967 { false, "www.foo.com", "(www|ftp).foo.com" },
964 { false, "www.foo.com", "www.foo.com#" }, // # = null char. 968 { false, "www.foo.com", "www.foo.com#" }, // # = null char.
965 { false, "www.foo.com", "", "www.foo.com#*.foo.com,#,#" }, 969 { false, "www.foo.com", "", "www.foo.com#*.foo.com,#,#" },
966 { false, "www.house.example", "ww.house.example" }, 970 { false, "www.house.example", "ww.house.example" },
967 { false, "test.org", "", "www.test.org,*.test.org,*.org" }, 971 { false, "test.org", "", "www.test.org,*.test.org,*.org" },
968 { false, "w.bar.foo.com", "w*.bar.foo.com" }, 972 { false, "w.bar.foo.com", "w*.bar.foo.com" },
969 { false, "www.bar.foo.com", "ww*ww.bar.foo.com" }, 973 { false, "www.bar.foo.com", "ww*ww.bar.foo.com" },
970 { false, "wwww.bar.foo.com", "ww*ww.bar.foo.com" }, 974 { false, "wwww.bar.foo.com", "ww*ww.bar.foo.com" },
971 { false, "wwww.bar.foo.com", "w*w.bar.foo.com" }, 975 { false, "wwww.bar.foo.com", "w*w.bar.foo.com" },
972 { false, "wwww.bar.foo.com", "w*w.bar.foo.c0m" }, 976 { false, "wwww.bar.foo.com", "w*w.bar.foo.c0m" },
973 { false, "WALLY.bar.foo.com", "wa*.bar.foo.com" }, 977 { false, "WALLY.bar.foo.com", "wa*.bar.foo.com" },
974 { false, "wally.bar.foo.com", "*Ly.bar.foo.com" }, 978 { false, "wally.bar.foo.com", "*Ly.bar.foo.com" },
975 { true, "ww%57.foo.com", "", "www.foo.com" }, 979 { true, "ww%57.foo.com", "", "www.foo.com" },
976 { true, "www&.foo.com", "www%26.foo.com" }, 980 { true, "www&.foo.com", "www%26.foo.com" },
977 // Common name must not be used if subject alternative name was provided. 981 // Common name must not be used if subject alternative name was provided.
978 { false, "www.test.co.jp", "www.test.co.jp", 982 { false, "www.test.co.jp", "www.test.co.jp",
979 "*.test.de,*.jp,www.test.co.uk,www.*.co.jp" }, 983 "*.test.de,*.jp,www.test.co.uk,www.*.co.jp" },
980 { false, "www.bar.foo.com", "www.bar.foo.com", 984 { false, "www.bar.foo.com", "www.bar.foo.com",
981 "*.foo.com,*.*.foo.com,*.*.bar.foo.com,*..bar.foo.com," }, 985 "*.foo.com,*.*.foo.com,*.*.bar.foo.com,*..bar.foo.com," },
982 { false, "www.bath.org", "www.bath.org", "", "20.30.40.50" }, 986 { false, "www.bath.org", "www.bath.org", "", "20.30.40.50" },
983 { false, "66.77.88.99", "www.bath.org", "www.bath.org" }, 987 { false, "66.77.88.99", "66.77.88.99", "www.bath.org" },
988 // Common name must not be used if fallback is disabled.
989 { false, "www.test.com", "www.test.com", nullptr, nullptr, true },
990 { false, "127.0.0.1", "127.0.0.1", nullptr, nullptr, true },
984 // IDN tests 991 // IDN tests
985 { true, "xn--poema-9qae5a.com.br", "xn--poema-9qae5a.com.br" }, 992 { true, "xn--poema-9qae5a.com.br", "xn--poema-9qae5a.com.br" },
986 { true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br" }, 993 { true, "www.xn--poema-9qae5a.com.br", "*.xn--poema-9qae5a.com.br" },
987 { false, "xn--poema-9qae5a.com.br", "", "*.xn--poema-9qae5a.com.br," 994 { false, "xn--poema-9qae5a.com.br", "", "*.xn--poema-9qae5a.com.br,"
988 "xn--poema-*.com.br," 995 "xn--poema-*.com.br,"
989 "xn--*-9qae5a.com.br," 996 "xn--*-9qae5a.com.br,"
990 "*--poema-9qae5a.com.br" }, 997 "*--poema-9qae5a.com.br" },
991 // The following are adapted from the examples quoted from 998 // The following are adapted from the examples quoted from
992 // http://tools.ietf.org/html/rfc6125#section-6.4.3 999 // http://tools.ietf.org/html/rfc6125#section-6.4.3
993 // (e.g., *.example.com would match foo.example.com but 1000 // (e.g., *.example.com would match foo.example.com but
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
1136 EXPECT_GE(decimal_value, 0); 1143 EXPECT_GE(decimal_value, 0);
1137 EXPECT_LE(decimal_value, 255); 1144 EXPECT_LE(decimal_value, 255);
1138 addr_bytes.push_back(static_cast<char>(decimal_value)); 1145 addr_bytes.push_back(static_cast<char>(decimal_value));
1139 } 1146 }
1140 ip_addressses.push_back(addr_bytes); 1147 ip_addressses.push_back(addr_bytes);
1141 ASSERT_EQ(4U, ip_addressses.back().size()) << i; 1148 ASSERT_EQ(4U, ip_addressses.back().size()) << i;
1142 } 1149 }
1143 } 1150 }
1144 } 1151 }
1145 1152
1146 bool unused = false; 1153 EXPECT_EQ(test_data.expected,
1147 EXPECT_EQ(test_data.expected, X509Certificate::VerifyHostname( 1154 X509Certificate::VerifyHostname(test_data.hostname, common_name,
1148 test_data.hostname, common_name, dns_names, ip_addressses, &unused)); 1155 dns_names, ip_addressses,
1156 !test_data.disable_fallback));
1149 } 1157 }
1150 1158
1151 INSTANTIATE_TEST_CASE_P(, X509CertificateNameVerifyTest, 1159 INSTANTIATE_TEST_CASE_P(, X509CertificateNameVerifyTest,
1152 testing::ValuesIn(kNameVerifyTestData)); 1160 testing::ValuesIn(kNameVerifyTestData));
1153 1161
1154 const struct PublicKeyInfoTestData { 1162 const struct PublicKeyInfoTestData {
1155 const char* cert_file; 1163 const char* cert_file;
1156 size_t expected_bits; 1164 size_t expected_bits;
1157 X509Certificate::PublicKeyType expected_type; 1165 X509Certificate::PublicKeyType expected_type;
1158 } kPublicKeyInfoTestData[] = { 1166 } kPublicKeyInfoTestData[] = {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 &actual_type); 1202 &actual_type);
1195 1203
1196 EXPECT_EQ(data.expected_bits, actual_bits); 1204 EXPECT_EQ(data.expected_bits, actual_bits);
1197 EXPECT_EQ(data.expected_type, actual_type); 1205 EXPECT_EQ(data.expected_type, actual_type);
1198 } 1206 }
1199 1207
1200 INSTANTIATE_TEST_CASE_P(, X509CertificatePublicKeyInfoTest, 1208 INSTANTIATE_TEST_CASE_P(, X509CertificatePublicKeyInfoTest,
1201 testing::ValuesIn(kPublicKeyInfoTestData)); 1209 testing::ValuesIn(kPublicKeyInfoTestData));
1202 1210
1203 } // namespace net 1211 } // namespace net
OLDNEW
« no previous file with comments | « net/cert/x509_certificate.cc ('k') | net/data/cert_issuer_source_aia_unittest/generate-certs.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698