// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "net/cert/ct_signed_certificate_timestamp_log_param.h" #include #include #include #include "base/base64.h" #include "base/strings/string_number_conversions.h" #include "base/values.h" #include "net/cert/ct_sct_to_string.h" #include "net/cert/signed_certificate_timestamp.h" #include "net/log/net_log_capture_mode.h" namespace net { namespace { // Base64 encode the given |value| string and put it in |dict| with the // description |key|. void SetBinaryData(const char* key, base::StringPiece value, base::DictionaryValue* dict) { std::string b64_value; base::Base64Encode(value, &b64_value); dict->SetString(key, b64_value); } // Returns a dictionary where each key is a field of the SCT and its value // is this field's value in the SCT. This dictionary is meant to be used for // outputting a de-serialized SCT to the NetLog. std::unique_ptr SCTToDictionary( const ct::SignedCertificateTimestamp& sct, ct::SCTVerifyStatus status) { std::unique_ptr out(new base::DictionaryValue()); out->SetString("origin", OriginToString(sct.origin)); out->SetString("verification_status", StatusToString(status)); out->SetInteger("version", sct.version); SetBinaryData("log_id", sct.log_id, out.get()); base::TimeDelta time_since_unix_epoch = sct.timestamp - base::Time::UnixEpoch(); out->SetString("timestamp", base::Int64ToString(time_since_unix_epoch.InMilliseconds())); SetBinaryData("extensions", sct.extensions, out.get()); out->SetString("hash_algorithm", HashAlgorithmToString(sct.signature.hash_algorithm)); out->SetString("signature_algorithm", SignatureAlgorithmToString(sct.signature.signature_algorithm)); SetBinaryData("signature_data", sct.signature.signature_data, out.get()); return out; } // Given a list of SCTs and their statuses, return a ListValue instance where // each item in the list is a dictionary created by SCTToDictionary. std::unique_ptr SCTListToPrintableValues( const SignedCertificateTimestampAndStatusList& sct_and_status_list) { std::unique_ptr output_scts(new base::ListValue()); for (const auto& sct_and_status : sct_and_status_list) output_scts->Append( SCTToDictionary(*(sct_and_status.sct.get()), sct_and_status.status)); return output_scts; } } // namespace std::unique_ptr NetLogSignedCertificateTimestampCallback( const SignedCertificateTimestampAndStatusList* scts, NetLogCaptureMode capture_mode) { std::unique_ptr dict(new base::DictionaryValue()); dict->Set("scts", SCTListToPrintableValues(*scts)); return std::move(dict); } std::unique_ptr NetLogRawSignedCertificateTimestampCallback( base::StringPiece embedded_scts, base::StringPiece sct_list_from_ocsp, base::StringPiece sct_list_from_tls_extension, NetLogCaptureMode capture_mode) { std::unique_ptr dict(new base::DictionaryValue()); SetBinaryData("embedded_scts", embedded_scts, dict.get()); SetBinaryData("scts_from_ocsp_response", sct_list_from_ocsp, dict.get()); SetBinaryData("scts_from_tls_extension", sct_list_from_tls_extension, dict.get()); return std::move(dict); } } // namespace net