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

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

Issue 1690123002: Reduce Certificate Parsing Strictness (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Removing 21 octet weakness. Created 4 years, 10 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
« no previous file with comments | « net/cert/internal/parse_certificate.h ('k') | net/cert/internal/signature_algorithm.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/cert/internal/parse_certificate.h" 5 #include "net/cert/internal/parse_certificate.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "net/der/input.h" 9 #include "net/der/input.h"
10 #include "net/der/parse_values.h" 10 #include "net/der/parse_values.h"
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
61 default: 61 default:
62 // Don't allow any other version identifier. 62 // Don't allow any other version identifier.
63 return false; 63 return false;
64 } 64 }
65 65
66 // By definition the input to this function was a single INTEGER, so there 66 // By definition the input to this function was a single INTEGER, so there
67 // shouldn't be anything else after it. 67 // shouldn't be anything else after it.
68 return !parser.HasMore(); 68 return !parser.HasMore();
69 } 69 }
70 70
71 // Returns true if the given serial number (CertificateSerialNumber in RFC 5280)
72 // is valid:
73 //
74 // CertificateSerialNumber ::= INTEGER
75 //
76 // The input to this function is the (unverified) value octets of the INTEGER.
77 // This function will verify that:
78 //
79 // * The octets are a valid DER-encoding of an INTEGER (for instance, minimal
80 // encoding length).
81 //
82 // * No more than 20 octets are used.
83 //
84 // Note that it DOES NOT reject non-positive values (zero or negative).
85 //
86 // For reference, here is what RFC 5280 section 4.1.2.2 says:
87 //
88 // Given the uniqueness requirements above, serial numbers can be
89 // expected to contain long integers. Certificate users MUST be able to
90 // handle serialNumber values up to 20 octets. Conforming CAs MUST NOT
91 // use serialNumber values longer than 20 octets.
92 //
93 // Note: Non-conforming CAs may issue certificates with serial numbers
94 // that are negative or zero. Certificate users SHOULD be prepared to
95 // gracefully handle such certificates.
96 WARN_UNUSED_RESULT bool VerifySerialNumber(const der::Input& value) {
97 bool unused_negative;
98 if (!der::IsValidInteger(value, &unused_negative))
99 return false;
100
101 // Check if the serial number is too long per RFC 5280.
102 if (value.Length() > 20)
103 return false;
104
105 return true;
106 }
107
108 // Consumes a "Time" value (as defined by RFC 5280) from |parser|. On success 71 // Consumes a "Time" value (as defined by RFC 5280) from |parser|. On success
109 // writes the result to |*out| and returns true. On failure no guarantees are 72 // writes the result to |*out| and returns true. On failure no guarantees are
110 // made about the state of |parser|. 73 // made about the state of |parser|.
111 // 74 //
112 // From RFC 5280: 75 // From RFC 5280:
113 // 76 //
114 // Time ::= CHOICE { 77 // Time ::= CHOICE {
115 // utcTime UTCTime, 78 // utcTime UTCTime,
116 // generalTime GeneralizedTime } 79 // generalTime GeneralizedTime }
117 WARN_UNUSED_RESULT bool ReadTime(der::Parser* parser, 80 WARN_UNUSED_RESULT bool ReadTime(der::Parser* parser,
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
184 } 147 }
185 return true; 148 return true;
186 } 149 }
187 150
188 } // namespace 151 } // namespace
189 152
190 ParsedTbsCertificate::ParsedTbsCertificate() {} 153 ParsedTbsCertificate::ParsedTbsCertificate() {}
191 154
192 ParsedTbsCertificate::~ParsedTbsCertificate() {} 155 ParsedTbsCertificate::~ParsedTbsCertificate() {}
193 156
157 bool VerifySerialNumber(const der::Input& value) {
158 bool unused_negative;
159 if (!der::IsValidInteger(value, &unused_negative))
160 return false;
161
162 // Check if the serial number is too long per RFC 5280.
163 if (value.Length() > 20)
164 return false;
165
166 return true;
167 }
168
194 bool ParseCertificate(const der::Input& certificate_tlv, 169 bool ParseCertificate(const der::Input& certificate_tlv,
195 ParsedCertificate* out) { 170 ParsedCertificate* out) {
196 der::Parser parser(certificate_tlv); 171 der::Parser parser(certificate_tlv);
197 172
198 // Certificate ::= SEQUENCE { 173 // Certificate ::= SEQUENCE {
199 der::Parser certificate_parser; 174 der::Parser certificate_parser;
200 if (!parser.ReadSequence(&certificate_parser)) 175 if (!parser.ReadSequence(&certificate_parser))
201 return false; 176 return false;
202 177
203 // tbsCertificate TBSCertificate, 178 // tbsCertificate TBSCertificate,
(...skipping 390 matching lines...) Expand 10 before | Expand all | Expand 10 after
594 // 569 //
595 // When the keyUsage extension appears in a certificate, at least 570 // When the keyUsage extension appears in a certificate, at least
596 // one of the bits MUST be set to 1. 571 // one of the bits MUST be set to 1.
597 if (BitStringIsAllZeros(*key_usage)) 572 if (BitStringIsAllZeros(*key_usage))
598 return false; 573 return false;
599 574
600 return true; 575 return true;
601 } 576 }
602 577
603 } // namespace net 578 } // namespace net
OLDNEW
« no previous file with comments | « net/cert/internal/parse_certificate.h ('k') | net/cert/internal/signature_algorithm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698