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

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

Powered by Google App Engine
This is Rietveld 408576698