 Chromium Code Reviews
 Chromium Code Reviews Issue 1383873002:
  Add a function for parsing an RFC 5280 Extension.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master
    
  
    Issue 1383873002:
  Add a function for parsing an RFC 5280 Extension.  (Closed) 
  Base URL: https://chromium.googlesource.com/chromium/src.git@master| OLD | NEW | 
|---|---|
| 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 "net/der/input.h" | 7 #include "net/der/input.h" | 
| 8 #include "net/der/parse_values.h" | 8 #include "net/der/parse_values.h" | 
| 9 #include "net/der/parser.h" | 9 #include "net/der/parser.h" | 
| 10 | 10 | 
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 346 return false; | 346 return false; | 
| 347 | 347 | 
| 348 // By definition the input was a single TBSCertificate, so there shouldn't be | 348 // By definition the input was a single TBSCertificate, so there shouldn't be | 
| 349 // unconsumed data. | 349 // unconsumed data. | 
| 350 if (parser.HasMore()) | 350 if (parser.HasMore()) | 
| 351 return false; | 351 return false; | 
| 352 | 352 | 
| 353 return true; | 353 return true; | 
| 354 } | 354 } | 
| 355 | 355 | 
| 356 // From RFC 5280: | |
| 357 // | |
| 358 // Extension ::= SEQUENCE { | |
| 359 // extnID OBJECT IDENTIFIER, | |
| 360 // critical BOOLEAN DEFAULT FALSE, | |
| 361 // extnValue OCTET STRING | |
| 362 // -- contains the DER encoding of an ASN.1 value | |
| 363 // -- corresponding to the extension type identified | |
| 364 // -- by extnID | |
| 365 // } | |
| 366 bool ParseExtension(const der::Input& extension_tlv, ParsedExtension* out) { | |
| 367 der::Parser parser(extension_tlv); | |
| 368 | |
| 369 // Extension ::= SEQUENCE { | |
| 370 der::Parser extension_parser; | |
| 371 if (!parser.ReadSequence(&extension_parser)) | |
| 372 return false; | |
| 373 | |
| 374 // extnID OBJECT IDENTIFIER, | |
| 375 if (!extension_parser.ReadTag(der::kOid, &out->oid)) | |
| 376 return false; | |
| 377 | |
| 378 // critical BOOLEAN DEFAULT FALSE, | |
| 379 out->critical = false; | |
| 380 bool has_critical; | |
| 381 der::Input critical; | |
| 382 if (!extension_parser.ReadOptionalTag(der::kBool, &critical, &has_critical)) | |
| 383 return false; | |
| 384 if (has_critical) { | |
| 385 if (!der::ParseBool(critical, &out->critical)) | |
| 386 return false; | |
| 387 if (!out->critical) | |
| 388 return false; // DER-encoding requires DEFAULT values be omitted. | |
| 389 } | |
| 390 | |
| 391 // extnValue OCTET STRING | |
| 392 if (!extension_parser.ReadTag(der::kOctetString, &out->value)) | |
| 393 return false; | |
| 394 | |
| 395 // By definition the input was a single Extension sequence, so there shouldn't | |
| 396 // be unconsumed data. | |
| 397 if (parser.HasMore()) | |
| 398 return false; | |
| 399 | |
| 400 // The Extension type does not have an extension point (everything goes in | |
| 401 // extnValue). | |
| 402 if (extension_parser.HasMore()) | |
| 403 return false; | |
| 
davidben
2015/11/04 17:56:12
Super nitpicky nit: I'd swap the order of this che
 
eroman
2015/11/07 00:35:35
Done.
 | |
| 404 | |
| 405 return true; | |
| 406 } | |
| 407 | |
| 356 } // namespace net | 408 } // namespace net | 
| OLD | NEW |