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

Unified Diff: net/cert/internal/name_constraints.h

Issue 1214933009: Class for parsing and evaluating RFC 5280 NameConstraints. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@compare_DN2
Patch Set: use test_helpers.h 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 side-by-side diff with in-line comments
Download patch
Index: net/cert/internal/name_constraints.h
diff --git a/net/cert/internal/name_constraints.h b/net/cert/internal/name_constraints.h
new file mode 100644
index 0000000000000000000000000000000000000000..2487f34ef4a5a0773cce0427f101b05afd55db2e
--- /dev/null
+++ b/net/cert/internal/name_constraints.h
@@ -0,0 +1,111 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_
+#define NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_
+
+#include <vector>
+
+#include "net/base/ip_address_number.h"
+#include "net/der/input.h"
eroman 2015/08/26 19:56:44 nit: can you forward-declare der::Input instead?
mattm 2015/08/29 01:37:18 Done.
+
+namespace net {
+
+// Parses a NameConstraints extension value and allows testing whether names are
+// allowed under those constraints as defined by RFC 5280 section 4.2.1.10.
+class NET_EXPORT NameConstraints {
+ public:
+ // TODO: make this private? (requires making some currently anonymous
eroman 2015/08/26 19:56:44 TODO: --> TODO(mattm):
mattm 2015/08/29 01:37:19 Done.
+ // functions into private static methods.) Or maybe this will need to be split
+ // out into a public class, since GeneralNames is used other places in a
eroman 2015/08/26 19:56:44 I would say not to make it private for the reasons
mattm 2015/08/29 01:37:18 Acknowledged.
+ // certificate also...
+ struct GeneralNames {
+ GeneralNames();
+ ~GeneralNames();
+
+ // ASCII hostnames.
+ std::vector<std::string> dns_names;
+
+ // DER encoded Name values (not including the Sequence tag).
eroman 2015/08/26 19:56:44 See also https://code.google.com/p/chromium/issues
mattm 2015/08/29 01:37:18 Acknowledged.
+ std::vector<std::vector<uint8_t>> directory_names;
+
+ // iPAddresses. For Subject Alternative Name this will be 4 bytes for IPv4
+ // or 16 bytes for IPv6. For Name Constraints, it will be ip + netmask
+ // (8 bytes for IPv4, 32 bytes for IPv6).
+ std::vector<std::vector<uint8_t>> ip_addresses;
eroman 2015/08/26 19:56:44 Should we go a step further and parse this into an
mattm 2015/08/29 01:37:18 I guess it could, but just the complication again
+
+ // Whether any values of the other types were present.
+ bool has_other_names;
+ bool has_rfc822_names;
+ bool has_x400_addresses;
+ bool has_edi_party_names;
+ bool has_uniform_resource_identifiers;
+ bool has_registered_ids;
+ };
+
+ ~NameConstraints();
+
+ // Parse a DER-encoded NameConstraints extension. |extension_value| should be
eroman 2015/08/26 19:56:44 This comment isnt' really clear that this in fact
mattm 2015/08/29 01:37:18 Done.
+ // the extnValue octet string from the extension, |is_critical| should be true
eroman 2015/08/26 19:56:44 Unclear if this is the content, or the full TLV of
mattm 2015/08/29 01:37:18 Done.
+ // if the extension was marked critical.
+ // Returns true if the extension was parsed successfully.
+ // The object lifetime is not bound to the lifetime of |extension_value| data.
eroman 2015/08/26 19:56:44 Out of curiosity what made you choose this model?
mattm 2015/08/29 01:37:18 Mainly that it just seemed safer and easier to und
+ bool Parse(const der::Input& extension_value, bool is_critical);
+
+ // Tests if a certificate is allowed by the name constraints.
+ // |subject_rdn_sequence| should be the DER-encoded value of the subject's
+ // RDNSequence field (not including Sequence tag), and may be an empty ASN.1
+ // sequence. |subject_alt_name| should be the extnValue of the subjectAltName
eroman 2015/08/26 19:56:44 Is this the OCTET STRING's value, or the full TLV?
mattm 2015/08/29 01:37:18 Just the value. You're correct there could be some
+ // extension, or empty if the cert did not have a subjectAltName extension.
+ // |is_leaf_cert| should be true if the certificate is the leaf of the
+ // certificate chain, in which case subject commonName hostname/ip checking is
+ // done.
+ bool IsPermittedCert(const der::Input& subject_rdn_sequence,
+ const der::Input& subject_alt_name,
+ bool is_leaf_cert) const;
+
+ // Returns true if the ASCII hostname |name| is permitted.
+ // |name| may be a wildcard hostname (starts with "*."). Eg, "*.bar.com" is
+ // considered would not be permitted if "bar.com" is permitted and
eroman 2015/08/26 19:56:44 is considered would not be --> would not be permit
mattm 2015/08/29 01:37:19 Done.
+ // "foo.bar.com" is excluded, while "*.baz.com" would only be permitted if
+ // "baz.com" is permitted.
+ bool IsPermittedDNSName(const std::string& name) const;
+
+ // Returns true if the directoryName |name| is permitted.
eroman 2015/08/26 19:56:44 what does |name| refer to?
mattm 2015/08/29 01:37:19 fixed.
+ // |name_rdn_sequence| should be the DER-encoded RDNSequence value (not
+ // including the Sequence tag.)
+ bool IsPermittedDirectoryName(const der::Input& name_rdn_sequence) const;
+
+ // Returns true if the iPAddress |ip| is permitted.
+ bool IsPermittedIP(const IPAddressNumber& ip) const;
+
+ // These name types aren't supported, therefore names of these types are
+ // permitted only if they don't appear in the name constraints at all, or if
+ // the name constraint they appeared in was non-critical.
+ //
+ // RFC 5280 section 4.2.1.10 says:
+ // Applications conforming to this profile MUST be able to process name
+ // constraints that are imposed on the directoryName name form and SHOULD be
+ // able to process name constraints that are imposed on the rfc822Name,
+ // uniformResourceIdentifier, dNSName, and iPAddress name forms.
+ // If a name constraints extension that is marked as critical
+ // imposes constraints on a particular name form, and an instance of
+ // that name form appears in the subject field or subjectAltName
+ // extension of a subsequent certificate, then the application MUST
+ // either process the constraint or reject the certificate.
+ bool IsPermittedOtherName() const;
+ bool IsPermittedRFC822Name() const;
+ bool IsPermittedX400Address() const;
+ bool IsPermittedEdiPartyName() const;
+ bool IsPermittedURI() const;
+ bool IsPermittedRegisteredId() const;
+
+ private:
+ GeneralNames permitted_subtrees_;
+ GeneralNames excluded_subtrees_;
+};
+
+} // namespace net
+
+#endif // NET_CERT_INTERNAL_NAME_CONSTRAINTS_H_

Powered by Google App Engine
This is Rietveld 408576698