diff options
Diffstat (limited to 'ppapi/proxy/platform_verification_private_resource.cc')
-rw-r--r-- | ppapi/proxy/platform_verification_private_resource.cc | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/ppapi/proxy/platform_verification_private_resource.cc b/ppapi/proxy/platform_verification_private_resource.cc new file mode 100644 index 0000000..4da3ca0 --- /dev/null +++ b/ppapi/proxy/platform_verification_private_resource.cc @@ -0,0 +1,132 @@ +// 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 "ppapi/proxy/platform_verification_private_resource.h" + +#include "base/bind.h" +#include "ppapi/c/pp_errors.h" +#include "ppapi/proxy/dispatch_reply_message.h" +#include "ppapi/proxy/ppapi_messages.h" +#include "ppapi/shared_impl/ppapi_globals.h" +#include "ppapi/shared_impl/tracked_callback.h" +#include "ppapi/shared_impl/var.h" +#include "ppapi/shared_impl/var_tracker.h" + +namespace ppapi { +namespace proxy { + +PlatformVerificationPrivateResource::PlatformVerificationPrivateResource( + Connection connection, + PP_Instance instance) + : PluginResource(connection, instance) { + SendCreate(BROWSER, PpapiHostMsg_PlatformVerification_Create()); +} + +PlatformVerificationPrivateResource::~PlatformVerificationPrivateResource() {} + +thunk::PPB_PlatformVerification_API* +PlatformVerificationPrivateResource::AsPPB_PlatformVerification_API() { + return this; +} + +int32_t PlatformVerificationPrivateResource::CanChallengePlatform( + PP_Bool* can_challenge_platform, + const scoped_refptr<TrackedCallback>& callback) { + if (!can_challenge_platform) + return PP_ERROR_BADARGUMENT; + + Call<PpapiHostMsg_PlatformVerification_CanChallengePlatformReply>( + BROWSER, PpapiHostMsg_PlatformVerification_CanChallengePlatform(), + base::Bind( + &PlatformVerificationPrivateResource::OnCanChallengePlatformReply, + base::Unretained(this), can_challenge_platform, callback)); + + return PP_OK_COMPLETIONPENDING; +} + +void PlatformVerificationPrivateResource::OnCanChallengePlatformReply( + PP_Bool* can_challenge_platform, + const scoped_refptr<TrackedCallback>& callback, + const ResourceMessageReplyParams& params, + bool can_challenge_platform_response) { + if (!TrackedCallback::IsPending(callback) || + TrackedCallback::IsScheduledToRun(callback)) { + return; + } + + *can_challenge_platform = PP_FromBool(can_challenge_platform_response); + callback->Run(params.result()); +} + +int32_t PlatformVerificationPrivateResource::ChallengePlatform( + const PP_Var& service_id, + const PP_Var& challenge, + PP_Var* signed_data, + PP_Var* signed_data_signature, + PP_Var* platform_key_certificate, + const scoped_refptr<TrackedCallback>& callback) { + // Prevent null types for obvious reasons, but also ref-counted types to avoid + // leaks on challenge failures (since they're only written to on success). + if (!signed_data || !signed_data_signature || !platform_key_certificate || + VarTracker::IsVarTypeRefcounted(signed_data->type) || + VarTracker::IsVarTypeRefcounted(signed_data_signature->type) || + VarTracker::IsVarTypeRefcounted(platform_key_certificate->type)) { + return PP_ERROR_BADARGUMENT; + } + + StringVar* service_id_str = StringVar::FromPPVar(service_id); + if (!service_id_str) + return PP_ERROR_BADARGUMENT; + + scoped_refptr<ArrayBufferVar> challenge_buffer = + ArrayBufferVar::FromPPVar(challenge); + if (!challenge_buffer) + return PP_ERROR_BADARGUMENT; + + uint8_t* challenge_data = static_cast<uint8_t*>(challenge_buffer->Map()); + uint32 challenge_length = challenge_buffer->ByteLength(); + std::vector<uint8_t> challenge_vector(challenge_data, + challenge_data + challenge_length); + challenge_buffer->Unmap(); + + PpapiHostMsg_PlatformVerification_ChallengePlatform challenge_message( + service_id_str->value(), challenge_vector); + + ChallengePlatformParams output_params = { + signed_data, signed_data_signature, platform_key_certificate, callback }; + + Call<PpapiHostMsg_PlatformVerification_ChallengePlatformReply>( + BROWSER, challenge_message, base::Bind( + &PlatformVerificationPrivateResource::OnChallengePlatformReply, + base::Unretained(this), output_params)); + return PP_OK_COMPLETIONPENDING; +} + +void PlatformVerificationPrivateResource::OnChallengePlatformReply( + ChallengePlatformParams output_params, + const ResourceMessageReplyParams& params, + const std::vector<uint8_t>& raw_signed_data, + const std::vector<uint8_t>& raw_signed_data_signature, + const std::string& raw_platform_key_certificate) { + if (!TrackedCallback::IsPending(output_params.callback) || + TrackedCallback::IsScheduledToRun(output_params.callback)) { + return; + } + + if (params.result() == PP_OK) { + *(output_params.signed_data) = + (PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar( + raw_signed_data.size(), &raw_signed_data.front()))->GetPPVar(); + *(output_params.signed_data_signature) = + (PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferVar( + raw_signed_data_signature.size(), + &raw_signed_data_signature.front()))->GetPPVar(); + *(output_params.platform_key_certificate) = + (new StringVar(raw_platform_key_certificate))->GetPPVar(); + } + output_params.callback->Run(params.result()); +} + +} // namespace proxy +} // namespace ppapi |