Home | History | Annotate | Download | only in common
      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
      3 // found in the LICENSE file.
      4 
      5 #include "content/common/ssl_status_serialization.h"
      6 
      7 #include "base/logging.h"
      8 #include "base/pickle.h"
      9 
     10 namespace content {
     11 
     12 std::string SerializeSecurityInfo(
     13     int cert_id,
     14     net::CertStatus cert_status,
     15     int security_bits,
     16     int ssl_connection_status,
     17     const SignedCertificateTimestampIDStatusList&
     18         signed_certificate_timestamp_ids) {
     19   Pickle pickle;
     20   pickle.WriteInt(cert_id);
     21   pickle.WriteUInt32(cert_status);
     22   pickle.WriteInt(security_bits);
     23   pickle.WriteInt(ssl_connection_status);
     24   pickle.WriteInt(signed_certificate_timestamp_ids.size());
     25   for (SignedCertificateTimestampIDStatusList::const_iterator iter =
     26            signed_certificate_timestamp_ids.begin();
     27        iter != signed_certificate_timestamp_ids.end(); ++iter) {
     28     pickle.WriteInt(iter->id);
     29     pickle.WriteUInt16(iter->status);
     30   }
     31   return std::string(static_cast<const char*>(pickle.data()), pickle.size());
     32 }
     33 
     34 bool DeserializeSecurityInfo(
     35     const std::string& state,
     36     int* cert_id,
     37     net::CertStatus* cert_status,
     38     int* security_bits,
     39     int* ssl_connection_status,
     40     SignedCertificateTimestampIDStatusList* signed_certificate_timestamp_ids) {
     41   DCHECK(cert_id && cert_status && security_bits && ssl_connection_status &&
     42          signed_certificate_timestamp_ids);
     43   if (state.empty()) {
     44     // No SSL used.
     45     *cert_id = 0;
     46     // The following are not applicable and are set to the default values.
     47     *cert_status = 0;
     48     *security_bits = -1;
     49     *ssl_connection_status = 0;
     50     signed_certificate_timestamp_ids->clear();
     51     return false;
     52   }
     53 
     54   Pickle pickle(state.data(), static_cast<int>(state.size()));
     55   PickleIterator iter(pickle);
     56   int num_scts_to_read;
     57   if (!pickle.ReadInt(&iter, cert_id) ||
     58       !pickle.ReadUInt32(&iter, cert_status) ||
     59       !pickle.ReadInt(&iter, security_bits) ||
     60       !pickle.ReadInt(&iter, ssl_connection_status) ||
     61       !pickle.ReadInt(&iter, &num_scts_to_read))
     62     return false;
     63 
     64   for (; num_scts_to_read > 0; --num_scts_to_read) {
     65     int id;
     66     uint16 status;
     67     if (!pickle.ReadInt(&iter, &id) ||
     68         !pickle.ReadUInt16(&iter, &status))
     69       return false;
     70     signed_certificate_timestamp_ids->push_back(
     71         SignedCertificateTimestampIDAndStatus(
     72             id,
     73             static_cast<net::ct::SCTVerifyStatus>(status)));
     74   }
     75 
     76   return true;
     77 }
     78 
     79 }  // namespace content
     80