blob: 11e46269dc6acc66c69b823b987e174986905c6c [file] [log] [blame] [view] [edit]
# Challenge-response Keys
This feature allows to protect user data via signing cryptographic keys stored
on hardware tokens, rather than via passwords.
The hardware token needs to present a valid signature for the generated
challenge to unseal a secret seed value (aka "cryptohome KDF passphrase"). The
VKK key is derived from this passphrase using Scrypt KDF, and is then used, as
usual, to get VK and mount the user's cryptohome directory.
The sealing algorithm involves TPM capabilities for achieving the security
strength. The algorithm is different depending on the version of the TPM chip
installed into the Chrome OS device - see below for specific descriptions.
[TOC]
## Using Challenge-response Key for Cryptohomes
The rough idea is:
```
cryptohome_kdf_passphrase := concat(
tpm_sealed_secret, deterministic_signature_of_salt)
```
where `tpm_sealed_secret` is the secret blob which is sealed using TPM in a way
that unsealing requires presenting valid signatures of the specified blobs, and
`deterministic_signature_of_salt` is the signature of a per-user salt obtained
using a deterministic signing algorithm.
TODO(emaxx): Fill this up while the feature gets implemented.
## Sealing/Unsealing Algorithm for TPM 2.0
This algorithm is based on the "TPM2_PolicySigned Extended Authorization Policy"
feature of TPM 2.0. In essence, it allows to encrypt the given blob of data via
the TPM's SRK and associate it with the given public key, so that the TPM will
only decrypt it back after being presented a valid signature for the
TPM-generated random nonce.
Technically, the TPM2_PolicySigned function is used when preparing the policy
session both for sealing and for unsealing. The difference is that the signature
is required only for the latter; for the former, the so-called "trial" policy
session is used and only the public key information is provided.
Additionally, the sealed data is bound to PCR0 (via the TPM2_PolicyPCR policy).
The input for the sealing operation - that is, the actual KDF passphrase - is a
randomly generated blob.
### Sealing Diagram for TPM 2.0
```
1. Generate Random Passphrase
|
v
2. Prepare Trial Policy Session (using
TPM2_PolicySigned et al., with supplying public key
information)
|
v
3. Seal (using TPM2_Create)
|
v
4. Store Sealed Blob Persistently
```
### Unsealing Diagram for TPM 2.0
```
1. Load Sealed Blob
|
v
2. Obtain TPM's nonce from Policy Session
|
v
3. Request via IPC Signature of nonce
|
v
4. Prepare Policy Session (using TPM2_PolicySigned et
al., with supplying public key information and
signature of nonce)
|
v
5. Unseal (using TPM2_Unseal)
```
### Cryptographic parameters for TPM 2.0 Sealing/Unsealing Algorithm
* The protection key on the hardware token: An RSA key of size 2048 or 1024
bits, with no specific restrictions for the public exponent. Supports the
RSASSA-PKCS1-v1_5 signature scheme with either of the following hash
functions: SHA-256 or SHA-384 or SHA-512 or SHA-1 (tie breaking will be
based on the preference order as reported by the middleware, with the
exception of always considering SHA-1 as the least preferred option).
* The passphrase: Of length 256 bits. Generated using the TPMs internal
random number generator.
## Sealing/Unsealing Algorithm for TPM 1.2
This algorithm is based on the "Certified Migratable Key" (CMK) feature of TPM
1.2. In a nutshell, CMK is an RSA key generated by the TPM and stored encrypted
by its SRK. The CMK is associated at the creation time with the specified
Migration Authority key (“MA key”). The TPM allows to "migrate" the CMK onto the
specified Migration Destination Key - that is, re-encrypt it from SRK onto the
Migration Destination key - if a valid signature with the MA key is provided.
The data to be signed is derived (by SHA-1 hashing) from the public keys of all
three keys involved in the migration - that is, the CMK, the MA Key and the
Migration Destination Key.
In our application, the role of the secret data to be sealed will be played by
the private part of the CMK (or, to be precise, its SHA-256 hash - in order to
avoid any bias). The CMK will be generated randomly by the TPM during the first
sign-in. The protection key from the hardware token will be the MA Key. Finally,
the Migration Destination Key will be generated randomly on each sign-in of the
user.
Some of operations with CMKs require special privileges; for those, some
additional permissions were added to the delegate that is created during the TPM
ownership taking. The delegate is also changed to be bound to PCR0, which
implies that CMK unsealing is restricted to that PCR as well.
### Sealing Diagram for TPM 1.2
```
1. Obtain Migration Authority Approval Ticket for the
Protection Key (via TPM_CMK_ApproveMA, with supplying
protection public key)
|
v
2. Create CMK (via TPM_CMK_CreateKey, with supplying
protection public key and migration authority approval
ticket from step #1)
|
v
3. Store SRK-wrapped CMK Persistently
```
### Unsealing Diagram for TPM 1.2
```
1. Load SRK-wrapped CMK
|
v
2. Generate Migration Destination Key randomly
|
v
3. Request via IPC Signature of Blob Formed from
three public keys (protection key, migration
destination key, and CMK)
|
v
4. Obtain Migration Authorization Blob for
Migration Destination key (via
TPM_AuthorizeMigrationKey, with passing migration
destination public key)
|
v
5. Obtain CMK Migration Signature Ticket for
Signature Blob (via TPM_CMK_CreateTicket, with
supplying three public keys and the signature blob)
|
v
6. Obtain Migrated CMK Blob and Migration Random Blob
(via Tspi_Key_CMKCreateBlob, with supplying
SRK-wrapped CMK, three public keys, migration
authorization blob from step #4, CMK migration
signature ticket from step #5)
|
v
7. Decrypt and Decode the CMK Private Key (via RSA
OAEP MGF1, with supplying migration destination
private key, and via second pass of OAEP MGF1
decoding, with supplying migration random blob)
|
v
8. Return SHA-256 Hash of CMK Private Key
```
### Cryptographic parameters for TPM 1.2 Sealing/Unsealing Algorithm
* The protection key on the hardware token: An RSA key of size 2048 or 1024
bits, with the public exponent equal to 65537. Supports the
RSASSA-PKCS1-v1_5 signature scheme with the SHA-1 hash function.
* CMK: An RSA key, with the public exponent equal to 65537. Of length 2048
bits. Generated by the TPM itself using its own algorithm and its internal
random number generator.
* The Migration Destination Key: An RSA key, with the public exponent equal
to 65537. Of length 2048 bits. Used for encryption/decryption with the RSA
OAEP MGF1 algorithm. Generated via OpenSSL using the system pseudorandom
number generator.