diff options
Diffstat (limited to 'security')
| -rw-r--r-- | security/Kconfig | 4 | ||||
| -rw-r--r-- | security/keys/encrypted-keys/Makefile | 1 | ||||
| -rw-r--r-- | security/keys/encrypted-keys/encrypted.c | 35 | ||||
| -rw-r--r-- | security/keys/encrypted-keys/encrypted.h | 11 | ||||
| -rw-r--r-- | security/keys/encrypted-keys/masterkey_trusted.c | 44 |
5 files changed, 67 insertions, 28 deletions
diff --git a/security/Kconfig b/security/Kconfig index 22847a889081..51bd5a0b69ae 100644 --- a/security/Kconfig +++ b/security/Kconfig | |||
| @@ -38,7 +38,9 @@ config TRUSTED_KEYS | |||
| 38 | 38 | ||
| 39 | config ENCRYPTED_KEYS | 39 | config ENCRYPTED_KEYS |
| 40 | tristate "ENCRYPTED KEYS" | 40 | tristate "ENCRYPTED KEYS" |
| 41 | depends on KEYS && TRUSTED_KEYS | 41 | depends on KEYS |
| 42 | select CRYPTO | ||
| 43 | select CRYPTO_HMAC | ||
| 42 | select CRYPTO_AES | 44 | select CRYPTO_AES |
| 43 | select CRYPTO_CBC | 45 | select CRYPTO_CBC |
| 44 | select CRYPTO_SHA256 | 46 | select CRYPTO_SHA256 |
diff --git a/security/keys/encrypted-keys/Makefile b/security/keys/encrypted-keys/Makefile index cbd3f8de37bb..6bc7a86d1027 100644 --- a/security/keys/encrypted-keys/Makefile +++ b/security/keys/encrypted-keys/Makefile | |||
| @@ -3,3 +3,4 @@ | |||
| 3 | # | 3 | # |
| 4 | 4 | ||
| 5 | obj-$(CONFIG_ENCRYPTED_KEYS) += encrypted.o ecryptfs_format.o | 5 | obj-$(CONFIG_ENCRYPTED_KEYS) += encrypted.o ecryptfs_format.o |
| 6 | obj-$(CONFIG_TRUSTED_KEYS) += masterkey_trusted.o | ||
diff --git a/security/keys/encrypted-keys/encrypted.c b/security/keys/encrypted-keys/encrypted.c index e7eca9ec4c65..3f577954b85a 100644 --- a/security/keys/encrypted-keys/encrypted.c +++ b/security/keys/encrypted-keys/encrypted.c | |||
| @@ -299,31 +299,6 @@ out: | |||
| 299 | } | 299 | } |
| 300 | 300 | ||
| 301 | /* | 301 | /* |
| 302 | * request_trusted_key - request the trusted key | ||
| 303 | * | ||
| 304 | * Trusted keys are sealed to PCRs and other metadata. Although userspace | ||
| 305 | * manages both trusted/encrypted key-types, like the encrypted key type | ||
| 306 | * data, trusted key type data is not visible decrypted from userspace. | ||
| 307 | */ | ||
| 308 | static struct key *request_trusted_key(const char *trusted_desc, | ||
| 309 | u8 **master_key, size_t *master_keylen) | ||
| 310 | { | ||
| 311 | struct trusted_key_payload *tpayload; | ||
| 312 | struct key *tkey; | ||
| 313 | |||
| 314 | tkey = request_key(&key_type_trusted, trusted_desc, NULL); | ||
| 315 | if (IS_ERR(tkey)) | ||
| 316 | goto error; | ||
| 317 | |||
| 318 | down_read(&tkey->sem); | ||
| 319 | tpayload = rcu_dereference(tkey->payload.data); | ||
| 320 | *master_key = tpayload->key; | ||
| 321 | *master_keylen = tpayload->key_len; | ||
| 322 | error: | ||
| 323 | return tkey; | ||
| 324 | } | ||
| 325 | |||
| 326 | /* | ||
| 327 | * request_user_key - request the user key | 302 | * request_user_key - request the user key |
| 328 | * | 303 | * |
| 329 | * Use a user provided key to encrypt/decrypt an encrypted-key. | 304 | * Use a user provided key to encrypt/decrypt an encrypted-key. |
| @@ -469,8 +444,14 @@ static struct key *request_master_key(struct encrypted_key_payload *epayload, | |||
| 469 | goto out; | 444 | goto out; |
| 470 | 445 | ||
| 471 | if (IS_ERR(mkey)) { | 446 | if (IS_ERR(mkey)) { |
| 472 | pr_info("encrypted_key: key %s not found", | 447 | int ret = PTR_ERR(epayload); |
| 473 | epayload->master_desc); | 448 | |
| 449 | if (ret == -ENOTSUPP) | ||
| 450 | pr_info("encrypted_key: key %s not supported", | ||
| 451 | epayload->master_desc); | ||
| 452 | else | ||
| 453 | pr_info("encrypted_key: key %s not found", | ||
| 454 | epayload->master_desc); | ||
| 474 | goto out; | 455 | goto out; |
| 475 | } | 456 | } |
| 476 | 457 | ||
diff --git a/security/keys/encrypted-keys/encrypted.h b/security/keys/encrypted-keys/encrypted.h index cef5e2f2b7d1..b6ade8945250 100644 --- a/security/keys/encrypted-keys/encrypted.h +++ b/security/keys/encrypted-keys/encrypted.h | |||
| @@ -2,6 +2,17 @@ | |||
| 2 | #define __ENCRYPTED_KEY_H | 2 | #define __ENCRYPTED_KEY_H |
| 3 | 3 | ||
| 4 | #define ENCRYPTED_DEBUG 0 | 4 | #define ENCRYPTED_DEBUG 0 |
| 5 | #ifdef CONFIG_TRUSTED_KEYS | ||
| 6 | extern struct key *request_trusted_key(const char *trusted_desc, | ||
| 7 | u8 **master_key, size_t *master_keylen); | ||
| 8 | #else | ||
| 9 | static inline struct key *request_trusted_key(const char *trusted_desc, | ||
| 10 | u8 **master_key, | ||
| 11 | size_t *master_keylen) | ||
| 12 | { | ||
| 13 | return ERR_PTR(-EOPNOTSUPP); | ||
| 14 | } | ||
| 15 | #endif | ||
| 5 | 16 | ||
| 6 | #if ENCRYPTED_DEBUG | 17 | #if ENCRYPTED_DEBUG |
| 7 | static inline void dump_master_key(const u8 *master_key, size_t master_keylen) | 18 | static inline void dump_master_key(const u8 *master_key, size_t master_keylen) |
diff --git a/security/keys/encrypted-keys/masterkey_trusted.c b/security/keys/encrypted-keys/masterkey_trusted.c new file mode 100644 index 000000000000..a5da5128891b --- /dev/null +++ b/security/keys/encrypted-keys/masterkey_trusted.c | |||
| @@ -0,0 +1,44 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2010 IBM Corporation | ||
| 3 | * Copyright (C) 2010 Politecnico di Torino, Italy | ||
| 4 | * TORSEC group -- http://security.polito.it | ||
| 5 | * | ||
| 6 | * Authors: | ||
| 7 | * Mimi Zohar <zohar@us.ibm.com> | ||
| 8 | * Roberto Sassu <roberto.sassu@polito.it> | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation, version 2 of the License. | ||
| 13 | * | ||
| 14 | * See Documentation/security/keys-trusted-encrypted.txt | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/uaccess.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <keys/trusted-type.h> | ||
| 20 | |||
| 21 | /* | ||
| 22 | * request_trusted_key - request the trusted key | ||
| 23 | * | ||
| 24 | * Trusted keys are sealed to PCRs and other metadata. Although userspace | ||
| 25 | * manages both trusted/encrypted key-types, like the encrypted key type | ||
| 26 | * data, trusted key type data is not visible decrypted from userspace. | ||
| 27 | */ | ||
| 28 | struct key *request_trusted_key(const char *trusted_desc, | ||
| 29 | u8 **master_key, size_t *master_keylen) | ||
| 30 | { | ||
| 31 | struct trusted_key_payload *tpayload; | ||
| 32 | struct key *tkey; | ||
| 33 | |||
| 34 | tkey = request_key(&key_type_trusted, trusted_desc, NULL); | ||
| 35 | if (IS_ERR(tkey)) | ||
| 36 | goto error; | ||
| 37 | |||
| 38 | down_read(&tkey->sem); | ||
| 39 | tpayload = rcu_dereference(tkey->payload.data); | ||
| 40 | *master_key = tpayload->key; | ||
| 41 | *master_keylen = tpayload->key_len; | ||
| 42 | error: | ||
| 43 | return tkey; | ||
| 44 | } | ||
