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

Side by Side Diff: net/cert/internal/name_constraints_unittest.cc

Issue 1214933009: Class for parsing and evaluating RFC 5280 NameConstraints. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@compare_DN2
Patch Set: win compile fix Created 5 years, 3 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
(Empty)
1 // Copyright 2015 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.
4
5 #include "net/cert/internal/name_constraints.h"
6
7 #include "net/cert/internal/test_helpers.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9
10 namespace net {
11 namespace {
12
13 ::testing::AssertionResult LoadTestData(const char* token,
14 const std::string& basename,
15 std::string* result) {
16 std::string path = "net/data/name_constraints_unittest/" + basename;
17
18 const PemBlockMapping mappings[] = {
19 {token, result},
20 };
21
22 return ReadTestDataFromPemFile(path, mappings);
23 }
24
25 ::testing::AssertionResult LoadTestName(const std::string& basename,
26 std::string* result) {
27 return LoadTestData("NAME", basename, result);
28 }
29
30 ::testing::AssertionResult LoadTestNameConstraint(const std::string& basename,
31 std::string* result) {
32 return LoadTestData("NAME CONSTRAINTS", basename, result);
33 }
34
35 ::testing::AssertionResult LoadTestSubjectAltName(const std::string& basename,
36 std::string* result) {
37 return LoadTestData("SUBJECT ALTERNATIVE NAME", basename, result);
38 }
39
40 } // namespace
41
42 class ParseNameConstraints
43 : public ::testing::TestWithParam<::testing::tuple<bool>> {
44 public:
45 bool is_critical() const { return ::testing::get<0>(GetParam()); }
46 };
47
48 // Run the tests with the name constraints marked critical and non-critical. For
49 // supported name types, the results should be the same for both.
50 INSTANTIATE_TEST_CASE_P(InstantiationName,
51 ParseNameConstraints,
52 ::testing::Values(true, false));
53
54 TEST_P(ParseNameConstraints, DNSNames) {
55 std::string a;
56 ASSERT_TRUE(LoadTestNameConstraint("dnsname.pem", &a));
57
58 scoped_ptr<NameConstraints> name_constraints(
59 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
60 ASSERT_TRUE(name_constraints);
61
62 EXPECT_TRUE(name_constraints->IsPermittedDNSName("permitted.example.com"));
63 EXPECT_TRUE(name_constraints->IsPermittedDNSName("permitted.example.com."));
64 EXPECT_TRUE(name_constraints->IsPermittedDNSName("a.permitted.example.com"));
65 EXPECT_FALSE(name_constraints->IsPermittedDNSName("apermitted.example.com"));
66 EXPECT_FALSE(name_constraints->IsPermittedDNSName("apermitted.example.com."));
67 EXPECT_TRUE(
68 name_constraints->IsPermittedDNSName("alsopermitted.example.com"));
69 EXPECT_FALSE(
70 name_constraints->IsPermittedDNSName("excluded.permitted.example.com"));
71 EXPECT_FALSE(
72 name_constraints->IsPermittedDNSName("a.excluded.permitted.example.com"));
73 EXPECT_FALSE(name_constraints->IsPermittedDNSName(
74 "stillnotpermitted.excluded.permitted.example.com"));
75 EXPECT_FALSE(name_constraints->IsPermittedDNSName(
76 "a.stillnotpermitted.excluded.permitted.example.com"));
77 EXPECT_FALSE(
78 name_constraints->IsPermittedDNSName("extraneousexclusion.example.com"));
79 EXPECT_FALSE(name_constraints->IsPermittedDNSName(
80 "a.extraneousexclusion.example.com"));
81 EXPECT_FALSE(name_constraints->IsPermittedDNSName("other.example.com"));
82 EXPECT_FALSE(name_constraints->IsPermittedDNSName("other.com"));
83
84 // Wildcard names:
85 // Pattern could match excluded.permitted.example.com, thus should not be
86 // allowed.
87 EXPECT_FALSE(name_constraints->IsPermittedDNSName("*.permitted.example.com"));
88 // Entirely within excluded name, obviously not allowed.
89 EXPECT_FALSE(
90 name_constraints->IsPermittedDNSName("*.excluded.permitted.example.com"));
91 // Within permitted.example.com and cannot match any exclusion, thus these are
92 // allowed.
93 EXPECT_TRUE(
94 name_constraints->IsPermittedDNSName("*.foo.permitted.example.com"));
95 EXPECT_TRUE(
96 name_constraints->IsPermittedDNSName("*.alsopermitted.example.com"));
97 // Matches permitted.example2.com, but also matches other .example2.com names
98 // which are not in either permitted or excluded, so not allowed.
99 EXPECT_FALSE(name_constraints->IsPermittedDNSName("*.example2.com"));
100 // Partial wildcards are not supported, so these name are permitted even if
101 // it seems like they shouldn't be. It's fine, since certificate verification
102 // won't treat them as wildcard names either.
103 EXPECT_TRUE(
104 name_constraints->IsPermittedDNSName("*xcluded.permitted.example.com"));
105 EXPECT_TRUE(
106 name_constraints->IsPermittedDNSName("exclude*.permitted.example.com"));
107 EXPECT_TRUE(
108 name_constraints->IsPermittedDNSName("excl*ded.permitted.example.com"));
109 // Garbage wildcard data.
110 EXPECT_FALSE(name_constraints->IsPermittedDNSName("*."));
111 EXPECT_FALSE(name_constraints->IsPermittedDNSName("*.*"));
112 EXPECT_FALSE(name_constraints->IsPermittedDNSName(".*"));
113 EXPECT_FALSE(name_constraints->IsPermittedDNSName("*"));
114 // Matches SAN with trailing dot.
115 EXPECT_TRUE(name_constraints->IsPermittedDNSName("permitted.example3.com"));
116 EXPECT_TRUE(name_constraints->IsPermittedDNSName("permitted.example3.com."));
117 EXPECT_TRUE(name_constraints->IsPermittedDNSName("a.permitted.example3.com"));
118 EXPECT_TRUE(
119 name_constraints->IsPermittedDNSName("a.permitted.example3.com."));
120
121 EXPECT_EQ(GENERAL_NAME_DNS_NAME, name_constraints->ConstrainedNameTypes());
122
123 std::string san;
124 ASSERT_TRUE(LoadTestSubjectAltName("san-permitted.pem", &san));
125 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
126 InputFromString(&san), true));
127
128 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-dnsname.pem", &san));
129 EXPECT_FALSE(name_constraints->IsPermittedCert(der::Input(),
130 InputFromString(&san), true));
131
132 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-directoryname.pem", &san));
133 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
134 InputFromString(&san), true));
135
136 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-ipaddress.pem", &san));
137 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
138 InputFromString(&san), true));
139 }
140
141 TEST_P(ParseNameConstraints, DNSNamesExcludeOnly) {
142 std::string a;
143 ASSERT_TRUE(LoadTestNameConstraint("dnsname-excluded.pem", &a));
144
145 scoped_ptr<NameConstraints> name_constraints(
146 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
147 ASSERT_TRUE(name_constraints);
148
149 // Only "excluded.permitted.example.com" is excluded, but since no dNSNames
150 // are permitted, everything is excluded.
151 EXPECT_FALSE(name_constraints->IsPermittedDNSName(""));
152 EXPECT_FALSE(name_constraints->IsPermittedDNSName("foo.com"));
153 EXPECT_FALSE(name_constraints->IsPermittedDNSName("permitted.example.com"));
154 EXPECT_FALSE(
155 name_constraints->IsPermittedDNSName("excluded.permitted.example.com"));
156 EXPECT_FALSE(
157 name_constraints->IsPermittedDNSName("a.excluded.permitted.example.com"));
158 }
159
160 TEST_P(ParseNameConstraints, DNSNamesExcludeAll) {
161 std::string a;
162 ASSERT_TRUE(LoadTestNameConstraint("dnsname-excludeall.pem", &a));
163
164 scoped_ptr<NameConstraints> name_constraints(
165 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
166 ASSERT_TRUE(name_constraints);
167
168 // "permitted.example.com" is in the permitted section, but since "" is
169 // excluded, nothing is permitted.
170 EXPECT_FALSE(name_constraints->IsPermittedDNSName(""));
171 EXPECT_FALSE(name_constraints->IsPermittedDNSName("foo.com"));
172 EXPECT_FALSE(name_constraints->IsPermittedDNSName("permitted.example.com"));
173 EXPECT_FALSE(
174 name_constraints->IsPermittedDNSName("foo.permitted.example.com"));
175 }
176
177 TEST_P(ParseNameConstraints, DNSNamesExcludeDot) {
178 std::string a;
179 ASSERT_TRUE(LoadTestNameConstraint("dnsname-exclude_dot.pem", &a));
180
181 scoped_ptr<NameConstraints> name_constraints(
182 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
183 ASSERT_TRUE(name_constraints);
184
185 // "." is excluded, which should match nothing.
186 EXPECT_FALSE(name_constraints->IsPermittedDNSName("foo.com"));
187 EXPECT_TRUE(name_constraints->IsPermittedDNSName("permitted.example.com"));
188 EXPECT_TRUE(
189 name_constraints->IsPermittedDNSName("foo.permitted.example.com"));
190 }
191
192 TEST_P(ParseNameConstraints, DNSNamesFailOnInvalidIA5String) {
193 std::string a;
194 ASSERT_TRUE(LoadTestNameConstraint("dnsname.pem", &a));
195
196 size_t replace_location = a.find("permitted.example2.com");
197 ASSERT_NE(std::string::npos, replace_location);
198 a.replace(replace_location, 1, 1, -1);
199
200 EXPECT_FALSE(
201 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
202 }
203
204 TEST_P(ParseNameConstraints, DirectoryNames) {
205 std::string constraints_der;
206 ASSERT_TRUE(LoadTestNameConstraint("directoryname.pem", &constraints_der));
207
208 std::string name_us;
209 ASSERT_TRUE(LoadTestName("name-us.pem", &name_us));
210 std::string name_us_ca;
211 ASSERT_TRUE(LoadTestName("name-us-california.pem", &name_us_ca));
212 std::string name_us_ca_mountain_view;
213 ASSERT_TRUE(LoadTestName("name-us-california-mountain_view.pem",
214 &name_us_ca_mountain_view));
215 std::string name_us_az;
216 ASSERT_TRUE(LoadTestName("name-us-arizona.pem", &name_us_az));
217 std::string name_jp;
218 ASSERT_TRUE(LoadTestName("name-jp.pem", &name_jp));
219 std::string name_jp_tokyo;
220 ASSERT_TRUE(LoadTestName("name-jp-tokyo.pem", &name_jp_tokyo));
221 std::string name_de;
222 ASSERT_TRUE(LoadTestName("name-de.pem", &name_de));
223 std::string name_ca;
224 ASSERT_TRUE(LoadTestName("name-ca.pem", &name_ca));
225
226 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
227 InputFromString(&constraints_der), is_critical()));
228 ASSERT_TRUE(name_constraints);
229
230 // Not in any permitted subtree.
231 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
232 SequenceValueFromString(&name_ca)));
233 // Within the permitted C=US subtree.
234 EXPECT_TRUE(name_constraints->IsPermittedDirectoryName(
235 SequenceValueFromString(&name_us)));
236 // Within the permitted C=US subtree.
237 EXPECT_TRUE(name_constraints->IsPermittedDirectoryName(
238 SequenceValueFromString(&name_us_az)));
239 // Within the permitted C=US subtree, however the excluded C=US,ST=California
240 // subtree takes priority.
241 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
242 SequenceValueFromString(&name_us_ca)));
243 // Within the permitted C=US subtree as well as the permitted
244 // C=US,ST=California,L=Mountain View subtree, however the excluded
245 // C=US,ST=California subtree still takes priority.
246 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
247 SequenceValueFromString(&name_us_ca_mountain_view)));
248 // Not in any permitted subtree, and also inside the extraneous excluded C=DE
249 // subtree.
250 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
251 SequenceValueFromString(&name_de)));
252 // Not in any permitted subtree.
253 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
254 SequenceValueFromString(&name_jp)));
255 // Within the permitted C=JP,ST=Tokyo subtree.
256 EXPECT_TRUE(name_constraints->IsPermittedDirectoryName(
257 SequenceValueFromString(&name_jp_tokyo)));
258
259 EXPECT_EQ(GENERAL_NAME_DIRECTORY_NAME,
260 name_constraints->ConstrainedNameTypes());
261
262 // Within the permitted C=US subtree.
263 EXPECT_TRUE(name_constraints->IsPermittedCert(
264 SequenceValueFromString(&name_us), der::Input(),
265 false /* is_leaf_cert */));
266 EXPECT_TRUE(
267 name_constraints->IsPermittedCert(SequenceValueFromString(&name_us),
268 der::Input(), true /* is_leaf_cert */));
269 // Within the permitted C=US subtree, however the excluded C=US,ST=California
270 // subtree takes priority.
271 EXPECT_FALSE(name_constraints->IsPermittedCert(
272 SequenceValueFromString(&name_us_ca), der::Input(),
273 false /* is_leaf_cert */));
274 EXPECT_FALSE(
275 name_constraints->IsPermittedCert(SequenceValueFromString(&name_us_ca),
276 der::Input(), true /* is_leaf_cert */));
277
278 std::string san;
279 ASSERT_TRUE(LoadTestSubjectAltName("san-permitted.pem", &san));
280 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
281 InputFromString(&san), true));
282
283 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-dnsname.pem", &san));
284 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
285 InputFromString(&san), true));
286
287 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-directoryname.pem", &san));
288 EXPECT_FALSE(name_constraints->IsPermittedCert(der::Input(),
289 InputFromString(&san), true));
290
291 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-ipaddress.pem", &san));
292 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
293 InputFromString(&san), true));
294 }
295
296 TEST_P(ParseNameConstraints, DirectoryNamesExcludeOnly) {
297 std::string constraints_der;
298 ASSERT_TRUE(
299 LoadTestNameConstraint("directoryname-excluded.pem", &constraints_der));
300 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
301 InputFromString(&constraints_der), is_critical()));
302 ASSERT_TRUE(name_constraints);
303
304 std::string name_empty;
305 ASSERT_TRUE(LoadTestName("name-empty.pem", &name_empty));
306 std::string name_us;
307 ASSERT_TRUE(LoadTestName("name-us.pem", &name_us));
308 std::string name_us_ca;
309 ASSERT_TRUE(LoadTestName("name-us-california.pem", &name_us_ca));
310 std::string name_us_ca_mountain_view;
311 ASSERT_TRUE(LoadTestName("name-us-california-mountain_view.pem",
312 &name_us_ca_mountain_view));
313
314 // Only "C=US,ST=California" is excluded, but since no directoryNames are
315 // permitted, everything is excluded.
316 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
317 SequenceValueFromString(&name_empty)));
318 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
319 SequenceValueFromString(&name_us)));
320 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
321 SequenceValueFromString(&name_us_ca)));
322 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
323 SequenceValueFromString(&name_us_ca_mountain_view)));
324 }
325
326 TEST_P(ParseNameConstraints, DirectoryNamesExcludeAll) {
327 std::string constraints_der;
328 ASSERT_TRUE(
329 LoadTestNameConstraint("directoryname-excluded.pem", &constraints_der));
330 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
331 InputFromString(&constraints_der), is_critical()));
332 ASSERT_TRUE(name_constraints);
333
334 std::string name_empty;
335 ASSERT_TRUE(LoadTestName("name-empty.pem", &name_empty));
336 std::string name_us;
337 ASSERT_TRUE(LoadTestName("name-us.pem", &name_us));
338 std::string name_us_ca;
339 ASSERT_TRUE(LoadTestName("name-us-california.pem", &name_us_ca));
340 std::string name_us_ca_mountain_view;
341 ASSERT_TRUE(LoadTestName("name-us-california-mountain_view.pem",
342 &name_us_ca_mountain_view));
343 std::string name_jp;
344 ASSERT_TRUE(LoadTestName("name-jp.pem", &name_jp));
345
346 // "C=US" is in the permitted section, but since an empty
347 // directoryName is excluded, nothing is permitted.
348 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
349 SequenceValueFromString(&name_empty)));
350 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
351 SequenceValueFromString(&name_us)));
352 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
353 SequenceValueFromString(&name_us_ca)));
354 EXPECT_FALSE(name_constraints->IsPermittedDirectoryName(
355 SequenceValueFromString(&name_jp)));
356 }
357
358 TEST_P(ParseNameConstraints, IPAdresses) {
359 std::string a;
360 ASSERT_TRUE(LoadTestNameConstraint("ipaddress.pem", &a));
361
362 scoped_ptr<NameConstraints> name_constraints(
363 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
364 ASSERT_TRUE(name_constraints);
365
366 // IPv4 tests:
367 {
368 // Not in any permitted range.
369 const uint8_t ip4[] = {192, 169, 0, 1};
370 EXPECT_FALSE(name_constraints->IsPermittedIP(
371 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
372 }
373 {
374 // Within the permitted 192.168.0.0/255.255.0.0 range.
375 const uint8_t ip4[] = {192, 168, 0, 1};
376 EXPECT_TRUE(name_constraints->IsPermittedIP(
377 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
378 }
379 {
380 // Within the permitted 192.168.0.0/255.255.0.0 range, however the
381 // excluded 192.168.5.0/255.255.255.0 takes priority.
382 const uint8_t ip4[] = {192, 168, 5, 1};
383 EXPECT_FALSE(name_constraints->IsPermittedIP(
384 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
385 }
386 {
387 // Within the permitted 192.168.0.0/255.255.0.0 range as well as the
388 // permitted 192.168.5.32/255.255.255.96 range, however the excluded
389 // 192.168.5.0/255.255.255.0 still takes priority.
390 const uint8_t ip4[] = {192, 168, 5, 33};
391 EXPECT_FALSE(name_constraints->IsPermittedIP(
392 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
393 }
394 {
395 // Not in any permitted range. (Just outside the 192.167.5.32/255.255.255.96
396 // range.)
397 const uint8_t ip4[] = {192, 167, 5, 31};
398 EXPECT_FALSE(name_constraints->IsPermittedIP(
399 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
400 }
401 {
402 // Within the permitted 192.167.5.32/255.255.255.96 range.
403 const uint8_t ip4[] = {192, 167, 5, 32};
404 EXPECT_TRUE(name_constraints->IsPermittedIP(
405 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
406 }
407 {
408 // Within the permitted 192.167.5.32/255.255.255.96 range.
409 const uint8_t ip4[] = {192, 167, 5, 63};
410 EXPECT_TRUE(name_constraints->IsPermittedIP(
411 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
412 }
413 {
414 // Not in any permitted range. (Just outside the 192.167.5.32/255.255.255.96
415 // range.)
416 const uint8_t ip4[] = {192, 167, 5, 64};
417 EXPECT_FALSE(name_constraints->IsPermittedIP(
418 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
419 }
420 {
421 // Not in any permitted range, and also inside the extraneous excluded
422 // 192.166.5.32/255.255.255.96 range.
423 const uint8_t ip4[] = {192, 166, 5, 32};
424 EXPECT_FALSE(name_constraints->IsPermittedIP(
425 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
426 }
427
428 // IPv6 tests:
429 {
430 // Not in any permitted range.
431 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 0, 0, 0, 1};
432 EXPECT_FALSE(name_constraints->IsPermittedIP(
433 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
434 }
435 {
436 // Within the permitted
437 // 102:304:506:708:90a:b0c::/ffff:ffff:ffff:ffff:ffff:ffff:: range.
438 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 0, 1};
439 EXPECT_TRUE(name_constraints->IsPermittedIP(
440 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
441 }
442 {
443 // Within the permitted
444 // 102:304:506:708:90a:b0c::/ffff:ffff:ffff:ffff:ffff:ffff:: range, however
445 // the excluded
446 // 102:304:506:708:90a:b0c:500:0/ffff:ffff:ffff:ffff:ffff:ffff:ff00:0 takes
447 // priority.
448 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 0, 0, 1};
449 EXPECT_FALSE(name_constraints->IsPermittedIP(
450 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
451 }
452 {
453 // Within the permitted
454 // 102:304:506:708:90a:b0c::/ffff:ffff:ffff:ffff:ffff:ffff:: range as well
455 // as the permitted
456 // 102:304:506:708:90a:b0c:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0,
457 // however the excluded
458 // 102:304:506:708:90a:b0c:500:0/ffff:ffff:ffff:ffff:ffff:ffff:ff00:0 takes
459 // priority.
460 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 5, 33, 0, 1};
461 EXPECT_FALSE(name_constraints->IsPermittedIP(
462 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
463 }
464 {
465 // Not in any permitted range. (Just outside the
466 // 102:304:506:708:90a:b0b:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0
467 // range.)
468 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8,
469 9, 10, 11, 11, 5, 31, 255, 255};
470 EXPECT_FALSE(name_constraints->IsPermittedIP(
471 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
472 }
473 {
474 // Within the permitted
475 // 102:304:506:708:90a:b0b:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0 range.
476 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 5, 32, 0, 0};
477 EXPECT_TRUE(name_constraints->IsPermittedIP(
478 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
479 }
480 {
481 // Within the permitted
482 // 102:304:506:708:90a:b0b:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0 range.
483 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8,
484 9, 10, 11, 11, 5, 63, 255, 255};
485 EXPECT_TRUE(name_constraints->IsPermittedIP(
486 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
487 }
488 {
489 // Not in any permitted range. (Just outside the
490 // 102:304:506:708:90a:b0b:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0
491 // range.)
492 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 11, 5, 64, 0, 0};
493 EXPECT_FALSE(name_constraints->IsPermittedIP(
494 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
495 }
496 {
497 // Not in any permitted range, and also inside the extraneous excluded
498 // 102:304:506:708:90a:b0a:520:0/ffff:ffff:ffff:ffff:ffff:ffff:ff60:0 range.
499 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 10, 5, 33, 0, 1};
500 EXPECT_FALSE(name_constraints->IsPermittedIP(
501 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
502 }
503
504 EXPECT_EQ(GENERAL_NAME_IP_ADDRESS, name_constraints->ConstrainedNameTypes());
505
506 std::string san;
507 ASSERT_TRUE(LoadTestSubjectAltName("san-permitted.pem", &san));
508 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
509 InputFromString(&san), true));
510
511 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-dnsname.pem", &san));
512 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
513 InputFromString(&san), true));
514
515 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-directoryname.pem", &san));
516 EXPECT_TRUE(name_constraints->IsPermittedCert(der::Input(),
517 InputFromString(&san), true));
518
519 ASSERT_TRUE(LoadTestSubjectAltName("san-excluded-ipaddress.pem", &san));
520 EXPECT_FALSE(name_constraints->IsPermittedCert(der::Input(),
521 InputFromString(&san), true));
522 }
523
524 TEST_P(ParseNameConstraints, IPAdressesExcludeOnly) {
525 std::string a;
526 ASSERT_TRUE(LoadTestNameConstraint("ipaddress-excluded.pem", &a));
527
528 scoped_ptr<NameConstraints> name_constraints(
529 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
530 ASSERT_TRUE(name_constraints);
531
532 // Only 192.168.5.0/255.255.255.0 is excluded, but since no iPAddresses
533 // are permitted, everything is excluded.
534 {
535 const uint8_t ip4[] = {192, 168, 0, 1};
536 EXPECT_FALSE(name_constraints->IsPermittedIP(
537 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
538 }
539 {
540 const uint8_t ip4[] = {192, 168, 5, 1};
541 EXPECT_FALSE(name_constraints->IsPermittedIP(
542 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
543 }
544 {
545 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 0, 0, 0, 1};
546 EXPECT_FALSE(name_constraints->IsPermittedIP(
547 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
548 }
549 }
550
551 TEST_P(ParseNameConstraints, IPAdressesExcludeAll) {
552 std::string a;
553 ASSERT_TRUE(LoadTestNameConstraint("ipaddress-excludeall.pem", &a));
554
555 scoped_ptr<NameConstraints> name_constraints(
556 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
557 ASSERT_TRUE(name_constraints);
558
559 // 192.168.0.0/255.255.0.0 and
560 // 102:304:506:708:90a:b0c::/ffff:ffff:ffff:ffff:ffff:ffff:: are permitted,
561 // but since 0.0.0.0/0 and ::/0 are excluded nothing is permitted.
562 {
563 const uint8_t ip4[] = {192, 168, 0, 1};
564 EXPECT_FALSE(name_constraints->IsPermittedIP(
565 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
566 }
567 {
568 const uint8_t ip4[] = {1, 1, 1, 1};
569 EXPECT_FALSE(name_constraints->IsPermittedIP(
570 IPAddressNumber(ip4, ip4 + arraysize(ip4))));
571 }
572 {
573 const uint8_t ip6[] = {2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
574 EXPECT_FALSE(name_constraints->IsPermittedIP(
575 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
576 }
577 {
578 const uint8_t ip6[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 0, 0, 0, 1};
579 EXPECT_FALSE(name_constraints->IsPermittedIP(
580 IPAddressNumber(ip6, ip6 + arraysize(ip6))));
581 }
582 }
583
584 TEST_P(ParseNameConstraints, IPAdressesFailOnInvalidAddr) {
585 std::string a;
586 ASSERT_TRUE(LoadTestNameConstraint("ipaddress-invalid_addr.pem", &a));
587
588 EXPECT_FALSE(
589 NameConstraints::CreateFromDer(InputFromString(&a), is_critical()));
590 }
591
592 TEST_P(ParseNameConstraints, OtherNamesInPermitted) {
593 std::string constraints_der;
594 ASSERT_TRUE(
595 LoadTestNameConstraint("othername-permitted.pem", &constraints_der));
596 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
597 InputFromString(&constraints_der), is_critical()));
598 ASSERT_TRUE(name_constraints);
599
600 if (is_critical()) {
601 EXPECT_EQ(GENERAL_NAME_OTHER_NAME,
602 name_constraints->ConstrainedNameTypes());
603 } else {
604 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
605 }
606
607 std::string san;
608 ASSERT_TRUE(LoadTestSubjectAltName("san-othername.pem", &san));
609 EXPECT_EQ(!is_critical(),
610 name_constraints->IsPermittedCert(
611 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
612 }
613
614 TEST_P(ParseNameConstraints, OtherNamesInExcluded) {
615 std::string constraints_der;
616 ASSERT_TRUE(
617 LoadTestNameConstraint("othername-excluded.pem", &constraints_der));
618 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
619 InputFromString(&constraints_der), is_critical()));
620 ASSERT_TRUE(name_constraints);
621
622 if (is_critical()) {
623 EXPECT_EQ(GENERAL_NAME_OTHER_NAME,
624 name_constraints->ConstrainedNameTypes());
625 } else {
626 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
627 }
628
629 std::string san;
630 ASSERT_TRUE(LoadTestSubjectAltName("san-othername.pem", &san));
631 EXPECT_EQ(!is_critical(),
632 name_constraints->IsPermittedCert(
633 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
634 }
635
636 TEST_P(ParseNameConstraints, Rfc822NamesInPermitted) {
637 std::string constraints_der;
638 ASSERT_TRUE(
639 LoadTestNameConstraint("rfc822name-permitted.pem", &constraints_der));
640 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
641 InputFromString(&constraints_der), is_critical()));
642 ASSERT_TRUE(name_constraints);
643
644 if (is_critical()) {
645 EXPECT_EQ(GENERAL_NAME_RFC822_NAME,
646 name_constraints->ConstrainedNameTypes());
647 } else {
648 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
649 }
650
651 std::string san;
652 ASSERT_TRUE(LoadTestSubjectAltName("san-rfc822name.pem", &san));
653 EXPECT_EQ(!is_critical(),
654 name_constraints->IsPermittedCert(
655 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
656 }
657
658 TEST_P(ParseNameConstraints, Rfc822NamesInExcluded) {
659 std::string constraints_der;
660 ASSERT_TRUE(
661 LoadTestNameConstraint("rfc822name-excluded.pem", &constraints_der));
662 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
663 InputFromString(&constraints_der), is_critical()));
664 ASSERT_TRUE(name_constraints);
665
666 if (is_critical()) {
667 EXPECT_EQ(GENERAL_NAME_RFC822_NAME,
668 name_constraints->ConstrainedNameTypes());
669 } else {
670 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
671 }
672
673 std::string san;
674 ASSERT_TRUE(LoadTestSubjectAltName("san-rfc822name.pem", &san));
675 EXPECT_EQ(!is_critical(),
676 name_constraints->IsPermittedCert(
677 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
678 }
679
680 TEST_P(ParseNameConstraints, X400AddresssInPermitted) {
681 std::string constraints_der;
682 ASSERT_TRUE(
683 LoadTestNameConstraint("x400address-permitted.pem", &constraints_der));
684 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
685 InputFromString(&constraints_der), is_critical()));
686 ASSERT_TRUE(name_constraints);
687
688 if (is_critical()) {
689 EXPECT_EQ(GENERAL_NAME_X400_ADDRESS,
690 name_constraints->ConstrainedNameTypes());
691 } else {
692 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
693 }
694
695 std::string san;
696 ASSERT_TRUE(LoadTestSubjectAltName("san-x400address.pem", &san));
697 EXPECT_EQ(!is_critical(),
698 name_constraints->IsPermittedCert(
699 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
700 }
701
702 TEST_P(ParseNameConstraints, X400AddresssInExcluded) {
703 std::string constraints_der;
704 ASSERT_TRUE(
705 LoadTestNameConstraint("x400address-excluded.pem", &constraints_der));
706 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
707 InputFromString(&constraints_der), is_critical()));
708 ASSERT_TRUE(name_constraints);
709
710 if (is_critical()) {
711 EXPECT_EQ(GENERAL_NAME_X400_ADDRESS,
712 name_constraints->ConstrainedNameTypes());
713 } else {
714 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
715 }
716
717 std::string san;
718 ASSERT_TRUE(LoadTestSubjectAltName("san-x400address.pem", &san));
719 EXPECT_EQ(!is_critical(),
720 name_constraints->IsPermittedCert(
721 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
722 }
723
724 TEST_P(ParseNameConstraints, EdiPartyNamesInPermitted) {
725 std::string constraints_der;
726 ASSERT_TRUE(
727 LoadTestNameConstraint("edipartyname-permitted.pem", &constraints_der));
728 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
729 InputFromString(&constraints_der), is_critical()));
730 ASSERT_TRUE(name_constraints);
731
732 if (is_critical()) {
733 EXPECT_EQ(GENERAL_NAME_EDI_PARTY_NAME,
734 name_constraints->ConstrainedNameTypes());
735 } else {
736 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
737 }
738
739 std::string san;
740 ASSERT_TRUE(LoadTestSubjectAltName("san-edipartyname.pem", &san));
741 EXPECT_EQ(!is_critical(),
742 name_constraints->IsPermittedCert(
743 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
744 }
745
746 TEST_P(ParseNameConstraints, EdiPartyNamesInExcluded) {
747 std::string constraints_der;
748 ASSERT_TRUE(
749 LoadTestNameConstraint("edipartyname-excluded.pem", &constraints_der));
750 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
751 InputFromString(&constraints_der), is_critical()));
752 ASSERT_TRUE(name_constraints);
753
754 if (is_critical()) {
755 EXPECT_EQ(GENERAL_NAME_EDI_PARTY_NAME,
756 name_constraints->ConstrainedNameTypes());
757 } else {
758 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
759 }
760
761 std::string san;
762 ASSERT_TRUE(LoadTestSubjectAltName("san-edipartyname.pem", &san));
763 EXPECT_EQ(!is_critical(),
764 name_constraints->IsPermittedCert(
765 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
766 }
767
768 TEST_P(ParseNameConstraints, URIsInPermitted) {
769 std::string constraints_der;
770 ASSERT_TRUE(LoadTestNameConstraint("uri-permitted.pem", &constraints_der));
771 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
772 InputFromString(&constraints_der), is_critical()));
773 ASSERT_TRUE(name_constraints);
774
775 if (is_critical()) {
776 EXPECT_EQ(GENERAL_NAME_UNIFORM_RESOURCE_IDENTIFIER,
777 name_constraints->ConstrainedNameTypes());
778 } else {
779 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
780 }
781
782 std::string san;
783 ASSERT_TRUE(LoadTestSubjectAltName("san-uri.pem", &san));
784 EXPECT_EQ(!is_critical(),
785 name_constraints->IsPermittedCert(
786 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
787 }
788
789 TEST_P(ParseNameConstraints, URIsInExcluded) {
790 std::string constraints_der;
791 ASSERT_TRUE(LoadTestNameConstraint("uri-excluded.pem", &constraints_der));
792 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
793 InputFromString(&constraints_der), is_critical()));
794 ASSERT_TRUE(name_constraints);
795
796 if (is_critical()) {
797 EXPECT_EQ(GENERAL_NAME_UNIFORM_RESOURCE_IDENTIFIER,
798 name_constraints->ConstrainedNameTypes());
799 } else {
800 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
801 }
802
803 std::string san;
804 ASSERT_TRUE(LoadTestSubjectAltName("san-uri.pem", &san));
805 EXPECT_EQ(!is_critical(),
806 name_constraints->IsPermittedCert(
807 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
808 }
809
810 TEST_P(ParseNameConstraints, RegisteredIDsInPermitted) {
811 std::string constraints_der;
812 ASSERT_TRUE(
813 LoadTestNameConstraint("registeredid-permitted.pem", &constraints_der));
814 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
815 InputFromString(&constraints_der), is_critical()));
816 ASSERT_TRUE(name_constraints);
817
818 if (is_critical()) {
819 EXPECT_EQ(GENERAL_NAME_REGISTERED_ID,
820 name_constraints->ConstrainedNameTypes());
821 } else {
822 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
823 }
824
825 std::string san;
826 ASSERT_TRUE(LoadTestSubjectAltName("san-registeredid.pem", &san));
827 EXPECT_EQ(!is_critical(),
828 name_constraints->IsPermittedCert(
829 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
830 }
831
832 TEST_P(ParseNameConstraints, RegisteredIDsInExcluded) {
833 std::string constraints_der;
834 ASSERT_TRUE(
835 LoadTestNameConstraint("registeredid-excluded.pem", &constraints_der));
836 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
837 InputFromString(&constraints_der), is_critical()));
838 ASSERT_TRUE(name_constraints);
839
840 if (is_critical()) {
841 EXPECT_EQ(GENERAL_NAME_REGISTERED_ID,
842 name_constraints->ConstrainedNameTypes());
843 } else {
844 EXPECT_EQ(0, name_constraints->ConstrainedNameTypes());
845 }
846
847 std::string san;
848 ASSERT_TRUE(LoadTestSubjectAltName("san-registeredid.pem", &san));
849 EXPECT_EQ(!is_critical(),
850 name_constraints->IsPermittedCert(
851 der::Input(), InputFromString(&san), false /* is_leaf_cert */));
852 }
853
854 TEST_P(ParseNameConstraints,
855 failsOnGeneralSubtreeWithMinimumZeroEncodedUnnecessarily) {
856 std::string constraints_der;
857 ASSERT_TRUE(
858 LoadTestNameConstraint("dnsname-with_min_0.pem", &constraints_der));
859 // The value should not be in the DER encoding if it is the default. But this
860 // could be changed to allowed if there are buggy encoders out there that
861 // include it anyway.
862 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
863 is_critical()));
864 }
865
866 TEST_P(ParseNameConstraints, FailsOnGeneralSubtreeWithMinimum) {
867 std::string constraints_der;
868 ASSERT_TRUE(
869 LoadTestNameConstraint("dnsname-with_min_1.pem", &constraints_der));
870 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
871 is_critical()));
872 }
873
874 TEST_P(ParseNameConstraints,
875 failsOnGeneralSubtreeWithMinimumZeroEncodedUnnecessarilyAndMaximum) {
876 std::string constraints_der;
877 ASSERT_TRUE(LoadTestNameConstraint("dnsname-with_min_0_and_max.pem",
878 &constraints_der));
879 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
880 is_critical()));
881 }
882
883 TEST_P(ParseNameConstraints, FailsOnGeneralSubtreeWithMinimumAndMaximum) {
884 std::string constraints_der;
885 ASSERT_TRUE(LoadTestNameConstraint("dnsname-with_min_1_and_max.pem",
886 &constraints_der));
887 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
888 is_critical()));
889 }
890
891 TEST_P(ParseNameConstraints, FailsOnGeneralSubtreeWithMaximum) {
892 std::string constraints_der;
893 ASSERT_TRUE(LoadTestNameConstraint("dnsname-with_max.pem", &constraints_der));
894 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
895 is_critical()));
896 }
897
898 TEST_P(ParseNameConstraints, FailsOnEmptyExtensionValue) {
899 std::string constraints_der = "";
900 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
901 is_critical()));
902 }
903
904 TEST_P(ParseNameConstraints, FailsOnNoPermittedAndExcluded) {
905 std::string constraints_der;
906 ASSERT_TRUE(
907 LoadTestNameConstraint("invalid-no_subtrees.pem", &constraints_der));
908 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
909 is_critical()));
910 }
911
912 TEST_P(ParseNameConstraints, FailsOnEmptyPermitted) {
913 std::string constraints_der;
914 ASSERT_TRUE(LoadTestNameConstraint("invalid-empty_permitted_subtree.pem",
915 &constraints_der));
916 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
917 is_critical()));
918 }
919
920 TEST_P(ParseNameConstraints, FailsOnEmptyExcluded) {
921 std::string constraints_der;
922 ASSERT_TRUE(LoadTestNameConstraint("invalid-empty_excluded_subtree.pem",
923 &constraints_der));
924 EXPECT_FALSE(NameConstraints::CreateFromDer(InputFromString(&constraints_der),
925 is_critical()));
926 }
927
928 TEST_P(ParseNameConstraints, IsPermittedCertSubjectEmailAddressIsOk) {
929 std::string constraints_der;
930 ASSERT_TRUE(LoadTestNameConstraint("directoryname.pem", &constraints_der));
931 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
932 InputFromString(&constraints_der), is_critical()));
933 ASSERT_TRUE(name_constraints);
934
935 std::string name_us_arizona_email;
936 ASSERT_TRUE(
937 LoadTestName("name-us-arizona-email.pem", &name_us_arizona_email));
938
939 // Name constraints don't contain rfc822Name, so emailAddress in subject is
940 // allowed regardless.
941 EXPECT_TRUE(name_constraints->IsPermittedCert(
942 SequenceValueFromString(&name_us_arizona_email), der::Input(),
943 true /* is_leaf_cert */));
944 EXPECT_TRUE(name_constraints->IsPermittedCert(
945 SequenceValueFromString(&name_us_arizona_email), der::Input(),
946 false /* is_leaf_cert */));
947 }
948
949 TEST_P(ParseNameConstraints, IsPermittedCertSubjectEmailAddressIsNotOk) {
950 std::string constraints_der;
951 ASSERT_TRUE(
952 LoadTestNameConstraint("rfc822name-permitted.pem", &constraints_der));
953 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
954 InputFromString(&constraints_der), is_critical()));
955 ASSERT_TRUE(name_constraints);
956
957 std::string name_us_arizona_email;
958 ASSERT_TRUE(
959 LoadTestName("name-us-arizona-email.pem", &name_us_arizona_email));
960
961 // Name constraints contain rfc822Name, so emailAddress in subject is not
962 // allowed if the constraints were critical.
963 EXPECT_EQ(!is_critical(), name_constraints->IsPermittedCert(
964 SequenceValueFromString(&name_us_arizona_email),
965 der::Input(), true /* is_leaf_cert */));
966 EXPECT_EQ(!is_critical(), name_constraints->IsPermittedCert(
967 SequenceValueFromString(&name_us_arizona_email),
968 der::Input(), false /* is_leaf_cert */));
969 }
970
971 TEST_P(ParseNameConstraints, IsPermittedCertSubjectDnsNames) {
972 std::string constraints_der;
973 ASSERT_TRUE(LoadTestNameConstraint("directoryname_and_dnsname.pem",
974 &constraints_der));
975 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
976 InputFromString(&constraints_der), is_critical()));
977 ASSERT_TRUE(name_constraints);
978
979 std::string name_us_az;
980 ASSERT_TRUE(LoadTestName("name-us-arizona.pem", &name_us_az));
981 std::string name_us_az_foocom;
982 ASSERT_TRUE(LoadTestName("name-us-arizona-foo.com.pem", &name_us_az_foocom));
983
984 // foo.com is not within the permitted dNSName constraints:
985 EXPECT_FALSE(name_constraints->IsPermittedCert(
986 SequenceValueFromString(&name_us_az_foocom), der::Input(),
987 true /* is_leaf_cert */));
988 // commonName check is only done for leaf certs, so this is allowed:
989 EXPECT_TRUE(name_constraints->IsPermittedCert(
990 SequenceValueFromString(&name_us_az_foocom), der::Input(),
991 false /* is_leaf_cert */));
992
993 std::string name_us_az_permitted;
994 ASSERT_TRUE(LoadTestName("name-us-arizona-permitted.example.com.pem",
995 &name_us_az_permitted));
996 // permitted.example.com is within the permitted dNSName constraints and the
997 // permitted C=US directoryName constraint:
998 EXPECT_TRUE(name_constraints->IsPermittedCert(
999 SequenceValueFromString(&name_us_az_permitted), der::Input(),
1000 true /* is_leaf_cert */));
1001 EXPECT_TRUE(name_constraints->IsPermittedCert(
1002 SequenceValueFromString(&name_us_az_permitted), der::Input(),
1003 false /* is_leaf_cert */));
1004
1005 std::string name_us_ca_permitted;
1006 ASSERT_TRUE(LoadTestName("name-us-california-permitted.example.com.pem",
1007 &name_us_ca_permitted));
1008 // permitted.example.com is within the permitted dNSName constraints but the
1009 // subject is within the excluded C=US,ST=California directoryName, so not
1010 // allowed anyway:
1011 EXPECT_FALSE(name_constraints->IsPermittedCert(
1012 SequenceValueFromString(&name_us_ca_permitted), der::Input(),
1013 true /* is_leaf_cert */));
1014 EXPECT_FALSE(name_constraints->IsPermittedCert(
1015 SequenceValueFromString(&name_us_ca_permitted), der::Input(),
1016 false /* is_leaf_cert */));
1017
1018 // As a leaf cert with no SubjectAltName, the subject is expected to have a
1019 // host in commonName, this subject has no commonName field, so fails:
1020 EXPECT_FALSE(
1021 name_constraints->IsPermittedCert(SequenceValueFromString(&name_us_az),
1022 der::Input(), true /* is_leaf_cert */));
1023 // Within the permitted C=US subtree, not a leaf cert, so does not need
1024 // a host in commonName.
1025 EXPECT_TRUE(name_constraints->IsPermittedCert(
1026 SequenceValueFromString(&name_us_az), der::Input(),
1027 false /* is_leaf_cert */));
1028 }
1029
1030 TEST_P(ParseNameConstraints, IsPermittedCertSubjectIpAddresses) {
1031 std::string constraints_der;
1032 ASSERT_TRUE(LoadTestNameConstraint(
1033 "directoryname_and_dnsname_and_ipaddress.pem", &constraints_der));
1034 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
1035 InputFromString(&constraints_der), is_critical()));
1036 ASSERT_TRUE(name_constraints);
1037
1038 std::string name_us_az;
1039 ASSERT_TRUE(LoadTestName("name-us-arizona.pem", &name_us_az));
1040 std::string name_us_az_1_1_1_1;
1041 ASSERT_TRUE(LoadTestName("name-us-arizona-1.1.1.1.pem", &name_us_az_1_1_1_1));
1042
1043 // 1.1.1.1 is not within the permitted iPAddress constraints:
1044 EXPECT_FALSE(name_constraints->IsPermittedCert(
1045 SequenceValueFromString(&name_us_az_1_1_1_1), der::Input(),
1046 true /* is_leaf_cert */));
1047 // commonName check is only done for leaf certs, so this is allowed:
1048 EXPECT_TRUE(name_constraints->IsPermittedCert(
1049 SequenceValueFromString(&name_us_az_1_1_1_1), der::Input(),
1050 false /* is_leaf_cert */));
1051
1052 std::string name_us_az_192_168_1_1;
1053 ASSERT_TRUE(
1054 LoadTestName("name-us-arizona-192.168.1.1.pem", &name_us_az_192_168_1_1));
1055 // 192.168.1.1 is within the permitted iPAddress constraints and the
1056 // permitted C=US directoryName constraint:
1057 EXPECT_TRUE(name_constraints->IsPermittedCert(
1058 SequenceValueFromString(&name_us_az_192_168_1_1), der::Input(),
1059 true /* is_leaf_cert */));
1060 EXPECT_TRUE(name_constraints->IsPermittedCert(
1061 SequenceValueFromString(&name_us_az_192_168_1_1), der::Input(),
1062 false /* is_leaf_cert */));
1063
1064 std::string name_us_ca_192_168_1_1;
1065 ASSERT_TRUE(LoadTestName("name-us-california-192.168.1.1.pem",
1066 &name_us_ca_192_168_1_1));
1067 // 192.168.1.1 is within the permitted iPAddress constraints but the
1068 // subject is within the excluded C=US,ST=California directoryName, so not
1069 // allowed anyway:
1070 EXPECT_FALSE(name_constraints->IsPermittedCert(
1071 SequenceValueFromString(&name_us_ca_192_168_1_1), der::Input(),
1072 true /* is_leaf_cert */));
1073 EXPECT_FALSE(name_constraints->IsPermittedCert(
1074 SequenceValueFromString(&name_us_ca_192_168_1_1), der::Input(),
1075 false /* is_leaf_cert */));
1076
1077 std::string name_us_az_ipv6;
1078 ASSERT_TRUE(LoadTestName("name-us-arizona-ipv6.pem", &name_us_az_ipv6));
1079 // 102:304:506:708:90a:b0c::1 is within the permitted iPAddress constraints
1080 // and the permitted C=US directoryName constraint, but Chrome only handles
1081 // IPv4 addresses in commonName so the address will be checked against dNSName
1082 // constraints instead, which will not match any permitted names.
1083 EXPECT_FALSE(name_constraints->IsPermittedCert(
1084 SequenceValueFromString(&name_us_az_ipv6), der::Input(),
1085 true /* is_leaf_cert */));
1086 EXPECT_TRUE(name_constraints->IsPermittedCert(
1087 SequenceValueFromString(&name_us_az_ipv6), der::Input(),
1088 false /* is_leaf_cert */));
1089
1090 // As a leaf cert with no SubjectAltName, the subject is expected to have a
1091 // host in commonName, this subject has no commonName field, so fails:
1092 EXPECT_FALSE(
1093 name_constraints->IsPermittedCert(SequenceValueFromString(&name_us_az),
1094 der::Input(), true /* is_leaf_cert */));
1095 // Within the permitted C=US subtree, not a leaf cert, so does not need
1096 // a host in commonName.
1097 EXPECT_TRUE(name_constraints->IsPermittedCert(
1098 SequenceValueFromString(&name_us_az), der::Input(),
1099 false /* is_leaf_cert */));
1100 }
1101
1102 TEST_P(ParseNameConstraints, IsPermittedCertSubjectCommonNameEncodings) {
1103 std::string constraints_der;
1104 ASSERT_TRUE(LoadTestNameConstraint("ipaddress.pem", &constraints_der));
1105 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
1106 InputFromString(&constraints_der), is_critical()));
1107 ASSERT_TRUE(name_constraints);
1108
1109 // CommonName encoded as BMPString: should work since we convert to UTF8
1110 // before parsing.
1111 std::string name_us_az_192_168_1_1_bmp;
1112 ASSERT_TRUE(LoadTestName("name-us-arizona-192.168.1.1-bmp.pem",
1113 &name_us_az_192_168_1_1_bmp));
1114 EXPECT_TRUE(name_constraints->IsPermittedCert(
1115 SequenceValueFromString(&name_us_az_192_168_1_1_bmp), der::Input(),
1116 true /* is_leaf_cert */));
1117 EXPECT_TRUE(name_constraints->IsPermittedCert(
1118 SequenceValueFromString(&name_us_az_192_168_1_1_bmp), der::Input(),
1119 false /* is_leaf_cert */));
1120
1121 // CommonName encoded as TeletexString: should not work, TeletexString is not
1122 // supported.
1123 std::string name_us_az_192_168_1_1_t61;
1124 ASSERT_TRUE(LoadTestName("name-us-arizona-192.168.1.1-t61.pem",
1125 &name_us_az_192_168_1_1_t61));
1126 EXPECT_FALSE(name_constraints->IsPermittedCert(
1127 SequenceValueFromString(&name_us_az_192_168_1_1_t61), der::Input(),
1128 true /* is_leaf_cert */));
1129 // If it's not a leaf cert, commonName is not checked, so this is allowed.
1130 EXPECT_TRUE(name_constraints->IsPermittedCert(
1131 SequenceValueFromString(&name_us_az_192_168_1_1_t61), der::Input(),
1132 false /* is_leaf_cert */));
1133 }
1134
1135 TEST_P(ParseNameConstraints, IsPermittedCertFailsOnEmptySubjectAltName) {
1136 std::string constraints_der;
1137 ASSERT_TRUE(LoadTestNameConstraint("dnsname.pem", &constraints_der));
1138 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
1139 InputFromString(&constraints_der), is_critical()));
1140 ASSERT_TRUE(name_constraints);
1141
1142 std::string name_us_az;
1143 ASSERT_TRUE(LoadTestName("name-us-arizona.pem", &name_us_az));
1144
1145 // No constraints on directoryName type, so name_us_az should be allowed when
1146 // subjectAltName is not present.
1147 EXPECT_TRUE(name_constraints->IsPermittedCert(
1148 SequenceValueFromString(&name_us_az), der::Input(),
1149 false /* is_leaf_cert */));
1150
1151 std::string san;
1152 ASSERT_TRUE(LoadTestSubjectAltName("san-invalid-empty.pem", &san));
1153 // Should fail if subjectAltName is present but empty.
1154 EXPECT_FALSE(name_constraints->IsPermittedCert(
1155 SequenceValueFromString(&name_us_az), InputFromString(&san),
1156 false /* is_leaf_cert */));
1157 EXPECT_FALSE(name_constraints->IsPermittedCert(
1158 SequenceValueFromString(&name_us_az), InputFromString(&san),
1159 true /* is_leaf_cert */));
1160 }
1161
1162 TEST_P(ParseNameConstraints, IsPermittedCertFailsOnInvalidIpInSubjectAltName) {
1163 std::string constraints_der;
1164 ASSERT_TRUE(LoadTestNameConstraint("ipaddress.pem", &constraints_der));
1165 scoped_ptr<NameConstraints> name_constraints(NameConstraints::CreateFromDer(
1166 InputFromString(&constraints_der), is_critical()));
1167 ASSERT_TRUE(name_constraints);
1168
1169 std::string name_us_az_192_168_1_1;
1170 ASSERT_TRUE(
1171 LoadTestName("name-us-arizona-192.168.1.1.pem", &name_us_az_192_168_1_1));
1172
1173 // Without the invalid subjectAltName, it passes.
1174 EXPECT_TRUE(name_constraints->IsPermittedCert(
1175 SequenceValueFromString(&name_us_az_192_168_1_1), der::Input(),
1176 false /* is_leaf_cert */));
1177
1178 std::string san;
1179 ASSERT_TRUE(LoadTestSubjectAltName("san-invalid-ipaddress.pem", &san));
1180 // Should fail if subjectAltName contains an invalid ip address.
1181 EXPECT_FALSE(name_constraints->IsPermittedCert(
1182 SequenceValueFromString(&name_us_az_192_168_1_1), InputFromString(&san),
1183 false /* is_leaf_cert */));
1184 EXPECT_FALSE(name_constraints->IsPermittedCert(
1185 SequenceValueFromString(&name_us_az_192_168_1_1), InputFromString(&san),
1186 true /* is_leaf_cert */));
1187 }
1188
1189 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698