Skip to content

Commit 1252cc3

Browse files
Roberto SassuMimi Zohar
Roberto Sassu
authored and
Mimi Zohar
committed
eCryptfs: added support for the encrypted key type
The function ecryptfs_keyring_auth_tok_for_sig() has been modified in order to search keys of both 'user' and 'encrypted' types. Signed-off-by: Roberto Sassu <[email protected]> Acked-by: Gianluca Ramunno <[email protected]> Acked-by: Tyler Hicks <[email protected]> Signed-off-by: Mimi Zohar <[email protected]>
1 parent 79a73d1 commit 1252cc3

File tree

2 files changed

+47
-7
lines changed

2 files changed

+47
-7
lines changed

fs/ecryptfs/ecryptfs_kernel.h

+39-2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#define ECRYPTFS_KERNEL_H
3030

3131
#include <keys/user-type.h>
32+
#include <keys/encrypted-type.h>
3233
#include <linux/fs.h>
3334
#include <linux/fs_stack.h>
3435
#include <linux/namei.h>
@@ -78,11 +79,47 @@ struct ecryptfs_page_crypt_context {
7879
} param;
7980
};
8081

82+
#if defined(CONFIG_ENCRYPTED_KEYS) || defined(CONFIG_ENCRYPTED_KEYS_MODULE)
83+
static inline struct ecryptfs_auth_tok *
84+
ecryptfs_get_encrypted_key_payload_data(struct key *key)
85+
{
86+
if (key->type == &key_type_encrypted)
87+
return (struct ecryptfs_auth_tok *)
88+
(&((struct encrypted_key_payload *)key->payload.data)->payload_data);
89+
else
90+
return NULL;
91+
}
92+
93+
static inline struct key *ecryptfs_get_encrypted_key(char *sig)
94+
{
95+
return request_key(&key_type_encrypted, sig, NULL);
96+
}
97+
98+
#else
99+
static inline struct ecryptfs_auth_tok *
100+
ecryptfs_get_encrypted_key_payload_data(struct key *key)
101+
{
102+
return NULL;
103+
}
104+
105+
static inline struct key *ecryptfs_get_encrypted_key(char *sig)
106+
{
107+
return ERR_PTR(-ENOKEY);
108+
}
109+
110+
#endif /* CONFIG_ENCRYPTED_KEYS */
111+
81112
static inline struct ecryptfs_auth_tok *
82113
ecryptfs_get_key_payload_data(struct key *key)
83114
{
84-
return (struct ecryptfs_auth_tok *)
85-
(((struct user_key_payload*)key->payload.data)->data);
115+
struct ecryptfs_auth_tok *auth_tok;
116+
117+
auth_tok = ecryptfs_get_encrypted_key_payload_data(key);
118+
if (!auth_tok)
119+
return (struct ecryptfs_auth_tok *)
120+
(((struct user_key_payload *)key->payload.data)->data);
121+
else
122+
return auth_tok;
86123
}
87124

88125
#define ECRYPTFS_MAX_KEYSET_SIZE 1024

fs/ecryptfs/keystore.c

+8-5
Original file line numberDiff line numberDiff line change
@@ -1635,11 +1635,14 @@ int ecryptfs_keyring_auth_tok_for_sig(struct key **auth_tok_key,
16351635

16361636
(*auth_tok_key) = request_key(&key_type_user, sig, NULL);
16371637
if (!(*auth_tok_key) || IS_ERR(*auth_tok_key)) {
1638-
printk(KERN_ERR "Could not find key with description: [%s]\n",
1639-
sig);
1640-
rc = process_request_key_err(PTR_ERR(*auth_tok_key));
1641-
(*auth_tok_key) = NULL;
1642-
goto out;
1638+
(*auth_tok_key) = ecryptfs_get_encrypted_key(sig);
1639+
if (!(*auth_tok_key) || IS_ERR(*auth_tok_key)) {
1640+
printk(KERN_ERR "Could not find key with description: [%s]\n",
1641+
sig);
1642+
rc = process_request_key_err(PTR_ERR(*auth_tok_key));
1643+
(*auth_tok_key) = NULL;
1644+
goto out;
1645+
}
16431646
}
16441647
down_write(&(*auth_tok_key)->sem);
16451648
rc = ecryptfs_verify_auth_tok_from_key(*auth_tok_key, auth_tok);

0 commit comments

Comments
 (0)