mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge branch 'next-tpm' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull tpm updates from James Morris:
- Clean up the transmission flow
Cleaned up the whole transmission flow. Locking of the chip is now
done in the level of tpm_try_get_ops() and tpm_put_ops() instead
taking the chip lock inside tpm_transmit(). The nested calls inside
tpm_transmit(), used with the resource manager, have been refactored
out.
Should make easier to perform more complex transactions with the TPM
without making the subsystem a bigger mess (e.g. encrypted channel
patches by James Bottomley).
- PPI 1.3 support
TPM PPI 1.3 introduces an additional optional command parameter that
may be needed for some commands. Display the parameter if the command
requires such a parameter. Only command 23 (SetPCRBanks) needs one.
The PPI request file will show output like this then:
# echo "23 16" > request
# cat request
23 16
# echo "5" > request
# cat request
5
- Extend all PCR banks in IMA
Instead of static PCR banks array, the array of available PCR banks
is now allocated dynamically. The digests sizes are determined
dynamically using a probe PCR read without relying crypto's static
list of hash algorithms.
This should finally make sealing of measurements in IMA safe and
secure.
- TPM 2.0 selftests
Added a test suite to tools/testing/selftests/tpm2 previously outside
of the kernel tree: https://github.com/jsakkine-intel/tpm2-scripts
* 'next-tpm' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (37 commits)
tpm/ppi: Enable submission of optional command parameter for PPI 1.3
tpm/ppi: Possibly show command parameter if TPM PPI 1.3 is used
tpm/ppi: Display up to 101 operations as define for version 1.3
tpm/ppi: rename TPM_PPI_REVISION_ID to TPM_PPI_REVISION_ID_1
tpm/ppi: pass function revision ID to tpm_eval_dsm()
tpm: pass an array of tpm_extend_digest structures to tpm_pcr_extend()
KEYS: trusted: explicitly use tpm_chip structure from tpm_default_chip()
tpm: move tpm_chip definition to include/linux/tpm.h
tpm: retrieve digest size of unknown algorithms with PCR read
tpm: rename and export tpm2_digest and tpm2_algorithms
tpm: dynamically allocate the allocated_banks array
tpm: remove @flags from tpm_transmit()
tpm: take TPM chip power gating out of tpm_transmit()
tpm: introduce tpm_chip_start() and tpm_chip_stop()
tpm: remove TPM_TRANSMIT_UNLOCKED flag
tpm: use tpm_try_get_ops() in tpm-sysfs.c.
tpm: remove @space from tpm_transmit()
tpm: move TPM space code out of tpm_transmit()
tpm: move tpm_validate_commmand() to tpm2-space.c
tpm: clean up tpm_try_transmit() error handling flow
...
This commit is contained in:
commit
5af7f11588
39 changed files with 1876 additions and 744 deletions
|
|
@ -34,6 +34,8 @@
|
|||
|
||||
static const char hmac_alg[] = "hmac(sha1)";
|
||||
static const char hash_alg[] = "sha1";
|
||||
static struct tpm_chip *chip;
|
||||
static struct tpm_digest *digests;
|
||||
|
||||
struct sdesc {
|
||||
struct shash_desc shash;
|
||||
|
|
@ -362,7 +364,7 @@ int trusted_tpm_send(unsigned char *cmd, size_t buflen)
|
|||
int rc;
|
||||
|
||||
dump_tpm_buf(cmd);
|
||||
rc = tpm_send(NULL, cmd, buflen);
|
||||
rc = tpm_send(chip, cmd, buflen);
|
||||
dump_tpm_buf(cmd);
|
||||
if (rc > 0)
|
||||
/* Can't return positive return codes values to keyctl */
|
||||
|
|
@ -379,15 +381,10 @@ EXPORT_SYMBOL_GPL(trusted_tpm_send);
|
|||
*/
|
||||
static int pcrlock(const int pcrnum)
|
||||
{
|
||||
unsigned char hash[SHA1_DIGEST_SIZE];
|
||||
int ret;
|
||||
|
||||
if (!capable(CAP_SYS_ADMIN))
|
||||
return -EPERM;
|
||||
ret = tpm_get_random(NULL, hash, SHA1_DIGEST_SIZE);
|
||||
if (ret != SHA1_DIGEST_SIZE)
|
||||
return ret;
|
||||
return tpm_pcr_extend(NULL, pcrnum, hash) ? -EINVAL : 0;
|
||||
|
||||
return tpm_pcr_extend(chip, pcrnum, digests) ? -EINVAL : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -400,7 +397,7 @@ static int osap(struct tpm_buf *tb, struct osapsess *s,
|
|||
unsigned char ononce[TPM_NONCE_SIZE];
|
||||
int ret;
|
||||
|
||||
ret = tpm_get_random(NULL, ononce, TPM_NONCE_SIZE);
|
||||
ret = tpm_get_random(chip, ononce, TPM_NONCE_SIZE);
|
||||
if (ret != TPM_NONCE_SIZE)
|
||||
return ret;
|
||||
|
||||
|
|
@ -496,7 +493,7 @@ static int tpm_seal(struct tpm_buf *tb, uint16_t keytype,
|
|||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
ret = tpm_get_random(NULL, td->nonceodd, TPM_NONCE_SIZE);
|
||||
ret = tpm_get_random(chip, td->nonceodd, TPM_NONCE_SIZE);
|
||||
if (ret != TPM_NONCE_SIZE)
|
||||
goto out;
|
||||
ordinal = htonl(TPM_ORD_SEAL);
|
||||
|
|
@ -606,7 +603,7 @@ static int tpm_unseal(struct tpm_buf *tb,
|
|||
|
||||
ordinal = htonl(TPM_ORD_UNSEAL);
|
||||
keyhndl = htonl(SRKHANDLE);
|
||||
ret = tpm_get_random(NULL, nonceodd, TPM_NONCE_SIZE);
|
||||
ret = tpm_get_random(chip, nonceodd, TPM_NONCE_SIZE);
|
||||
if (ret != TPM_NONCE_SIZE) {
|
||||
pr_info("trusted_key: tpm_get_random failed (%d)\n", ret);
|
||||
return ret;
|
||||
|
|
@ -751,7 +748,7 @@ static int getoptions(char *c, struct trusted_key_payload *pay,
|
|||
int i;
|
||||
int tpm2;
|
||||
|
||||
tpm2 = tpm_is_tpm2(NULL);
|
||||
tpm2 = tpm_is_tpm2(chip);
|
||||
if (tpm2 < 0)
|
||||
return tpm2;
|
||||
|
||||
|
|
@ -920,7 +917,7 @@ static struct trusted_key_options *trusted_options_alloc(void)
|
|||
struct trusted_key_options *options;
|
||||
int tpm2;
|
||||
|
||||
tpm2 = tpm_is_tpm2(NULL);
|
||||
tpm2 = tpm_is_tpm2(chip);
|
||||
if (tpm2 < 0)
|
||||
return NULL;
|
||||
|
||||
|
|
@ -970,7 +967,7 @@ static int trusted_instantiate(struct key *key,
|
|||
size_t key_len;
|
||||
int tpm2;
|
||||
|
||||
tpm2 = tpm_is_tpm2(NULL);
|
||||
tpm2 = tpm_is_tpm2(chip);
|
||||
if (tpm2 < 0)
|
||||
return tpm2;
|
||||
|
||||
|
|
@ -1011,7 +1008,7 @@ static int trusted_instantiate(struct key *key,
|
|||
switch (key_cmd) {
|
||||
case Opt_load:
|
||||
if (tpm2)
|
||||
ret = tpm_unseal_trusted(NULL, payload, options);
|
||||
ret = tpm_unseal_trusted(chip, payload, options);
|
||||
else
|
||||
ret = key_unseal(payload, options);
|
||||
dump_payload(payload);
|
||||
|
|
@ -1021,13 +1018,13 @@ static int trusted_instantiate(struct key *key,
|
|||
break;
|
||||
case Opt_new:
|
||||
key_len = payload->key_len;
|
||||
ret = tpm_get_random(NULL, payload->key, key_len);
|
||||
ret = tpm_get_random(chip, payload->key, key_len);
|
||||
if (ret != key_len) {
|
||||
pr_info("trusted_key: key_create failed (%d)\n", ret);
|
||||
goto out;
|
||||
}
|
||||
if (tpm2)
|
||||
ret = tpm_seal_trusted(NULL, payload, options);
|
||||
ret = tpm_seal_trusted(chip, payload, options);
|
||||
else
|
||||
ret = key_seal(payload, options);
|
||||
if (ret < 0)
|
||||
|
|
@ -1221,21 +1218,59 @@ hashalg_fail:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int __init init_digests(void)
|
||||
{
|
||||
u8 digest[TPM_MAX_DIGEST_SIZE];
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
ret = tpm_get_random(chip, digest, TPM_MAX_DIGEST_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
if (ret < TPM_MAX_DIGEST_SIZE)
|
||||
return -EFAULT;
|
||||
|
||||
digests = kcalloc(chip->nr_allocated_banks, sizeof(*digests),
|
||||
GFP_KERNEL);
|
||||
if (!digests)
|
||||
return -ENOMEM;
|
||||
|
||||
for (i = 0; i < chip->nr_allocated_banks; i++)
|
||||
memcpy(digests[i].digest, digest, TPM_MAX_DIGEST_SIZE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init init_trusted(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
chip = tpm_default_chip();
|
||||
if (!chip)
|
||||
return -ENOENT;
|
||||
ret = init_digests();
|
||||
if (ret < 0)
|
||||
goto err_put;
|
||||
ret = trusted_shash_alloc();
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
goto err_free;
|
||||
ret = register_key_type(&key_type_trusted);
|
||||
if (ret < 0)
|
||||
trusted_shash_release();
|
||||
goto err_release;
|
||||
return 0;
|
||||
err_release:
|
||||
trusted_shash_release();
|
||||
err_free:
|
||||
kfree(digests);
|
||||
err_put:
|
||||
put_device(&chip->dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __exit cleanup_trusted(void)
|
||||
{
|
||||
put_device(&chip->dev);
|
||||
kfree(digests);
|
||||
trusted_shash_release();
|
||||
unregister_key_type(&key_type_trusted);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue