blob: 9bfc062c093cf06752f94a581de127cd4f2225d2 [file] [log] [blame]
// 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"
namespace chromeos {
namespace attestation {
using media::interfaces::PlatformVerification;
// static
void PlatformVerificationImpl::Create(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<PlatformVerification> request) {
DVLOG(2) << __FUNCTION__;
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::UI));
DCHECK(render_frame_host);
// The created object is strongly bound to (and owned by) the pipe.
new PlatformVerificationImpl(render_frame_host, request.Pass());
}
PlatformVerificationImpl::PlatformVerificationImpl(
content::RenderFrameHost* render_frame_host,
mojo::InterfaceRequest<PlatformVerification> request)
: binding_(this, request.Pass()),
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