This package contains the cryptohome daemon, which is responsible for the
creation and mounting/unmounting of per-user encrypted home directories.

Cryptohome makes use of ecryptfs for the underlying file and filename
encryption.  Keys for a user are maintained in an encrypted vault keyset that is
protected using a key derived from the user's password.  That protection may
be either through the TPM or through the use of Scrypt
(http://www.tarsnap.com/scrypt.html).

Cryptohome manages directories as follows:

/home/.shadow                            : Location for the system salt and
                                           individual users' salt/key/vault
/home/.shadow/<salted_hash_of_username>  : Each Chrome OS user gets a
                                           directory in the shadow root where
                                           their salts, keys, and vault are
                                           stored (s_h_o_u).
/home/.shadow/<s_h_o_u>/vault            : The user's vault (the encrypted
                                           version of their home directory)
/home/.shadow/<s_h_o_u>/master.0         : Vault keyset for the user.  The
                                           vault keyset contains the
                                           encrypted file encryption key and
                                           encrypted filename encryption key.
                                           It also contains the salt used to
                                           convert the user's passkey to an
                                           AES key, and may contain the
                                           TPM-encrypted intermediate key
                                           when TPM protection is enabled
                                           (see tpm.h for details).
/home/.shadow/<s_h_o_u>/mount            : On successful login, the user's
                                           vault directory is mounted here
                                           using the symmetric key decrypted
                                           from master.X by the user's
                                           passkey.
/home/user/<s_h_o_u>                     : bind mount of
                                           /home/.shadow/<s_h_o_u>/mount/user
/home/root/<s_h_o_u>                     : bind mount of
                                           /home/.shadow/<s_h_o_u>/mount/root
/home/chronos/u<s_h_o_u>                 : bind mount of
                                           /home/.shadow/<s_h_o_u>/mount/user
                                           used for multi-user support.
/home/chronos/user                       : bind mount of the active user
                                           /home/.shadow/<s_h_o_u>/mount/user,
                                           for backward compatibilty.

Offline login and screen unlock is processed through cryptohome using a test
decryption of the user's master key using the passkey provided.  If the user
currently has their cryptohome mounted, then the credentials may be verified
against their session object instead, which provides quick credentials
verification without access to the key material.  This latter method uses the
UserSession object in user_session.cc.  A user session is established on
successful completion of MountCryptohome() in mount.cc.  The user session is
torn down when a call to UnmmountCryptohome, MountCryptohome,
MountGuestCryptohome, or MigratePasskey is made (regardless of success status).
If no user session exists for the Mount instance, offline credential test falls
back to attempting to decrypt the user's stored vault keyset.  The session
method is preferred because it does not attempt to decrypt key material, and
because it does not require a round-trip to the TPM when the TPM is used for
further protecting the keyset (which can be ~.7s, or close to 3s if the RSA
key was evicted from the TPM key slot it occupies).

A user's cryptohome is automatically created when the vault directory for the
user does not exist and the cryptohome service gets a call to mount the
user's home directory.  This assumes that the call to MountCryptohome contains
the correct user password--no verification can be done if the vault keyset for
the user does not exist.  TestCredentials should be used if implicit creation is
not desired (an of course, explicit mount).

Passkey change is implemented through a call to MigratePasskey.  MigratePasskey
will attempt to decrypt the vault keyset using the old credentials supplied, and
if successful, will re-save the vault keyset using the new credentials.
MigratePasskey can be called regardless of whether a user's (any user)
cryptohome is mounted.  However, it will always clear the current user's session
as described above.

Typical Mount Flow

1. Cryptohome's Mount() DBUS API is called with valid user credentials.
2. If a cryptohome does not exist for that user name, a new one is created.
   a. The cryptohome is located at /home/.shadow/<salted hash of user name>,
      where the encrypted hash is a SHA1 hash of the system salt concatenated
      to the user name.
   b. The cryptohome vault (the directory that is mounted via ecryptfs) is
      created at /home/.shadow/<s_h_o_u>/vault
   c. The vault keyset is stored at /home/.shadow/<s_h_o_u>/master.0
      i. The vault keyset stores an encrypted blob containing the ecryptfs file
         encryption key (FEK) and file name encryption key (FNEK).
      ii. The vault keyset stores non-sensitive information about the protection
          mechanism used to encrypt the keys, such as salt, password rounds,
          etc.  See the later discussion on protection mechanisms.
3. The encrypted blob in the vault keyset is decrypted using the user
   credentials supplied to the Mount() API.
   a. On failure one of several actions is taken:
      i. If the blob was protected using the TPM, and the TPM has been cleared
         and re-owned, then the user's cryptohome vault is removed and
         re-created.  This is because it is not possible to recover a keyset
         that is TPM-protected if the TPM has been cleared.  A status code
         is returned in this case, but the Mount() call returns success.  This
         is the only case where cryptohome will automatically re-create a user's
         home.
      ii. If the blob was protected using the TPM, and the TPM is unavailable,
          for example, it has been disabled, then the call returns an error code
          indicating that either there was a failure communicating with the TPM
          or that the TPM is in defend lock (a state where the TPM believes
          that a brute-force attack is happening, and so it temporarily blocks
          most API calls).  Communications failures are usually transient, and
          can be fixed by calling the API a second time.  (For example, some
          chips on resume from S3 require us to re-establish our long-lived
          session.)  If the device allows manual disabling of the TPM, this
          error would not be transient, and the user would have to re-enable the
          TPM.  Defend lock errors are always transient, but the back-off period
          is variable.  While sometimes it may be seconds, other times it is
          best to reboot the system to clear this state.
      iii. If the blob was protected using the TPM, and there is a failure in
           the TSS API (couldn't load the cryptohome TPM key, etc.) that
           doesn't correspond to a TPM clear, then a communications failure
           error is returned as decribed in (ii).
      iv. If there is a disk failure, specifically, the vault keyset file is
          corrupt, there is undefined behavior.
      v. If the following errors occur on creation, cryptohome returns an error
         and cannot remedy the problem:
         - If the TPM is unavailable, cryptohome falls back to Scrypt-based
           protection, and the call to scryptenc_buf fails for any reason.
         - If writing the encrypted vault keyset to disk fails for any reason
         - If creating the user's vault path fails for any reason
         - If setting the ownership of the user's vault path fails for any
           reason
         - If decrypting the vault keyset fails because the call to decrypt
           in the TPM fails, it is assumed that the password is incorrect.
           This may occur if the user changes their password, as the keyset
           would still be protected with the password used at last login, but
           the call to Mount() would presumably use the current credentials.
           In this case, the system is given a chance to migrate the keys by
           having the user supply the old password.
         - If decrypting the vault keyset fails because the call to decrypt
           using scrypt fails, it is assumed that the password is incorrect, as
           with the TPM above.
         - If adding the decrypted keyset to the kernel keyring before ecryptfs
           mount fails, it is assumed that the key material was decrytped
           properly but some other problem exists outside of the control of
           cryptohome.
         - If the call to mount the user's cryptohome fails, it is assumed that
           some other problem exists outside of the control of cryptohome.
         - If the user's cryptohome must be re-created due to condition (i),
           and the cryptohome cannot be removed, then some other problem exists
           outside of the control of cryptohome.


Protection Mechanisms

The vault keyset (vault_keyset.cc/h) contains the file encryption key and file
name encryption key used by ecryptfs.  This keyset encrypted and persisted to
disk.  Cryptohome may use either the TPM or Scrypt as the encryption/protection
mechanism.

If the TPM is available, cryptohome will prefer to use it.  If the TPM is not
available (either not present, not enabled, owned by another OS, or it is in the
middle of being owned), cryptohome will fall back to using scrypt-based
protection of the vault keyset.  If the TPM becomes available at a later login,
cryptohome will transparently migrate a user's keyset to TPM-based protection.

The method when the TPM is enabled can be described using the decryption
workflow as an example:

  UP -
      |
      + AES decrypt (no padding) => IEVKK -
      |                                    |
EVKK -                                     |
                                           + RSA decrypt (in TPM) => VKK
                                           |
                                           |
                                  TPM_CHK -

Where:
  UP - User Passkey
  EVKK - Ecrypted vault keyset key (stored on disk)
  IEVKK - Intermediate vault keyset key
  TPM_CHK - TPM-wrapped system-wide Cryptohome Key
  VKK - Vault Keyset Key

The end result, the Vault Keyset Key (VKK), is an AES key that is used to
decrypt the Vault Keyset, which holds the ecryptfs keys (filename encryption
key and file encryption key).  The VKK, when using the TPM for protection, is
a randomly-generated key.

The User Passkey (UP) is used as an AES key to do an initial decrypt of the
Encrypted Vault Keyset Key (EVKK, or the "tpm_key" field in the
SerializedVaultKeyset, see vault_keyset.proto).  This is done without padding as
the decryption is done in-place and the resulting buffer is the Intermediate
Vault Keyset Key (IEVKK), which is fed into an RSA decrypt on the TPM as the
cipher text.  That RSA decrypt uses the system-wide TPM-wrapped
cryptohome key.  In this manner, we can use a randomly-created system-wide
key (the TPM has a limited number of key slots), but still require the user's
passkey during the decryption phase.  This also increases the brute-force
cost of attacking the SerializedVaultKeyset offline as it means that the
attacker would have to do a TPM cipher operation per password attempt
(assuming that the wrapped key could not be recovered).

After obtaining the VKK, it is used to recover the vault keyset by using it as
an AES key to decrypt the Encrypted Vault Keyset (EVK, or the "wrapped_keyset"
field in the SerializedVaultKeyset):

VKK -
     |
     + AES (PKCS#5 padding + SHA1 verification) => VK
     |
EVK -

Where:
  EVK - Encrypted vault keyset
  VK - Vault keyset

Presented another way:

+----------------------------------+
| EVKK (persisted as "tpm_key")    |
+----------------------------------+
                              \   /
                               \ /   Final 128-bits decrypted     +----------+
                                +--- in-place using the user's ---+ UP (mem) |
                               / \   passkey                      +----------+
                              /   \
+----------------------------------+
| IEVKK (mem)                      |
+----------------------------------+
 \                                 /
  \                               /
   \                             /
    -----------      ------------
                \   /
                 \ /                       +---------------------+
                  +--- Decrypted on-TPM ---+ TPM_CHK (persisted, |
                 / \                       | sealed by the TPM)  |
                /   \                      +---------------------+
               /     \
              /       \
             /         \            +-------------------------------------+
            /           \           | EVK (persisted as "wrapped_keyset") |
           /             \          +-------------------------------------+
          /               \          \                                   /
         /                 \          ----------------   ----------------
        +-------------------+                         \ /
        | VKK (mem)         +--- AES decrypt ----------+
        +-------------------+                         / \
                                      ----------------   ----------------
                                     /                                   \
                                    +-------------------------------------+
                                    | VK (mem)                            |
                                    +-------------------------------------+

Encryption of the Vault Keyset (VK) is the reverse method (see WrapVaultKeyset
in crypto.cc).

By comparison, when the TPM is not enabled, the UP is used as the password
supplied to scryptbuf_enc, which will use memory-bound key strengthening and AES
to encrypt the VK.  The Scrypt method is simpler because of the high-level API
that Scrypt exposes for key strengthening and encryption in one function call.
