Skip to content

Commit

Permalink
Add boot attributes methods in CryptohomeClient.
Browse files Browse the repository at this point in the history
    
BUG=chromium:353050
TEST=manually ran affected unit_tests and browser_tests.

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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@281387 0039d316-1c4b-4281-b951-d872f2087c98
  • Loading branch information
davidyu@chromium.org committed Jul 4, 2014
1 parent 2fd98ed commit 028ee6f
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 15 deletions.
48 changes: 48 additions & 0 deletions chromeos/dbus/cryptohome_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -800,6 +800,54 @@ class CryptohomeClientImpl : public CryptohomeClient {
callback));
}

virtual void GetBootAttribute(
const cryptohome::GetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE {
const char* method_name = cryptohome::kCryptohomeGetBootAttribute;
dbus::MethodCall method_call(cryptohome::kCryptohomeInterface, method_name);

dbus::MessageWriter writer(&method_call);
writer.AppendProtoAsArrayOfBytes(request);

proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::Bind(&CryptohomeClientImpl::OnBaseReplyMethod,
weak_ptr_factory_.GetWeakPtr(),
callback));
}

virtual void SetBootAttribute(
const cryptohome::SetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE {
const char* method_name = cryptohome::kCryptohomeSetBootAttribute;
dbus::MethodCall method_call(cryptohome::kCryptohomeInterface, method_name);

dbus::MessageWriter writer(&method_call);
writer.AppendProtoAsArrayOfBytes(request);

proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::Bind(&CryptohomeClientImpl::OnBaseReplyMethod,
weak_ptr_factory_.GetWeakPtr(),
callback));
}

virtual void FlushAndSignBootAttributes(
const cryptohome::FlushAndSignBootAttributesRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE {
const char* method_name = cryptohome::kCryptohomeFlushAndSignBootAttributes;
dbus::MethodCall method_call(cryptohome::kCryptohomeInterface, method_name);

dbus::MessageWriter writer(&method_call);
writer.AppendProtoAsArrayOfBytes(request);

proxy_->CallMethod(&method_call,
dbus::ObjectProxy::TIMEOUT_USE_DEFAULT,
base::Bind(&CryptohomeClientImpl::OnBaseReplyMethod,
weak_ptr_factory_.GetWeakPtr(),
callback));
}

protected:
virtual void Init(dbus::Bus* bus) OVERRIDE {
proxy_ = bus->GetObjectProxy(
Expand Down
29 changes: 28 additions & 1 deletion chromeos/dbus/cryptohome_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,12 @@ class AddKeyRequest;
class AuthorizationRequest;
class BaseReply;
class CheckKeyRequest;
class FlushAndSignBootAttributesRequest;
class GetBootAttributeRequest;
class MountRequest;
class UpdateKeyRequest;
class RemoveKeyRequest;
class SetBootAttributeRequest;
class UpdateKeyRequest;

} // namespace cryptohome

Expand Down Expand Up @@ -499,6 +502,30 @@ class CHROMEOS_EXPORT CryptohomeClient : public DBusClient {
const cryptohome::RemoveKeyRequest& request,
const ProtobufMethodCallback& callback) = 0;

// Asynchronously calls GetBootAttribute method. |callback| is called after
// method call, and with reply protobuf.
// GetBootAttribute gets the value of the specified boot attribute.
virtual void GetBootAttribute(
const cryptohome::GetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) = 0;

// Asynchronously calls SetBootAttribute method. |callback| is called after
// method call, and with reply protobuf.
// SetBootAttribute sets the value of the specified boot attribute. The value
// won't be available unitl FlushAndSignBootAttributes() is called.
virtual void SetBootAttribute(
const cryptohome::SetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) = 0;

// Asynchronously calls FlushAndSignBootAttributes method. |callback| is
// called after method call, and with reply protobuf.
// FlushAndSignBootAttributes makes all pending boot attribute settings
// available, and have them signed by a special TPM key. This method always
// fails after any user, publuc, or guest session starts.
virtual void FlushAndSignBootAttributes(
const cryptohome::FlushAndSignBootAttributesRequest& request,
const ProtobufMethodCallback& callback) = 0;

protected:
// Create() should be used instead.
CryptohomeClient();
Expand Down
49 changes: 38 additions & 11 deletions chromeos/dbus/fake_cryptohome_client.cc
Original file line number Diff line number Diff line change
Expand Up @@ -472,39 +472,71 @@ void FakeCryptohomeClient::CheckKeyEx(
const cryptohome::AuthorizationRequest& auth,
const cryptohome::CheckKeyRequest& request,
const ProtobufMethodCallback& callback) {
ReturnProtobufMethodCallback(id.email(), callback);
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::MountEx(
const cryptohome::AccountIdentifier& id,
const cryptohome::AuthorizationRequest& auth,
const cryptohome::MountRequest& request,
const ProtobufMethodCallback& callback) {
ReturnProtobufMethodCallback(id.email(), callback);
cryptohome::BaseReply reply;
cryptohome::MountReply* mount =
reply.MutableExtension(cryptohome::MountReply::reply);
mount->set_sanitized_username(GetStubSanitizedUsername(id.email()));
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::AddKeyEx(
const cryptohome::AccountIdentifier& id,
const cryptohome::AuthorizationRequest& auth,
const cryptohome::AddKeyRequest& request,
const ProtobufMethodCallback& callback) {
ReturnProtobufMethodCallback(id.email(), callback);
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::RemoveKeyEx(
const cryptohome::AccountIdentifier& id,
const cryptohome::AuthorizationRequest& auth,
const cryptohome::RemoveKeyRequest& request,
const ProtobufMethodCallback& callback) {
ReturnProtobufMethodCallback(id.email(), callback);
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::UpdateKeyEx(
const cryptohome::AccountIdentifier& id,
const cryptohome::AuthorizationRequest& auth,
const cryptohome::UpdateKeyRequest& request,
const ProtobufMethodCallback& callback) {
ReturnProtobufMethodCallback(id.email(), callback);
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::GetBootAttribute(
const cryptohome::GetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) {
cryptohome::BaseReply reply;
cryptohome::GetBootAttributeReply* attr_reply =
reply.MutableExtension(cryptohome::GetBootAttributeReply::reply);
attr_reply->set_value("");
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::SetBootAttribute(
const cryptohome::SetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) {
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::FlushAndSignBootAttributes(
const cryptohome::FlushAndSignBootAttributesRequest& request,
const ProtobufMethodCallback& callback) {
cryptohome::BaseReply reply;
ReturnProtobufMethodCallback(reply, callback);
}

void FakeCryptohomeClient::SetServiceIsAvailable(bool is_available) {
Expand All @@ -525,13 +557,8 @@ std::vector<uint8> FakeCryptohomeClient::GetStubSystemSalt() {
}

void FakeCryptohomeClient::ReturnProtobufMethodCallback(
const std::string& userid,
const cryptohome::BaseReply& reply,
const ProtobufMethodCallback& callback) {
cryptohome::BaseReply reply;
reply.set_error(cryptohome::CRYPTOHOME_ERROR_NOT_SET);
cryptohome::MountReply* mount =
reply.MutableExtension(cryptohome::MountReply::reply);
mount->set_sanitized_username(GetStubSanitizedUsername(userid));
base::MessageLoop::current()->PostTask(
FROM_HERE,
base::Bind(callback,
Expand Down
16 changes: 13 additions & 3 deletions chromeos/dbus/fake_cryptohome_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,15 @@ class CHROMEOS_EXPORT FakeCryptohomeClient : public CryptohomeClient {
const cryptohome::AuthorizationRequest& auth,
const cryptohome::RemoveKeyRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE;
virtual void GetBootAttribute(
const cryptohome::GetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE;
virtual void SetBootAttribute(
const cryptohome::SetBootAttributeRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE;
virtual void FlushAndSignBootAttributes(
const cryptohome::FlushAndSignBootAttributesRequest& request,
const ProtobufMethodCallback& callback) OVERRIDE;

// Changes the behavior of WaitForServiceToBeAvailable(). This method runs
// pending callbacks if is_available is true.
Expand All @@ -206,6 +215,10 @@ class CHROMEOS_EXPORT FakeCryptohomeClient : public CryptohomeClient {
static std::vector<uint8> GetStubSystemSalt();

private:
void ReturnProtobufMethodCallback(
const cryptohome::BaseReply& reply,
const ProtobufMethodCallback& callback);

// Posts tasks which return fake results to the UI thread.
void ReturnAsyncMethodResult(const AsyncMethodCallback& callback,
bool returns_data);
Expand All @@ -214,9 +227,6 @@ class CHROMEOS_EXPORT FakeCryptohomeClient : public CryptohomeClient {
void ReturnAsyncMethodResultInternal(const AsyncMethodCallback& callback,
bool returns_data);

void ReturnProtobufMethodCallback(const std::string& user_id,
const ProtobufMethodCallback& callback);

bool service_is_available_;
int async_call_id_;
AsyncCallStatusHandler async_call_status_handler_;
Expand Down
10 changes: 10 additions & 0 deletions chromeos/dbus/mock_cryptohome_client.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,16 @@ class MockCryptohomeClient : public CryptohomeClient {
const cryptohome::AuthorizationRequest& auth,
const cryptohome::RemoveKeyRequest& request,
const ProtobufMethodCallback& callback));
MOCK_METHOD2(GetBootAttribute,
void(const cryptohome::GetBootAttributeRequest& request,
const ProtobufMethodCallback& callback));
MOCK_METHOD2(SetBootAttribute,
void(const cryptohome::SetBootAttributeRequest& request,
const ProtobufMethodCallback& callback));
MOCK_METHOD2(
FlushAndSignBootAttributes,
void(const cryptohome::FlushAndSignBootAttributesRequest& request,
const ProtobufMethodCallback& callback));
};

} // namespace chromeos
Expand Down

0 comments on commit 028ee6f

Please sign in to comment.