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