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