Home | History | Annotate | Download | only in dbus
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROMEOS_DBUS_CRYPTOHOME_CLIENT_H_
      6 #define CHROMEOS_DBUS_CRYPTOHOME_CLIENT_H_
      7 
      8 #include <string>
      9 #include <vector>
     10 
     11 #include "base/basictypes.h"
     12 #include "base/callback.h"
     13 #include "chromeos/attestation/attestation_constants.h"
     14 #include "chromeos/chromeos_export.h"
     15 #include "chromeos/dbus/dbus_client.h"
     16 #include "chromeos/dbus/dbus_method_call_status.h"
     17 
     18 namespace cryptohome {
     19 
     20 class AccountIdentifier;
     21 class AddKeyRequest;
     22 class AuthorizationRequest;
     23 class BaseReply;
     24 class CheckKeyRequest;
     25 class MountRequest;
     26 class UpdateKeyRequest;
     27 class RemoveKeyRequest;
     28 
     29 } // namespace cryptohome
     30 
     31 namespace chromeos {
     32 
     33 // CryptohomeClient is used to communicate with the Cryptohome service.
     34 // All method should be called from the origin thread (UI thread) which
     35 // initializes the DBusThreadManager instance.
     36 class CHROMEOS_EXPORT CryptohomeClient : public DBusClient {
     37  public:
     38   // A callback to handle AsyncCallStatus signals.
     39   typedef base::Callback<void(int async_id,
     40                               bool return_status,
     41                               int return_code)>
     42       AsyncCallStatusHandler;
     43   // A callback to handle AsyncCallStatusWithData signals.
     44   typedef base::Callback<void(int async_id,
     45                               bool return_status,
     46                               const std::string& data)>
     47       AsyncCallStatusWithDataHandler;
     48   // A callback to handle responses of AsyncXXX methods.
     49   typedef base::Callback<void(int async_id)> AsyncMethodCallback;
     50   // A callback for GetSystemSalt().
     51   typedef base::Callback<void(
     52       DBusMethodCallStatus call_status,
     53       const std::vector<uint8>& system_salt)> GetSystemSaltCallback;
     54   // A callback for WaitForServiceToBeAvailable().
     55   typedef base::Callback<void(bool service_is_ready)>
     56       WaitForServiceToBeAvailableCallback;
     57   // A callback to handle responses of Pkcs11GetTpmTokenInfo method.  The result
     58   // of the D-Bus call is in |call_status|.  On success, |label| holds the
     59   // PKCS #11 token label.  This is not useful in practice to identify a token
     60   // but may be meaningful to a user.  The |user_pin| can be used with the
     61   // C_Login PKCS #11 function but is not necessary because tokens are logged in
     62   // for the duration of a signed-in session.  The |slot| corresponds to a
     63   // CK_SLOT_ID for the PKCS #11 API and reliably identifies the token for the
     64   // duration of the signed-in session.
     65   typedef base::Callback<void(
     66       DBusMethodCallStatus call_status,
     67       const std::string& label,
     68       const std::string& user_pin,
     69       int slot)> Pkcs11GetTpmTokenInfoCallback;
     70   // A callback for methods which return both a bool result and data.
     71   typedef base::Callback<void(DBusMethodCallStatus call_status,
     72                               bool result,
     73                               const std::string& data)> DataMethodCallback;
     74 
     75   // A callback for methods which return both a bool and a protobuf as reply.
     76   typedef base::Callback<
     77       void(DBusMethodCallStatus call_status,
     78            bool result,
     79            const cryptohome::BaseReply& reply)> ProtobufMethodCallback;
     80 
     81   virtual ~CryptohomeClient();
     82 
     83   // Factory function, creates a new instance and returns ownership.
     84   // For normal usage, access the singleton via DBusThreadManager::Get().
     85   static CryptohomeClient* Create();
     86 
     87   // Returns the sanitized |username| that the stub implementation would return.
     88   static std::string GetStubSanitizedUsername(const std::string& username);
     89 
     90   // Sets AsyncCallStatus signal handlers.
     91   // |handler| is called when results for AsyncXXX methods are returned.
     92   // Cryptohome service will process the calls in a first-in-first-out manner
     93   // when they are made in parallel.
     94   virtual void SetAsyncCallStatusHandlers(
     95       const AsyncCallStatusHandler& handler,
     96       const AsyncCallStatusWithDataHandler& data_handler) = 0;
     97 
     98   // Resets AsyncCallStatus signal handlers.
     99   virtual void ResetAsyncCallStatusHandlers() = 0;
    100 
    101   // Runs the callback as soon as the service becomes available.
    102   virtual void WaitForServiceToBeAvailable(
    103       const WaitForServiceToBeAvailableCallback& callback) = 0;
    104 
    105   // Calls IsMounted method and returns true when the call succeeds.
    106   virtual void IsMounted(const BoolDBusMethodCallback& callback) = 0;
    107 
    108   // Calls Unmount method and returns true when the call succeeds.
    109   // This method blocks until the call returns.
    110   virtual bool Unmount(bool* success) = 0;
    111 
    112   // Calls AsyncCheckKey method.  |callback| is called after the method call
    113   // succeeds.
    114   virtual void AsyncCheckKey(const std::string& username,
    115                              const std::string& key,
    116                              const AsyncMethodCallback& callback) = 0;
    117 
    118   // Calls AsyncMigrateKey method.  |callback| is called after the method call
    119   // succeeds.
    120   virtual void AsyncMigrateKey(const std::string& username,
    121                                const std::string& from_key,
    122                                const std::string& to_key,
    123                                const AsyncMethodCallback& callback) = 0;
    124 
    125   // Calls AsyncRemove method.  |callback| is called after the method call
    126   // succeeds.
    127   virtual void AsyncRemove(const std::string& username,
    128                            const AsyncMethodCallback& callback) = 0;
    129 
    130   // Calls GetSystemSalt method.  |callback| is called after the method call
    131   // succeeds.
    132   virtual void GetSystemSalt(const GetSystemSaltCallback& callback) = 0;
    133 
    134   // Calls GetSanitizedUsername method.  |callback| is called after the method
    135   // call succeeds.
    136   virtual void GetSanitizedUsername(
    137       const std::string& username,
    138       const StringDBusMethodCallback& callback) = 0;
    139 
    140   // Same as GetSanitizedUsername() but blocks until a reply is received, and
    141   // returns the sanitized username synchronously. Returns an empty string if
    142   // the method call fails.
    143   // This may only be called in situations where blocking the UI thread is
    144   // considered acceptable (e.g. restarting the browser after a crash or after
    145   // a flag change).
    146   virtual std::string BlockingGetSanitizedUsername(
    147       const std::string& username) = 0;
    148 
    149   // Calls the AsyncMount method to asynchronously mount the cryptohome for
    150   // |username|, using |key| to unlock it. For supported |flags|, see the
    151   // documentation of AsyncMethodCaller::AsyncMount().
    152   // |callback| is called after the method call succeeds.
    153   virtual void AsyncMount(const std::string& username,
    154                           const std::string& key,
    155                           int flags,
    156                           const AsyncMethodCallback& callback) = 0;
    157 
    158   // Calls the AsyncAddKey method to asynchronously add another |new_key| for
    159   // |username|, using |key| to unlock it first.
    160   // |callback| is called after the method call succeeds.
    161   virtual void AsyncAddKey(const std::string& username,
    162                            const std::string& key,
    163                            const std::string& new_key,
    164                            const AsyncMethodCallback& callback) = 0;
    165 
    166   // Calls AsyncMountGuest method.  |callback| is called after the method call
    167   // succeeds.
    168   virtual void AsyncMountGuest(const AsyncMethodCallback& callback) = 0;
    169 
    170   // Calls the AsyncMount method to asynchronously mount the cryptohome for
    171   // |public_mount_id|. For supported |flags|, see the documentation of
    172   // AsyncMethodCaller::AsyncMount().  |callback| is called after the method
    173   // call succeeds.
    174   virtual void AsyncMountPublic(const std::string& public_mount_id,
    175                                 int flags,
    176                                 const AsyncMethodCallback& callback) = 0;
    177 
    178   // Calls TpmIsReady method.
    179   virtual void TpmIsReady(const BoolDBusMethodCallback& callback) = 0;
    180 
    181   // Calls TpmIsEnabled method.
    182   virtual void TpmIsEnabled(const BoolDBusMethodCallback& callback) = 0;
    183 
    184   // Calls TpmIsEnabled method and returns true when the call succeeds.
    185   // This method blocks until the call returns.
    186   // TODO(hashimoto): Remove this method. crbug.com/141006
    187   virtual bool CallTpmIsEnabledAndBlock(bool* enabled) = 0;
    188 
    189   // Calls TpmGetPassword method.
    190   virtual void TpmGetPassword(const StringDBusMethodCallback& callback) = 0;
    191 
    192   // Calls TpmIsOwned method.
    193   virtual void TpmIsOwned(const BoolDBusMethodCallback& callback) = 0;
    194 
    195   // Calls TpmIsOwned method and returns true when the call succeeds.
    196   // This method blocks until the call returns.
    197   // TODO(hashimoto): Remove this method. crbug.com/141012
    198   virtual bool CallTpmIsOwnedAndBlock(bool* owned) = 0;
    199 
    200   // Calls TpmIsBeingOwned method.
    201   virtual void TpmIsBeingOwned(const BoolDBusMethodCallback& callback) = 0;
    202 
    203   // Calls TpmIsBeingOwned method and returns true when the call succeeds.
    204   // This method blocks until the call returns.
    205   // TODO(hashimoto): Remove this method. crbug.com/141011
    206   virtual bool CallTpmIsBeingOwnedAndBlock(bool* owning) = 0;
    207 
    208   // Calls TpmCanAttemptOwnership method.
    209   // This method tells the service that it is OK to attempt ownership.
    210   virtual void TpmCanAttemptOwnership(
    211       const VoidDBusMethodCallback& callback) = 0;
    212 
    213   // Calls TpmClearStoredPasswordMethod.
    214   virtual void TpmClearStoredPassword(
    215       const VoidDBusMethodCallback& callback) = 0;
    216 
    217   // Calls TpmClearStoredPassword method and returns true when the call
    218   // succeeds.  This method blocks until the call returns.
    219   // TODO(hashimoto): Remove this method. crbug.com/141010
    220   virtual bool CallTpmClearStoredPasswordAndBlock() = 0;
    221 
    222   // Calls Pkcs11IsTpmTokenReady method.
    223   virtual void Pkcs11IsTpmTokenReady(
    224       const BoolDBusMethodCallback& callback) = 0;
    225 
    226   // Calls Pkcs11GetTpmTokenInfo method.  This method is deprecated, you should
    227   // use Pkcs11GetTpmTokenInfoForUser instead.  On success |callback| will
    228   // receive PKCS #11 token information for the token associated with the user
    229   // who originally signed in (i.e. PKCS #11 slot 0).
    230   virtual void Pkcs11GetTpmTokenInfo(
    231       const Pkcs11GetTpmTokenInfoCallback& callback) = 0;
    232 
    233   // Calls Pkcs11GetTpmTokenInfoForUser method.  On success |callback| will
    234   // receive PKCS #11 token information for the user identified by |user_email|.
    235   // The |user_email| must be a canonical email address as returned by
    236   // chromeos::User::email().
    237   virtual void Pkcs11GetTpmTokenInfoForUser(
    238       const std::string& user_email,
    239       const Pkcs11GetTpmTokenInfoCallback& callback) = 0;
    240 
    241   // Calls InstallAttributesGet method and returns true when the call succeeds.
    242   // This method blocks until the call returns.
    243   // The original content of |value| is lost.
    244   virtual bool InstallAttributesGet(const std::string& name,
    245                                     std::vector<uint8>* value,
    246                                     bool* successful) = 0;
    247 
    248   // Calls InstallAttributesSet method and returns true when the call succeeds.
    249   // This method blocks until the call returns.
    250   virtual bool InstallAttributesSet(const std::string& name,
    251                                     const std::vector<uint8>& value,
    252                                     bool* successful) = 0;
    253 
    254   // Calls InstallAttributesFinalize method and returns true when the call
    255   // succeeds.  This method blocks until the call returns.
    256   virtual bool InstallAttributesFinalize(bool* successful) = 0;
    257 
    258   // Calls InstallAttributesIsReady method.
    259   virtual void InstallAttributesIsReady(
    260       const BoolDBusMethodCallback& callback) = 0;
    261 
    262   // Calls InstallAttributesIsInvalid method and returns true when the call
    263   // succeeds.  This method blocks until the call returns.
    264   virtual bool InstallAttributesIsInvalid(bool* is_invalid) = 0;
    265 
    266   // Calls InstallAttributesIsFirstInstall method and returns true when the call
    267   // succeeds. This method blocks until the call returns.
    268   virtual bool InstallAttributesIsFirstInstall(bool* is_first_install) = 0;
    269 
    270   // Calls the TpmAttestationIsPrepared dbus method.  The callback is called
    271   // when the operation completes.
    272   virtual void TpmAttestationIsPrepared(
    273         const BoolDBusMethodCallback& callback) = 0;
    274 
    275   // Calls the TpmAttestationIsEnrolled dbus method.  The callback is called
    276   // when the operation completes.
    277   virtual void TpmAttestationIsEnrolled(
    278         const BoolDBusMethodCallback& callback) = 0;
    279 
    280   // Asynchronously creates an attestation enrollment request.  The callback
    281   // will be called when the dbus call completes.  When the operation completes,
    282   // the AsyncCallStatusWithDataHandler signal handler is called.  The data that
    283   // is sent with the signal is an enrollment request to be sent to the Privacy
    284   // CA of type |pca_type|.  The enrollment is completed by calling
    285   // AsyncTpmAttestationEnroll.
    286   virtual void AsyncTpmAttestationCreateEnrollRequest(
    287       chromeos::attestation::PrivacyCAType pca_type,
    288       const AsyncMethodCallback& callback) = 0;
    289 
    290   // Asynchronously finishes an attestation enrollment operation.  The callback
    291   // will be called when the dbus call completes.  When the operation completes,
    292   // the AsyncCallStatusHandler signal handler is called.  |pca_response| is the
    293   // response to the enrollment request emitted by the Privacy CA of type
    294   // |pca_type|.
    295   virtual void AsyncTpmAttestationEnroll(
    296       chromeos::attestation::PrivacyCAType pca_type,
    297       const std::string& pca_response,
    298       const AsyncMethodCallback& callback) = 0;
    299 
    300   // Asynchronously creates an attestation certificate request according to
    301   // |certificate_profile|.  Some profiles require that the |user_id| of the
    302   // currently active user and an identifier of the |request_origin| be
    303   // provided.  |callback| will be called when the dbus call completes.  When
    304   // the operation completes, the AsyncCallStatusWithDataHandler signal handler
    305   // is called.  The data that is sent with the signal is a certificate request
    306   // to be sent to the Privacy CA of type |pca_type|.  The certificate request
    307   // is completed by calling AsyncTpmAttestationFinishCertRequest.  The
    308   // |user_id| will not be included in the certificate request for the Privacy
    309   // CA.
    310   virtual void AsyncTpmAttestationCreateCertRequest(
    311       chromeos::attestation::PrivacyCAType pca_type,
    312       attestation::AttestationCertificateProfile certificate_profile,
    313       const std::string& user_id,
    314       const std::string& request_origin,
    315       const AsyncMethodCallback& callback) = 0;
    316 
    317   // Asynchronously finishes a certificate request operation.  The callback will
    318   // be called when the dbus call completes.  When the operation completes, the
    319   // AsyncCallStatusWithDataHandler signal handler is called.  The data that is
    320   // sent with the signal is a certificate chain in PEM format.  |pca_response|
    321   // is the response to the certificate request emitted by the Privacy CA.
    322   // |key_type| determines whether the certified key is to be associated with
    323   // the current user.  |key_name| is a name for the key.  If |key_type| is
    324   // KEY_USER, a |user_id| must be provided.  Otherwise |user_id| is ignored.
    325   // For normal GAIA users the |user_id| is a canonical email address.
    326   virtual void AsyncTpmAttestationFinishCertRequest(
    327       const std::string& pca_response,
    328       attestation::AttestationKeyType key_type,
    329       const std::string& user_id,
    330       const std::string& key_name,
    331       const AsyncMethodCallback& callback) = 0;
    332 
    333   // Checks if an attestation key already exists.  If the key specified by
    334   // |key_type| and |key_name| exists, then the result sent to the callback will
    335   // be true.  If |key_type| is KEY_USER, a |user_id| must be provided.
    336   // Otherwise |user_id| is ignored.  For normal GAIA users the |user_id| is a
    337   // canonical email address.
    338   virtual void TpmAttestationDoesKeyExist(
    339       attestation::AttestationKeyType key_type,
    340       const std::string& user_id,
    341       const std::string& key_name,
    342       const BoolDBusMethodCallback& callback) = 0;
    343 
    344   // Gets the attestation certificate for the key specified by |key_type| and
    345   // |key_name|.  |callback| will be called when the operation completes.  If
    346   // the key does not exist the callback |result| parameter will be false.  If
    347   // |key_type| is KEY_USER, a |user_id| must be provided.  Otherwise |user_id|
    348   // is ignored.  For normal GAIA users the |user_id| is a canonical email
    349   // address.
    350   virtual void TpmAttestationGetCertificate(
    351       attestation::AttestationKeyType key_type,
    352       const std::string& user_id,
    353       const std::string& key_name,
    354       const DataMethodCallback& callback) = 0;
    355 
    356   // Gets the public key for the key specified by |key_type| and |key_name|.
    357   // |callback| will be called when the operation completes.  If the key does
    358   // not exist the callback |result| parameter will be false.  If |key_type| is
    359   // KEY_USER, a |user_id| must be provided.  Otherwise |user_id| is ignored.
    360   // For normal GAIA users the |user_id| is a canonical email address.
    361   virtual void TpmAttestationGetPublicKey(
    362       attestation::AttestationKeyType key_type,
    363       const std::string& user_id,
    364       const std::string& key_name,
    365       const DataMethodCallback& callback) = 0;
    366 
    367   // Asynchronously registers an attestation key with the current user's
    368   // PKCS #11 token.  The |callback| will be called when the dbus call
    369   // completes.  When the operation completes, the AsyncCallStatusHandler signal
    370   // handler is called.  |key_type| and |key_name| specify the key to register.
    371   // If |key_type| is KEY_USER, a |user_id| must be provided.  Otherwise
    372   // |user_id| is ignored.  For normal GAIA users the |user_id| is a canonical
    373   // email address.
    374   virtual void TpmAttestationRegisterKey(
    375       attestation::AttestationKeyType key_type,
    376       const std::string& user_id,
    377       const std::string& key_name,
    378       const AsyncMethodCallback& callback) = 0;
    379 
    380   // Asynchronously signs an enterprise challenge with the key specified by
    381   // |key_type| and |key_name|.  |domain| and |device_id| will be included in
    382   // the challenge response.  |options| control how the challenge response is
    383   // generated.  |challenge| must be a valid enterprise attestation challenge.
    384   // The |callback| will be called when the dbus call completes.  When the
    385   // operation completes, the AsyncCallStatusWithDataHandler signal handler is
    386   // called.  If |key_type| is KEY_USER, a |user_id| must be provided.
    387   // Otherwise |user_id| is ignored.  For normal GAIA users the |user_id| is a
    388   // canonical email address.
    389   virtual void TpmAttestationSignEnterpriseChallenge(
    390       attestation::AttestationKeyType key_type,
    391       const std::string& user_id,
    392       const std::string& key_name,
    393       const std::string& domain,
    394       const std::string& device_id,
    395       attestation::AttestationChallengeOptions options,
    396       const std::string& challenge,
    397       const AsyncMethodCallback& callback) = 0;
    398 
    399   // Asynchronously signs a simple challenge with the key specified by
    400   // |key_type| and |key_name|.  |challenge| can be any set of arbitrary bytes.
    401   // A nonce will be appended to the challenge before signing; this method
    402   // cannot be used to sign arbitrary data.  The |callback| will be called when
    403   // the dbus call completes.  When the operation completes, the
    404   // AsyncCallStatusWithDataHandler signal handler is called.  If |key_type| is
    405   // KEY_USER, a |user_id| must be provided.  Otherwise |user_id| is ignored.
    406   // For normal GAIA users the |user_id| is a canonical email address.
    407   virtual void TpmAttestationSignSimpleChallenge(
    408       attestation::AttestationKeyType key_type,
    409       const std::string& user_id,
    410       const std::string& key_name,
    411       const std::string& challenge,
    412       const AsyncMethodCallback& callback) = 0;
    413 
    414   // Gets the payload associated with the key specified by |key_type| and
    415   // |key_name|.  The |callback| will be called when the operation completes.
    416   // If the key does not exist the callback |result| parameter will be false.
    417   // If no payload has been set for the key the callback |result| parameter will
    418   // be true and the |data| parameter will be empty.  If |key_type| is
    419   // KEY_USER, a |user_id| must be provided.  Otherwise |user_id| is ignored.
    420   // For normal GAIA users the |user_id| is a canonical email address.
    421   virtual void TpmAttestationGetKeyPayload(
    422       attestation::AttestationKeyType key_type,
    423       const std::string& user_id,
    424       const std::string& key_name,
    425       const DataMethodCallback& callback) = 0;
    426 
    427   // Sets the |payload| associated with the key specified by |key_type| and
    428   // |key_name|.  The |callback| will be called when the operation completes.
    429   // If the operation succeeds, the callback |result| parameter will be true.
    430   // If |key_type| is KEY_USER, a |user_id| must be provided.  Otherwise
    431   // |user_id| is ignored.  For normal GAIA users the |user_id| is a canonical
    432   // email address.
    433   virtual void TpmAttestationSetKeyPayload(
    434       attestation::AttestationKeyType key_type,
    435       const std::string& user_id,
    436       const std::string& key_name,
    437       const std::string& payload,
    438       const BoolDBusMethodCallback& callback) = 0;
    439 
    440   // Deletes certified keys as specified by |key_type| and |key_prefix|.  The
    441   // |callback| will be called when the operation completes.  If the operation
    442   // succeeds, the callback |result| parameter will be true.  If |key_type| is
    443   // KEY_USER, a |user_id| must be provided.  Otherwise |user_id| is ignored.
    444   // For normal GAIA users the |user_id| is a canonical email address.  All keys
    445   // where the key name has a prefix matching |key_prefix| will be deleted.  All
    446   // meta-data associated with the key, including certificates, will also be
    447   // deleted.
    448   virtual void TpmAttestationDeleteKeys(
    449       attestation::AttestationKeyType key_type,
    450       const std::string& user_id,
    451       const std::string& key_prefix,
    452       const BoolDBusMethodCallback& callback) = 0;
    453 
    454   // Asynchronously calls CheckKeyEx method. |callback| is called after method
    455   // call, and with reply protobuf.
    456   // CheckKeyEx just checks if authorization information is valid.
    457   virtual void CheckKeyEx(
    458       const cryptohome::AccountIdentifier& id,
    459       const cryptohome::AuthorizationRequest& auth,
    460       const cryptohome::CheckKeyRequest& request,
    461       const ProtobufMethodCallback& callback) = 0;
    462 
    463   // Asynchronously calls MountEx method. |callback| is called after method
    464   // call, and with reply protobuf.
    465   // MountEx attempts to mount home dir using given authorization, and can
    466   // create new home dir if necessary values are specified in |request|.
    467   virtual void MountEx(
    468       const cryptohome::AccountIdentifier& id,
    469       const cryptohome::AuthorizationRequest& auth,
    470       const cryptohome::MountRequest& request,
    471       const ProtobufMethodCallback& callback) = 0;
    472 
    473   // Asynchronously calls AddKeyEx method. |callback| is called after method
    474   // call, and with reply protobuf.
    475   // AddKeyEx adds another key to the given key set. |request| also defines
    476   // behavior in case when key with specified label already exist.
    477   virtual void AddKeyEx(
    478       const cryptohome::AccountIdentifier& id,
    479       const cryptohome::AuthorizationRequest& auth,
    480       const cryptohome::AddKeyRequest& request,
    481       const ProtobufMethodCallback& callback) = 0;
    482 
    483   // Asynchronously calls UpdateKeyEx method. |callback| is called after method
    484   // call, and with reply protobuf. Reply will contain MountReply extension.
    485   // UpdateKeyEx replaces key used for authorization, without affecting any
    486   // other keys. If specified at home dir creation time, new key may have
    487   // to be signed and/or encrypted.
    488   virtual void UpdateKeyEx(
    489       const cryptohome::AccountIdentifier& id,
    490       const cryptohome::AuthorizationRequest& auth,
    491       const cryptohome::UpdateKeyRequest& request,
    492       const ProtobufMethodCallback& callback) = 0;
    493 
    494   // Asynchronously calls RemoveKeyEx method. |callback| is called after method
    495   // call, and with reply protobuf.
    496   // RemoveKeyEx removes key from the given key set.
    497   virtual void RemoveKeyEx(const cryptohome::AccountIdentifier& id,
    498                            const cryptohome::AuthorizationRequest& auth,
    499                            const cryptohome::RemoveKeyRequest& request,
    500                            const ProtobufMethodCallback& callback) = 0;
    501 
    502  protected:
    503   // Create() should be used instead.
    504   CryptohomeClient();
    505 
    506  private:
    507   DISALLOW_COPY_AND_ASSIGN(CryptohomeClient);
    508 };
    509 
    510 }  // namespace chromeos
    511 
    512 #endif  // CHROMEOS_DBUS_CRYPTOHOME_CLIENT_H_
    513