diff options
author | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> | 2015-11-05 14:43:06 -0500 |
---|---|---|
committer | Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> | 2015-12-20 08:27:12 -0500 |
commit | 5ca4c20cfd37bac6486de040e9951b3b34755238 (patch) | |
tree | 1ee427b120ae979e1cd30b7bc47c31426066deae /security/keys | |
parent | 5208cc83423dde06924121a85368c721a27ca555 (diff) |
keys, trusted: select hash algorithm for TPM2 chips
Added 'hash=' option for selecting the hash algorithm for add_key()
syscall and documentation for it.
Added entry for sm3-256 to the following tables in order to support
TPM_ALG_SM3_256:
* hash_algo_name
* hash_digest_size
Includes support for the following hash algorithms:
* sha1
* sha256
* sha384
* sha512
* sm3-256
Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tested-by: Colin Ian King <colin.king@canonical.com>
Reviewed-by: James Morris <james.l.morris@oracle.com>
Reviewed-by: Mimi Zohar <zohar@linux.vnet.ibm.com>
Acked-by: Peter Huewe <peterhuewe@gmx.de>
Diffstat (limited to 'security/keys')
-rw-r--r-- | security/keys/Kconfig | 1 | ||||
-rw-r--r-- | security/keys/trusted.c | 27 |
2 files changed, 27 insertions, 1 deletions
diff --git a/security/keys/Kconfig b/security/keys/Kconfig index 72483b8f1be5..fe4d74e126a7 100644 --- a/security/keys/Kconfig +++ b/security/keys/Kconfig | |||
@@ -54,6 +54,7 @@ config TRUSTED_KEYS | |||
54 | select CRYPTO | 54 | select CRYPTO |
55 | select CRYPTO_HMAC | 55 | select CRYPTO_HMAC |
56 | select CRYPTO_SHA1 | 56 | select CRYPTO_SHA1 |
57 | select CRYPTO_HASH_INFO | ||
57 | help | 58 | help |
58 | This option provides support for creating, sealing, and unsealing | 59 | This option provides support for creating, sealing, and unsealing |
59 | keys in the kernel. Trusted keys are random number symmetric keys, | 60 | keys in the kernel. Trusted keys are random number symmetric keys, |
diff --git a/security/keys/trusted.c b/security/keys/trusted.c index 7c183c767a3a..8f1300cab38e 100644 --- a/security/keys/trusted.c +++ b/security/keys/trusted.c | |||
@@ -11,6 +11,7 @@ | |||
11 | * See Documentation/security/keys-trusted-encrypted.txt | 11 | * See Documentation/security/keys-trusted-encrypted.txt |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #include <crypto/hash_info.h> | ||
14 | #include <linux/uaccess.h> | 15 | #include <linux/uaccess.h> |
15 | #include <linux/module.h> | 16 | #include <linux/module.h> |
16 | #include <linux/init.h> | 17 | #include <linux/init.h> |
@@ -710,7 +711,8 @@ enum { | |||
710 | Opt_err = -1, | 711 | Opt_err = -1, |
711 | Opt_new, Opt_load, Opt_update, | 712 | Opt_new, Opt_load, Opt_update, |
712 | Opt_keyhandle, Opt_keyauth, Opt_blobauth, | 713 | Opt_keyhandle, Opt_keyauth, Opt_blobauth, |
713 | Opt_pcrinfo, Opt_pcrlock, Opt_migratable | 714 | Opt_pcrinfo, Opt_pcrlock, Opt_migratable, |
715 | Opt_hash, | ||
714 | }; | 716 | }; |
715 | 717 | ||
716 | static const match_table_t key_tokens = { | 718 | static const match_table_t key_tokens = { |
@@ -723,6 +725,7 @@ static const match_table_t key_tokens = { | |||
723 | {Opt_pcrinfo, "pcrinfo=%s"}, | 725 | {Opt_pcrinfo, "pcrinfo=%s"}, |
724 | {Opt_pcrlock, "pcrlock=%s"}, | 726 | {Opt_pcrlock, "pcrlock=%s"}, |
725 | {Opt_migratable, "migratable=%s"}, | 727 | {Opt_migratable, "migratable=%s"}, |
728 | {Opt_hash, "hash=%s"}, | ||
726 | {Opt_err, NULL} | 729 | {Opt_err, NULL} |
727 | }; | 730 | }; |
728 | 731 | ||
@@ -737,6 +740,14 @@ static int getoptions(char *c, struct trusted_key_payload *pay, | |||
737 | unsigned long handle; | 740 | unsigned long handle; |
738 | unsigned long lock; | 741 | unsigned long lock; |
739 | unsigned long token_mask = 0; | 742 | unsigned long token_mask = 0; |
743 | int i; | ||
744 | int tpm2; | ||
745 | |||
746 | tpm2 = tpm_is_tpm2(TPM_ANY_NUM); | ||
747 | if (tpm2 < 0) | ||
748 | return tpm2; | ||
749 | |||
750 | opt->hash = tpm2 ? HASH_ALGO_SHA256 : HASH_ALGO_SHA1; | ||
740 | 751 | ||
741 | while ((p = strsep(&c, " \t"))) { | 752 | while ((p = strsep(&c, " \t"))) { |
742 | if (*p == '\0' || *p == ' ' || *p == '\t') | 753 | if (*p == '\0' || *p == ' ' || *p == '\t') |
@@ -790,6 +801,20 @@ static int getoptions(char *c, struct trusted_key_payload *pay, | |||
790 | return -EINVAL; | 801 | return -EINVAL; |
791 | opt->pcrlock = lock; | 802 | opt->pcrlock = lock; |
792 | break; | 803 | break; |
804 | case Opt_hash: | ||
805 | for (i = 0; i < HASH_ALGO__LAST; i++) { | ||
806 | if (!strcmp(args[0].from, hash_algo_name[i])) { | ||
807 | opt->hash = i; | ||
808 | break; | ||
809 | } | ||
810 | } | ||
811 | if (i == HASH_ALGO__LAST) | ||
812 | return -EINVAL; | ||
813 | if (!tpm2 && i != HASH_ALGO_SHA1) { | ||
814 | pr_info("trusted_key: TPM 1.x only supports SHA-1.\n"); | ||
815 | return -EINVAL; | ||
816 | } | ||
817 | break; | ||
793 | default: | 818 | default: |
794 | return -EINVAL; | 819 | return -EINVAL; |
795 | } | 820 | } |