summaryrefslogtreecommitdiffstats
path: root/net/base/x509_certificate.cc
diff options
context:
space:
mode:
authorrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-29 23:38:27 +0000
committerrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-03-29 23:38:27 +0000
commit6d7d80e033e9b067aa6aea375760fb505318daa2 (patch)
tree2b96285fe85b83a2f5ca8237794787ea033ec876 /net/base/x509_certificate.cc
parentd6783d5ac2cff814dcafa21c6b5d9f97faa9db0e (diff)
downloadchromium_src-6d7d80e033e9b067aa6aea375760fb505318daa2.zip
chromium_src-6d7d80e033e9b067aa6aea375760fb505318daa2.tar.gz
chromium_src-6d7d80e033e9b067aa6aea375760fb505318daa2.tar.bz2
Cache certificates as DER on all platforms.
With the exception of Windows, every other platform was already serializing as a DER chain. Update Windows to no longer serialize in a proprietary format - use DER on all platforms. BUG=118706 TEST=existing unit tests Review URL: https://chromiumcodereview.appspot.com/9808094 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@129725 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/base/x509_certificate.cc')
-rw-r--r--net/base/x509_certificate.cc72
1 files changed, 41 insertions, 31 deletions
diff --git a/net/base/x509_certificate.cc b/net/base/x509_certificate.cc
index b30e2f8..7f1c41e 100644
--- a/net/base/x509_certificate.cc
+++ b/net/base/x509_certificate.cc
@@ -303,14 +303,33 @@ X509Certificate* X509Certificate::CreateFromBytes(const char* data,
X509Certificate* X509Certificate::CreateFromPickle(const Pickle& pickle,
PickleIterator* pickle_iter,
PickleType type) {
- OSCertHandle cert_handle = ReadOSCertHandleFromPickle(pickle, pickle_iter);
+ if (type == PICKLETYPE_CERTIFICATE_CHAIN_V3) {
+ int chain_length = 0;
+ if (!pickle_iter->ReadLength(&chain_length))
+ return NULL;
+
+ std::vector<base::StringPiece> cert_chain;
+ const char* data = NULL;
+ int data_length = 0;
+ for (int i = 0; i < chain_length; ++i) {
+ if (!pickle_iter->ReadData(&data, &data_length))
+ return NULL;
+ cert_chain.push_back(base::StringPiece(data, data_length));
+ }
+ return CreateFromDERCertChain(cert_chain);
+ }
+
+ // Legacy / Migration code. This should eventually be removed once
+ // sufficient time has passed that all pickles serialized prior to
+ // PICKLETYPE_CERTIFICATE_CHAIN_V3 have been removed.
+ OSCertHandle cert_handle = ReadOSCertHandleFromPickle(pickle_iter);
if (!cert_handle)
return NULL;
OSCertHandles intermediates;
uint32 num_intermediates = 0;
if (type != PICKLETYPE_SINGLE_CERTIFICATE) {
- if (!pickle.ReadUInt32(pickle_iter, &num_intermediates)) {
+ if (!pickle_iter->ReadUInt32(&num_intermediates)) {
FreeOSCertHandle(cert_handle);
return NULL;
}
@@ -329,30 +348,27 @@ X509Certificate* X509Certificate::CreateFromPickle(const Pickle& pickle,
// bits of zeroes. Now we always write 32 bits, so after a while, these old
// cached pickles will all get replaced.
// TODO(mdm): remove this compatibility code in April 2013 or so.
- if (type == PICKLETYPE_CERTIFICATE_CHAIN_OLD) {
- PickleIterator saved_iter = *pickle_iter;
- uint32 zero_check = 0;
- if (!pickle.ReadUInt32(pickle_iter, &zero_check)) {
- // This may not be an error. If there are no intermediates, and we're
- // reading an old 32-bit pickle, and there's nothing else after this in
- // the pickle, we should report success. Note that it is technically
- // possible for us to skip over zeroes that should have occurred after
- // an empty certificate list; to avoid this going forward, only do this
- // backward-compatibility stuff for PICKLETYPE_CERTIFICATE_CHAIN_OLD
- // which comes from the pickle version number in http_response_info.cc.
- if (num_intermediates) {
- FreeOSCertHandle(cert_handle);
- return NULL;
- }
+ PickleIterator saved_iter = *pickle_iter;
+ uint32 zero_check = 0;
+ if (!pickle_iter->ReadUInt32(&zero_check)) {
+ // This may not be an error. If there are no intermediates, and we're
+ // reading an old 32-bit pickle, and there's nothing else after this in
+ // the pickle, we should report success. Note that it is technically
+ // possible for us to skip over zeroes that should have occurred after
+ // an empty certificate list; to avoid this going forward, only do this
+ // backward-compatibility stuff for PICKLETYPE_CERTIFICATE_CHAIN_V1
+ // which comes from the pickle version number in http_response_info.cc.
+ if (num_intermediates) {
+ FreeOSCertHandle(cert_handle);
+ return NULL;
}
- if (zero_check)
- *pickle_iter = saved_iter;
}
+ if (zero_check)
+ *pickle_iter = saved_iter;
#endif // defined(OS_POSIX) && !defined(OS_MACOSX) && defined(__x86_64__)
for (uint32 i = 0; i < num_intermediates; ++i) {
- OSCertHandle intermediate = ReadOSCertHandleFromPickle(pickle,
- pickle_iter);
+ OSCertHandle intermediate = ReadOSCertHandleFromPickle(pickle_iter);
if (!intermediate)
break;
intermediates.push_back(intermediate);
@@ -448,23 +464,17 @@ CertificateList X509Certificate::CreateCertificateListFromBytes(
void X509Certificate::Persist(Pickle* pickle) {
DCHECK(cert_handle_);
- if (!WriteOSCertHandleToPickle(cert_handle_, pickle)) {
- NOTREACHED();
- return;
- }
-
// This would be an absolutely insane number of intermediates.
- if (intermediate_ca_certs_.size() >= 0xFFFFFFFF) {
+ if (intermediate_ca_certs_.size() > static_cast<size_t>(INT_MAX) - 1) {
NOTREACHED();
return;
}
-
- if (!pickle->WriteUInt32(
- static_cast<uint32>(intermediate_ca_certs_.size()))) {
+ if (!pickle->WriteInt(
+ static_cast<int>(intermediate_ca_certs_.size() + 1)) ||
+ !WriteOSCertHandleToPickle(cert_handle_, pickle)) {
NOTREACHED();
return;
}
-
for (size_t i = 0; i < intermediate_ca_certs_.size(); ++i) {
if (!WriteOSCertHandleToPickle(intermediate_ca_certs_[i], pickle)) {
NOTREACHED();