aboutsummaryrefslogtreecommitdiffstats
path: root/security/keys
diff options
context:
space:
mode:
authorJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2015-11-05 14:43:06 -0500
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2015-12-20 08:27:12 -0500
commit5ca4c20cfd37bac6486de040e9951b3b34755238 (patch)
tree1ee427b120ae979e1cd30b7bc47c31426066deae /security/keys
parent5208cc83423dde06924121a85368c721a27ca555 (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/Kconfig1
-rw-r--r--security/keys/trusted.c27
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
716static const match_table_t key_tokens = { 718static 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 }