Commit 9ab96483 authored by xhwang's avatar xhwang Committed by Commit bot

Add Platform Verification Mojo Services.

Render frames can use this service to verify platform on ChromeOS.

BUG=479836

Review URL: https://codereview.chromium.org/1053773007

Cr-Commit-Position: refs/heads/master@{#329247}
parent 78d41b5d
...@@ -120,6 +120,7 @@ ...@@ -120,6 +120,7 @@
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/child_process_host.h" #include "content/public/common/child_process_host.h"
#include "content/public/common/content_descriptors.h" #include "content/public/common/content_descriptors.h"
#include "content/public/common/service_registry.h"
#include "content/public/common/url_utils.h" #include "content/public/common/url_utils.h"
#include "content/public/common/web_preferences.h" #include "content/public/common/web_preferences.h"
#include "gin/v8_initializer.h" #include "gin/v8_initializer.h"
...@@ -141,6 +142,7 @@ ...@@ -141,6 +142,7 @@
#include "chrome/browser/chrome_browser_main_mac.h" #include "chrome/browser/chrome_browser_main_mac.h"
#include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h" #include "chrome/browser/spellchecker/spellcheck_message_filter_mac.h"
#elif defined(OS_CHROMEOS) #elif defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/attestation/platform_verification_impl.h"
#include "chrome/browser/chromeos/chrome_browser_main_chromeos.h" #include "chrome/browser/chromeos/chrome_browser_main_chromeos.h"
#include "chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h" #include "chrome/browser/chromeos/drive/fileapi/file_system_backend_delegate.h"
#include "chrome/browser/chromeos/file_manager/app_id.h" #include "chrome/browser/chromeos/file_manager/app_id.h"
...@@ -2330,6 +2332,16 @@ void ChromeContentBrowserClient::PreSpawnRenderer( ...@@ -2330,6 +2332,16 @@ void ChromeContentBrowserClient::PreSpawnRenderer(
} }
#endif #endif
void ChromeContentBrowserClient::OverrideRenderFrameMojoServices(
content::ServiceRegistry* registry,
content::RenderFrameHost* render_frame_host) {
#if defined(OS_CHROMEOS)
registry->AddService(
base::Bind(&chromeos::attestation::PlatformVerificationImpl::Create,
render_frame_host));
#endif
}
void ChromeContentBrowserClient::OpenURL( void ChromeContentBrowserClient::OpenURL(
content::BrowserContext* browser_context, content::BrowserContext* browser_context,
const content::OpenURLParams& params, const content::OpenURLParams& params,
......
...@@ -249,7 +249,9 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { ...@@ -249,7 +249,9 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient {
const wchar_t* GetResourceDllName() override; const wchar_t* GetResourceDllName() override;
void PreSpawnRenderer(sandbox::TargetPolicy* policy, bool* success) override; void PreSpawnRenderer(sandbox::TargetPolicy* policy, bool* success) override;
#endif #endif
void OverrideRenderFrameMojoServices(
content::ServiceRegistry* registry,
content::RenderFrameHost* render_frame_host) override;
void OpenURL(content::BrowserContext* browser_context, void OpenURL(content::BrowserContext* browser_context,
const content::OpenURLParams& params, const content::OpenURLParams& params,
const base::Callback<void(content::WebContents*)>& callback) const base::Callback<void(content::WebContents*)>& callback)
......
...@@ -79,6 +79,7 @@ source_set("chromeos") { ...@@ -79,6 +79,7 @@ source_set("chromeos") {
"//device/bluetooth", "//device/bluetooth",
"//device/hid", "//device/hid",
"//media", "//media",
"//media/mojo/interfaces",
"//net", "//net",
"//ppapi/proxy:ipc", # For PpapiMsg_LoadPlugin "//ppapi/proxy:ipc", # For PpapiMsg_LoadPlugin
......
...@@ -9,6 +9,7 @@ include_rules = [ ...@@ -9,6 +9,7 @@ include_rules = [
"+device/bluetooth", "+device/bluetooth",
"+media/audio/sounds", # For system sounds "+media/audio/sounds", # For system sounds
"+media/base/media_switches.h", # For media command line switches. "+media/base/media_switches.h", # For media command line switches.
"+media/mojo/interfaces", # For platform verification mojom interface.
"+ui/ozone/public", "+ui/ozone/public",
# Other libraries. # Other libraries.
......
// Copyright 2015 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 "chrome/browser/chromeos/attestation/platform_verification_impl.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/web_contents.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h"
namespace chromeos {
namespace attestation {
// static
void PlatformVerificationImpl::Create(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<media::interfaces::PlatformVerification> request) {
DVLOG(2) << __FUNCTION__;
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
DCHECK(render_frame_host);
// The created object is bound to (and owned by) the pipe.
mojo::BindToRequest(new PlatformVerificationImpl(render_frame_host),
&request);
}
PlatformVerificationImpl::PlatformVerificationImpl(
content::RenderFrameHost* render_frame_host)
: render_frame_host_(render_frame_host), weak_factory_(this) {
DCHECK(render_frame_host);
}
PlatformVerificationImpl::~PlatformVerificationImpl() {
}
void PlatformVerificationImpl::ChallengePlatform(
const mojo::String& service_id,
const mojo::String& challenge,
const ChallengePlatformCallback& callback) {
DVLOG(2) << __FUNCTION__;
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
if (!platform_verification_flow_.get())
platform_verification_flow_ = new PlatformVerificationFlow();
platform_verification_flow_->ChallengePlatformKey(
content::WebContents::FromRenderFrameHost(render_frame_host_), service_id,
challenge, base::Bind(&PlatformVerificationImpl::OnPlatformChallenged,
weak_factory_.GetWeakPtr(), callback));
}
void PlatformVerificationImpl::OnPlatformChallenged(
const ChallengePlatformCallback& callback,
Result result,
const std::string& signed_data,
const std::string& signature,
const std::string& platform_key_certificate) {
DVLOG(2) << __FUNCTION__ << ": " << result;
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
if (result != PlatformVerificationFlow::SUCCESS) {
DCHECK(signed_data.empty());
DCHECK(signature.empty());
DCHECK(platform_key_certificate.empty());
LOG(ERROR) << "Platform verification failed.";
callback.Run(false, "", "", "");
return;
}
DCHECK(!signed_data.empty());
DCHECK(!signature.empty());
DCHECK(!platform_key_certificate.empty());
callback.Run(true, signed_data, signature, platform_key_certificate);
}
} // namespace attestation
} // namespace chromeos
// Copyright 2015 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.
#ifndef CHROME_BROWSER_CHROMEOS_ATTESTATION_PLATFORM_VERIFICATION_IMPL_H_
#define CHROME_BROWSER_CHROMEOS_ATTESTATION_PLATFORM_VERIFICATION_IMPL_H_
#include <string>
#include "base/basictypes.h"
#include "base/callback.h"
#include "base/memory/ref_counted.h"
#include "chrome/browser/chromeos/attestation/platform_verification_flow.h"
#include "content/public/browser/render_frame_host.h"
#include "media/mojo/interfaces/platform_verification.mojom.h"
#include "third_party/mojo/src/mojo/public/cpp/bindings/interface_impl.h"
namespace chromeos {
namespace attestation {
// Implements media::interfaces::PlatformVerification on ChromeOS using
// PlatformVerificationFlow. Can only be used on the UI thread because
// PlatformVerificationFlow lives on the UI thread.
class PlatformVerificationImpl
: public mojo::InterfaceImpl<media::interfaces::PlatformVerification> {
public:
static void Create(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<media::interfaces::PlatformVerification> request);
explicit PlatformVerificationImpl(
content::RenderFrameHost* render_frame_host);
~PlatformVerificationImpl() override;
// mojo::InterfaceImpl<PlatformVerification> implementation.
void ChallengePlatform(const mojo::String& service_id,
const mojo::String& challenge,
const ChallengePlatformCallback& callback) override;
private:
using Result = PlatformVerificationFlow::Result;
void OnPlatformChallenged(const ChallengePlatformCallback& callback,
Result result,
const std::string& signed_data,
const std::string& signature,
const std::string& platform_key_certificate);
content::RenderFrameHost* const render_frame_host_;
scoped_refptr<PlatformVerificationFlow> platform_verification_flow_;
base::WeakPtrFactory<PlatformVerificationImpl> weak_factory_;
};
} // namespace attestation
} // namespace chromeos
#endif // CHROME_BROWSER_CHROMEOS_ATTESTATION_PLATFORM_VERIFICATION_IMPL_H_
...@@ -3146,6 +3146,7 @@ ...@@ -3146,6 +3146,7 @@
'../components/components.gyp:web_resource', '../components/components.gyp:web_resource',
'../content/app/resources/content_resources.gyp:content_resources', '../content/app/resources/content_resources.gyp:content_resources',
'../media/media.gyp:media', '../media/media.gyp:media',
'../media/mojo/interfaces/mojo_bindings.gyp:platform_verification_api',
'../mojo/mojo_base.gyp:mojo_common_lib', '../mojo/mojo_base.gyp:mojo_common_lib',
'../mojo/mojo_base.gyp:mojo_environment_chromium', '../mojo/mojo_base.gyp:mojo_environment_chromium',
'../net/net.gyp:net_extras', '../net/net.gyp:net_extras',
......
...@@ -53,6 +53,8 @@ ...@@ -53,6 +53,8 @@
'browser/chromeos/attestation/platform_verification_dialog.h', 'browser/chromeos/attestation/platform_verification_dialog.h',
'browser/chromeos/attestation/platform_verification_flow.cc', 'browser/chromeos/attestation/platform_verification_flow.cc',
'browser/chromeos/attestation/platform_verification_flow.h', 'browser/chromeos/attestation/platform_verification_flow.h',
'browser/chromeos/attestation/platform_verification_impl.cc',
'browser/chromeos/attestation/platform_verification_impl.h',
'browser/chromeos/background/ash_user_wallpaper_delegate.cc', 'browser/chromeos/background/ash_user_wallpaper_delegate.cc',
'browser/chromeos/background/ash_user_wallpaper_delegate.h', 'browser/chromeos/background/ash_user_wallpaper_delegate.h',
'browser/chromeos/base/locale_util.cc', 'browser/chromeos/base/locale_util.cc',
...@@ -1038,57 +1040,56 @@ ...@@ -1038,57 +1040,56 @@
], ],
# These files lists are shared with the GN build. # These files lists are shared with the GN build.
'browser_chromeos_extension_sources': [ 'browser_chromeos_extension_sources': [
# Only extension API implementations should go here. # Only extension API implementations should go here.
'browser/chromeos/extensions/echo_private_api.cc', 'browser/chromeos/extensions/echo_private_api.cc',
'browser/chromeos/extensions/echo_private_api.h', 'browser/chromeos/extensions/echo_private_api.h',
'browser/chromeos/extensions/file_manager/device_event_router.cc', 'browser/chromeos/extensions/file_manager/device_event_router.cc',
'browser/chromeos/extensions/file_manager/device_event_router.h', 'browser/chromeos/extensions/file_manager/device_event_router.h',
'browser/chromeos/extensions/file_manager/event_router.cc', 'browser/chromeos/extensions/file_manager/event_router.cc',
'browser/chromeos/extensions/file_manager/event_router.h', 'browser/chromeos/extensions/file_manager/event_router.h',
'browser/chromeos/extensions/file_manager/event_router_factory.cc', 'browser/chromeos/extensions/file_manager/event_router_factory.cc',
'browser/chromeos/extensions/file_manager/event_router_factory.h', 'browser/chromeos/extensions/file_manager/event_router_factory.h',
'browser/chromeos/extensions/file_manager/file_browser_handler_api.cc', 'browser/chromeos/extensions/file_manager/file_browser_handler_api.cc',
'browser/chromeos/extensions/file_manager/file_browser_handler_api.h', 'browser/chromeos/extensions/file_manager/file_browser_handler_api.h',
'browser/chromeos/extensions/file_manager/file_manager_private_api_functions.h', 'browser/chromeos/extensions/file_manager/file_manager_private_api_functions.h',
'browser/chromeos/extensions/file_manager/job_event_router.cc', 'browser/chromeos/extensions/file_manager/job_event_router.cc',
'browser/chromeos/extensions/file_manager/job_event_router.h', 'browser/chromeos/extensions/file_manager/job_event_router.h',
'browser/chromeos/extensions/file_manager/private_api_base.cc', 'browser/chromeos/extensions/file_manager/private_api_base.cc',
'browser/chromeos/extensions/file_manager/private_api_base.h', 'browser/chromeos/extensions/file_manager/private_api_base.h',
'browser/chromeos/extensions/file_manager/private_api_dialog.cc', 'browser/chromeos/extensions/file_manager/private_api_dialog.cc',
'browser/chromeos/extensions/file_manager/private_api_dialog.h', 'browser/chromeos/extensions/file_manager/private_api_dialog.h',
'browser/chromeos/extensions/file_manager/private_api_drive.cc', 'browser/chromeos/extensions/file_manager/private_api_drive.cc',
'browser/chromeos/extensions/file_manager/private_api_drive.h', 'browser/chromeos/extensions/file_manager/private_api_drive.h',
'browser/chromeos/extensions/file_manager/private_api_file_system.cc', 'browser/chromeos/extensions/file_manager/private_api_file_system.cc',
'browser/chromeos/extensions/file_manager/private_api_file_system.h', 'browser/chromeos/extensions/file_manager/private_api_file_system.h',
'browser/chromeos/extensions/file_manager/private_api_misc.cc', 'browser/chromeos/extensions/file_manager/private_api_misc.cc',
'browser/chromeos/extensions/file_manager/private_api_misc.h', 'browser/chromeos/extensions/file_manager/private_api_misc.h',
'browser/chromeos/extensions/file_manager/private_api_mount.cc', 'browser/chromeos/extensions/file_manager/private_api_mount.cc',
'browser/chromeos/extensions/file_manager/private_api_mount.h', 'browser/chromeos/extensions/file_manager/private_api_mount.h',
'browser/chromeos/extensions/file_manager/private_api_strings.cc', 'browser/chromeos/extensions/file_manager/private_api_strings.cc',
'browser/chromeos/extensions/file_manager/private_api_strings.h', 'browser/chromeos/extensions/file_manager/private_api_strings.h',
'browser/chromeos/extensions/file_manager/private_api_tasks.cc', 'browser/chromeos/extensions/file_manager/private_api_tasks.cc',
'browser/chromeos/extensions/file_manager/private_api_tasks.h', 'browser/chromeos/extensions/file_manager/private_api_tasks.h',
'browser/chromeos/extensions/file_manager/private_api_util.cc', 'browser/chromeos/extensions/file_manager/private_api_util.cc',
'browser/chromeos/extensions/file_manager/private_api_util.h', 'browser/chromeos/extensions/file_manager/private_api_util.h',
'browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc', 'browser/chromeos/extensions/file_system_provider/file_system_provider_api.cc',
'browser/chromeos/extensions/file_system_provider/file_system_provider_api.h', 'browser/chromeos/extensions/file_system_provider/file_system_provider_api.h',
'browser/chromeos/extensions/file_system_provider/provider_function.cc', 'browser/chromeos/extensions/file_system_provider/provider_function.cc',
'browser/chromeos/extensions/file_system_provider/provider_function.h', 'browser/chromeos/extensions/file_system_provider/provider_function.h',
'browser/chromeos/extensions/first_run_private_api.cc', 'browser/chromeos/extensions/first_run_private_api.cc',
'browser/chromeos/extensions/first_run_private_api.h', 'browser/chromeos/extensions/first_run_private_api.h',
'browser/chromeos/extensions/input_method_api.cc', 'browser/chromeos/extensions/input_method_api.cc',
'browser/chromeos/extensions/input_method_api.h', 'browser/chromeos/extensions/input_method_api.h',
'browser/chromeos/extensions/media_player_api.cc', 'browser/chromeos/extensions/media_player_api.cc',
'browser/chromeos/extensions/media_player_api.h', 'browser/chromeos/extensions/media_player_api.h',
'browser/chromeos/extensions/wallpaper_api.cc', 'browser/chromeos/extensions/wallpaper_api.cc',
'browser/chromeos/extensions/wallpaper_api.h', 'browser/chromeos/extensions/wallpaper_api.h',
'browser/chromeos/extensions/wallpaper_function_base.cc', 'browser/chromeos/extensions/wallpaper_function_base.cc',
'browser/chromeos/extensions/wallpaper_function_base.h', 'browser/chromeos/extensions/wallpaper_function_base.h',
'browser/chromeos/extensions/wallpaper_manager_util.cc', 'browser/chromeos/extensions/wallpaper_manager_util.cc',
'browser/chromeos/extensions/wallpaper_manager_util.h', 'browser/chromeos/extensions/wallpaper_manager_util.h',
'browser/chromeos/extensions/wallpaper_private_api.cc', 'browser/chromeos/extensions/wallpaper_private_api.cc',
'browser/chromeos/extensions/wallpaper_private_api.h', 'browser/chromeos/extensions/wallpaper_private_api.h',
], ],
}, },
'targets': [ 'targets': [
...@@ -1152,7 +1153,7 @@ ...@@ -1152,7 +1153,7 @@
'../components/components.gyp:variations_http_provider', '../components/components.gyp:variations_http_provider',
'../components/components.gyp:wallpaper', '../components/components.gyp:wallpaper',
'../components/components.gyp:webui_generator', '../components/components.gyp:webui_generator',
'../components/components.gyp:wifi_sync', '../components/components.gyp:wifi_sync',
'../components/components_strings.gyp:components_strings', '../components/components_strings.gyp:components_strings',
'../content/app/resources/content_resources.gyp:content_resources', '../content/app/resources/content_resources.gyp:content_resources',
'../content/content.gyp:content_browser', '../content/content.gyp:content_browser',
...@@ -1162,6 +1163,7 @@ ...@@ -1162,6 +1163,7 @@
'../device/bluetooth/bluetooth.gyp:device_bluetooth', '../device/bluetooth/bluetooth.gyp:device_bluetooth',
'../device/hid/hid.gyp:device_hid', '../device/hid/hid.gyp:device_hid',
'../media/media.gyp:media', '../media/media.gyp:media',
'../media/mojo/interfaces/mojo_bindings.gyp:platform_verification_api',
'../net/net.gyp:net', '../net/net.gyp:net',
'../ppapi/ppapi_internal.gyp:ppapi_ipc', # For PpapiMsg_LoadPlugin '../ppapi/ppapi_internal.gyp:ppapi_ipc', # For PpapiMsg_LoadPlugin
'../skia/skia.gyp:skia', '../skia/skia.gyp:skia',
......
...@@ -1570,6 +1570,9 @@ void RenderFrameHostImpl::RegisterMojoServices() { ...@@ -1570,6 +1570,9 @@ void RenderFrameHostImpl::RegisterMojoServices() {
GetServiceRegistry()->AddService<mojo::MediaRenderer>( GetServiceRegistry()->AddService<mojo::MediaRenderer>(
base::Bind(&CreateMediaRendererService)); base::Bind(&CreateMediaRendererService));
#endif #endif
GetContentClient()->browser()->OverrideRenderFrameMojoServices(
GetServiceRegistry(), this);
} }
void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) { void RenderFrameHostImpl::SetState(RenderFrameHostImplState rfh_state) {
......
...@@ -572,6 +572,12 @@ class CONTENT_EXPORT ContentBrowserClient { ...@@ -572,6 +572,12 @@ class CONTENT_EXPORT ContentBrowserClient {
// RenderProcessHost. // RenderProcessHost.
virtual void OverrideRenderProcessMojoServices(ServiceRegistry* registry) {} virtual void OverrideRenderProcessMojoServices(ServiceRegistry* registry) {}
// Allows to override browser Mojo services exposed through the
// RenderFrameHost.
virtual void OverrideRenderFrameMojoServices(
ServiceRegistry* registry,
RenderFrameHost* render_frame_host) {}
// Registers additional navigator.connect service factories available in a // Registers additional navigator.connect service factories available in a
// particular NavigatorConnectContext. // particular NavigatorConnectContext.
virtual void GetAdditionalNavigatorConnectServices( virtual void GetAdditionalNavigatorConnectServices(
......
...@@ -13,6 +13,10 @@ mojom("interfaces") { ...@@ -13,6 +13,10 @@ mojom("interfaces") {
"media_types.mojom", "media_types.mojom",
] ]
if (is_chromeos) {
sources += [ "platform_verification.mojom" ]
}
deps = [ deps = [
"//ui/mojo/geometry:interfaces", "//ui/mojo/geometry:interfaces",
] ]
......
# Copyright 2015 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.
{
'targets': [
{
# GN version: //media/mojo/interfaces
'target_name': 'platform_verification_mojo_bindings',
'type': 'none',
'sources': [
'platform_verification.mojom',
],
'includes': [ '../../../third_party/mojo/mojom_bindings_generator.gypi' ],
},
{
'target_name': 'platform_verification_api',
'type': 'static_library',
'dependencies': [
'platform_verification_mojo_bindings',
'../../../mojo/mojo_base.gyp:mojo_environment_chromium',
'../../../third_party/mojo/mojo_public.gyp:mojo_application_bindings',
'../../../third_party/mojo/mojo_public.gyp:mojo_cpp_bindings',
],
'sources': [
'<(SHARED_INTERMEDIATE_DIR)/media/mojo/interfaces/platform_verification.mojom.cc',
'<(SHARED_INTERMEDIATE_DIR)/media/mojo/interfaces/platform_verification.mojom.h',
],
},
],
}
// Copyright 2015 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.
// TODO(xhwang): Move this out of media if it is needed anywhere else.
module media.interfaces;
// Allows authorized services to verify that the underlying platform is trusted.
// An example of a trusted platform is a Chrome OS device in verified boot mode.
// This can be used for protected content playback.
//
// Input parameters:
// - |service_id|: the service ID for the |challenge|.
// - |challenge|: the challenge data.
//
// Output parameters:
// - |success|: whether the platform is successfully verified. If true/false the
// following 3 parameters should be non-empty/empty.
// - |signed_data|: the data signed by the platform.
// - |signed_data_signature|: the signature of the signed data block.
// - |platform_key_certificate|: the device specific certificate for the
// requested service.
interface PlatformVerification {
ChallengePlatform(string service_id, string challenge) =>
(bool success,
string? signed_data,
string? signed_data_signature,
string? platform_key_certificate);
};
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment