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