15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/ssl_status_serialization.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/pickle.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
12a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)std::string SerializeSecurityInfo(
13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int cert_id,
14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    net::CertStatus cert_status,
15a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int security_bits,
16a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int ssl_connection_status,
17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const SignedCertificateTimestampIDStatusList&
18a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        signed_certificate_timestamp_ids) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle.WriteInt(cert_id);
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle.WriteUInt32(cert_status);
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle.WriteInt(security_bits);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pickle.WriteInt(ssl_connection_status);
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  pickle.WriteInt(signed_certificate_timestamp_ids.size());
25a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  for (SignedCertificateTimestampIDStatusList::const_iterator iter =
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           signed_certificate_timestamp_ids.begin();
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)       iter != signed_certificate_timestamp_ids.end(); ++iter) {
28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pickle.WriteInt(iter->id);
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    pickle.WriteUInt16(iter->status);
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string(static_cast<const char*>(pickle.data()), pickle.size());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
34a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)bool DeserializeSecurityInfo(
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const std::string& state,
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int* cert_id,
37a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    net::CertStatus* cert_status,
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int* security_bits,
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    int* ssl_connection_status,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SignedCertificateTimestampIDStatusList* signed_certificate_timestamp_ids) {
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(cert_id && cert_status && security_bits && ssl_connection_status &&
42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)         signed_certificate_timestamp_ids);
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (state.empty()) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No SSL used.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *cert_id = 0;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The following are not applicable and are set to the default values.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *cert_status = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *security_bits = -1;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *ssl_connection_status = 0;
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    signed_certificate_timestamp_ids->clear();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Pickle pickle(state.data(), static_cast<int>(state.size()));
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PickleIterator iter(pickle);
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  int num_scts_to_read;
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!pickle.ReadInt(&iter, cert_id) ||
58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !pickle.ReadUInt32(&iter, cert_status) ||
59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !pickle.ReadInt(&iter, security_bits) ||
60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !pickle.ReadInt(&iter, ssl_connection_status) ||
61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      !pickle.ReadInt(&iter, &num_scts_to_read))
62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return false;
63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  for (; num_scts_to_read > 0; --num_scts_to_read) {
65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    int id;
66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    uint16 status;
67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    if (!pickle.ReadInt(&iter, &id) ||
68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        !pickle.ReadUInt16(&iter, &status))
69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      return false;
70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    signed_certificate_timestamp_ids->push_back(
71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        SignedCertificateTimestampIDAndStatus(
72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            id,
73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch            static_cast<net::ct::SCTVerifyStatus>(status)));
74a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return true;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
80