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

Side by Side Diff: net/base/x509_certificate.cc

Issue 10377025: Parse an application/x-x509-user-cert response with (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/base/x509_certificate.h" 5 #include "net/base/x509_certificate.h"
6 6
7 #include <stdlib.h> 7 #include <stdlib.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <map> 10 #include <map>
(...skipping 396 matching lines...) Expand 10 before | Expand all | Expand 10 after
407 std::string decoded(pem_tok.data()); 407 std::string decoded(pem_tok.data());
408 408
409 OSCertHandle handle = NULL; 409 OSCertHandle handle = NULL;
410 if (format & FORMAT_PEM_CERT_SEQUENCE) 410 if (format & FORMAT_PEM_CERT_SEQUENCE)
411 handle = CreateOSCertHandleFromBytes(decoded.c_str(), decoded.size()); 411 handle = CreateOSCertHandleFromBytes(decoded.c_str(), decoded.size());
412 if (handle != NULL) { 412 if (handle != NULL) {
413 // Parsed a DER encoded certificate. All PEM blocks that follow must 413 // Parsed a DER encoded certificate. All PEM blocks that follow must
414 // also be DER encoded certificates wrapped inside of PEM blocks. 414 // also be DER encoded certificates wrapped inside of PEM blocks.
415 format = FORMAT_PEM_CERT_SEQUENCE; 415 format = FORMAT_PEM_CERT_SEQUENCE;
416 certificates.push_back(handle); 416 certificates.push_back(handle);
417 fprintf(stderr, "PEM: format %d\n", (int)format);
417 continue; 418 continue;
418 } 419 }
419 420
420 // If the first block failed to parse as a DER certificate, and 421 // If the first block failed to parse as a DER certificate, and
421 // formats other than PEM are acceptable, check to see if the decoded 422 // formats other than PEM are acceptable, check to see if the decoded
422 // data is one of the accepted formats. 423 // data is one of the accepted formats.
423 if (format & ~FORMAT_PEM_CERT_SEQUENCE) { 424 if (format & ~FORMAT_PEM_CERT_SEQUENCE) {
424 for (size_t i = 0; certificates.empty() && 425 for (size_t i = 0; certificates.empty() &&
425 i < arraysize(kFormatDecodePriority); ++i) { 426 i < arraysize(kFormatDecodePriority); ++i) {
426 if (format & kFormatDecodePriority[i]) { 427 if (format & kFormatDecodePriority[i]) {
427 certificates = CreateOSCertHandlesFromBytes(decoded.c_str(), 428 certificates = CreateOSCertHandlesFromBytes(decoded.c_str(),
428 decoded.size(), kFormatDecodePriority[i]); 429 decoded.size(), kFormatDecodePriority[i]);
430 if (!certificates.empty())
431 fprintf(stderr, "PEM: format %d\n", (int)kFormatDecodePriority[i]);
429 } 432 }
430 } 433 }
431 } 434 }
432 435
433 // Stop parsing after the first block for any format but a sequence of 436 // Stop parsing after the first block for any format but a sequence of
434 // PEM-encoded DER certificates. The case of FORMAT_PEM_CERT_SEQUENCE 437 // PEM-encoded DER certificates. The case of FORMAT_PEM_CERT_SEQUENCE
435 // is handled above, and continues processing until a certificate fails 438 // is handled above, and continues processing until a certificate fails
436 // to parse. 439 // to parse.
437 break; 440 break;
438 } 441 }
439 442
440 // Try each of the formats, in order of parse preference, to see if |data| 443 // Try each of the formats, in order of parse preference, to see if |data|
441 // contains the binary representation of a Format, if it failed to parse 444 // contains the binary representation of a Format, if it failed to parse
442 // as a PEM certificate/chain. 445 // as a PEM certificate/chain.
443 for (size_t i = 0; certificates.empty() && 446 for (size_t i = 0; certificates.empty() &&
444 i < arraysize(kFormatDecodePriority); ++i) { 447 i < arraysize(kFormatDecodePriority); ++i) {
445 if (format & kFormatDecodePriority[i]) 448 if (format & kFormatDecodePriority[i]) {
446 certificates = CreateOSCertHandlesFromBytes(data, length, 449 certificates = CreateOSCertHandlesFromBytes(data, length,
447 kFormatDecodePriority[i]); 450 kFormatDecodePriority[i]);
451 if (!certificates.empty())
452 fprintf(stderr, "Binary: format %d\n", (int)kFormatDecodePriority[i]);
453 }
448 } 454 }
449 455
450 CertificateList results; 456 CertificateList results;
451 // No certificates parsed. 457 // No certificates parsed.
452 if (certificates.empty()) 458 if (certificates.empty())
453 return results; 459 return results;
454 460
455 for (OSCertHandles::iterator it = certificates.begin(); 461 for (OSCertHandles::iterator it = certificates.begin();
456 it != certificates.end(); ++it) { 462 it != certificates.end(); ++it) {
457 X509Certificate* result = CreateFromHandle(*it, OSCertHandles()); 463 X509Certificate* result = CreateFromHandle(*it, OSCertHandles());
458 results.push_back(scoped_refptr<X509Certificate>(result)); 464 results.push_back(scoped_refptr<X509Certificate>(result));
459 FreeOSCertHandle(*it); 465 FreeOSCertHandle(*it);
466 fprintf(stderr, "Certificate: %s issued by %s\n",
467 result->subject().common_name.c_str(),
468 result->issuer().common_name.c_str());
460 } 469 }
461 470
462 return results; 471 return results;
463 } 472 }
464 473
465 void X509Certificate::Persist(Pickle* pickle) { 474 void X509Certificate::Persist(Pickle* pickle) {
466 DCHECK(cert_handle_); 475 DCHECK(cert_handle_);
467 // This would be an absolutely insane number of intermediates. 476 // This would be an absolutely insane number of intermediates.
468 if (intermediate_ca_certs_.size() > static_cast<size_t>(INT_MAX) - 1) { 477 if (intermediate_ca_certs_.size() > static_cast<size_t>(INT_MAX) - 1) {
469 NOTREACHED(); 478 NOTREACHED();
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 RemoveFromCache(cert_handle_); 701 RemoveFromCache(cert_handle_);
693 FreeOSCertHandle(cert_handle_); 702 FreeOSCertHandle(cert_handle_);
694 } 703 }
695 for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) { 704 for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
696 RemoveFromCache(intermediate_ca_certs_[i]); 705 RemoveFromCache(intermediate_ca_certs_[i]);
697 FreeOSCertHandle(intermediate_ca_certs_[i]); 706 FreeOSCertHandle(intermediate_ca_certs_[i]);
698 } 707 }
699 } 708 }
700 709
701 } // namespace net 710 } // namespace net
OLDNEW
« no previous file with comments | « net/base/cert_database_nss.cc ('k') | net/third_party/mozilla_security_manager/nsKeygenHandler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698