pepper_platform_verification_message_filter.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
114e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Copyright 2013 The Chromium Authors. All rights reserved. 214e513058ed4168c94e015638d16f5f87fd8063aChris Craik// Use of this source code is governed by a BSD-style license that can be 314e513058ed4168c94e015638d16f5f87fd8063aChris Craik// found in the LICENSE file. 414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 514e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "chrome/browser/renderer_host/pepper/pepper_platform_verification_message_filter.h" 614e513058ed4168c94e015638d16f5f87fd8063aChris Craik 714e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "base/bind_helpers.h" 814e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "content/public/browser/browser_ppapi_host.h" 914e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "content/public/browser/browser_thread.h" 1014e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "content/public/browser/render_view_host.h" 1114e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "content/public/browser/web_contents.h" 1214e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "ppapi/c/pp_errors.h" 1314e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "ppapi/host/dispatch_host_message.h" 1414e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "ppapi/host/host_message_context.h" 1514e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "ppapi/host/ppapi_host.h" 1614e513058ed4168c94e015638d16f5f87fd8063aChris Craik#include "ppapi/proxy/ppapi_messages.h" 17deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craik 18deeda3d337aed1eee218b89a7aba5992ced371f0Chris Craikusing chromeos::attestation::PlatformVerificationFlow; 1914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 2014e513058ed4168c94e015638d16f5f87fd8063aChris Craiknamespace chrome { 2114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 2214e513058ed4168c94e015638d16f5f87fd8063aChris CraikPepperPlatformVerificationMessageFilter:: 23af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik PepperPlatformVerificationMessageFilter(content::BrowserPpapiHost* host, 24af4d04cab6d48ae0d6a5e79bd30f679af87abaadChris Craik PP_Instance instance) 2514e513058ed4168c94e015638d16f5f87fd8063aChris Craik : render_process_id_(0), render_view_id_(0) { 2614e513058ed4168c94e015638d16f5f87fd8063aChris Craik host->GetRenderViewIDsForInstance( 2714e513058ed4168c94e015638d16f5f87fd8063aChris Craik instance, &render_process_id_, &render_view_id_); 28058fc640017c90120c599d378a4cbc55668b05b7Chris Craik} 29058fc640017c90120c599d378a4cbc55668b05b7Chris Craik 30058fc640017c90120c599d378a4cbc55668b05b7Chris CraikPepperPlatformVerificationMessageFilter:: 31058fc640017c90120c599d378a4cbc55668b05b7Chris Craik ~PepperPlatformVerificationMessageFilter() {} 32058fc640017c90120c599d378a4cbc55668b05b7Chris Craik 33058fc640017c90120c599d378a4cbc55668b05b7Chris Craikscoped_refptr<base::TaskRunner> 34058fc640017c90120c599d378a4cbc55668b05b7Chris CraikPepperPlatformVerificationMessageFilter::OverrideTaskRunnerForMessage( 3514e513058ed4168c94e015638d16f5f87fd8063aChris Craik const IPC::Message& msg) { 3614e513058ed4168c94e015638d16f5f87fd8063aChris Craik return content::BrowserThread::GetMessageLoopProxyForThread( 3714e513058ed4168c94e015638d16f5f87fd8063aChris Craik content::BrowserThread::UI); 3869e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik} 3914e513058ed4168c94e015638d16f5f87fd8063aChris Craik 4014e513058ed4168c94e015638d16f5f87fd8063aChris Craikint32_t PepperPlatformVerificationMessageFilter::OnResourceMessageReceived( 4114e513058ed4168c94e015638d16f5f87fd8063aChris Craik const IPC::Message& msg, 4214e513058ed4168c94e015638d16f5f87fd8063aChris Craik ppapi::host::HostMessageContext* context) { 4369e5adffb19135d51bde8e458f4907d7265f3e23Chris Craik DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 4414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 4514e513058ed4168c94e015638d16f5f87fd8063aChris Craik IPC_BEGIN_MESSAGE_MAP(PepperPlatformVerificationMessageFilter, msg) 4614e513058ed4168c94e015638d16f5f87fd8063aChris Craik PPAPI_DISPATCH_HOST_RESOURCE_CALL_0( 47797b95b26bbb7557678af78b9a2a61830158920fChris Craik PpapiHostMsg_PlatformVerification_CanChallengePlatform, 4814e513058ed4168c94e015638d16f5f87fd8063aChris Craik OnCanChallengePlatform) 4914e513058ed4168c94e015638d16f5f87fd8063aChris Craik PPAPI_DISPATCH_HOST_RESOURCE_CALL( 50a64a2bef1048db5a742843f1e3bea9e80d0defc5Chris Craik PpapiHostMsg_PlatformVerification_ChallengePlatform, 51797b95b26bbb7557678af78b9a2a61830158920fChris Craik OnChallengePlatform) 52284b24358410cb0200e525a5ba36994090c83f20Chris Craik IPC_END_MESSAGE_MAP() 53284b24358410cb0200e525a5ba36994090c83f20Chris Craik 54284b24358410cb0200e525a5ba36994090c83f20Chris Craik return PP_ERROR_FAILED; 55284b24358410cb0200e525a5ba36994090c83f20Chris Craik} 56284b24358410cb0200e525a5ba36994090c83f20Chris Craik 57284b24358410cb0200e525a5ba36994090c83f20Chris Craikint32_t PepperPlatformVerificationMessageFilter::OnCanChallengePlatform( 58284b24358410cb0200e525a5ba36994090c83f20Chris Craik ppapi::host::HostMessageContext* context) { 59797b95b26bbb7557678af78b9a2a61830158920fChris Craik DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 60797b95b26bbb7557678af78b9a2a61830158920fChris Craik if (!pv_) 6114e513058ed4168c94e015638d16f5f87fd8063aChris Craik pv_.reset(new PlatformVerificationFlow()); 6214e513058ed4168c94e015638d16f5f87fd8063aChris Craik pv_->CheckPlatformState(base::Bind( 6314e513058ed4168c94e015638d16f5f87fd8063aChris Craik &PepperPlatformVerificationMessageFilter::CanChallengePlatformCallback, 6414e513058ed4168c94e015638d16f5f87fd8063aChris Craik this, 6514e513058ed4168c94e015638d16f5f87fd8063aChris Craik context->MakeReplyMessageContext())); 6614e513058ed4168c94e015638d16f5f87fd8063aChris Craik return PP_OK_COMPLETIONPENDING; 6714e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 6814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 6914e513058ed4168c94e015638d16f5f87fd8063aChris Craikint32_t PepperPlatformVerificationMessageFilter::OnChallengePlatform( 7014e513058ed4168c94e015638d16f5f87fd8063aChris Craik ppapi::host::HostMessageContext* context, 7114e513058ed4168c94e015638d16f5f87fd8063aChris Craik const std::string& service_id, 7214e513058ed4168c94e015638d16f5f87fd8063aChris Craik const std::vector<uint8_t>& challenge) { 7314e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 7414e513058ed4168c94e015638d16f5f87fd8063aChris Craik 7514e513058ed4168c94e015638d16f5f87fd8063aChris Craik // Ensure the RenderViewHost is still alive. 7614e513058ed4168c94e015638d16f5f87fd8063aChris Craik content::RenderViewHost* rvh = 7714e513058ed4168c94e015638d16f5f87fd8063aChris Craik content::RenderViewHost::FromID(render_process_id_, render_view_id_); 7814e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (!rvh) { 7914e513058ed4168c94e015638d16f5f87fd8063aChris Craik ppapi::host::ReplyMessageContext reply_context = 8014e513058ed4168c94e015638d16f5f87fd8063aChris Craik context->MakeReplyMessageContext(); 8114e513058ed4168c94e015638d16f5f87fd8063aChris Craik reply_context.params.set_result(PP_ERROR_FAILED); 8214e513058ed4168c94e015638d16f5f87fd8063aChris Craik SendReply( 8314e513058ed4168c94e015638d16f5f87fd8063aChris Craik reply_context, 8414e513058ed4168c94e015638d16f5f87fd8063aChris Craik PpapiHostMsg_PlatformVerification_ChallengePlatformReply( 8514e513058ed4168c94e015638d16f5f87fd8063aChris Craik std::vector<uint8_t>(), std::vector<uint8_t>(), std::string())); 8614e513058ed4168c94e015638d16f5f87fd8063aChris Craik return PP_OK_COMPLETIONPENDING; 8714e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 8814e513058ed4168c94e015638d16f5f87fd8063aChris Craik 8914e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (!pv_) 9014e513058ed4168c94e015638d16f5f87fd8063aChris Craik pv_.reset(new PlatformVerificationFlow()); 9114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 9214e513058ed4168c94e015638d16f5f87fd8063aChris Craik pv_->ChallengePlatformKey( 9314e513058ed4168c94e015638d16f5f87fd8063aChris Craik content::WebContents::FromRenderViewHost(rvh), 9414e513058ed4168c94e015638d16f5f87fd8063aChris Craik service_id, 9514e513058ed4168c94e015638d16f5f87fd8063aChris Craik std::string(challenge.begin(), challenge.end()), 9614e513058ed4168c94e015638d16f5f87fd8063aChris Craik base::Bind( 9714e513058ed4168c94e015638d16f5f87fd8063aChris Craik &PepperPlatformVerificationMessageFilter::ChallengePlatformCallback, 9814e513058ed4168c94e015638d16f5f87fd8063aChris Craik this, 9914e513058ed4168c94e015638d16f5f87fd8063aChris Craik context->MakeReplyMessageContext())); 10014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 10114e513058ed4168c94e015638d16f5f87fd8063aChris Craik return PP_OK_COMPLETIONPENDING; 10214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 10314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 10414e513058ed4168c94e015638d16f5f87fd8063aChris Craikvoid PepperPlatformVerificationMessageFilter::CanChallengePlatformCallback( 10514e513058ed4168c94e015638d16f5f87fd8063aChris Craik ppapi::host::ReplyMessageContext reply_context, 10614e513058ed4168c94e015638d16f5f87fd8063aChris Craik bool can_challenge_platform) { 10714e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 10814e513058ed4168c94e015638d16f5f87fd8063aChris Craik reply_context.params.set_result(PP_OK); 10914e513058ed4168c94e015638d16f5f87fd8063aChris Craik SendReply(reply_context, 11014e513058ed4168c94e015638d16f5f87fd8063aChris Craik PpapiHostMsg_PlatformVerification_CanChallengePlatformReply( 11114e513058ed4168c94e015638d16f5f87fd8063aChris Craik can_challenge_platform)); 11214e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 11314e513058ed4168c94e015638d16f5f87fd8063aChris Craik 11414e513058ed4168c94e015638d16f5f87fd8063aChris Craikvoid PepperPlatformVerificationMessageFilter::ChallengePlatformCallback( 11514e513058ed4168c94e015638d16f5f87fd8063aChris Craik ppapi::host::ReplyMessageContext reply_context, 11614e513058ed4168c94e015638d16f5f87fd8063aChris Craik chromeos::attestation::PlatformVerificationFlow::Result challenge_result, 11714e513058ed4168c94e015638d16f5f87fd8063aChris Craik const std::string& signed_data, 11814e513058ed4168c94e015638d16f5f87fd8063aChris Craik const std::string& signature, 11914e513058ed4168c94e015638d16f5f87fd8063aChris Craik const std::string& platform_key_certificate) { 12014e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)); 12114e513058ed4168c94e015638d16f5f87fd8063aChris Craik 12214e513058ed4168c94e015638d16f5f87fd8063aChris Craik if (challenge_result == PlatformVerificationFlow::SUCCESS) { 12314e513058ed4168c94e015638d16f5f87fd8063aChris Craik reply_context.params.set_result(PP_OK); 12414e513058ed4168c94e015638d16f5f87fd8063aChris Craik } else { 12514e513058ed4168c94e015638d16f5f87fd8063aChris Craik reply_context.params.set_result(PP_ERROR_FAILED); 12614e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK_EQ(signed_data.size(), 0u); 12714e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK_EQ(signature.size(), 0u); 12814e513058ed4168c94e015638d16f5f87fd8063aChris Craik DCHECK_EQ(platform_key_certificate.size(), 0u); 12914e513058ed4168c94e015638d16f5f87fd8063aChris Craik } 13014e513058ed4168c94e015638d16f5f87fd8063aChris Craik 13114e513058ed4168c94e015638d16f5f87fd8063aChris Craik SendReply(reply_context, 132139088228faa7f3c446af7387e017933998a5570Derek Sollenberger PpapiHostMsg_PlatformVerification_ChallengePlatformReply( 133139088228faa7f3c446af7387e017933998a5570Derek Sollenberger std::vector<uint8_t>(signed_data.begin(), signed_data.end()), 13414e513058ed4168c94e015638d16f5f87fd8063aChris Craik std::vector<uint8_t>(signature.begin(), signature.end()), 13514e513058ed4168c94e015638d16f5f87fd8063aChris Craik platform_key_certificate)); 13614e513058ed4168c94e015638d16f5f87fd8063aChris Craik} 13714e513058ed4168c94e015638d16f5f87fd8063aChris Craik 13814e513058ed4168c94e015638d16f5f87fd8063aChris Craik} // namespace chrome 13914e513058ed4168c94e015638d16f5f87fd8063aChris Craik