xref: /OK3568_Linux_fs/kernel/security/keys/encrypted-keys/encrypted.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright (C) 2010 IBM Corporation
4*4882a593Smuzhiyun  * Copyright (C) 2010 Politecnico di Torino, Italy
5*4882a593Smuzhiyun  *                    TORSEC group -- https://security.polito.it
6*4882a593Smuzhiyun  *
7*4882a593Smuzhiyun  * Authors:
8*4882a593Smuzhiyun  * Mimi Zohar <zohar@us.ibm.com>
9*4882a593Smuzhiyun  * Roberto Sassu <roberto.sassu@polito.it>
10*4882a593Smuzhiyun  *
11*4882a593Smuzhiyun  * See Documentation/security/keys/trusted-encrypted.rst
12*4882a593Smuzhiyun  */
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #include <linux/uaccess.h>
15*4882a593Smuzhiyun #include <linux/module.h>
16*4882a593Smuzhiyun #include <linux/init.h>
17*4882a593Smuzhiyun #include <linux/slab.h>
18*4882a593Smuzhiyun #include <linux/parser.h>
19*4882a593Smuzhiyun #include <linux/string.h>
20*4882a593Smuzhiyun #include <linux/err.h>
21*4882a593Smuzhiyun #include <keys/user-type.h>
22*4882a593Smuzhiyun #include <keys/trusted-type.h>
23*4882a593Smuzhiyun #include <keys/encrypted-type.h>
24*4882a593Smuzhiyun #include <linux/key-type.h>
25*4882a593Smuzhiyun #include <linux/random.h>
26*4882a593Smuzhiyun #include <linux/rcupdate.h>
27*4882a593Smuzhiyun #include <linux/scatterlist.h>
28*4882a593Smuzhiyun #include <linux/ctype.h>
29*4882a593Smuzhiyun #include <crypto/aes.h>
30*4882a593Smuzhiyun #include <crypto/algapi.h>
31*4882a593Smuzhiyun #include <crypto/hash.h>
32*4882a593Smuzhiyun #include <crypto/sha.h>
33*4882a593Smuzhiyun #include <crypto/skcipher.h>
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun #include "encrypted.h"
36*4882a593Smuzhiyun #include "ecryptfs_format.h"
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun static const char KEY_TRUSTED_PREFIX[] = "trusted:";
39*4882a593Smuzhiyun static const char KEY_USER_PREFIX[] = "user:";
40*4882a593Smuzhiyun static const char hash_alg[] = "sha256";
41*4882a593Smuzhiyun static const char hmac_alg[] = "hmac(sha256)";
42*4882a593Smuzhiyun static const char blkcipher_alg[] = "cbc(aes)";
43*4882a593Smuzhiyun static const char key_format_default[] = "default";
44*4882a593Smuzhiyun static const char key_format_ecryptfs[] = "ecryptfs";
45*4882a593Smuzhiyun static const char key_format_enc32[] = "enc32";
46*4882a593Smuzhiyun static unsigned int ivsize;
47*4882a593Smuzhiyun static int blksize;
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define KEY_TRUSTED_PREFIX_LEN (sizeof (KEY_TRUSTED_PREFIX) - 1)
50*4882a593Smuzhiyun #define KEY_USER_PREFIX_LEN (sizeof (KEY_USER_PREFIX) - 1)
51*4882a593Smuzhiyun #define KEY_ECRYPTFS_DESC_LEN 16
52*4882a593Smuzhiyun #define HASH_SIZE SHA256_DIGEST_SIZE
53*4882a593Smuzhiyun #define MAX_DATA_SIZE 4096
54*4882a593Smuzhiyun #define MIN_DATA_SIZE  20
55*4882a593Smuzhiyun #define KEY_ENC32_PAYLOAD_LEN 32
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun static struct crypto_shash *hash_tfm;
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun enum {
60*4882a593Smuzhiyun 	Opt_new, Opt_load, Opt_update, Opt_err
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun enum {
64*4882a593Smuzhiyun 	Opt_default, Opt_ecryptfs, Opt_enc32, Opt_error
65*4882a593Smuzhiyun };
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun static const match_table_t key_format_tokens = {
68*4882a593Smuzhiyun 	{Opt_default, "default"},
69*4882a593Smuzhiyun 	{Opt_ecryptfs, "ecryptfs"},
70*4882a593Smuzhiyun 	{Opt_enc32, "enc32"},
71*4882a593Smuzhiyun 	{Opt_error, NULL}
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun static const match_table_t key_tokens = {
75*4882a593Smuzhiyun 	{Opt_new, "new"},
76*4882a593Smuzhiyun 	{Opt_load, "load"},
77*4882a593Smuzhiyun 	{Opt_update, "update"},
78*4882a593Smuzhiyun 	{Opt_err, NULL}
79*4882a593Smuzhiyun };
80*4882a593Smuzhiyun 
aes_get_sizes(void)81*4882a593Smuzhiyun static int aes_get_sizes(void)
82*4882a593Smuzhiyun {
83*4882a593Smuzhiyun 	struct crypto_skcipher *tfm;
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun 	tfm = crypto_alloc_skcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
86*4882a593Smuzhiyun 	if (IS_ERR(tfm)) {
87*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to alloc_cipher (%ld)\n",
88*4882a593Smuzhiyun 		       PTR_ERR(tfm));
89*4882a593Smuzhiyun 		return PTR_ERR(tfm);
90*4882a593Smuzhiyun 	}
91*4882a593Smuzhiyun 	ivsize = crypto_skcipher_ivsize(tfm);
92*4882a593Smuzhiyun 	blksize = crypto_skcipher_blocksize(tfm);
93*4882a593Smuzhiyun 	crypto_free_skcipher(tfm);
94*4882a593Smuzhiyun 	return 0;
95*4882a593Smuzhiyun }
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /*
98*4882a593Smuzhiyun  * valid_ecryptfs_desc - verify the description of a new/loaded encrypted key
99*4882a593Smuzhiyun  *
100*4882a593Smuzhiyun  * The description of a encrypted key with format 'ecryptfs' must contain
101*4882a593Smuzhiyun  * exactly 16 hexadecimal characters.
102*4882a593Smuzhiyun  *
103*4882a593Smuzhiyun  */
valid_ecryptfs_desc(const char * ecryptfs_desc)104*4882a593Smuzhiyun static int valid_ecryptfs_desc(const char *ecryptfs_desc)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun 	int i;
107*4882a593Smuzhiyun 
108*4882a593Smuzhiyun 	if (strlen(ecryptfs_desc) != KEY_ECRYPTFS_DESC_LEN) {
109*4882a593Smuzhiyun 		pr_err("encrypted_key: key description must be %d hexadecimal "
110*4882a593Smuzhiyun 		       "characters long\n", KEY_ECRYPTFS_DESC_LEN);
111*4882a593Smuzhiyun 		return -EINVAL;
112*4882a593Smuzhiyun 	}
113*4882a593Smuzhiyun 
114*4882a593Smuzhiyun 	for (i = 0; i < KEY_ECRYPTFS_DESC_LEN; i++) {
115*4882a593Smuzhiyun 		if (!isxdigit(ecryptfs_desc[i])) {
116*4882a593Smuzhiyun 			pr_err("encrypted_key: key description must contain "
117*4882a593Smuzhiyun 			       "only hexadecimal characters\n");
118*4882a593Smuzhiyun 			return -EINVAL;
119*4882a593Smuzhiyun 		}
120*4882a593Smuzhiyun 	}
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	return 0;
123*4882a593Smuzhiyun }
124*4882a593Smuzhiyun 
125*4882a593Smuzhiyun /*
126*4882a593Smuzhiyun  * valid_master_desc - verify the 'key-type:desc' of a new/updated master-key
127*4882a593Smuzhiyun  *
128*4882a593Smuzhiyun  * key-type:= "trusted:" | "user:"
129*4882a593Smuzhiyun  * desc:= master-key description
130*4882a593Smuzhiyun  *
131*4882a593Smuzhiyun  * Verify that 'key-type' is valid and that 'desc' exists. On key update,
132*4882a593Smuzhiyun  * only the master key description is permitted to change, not the key-type.
133*4882a593Smuzhiyun  * The key-type remains constant.
134*4882a593Smuzhiyun  *
135*4882a593Smuzhiyun  * On success returns 0, otherwise -EINVAL.
136*4882a593Smuzhiyun  */
valid_master_desc(const char * new_desc,const char * orig_desc)137*4882a593Smuzhiyun static int valid_master_desc(const char *new_desc, const char *orig_desc)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	int prefix_len;
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	if (!strncmp(new_desc, KEY_TRUSTED_PREFIX, KEY_TRUSTED_PREFIX_LEN))
142*4882a593Smuzhiyun 		prefix_len = KEY_TRUSTED_PREFIX_LEN;
143*4882a593Smuzhiyun 	else if (!strncmp(new_desc, KEY_USER_PREFIX, KEY_USER_PREFIX_LEN))
144*4882a593Smuzhiyun 		prefix_len = KEY_USER_PREFIX_LEN;
145*4882a593Smuzhiyun 	else
146*4882a593Smuzhiyun 		return -EINVAL;
147*4882a593Smuzhiyun 
148*4882a593Smuzhiyun 	if (!new_desc[prefix_len])
149*4882a593Smuzhiyun 		return -EINVAL;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	if (orig_desc && strncmp(new_desc, orig_desc, prefix_len))
152*4882a593Smuzhiyun 		return -EINVAL;
153*4882a593Smuzhiyun 
154*4882a593Smuzhiyun 	return 0;
155*4882a593Smuzhiyun }
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun /*
158*4882a593Smuzhiyun  * datablob_parse - parse the keyctl data
159*4882a593Smuzhiyun  *
160*4882a593Smuzhiyun  * datablob format:
161*4882a593Smuzhiyun  * new [<format>] <master-key name> <decrypted data length>
162*4882a593Smuzhiyun  * load [<format>] <master-key name> <decrypted data length>
163*4882a593Smuzhiyun  *     <encrypted iv + data>
164*4882a593Smuzhiyun  * update <new-master-key name>
165*4882a593Smuzhiyun  *
166*4882a593Smuzhiyun  * Tokenizes a copy of the keyctl data, returning a pointer to each token,
167*4882a593Smuzhiyun  * which is null terminated.
168*4882a593Smuzhiyun  *
169*4882a593Smuzhiyun  * On success returns 0, otherwise -EINVAL.
170*4882a593Smuzhiyun  */
datablob_parse(char * datablob,const char ** format,char ** master_desc,char ** decrypted_datalen,char ** hex_encoded_iv)171*4882a593Smuzhiyun static int datablob_parse(char *datablob, const char **format,
172*4882a593Smuzhiyun 			  char **master_desc, char **decrypted_datalen,
173*4882a593Smuzhiyun 			  char **hex_encoded_iv)
174*4882a593Smuzhiyun {
175*4882a593Smuzhiyun 	substring_t args[MAX_OPT_ARGS];
176*4882a593Smuzhiyun 	int ret = -EINVAL;
177*4882a593Smuzhiyun 	int key_cmd;
178*4882a593Smuzhiyun 	int key_format;
179*4882a593Smuzhiyun 	char *p, *keyword;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 	keyword = strsep(&datablob, " \t");
182*4882a593Smuzhiyun 	if (!keyword) {
183*4882a593Smuzhiyun 		pr_info("encrypted_key: insufficient parameters specified\n");
184*4882a593Smuzhiyun 		return ret;
185*4882a593Smuzhiyun 	}
186*4882a593Smuzhiyun 	key_cmd = match_token(keyword, key_tokens, args);
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	/* Get optional format: default | ecryptfs */
189*4882a593Smuzhiyun 	p = strsep(&datablob, " \t");
190*4882a593Smuzhiyun 	if (!p) {
191*4882a593Smuzhiyun 		pr_err("encrypted_key: insufficient parameters specified\n");
192*4882a593Smuzhiyun 		return ret;
193*4882a593Smuzhiyun 	}
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun 	key_format = match_token(p, key_format_tokens, args);
196*4882a593Smuzhiyun 	switch (key_format) {
197*4882a593Smuzhiyun 	case Opt_ecryptfs:
198*4882a593Smuzhiyun 	case Opt_enc32:
199*4882a593Smuzhiyun 	case Opt_default:
200*4882a593Smuzhiyun 		*format = p;
201*4882a593Smuzhiyun 		*master_desc = strsep(&datablob, " \t");
202*4882a593Smuzhiyun 		break;
203*4882a593Smuzhiyun 	case Opt_error:
204*4882a593Smuzhiyun 		*master_desc = p;
205*4882a593Smuzhiyun 		break;
206*4882a593Smuzhiyun 	}
207*4882a593Smuzhiyun 
208*4882a593Smuzhiyun 	if (!*master_desc) {
209*4882a593Smuzhiyun 		pr_info("encrypted_key: master key parameter is missing\n");
210*4882a593Smuzhiyun 		goto out;
211*4882a593Smuzhiyun 	}
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun 	if (valid_master_desc(*master_desc, NULL) < 0) {
214*4882a593Smuzhiyun 		pr_info("encrypted_key: master key parameter \'%s\' "
215*4882a593Smuzhiyun 			"is invalid\n", *master_desc);
216*4882a593Smuzhiyun 		goto out;
217*4882a593Smuzhiyun 	}
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun 	if (decrypted_datalen) {
220*4882a593Smuzhiyun 		*decrypted_datalen = strsep(&datablob, " \t");
221*4882a593Smuzhiyun 		if (!*decrypted_datalen) {
222*4882a593Smuzhiyun 			pr_info("encrypted_key: keylen parameter is missing\n");
223*4882a593Smuzhiyun 			goto out;
224*4882a593Smuzhiyun 		}
225*4882a593Smuzhiyun 	}
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun 	switch (key_cmd) {
228*4882a593Smuzhiyun 	case Opt_new:
229*4882a593Smuzhiyun 		if (!decrypted_datalen) {
230*4882a593Smuzhiyun 			pr_info("encrypted_key: keyword \'%s\' not allowed "
231*4882a593Smuzhiyun 				"when called from .update method\n", keyword);
232*4882a593Smuzhiyun 			break;
233*4882a593Smuzhiyun 		}
234*4882a593Smuzhiyun 		ret = 0;
235*4882a593Smuzhiyun 		break;
236*4882a593Smuzhiyun 	case Opt_load:
237*4882a593Smuzhiyun 		if (!decrypted_datalen) {
238*4882a593Smuzhiyun 			pr_info("encrypted_key: keyword \'%s\' not allowed "
239*4882a593Smuzhiyun 				"when called from .update method\n", keyword);
240*4882a593Smuzhiyun 			break;
241*4882a593Smuzhiyun 		}
242*4882a593Smuzhiyun 		*hex_encoded_iv = strsep(&datablob, " \t");
243*4882a593Smuzhiyun 		if (!*hex_encoded_iv) {
244*4882a593Smuzhiyun 			pr_info("encrypted_key: hex blob is missing\n");
245*4882a593Smuzhiyun 			break;
246*4882a593Smuzhiyun 		}
247*4882a593Smuzhiyun 		ret = 0;
248*4882a593Smuzhiyun 		break;
249*4882a593Smuzhiyun 	case Opt_update:
250*4882a593Smuzhiyun 		if (decrypted_datalen) {
251*4882a593Smuzhiyun 			pr_info("encrypted_key: keyword \'%s\' not allowed "
252*4882a593Smuzhiyun 				"when called from .instantiate method\n",
253*4882a593Smuzhiyun 				keyword);
254*4882a593Smuzhiyun 			break;
255*4882a593Smuzhiyun 		}
256*4882a593Smuzhiyun 		ret = 0;
257*4882a593Smuzhiyun 		break;
258*4882a593Smuzhiyun 	case Opt_err:
259*4882a593Smuzhiyun 		pr_info("encrypted_key: keyword \'%s\' not recognized\n",
260*4882a593Smuzhiyun 			keyword);
261*4882a593Smuzhiyun 		break;
262*4882a593Smuzhiyun 	}
263*4882a593Smuzhiyun out:
264*4882a593Smuzhiyun 	return ret;
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun /*
268*4882a593Smuzhiyun  * datablob_format - format as an ascii string, before copying to userspace
269*4882a593Smuzhiyun  */
datablob_format(struct encrypted_key_payload * epayload,size_t asciiblob_len)270*4882a593Smuzhiyun static char *datablob_format(struct encrypted_key_payload *epayload,
271*4882a593Smuzhiyun 			     size_t asciiblob_len)
272*4882a593Smuzhiyun {
273*4882a593Smuzhiyun 	char *ascii_buf, *bufp;
274*4882a593Smuzhiyun 	u8 *iv = epayload->iv;
275*4882a593Smuzhiyun 	int len;
276*4882a593Smuzhiyun 	int i;
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun 	ascii_buf = kmalloc(asciiblob_len + 1, GFP_KERNEL);
279*4882a593Smuzhiyun 	if (!ascii_buf)
280*4882a593Smuzhiyun 		goto out;
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun 	ascii_buf[asciiblob_len] = '\0';
283*4882a593Smuzhiyun 
284*4882a593Smuzhiyun 	/* copy datablob master_desc and datalen strings */
285*4882a593Smuzhiyun 	len = sprintf(ascii_buf, "%s %s %s ", epayload->format,
286*4882a593Smuzhiyun 		      epayload->master_desc, epayload->datalen);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	/* convert the hex encoded iv, encrypted-data and HMAC to ascii */
289*4882a593Smuzhiyun 	bufp = &ascii_buf[len];
290*4882a593Smuzhiyun 	for (i = 0; i < (asciiblob_len - len) / 2; i++)
291*4882a593Smuzhiyun 		bufp = hex_byte_pack(bufp, iv[i]);
292*4882a593Smuzhiyun out:
293*4882a593Smuzhiyun 	return ascii_buf;
294*4882a593Smuzhiyun }
295*4882a593Smuzhiyun 
296*4882a593Smuzhiyun /*
297*4882a593Smuzhiyun  * request_user_key - request the user key
298*4882a593Smuzhiyun  *
299*4882a593Smuzhiyun  * Use a user provided key to encrypt/decrypt an encrypted-key.
300*4882a593Smuzhiyun  */
request_user_key(const char * master_desc,const u8 ** master_key,size_t * master_keylen)301*4882a593Smuzhiyun static struct key *request_user_key(const char *master_desc, const u8 **master_key,
302*4882a593Smuzhiyun 				    size_t *master_keylen)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun 	const struct user_key_payload *upayload;
305*4882a593Smuzhiyun 	struct key *ukey;
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun 	ukey = request_key(&key_type_user, master_desc, NULL);
308*4882a593Smuzhiyun 	if (IS_ERR(ukey))
309*4882a593Smuzhiyun 		goto error;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	down_read(&ukey->sem);
312*4882a593Smuzhiyun 	upayload = user_key_payload_locked(ukey);
313*4882a593Smuzhiyun 	if (!upayload) {
314*4882a593Smuzhiyun 		/* key was revoked before we acquired its semaphore */
315*4882a593Smuzhiyun 		up_read(&ukey->sem);
316*4882a593Smuzhiyun 		key_put(ukey);
317*4882a593Smuzhiyun 		ukey = ERR_PTR(-EKEYREVOKED);
318*4882a593Smuzhiyun 		goto error;
319*4882a593Smuzhiyun 	}
320*4882a593Smuzhiyun 	*master_key = upayload->data;
321*4882a593Smuzhiyun 	*master_keylen = upayload->datalen;
322*4882a593Smuzhiyun error:
323*4882a593Smuzhiyun 	return ukey;
324*4882a593Smuzhiyun }
325*4882a593Smuzhiyun 
calc_hmac(u8 * digest,const u8 * key,unsigned int keylen,const u8 * buf,unsigned int buflen)326*4882a593Smuzhiyun static int calc_hmac(u8 *digest, const u8 *key, unsigned int keylen,
327*4882a593Smuzhiyun 		     const u8 *buf, unsigned int buflen)
328*4882a593Smuzhiyun {
329*4882a593Smuzhiyun 	struct crypto_shash *tfm;
330*4882a593Smuzhiyun 	int err;
331*4882a593Smuzhiyun 
332*4882a593Smuzhiyun 	tfm = crypto_alloc_shash(hmac_alg, 0, 0);
333*4882a593Smuzhiyun 	if (IS_ERR(tfm)) {
334*4882a593Smuzhiyun 		pr_err("encrypted_key: can't alloc %s transform: %ld\n",
335*4882a593Smuzhiyun 		       hmac_alg, PTR_ERR(tfm));
336*4882a593Smuzhiyun 		return PTR_ERR(tfm);
337*4882a593Smuzhiyun 	}
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	err = crypto_shash_setkey(tfm, key, keylen);
340*4882a593Smuzhiyun 	if (!err)
341*4882a593Smuzhiyun 		err = crypto_shash_tfm_digest(tfm, buf, buflen, digest);
342*4882a593Smuzhiyun 	crypto_free_shash(tfm);
343*4882a593Smuzhiyun 	return err;
344*4882a593Smuzhiyun }
345*4882a593Smuzhiyun 
346*4882a593Smuzhiyun enum derived_key_type { ENC_KEY, AUTH_KEY };
347*4882a593Smuzhiyun 
348*4882a593Smuzhiyun /* Derive authentication/encryption key from trusted key */
get_derived_key(u8 * derived_key,enum derived_key_type key_type,const u8 * master_key,size_t master_keylen)349*4882a593Smuzhiyun static int get_derived_key(u8 *derived_key, enum derived_key_type key_type,
350*4882a593Smuzhiyun 			   const u8 *master_key, size_t master_keylen)
351*4882a593Smuzhiyun {
352*4882a593Smuzhiyun 	u8 *derived_buf;
353*4882a593Smuzhiyun 	unsigned int derived_buf_len;
354*4882a593Smuzhiyun 	int ret;
355*4882a593Smuzhiyun 
356*4882a593Smuzhiyun 	derived_buf_len = strlen("AUTH_KEY") + 1 + master_keylen;
357*4882a593Smuzhiyun 	if (derived_buf_len < HASH_SIZE)
358*4882a593Smuzhiyun 		derived_buf_len = HASH_SIZE;
359*4882a593Smuzhiyun 
360*4882a593Smuzhiyun 	derived_buf = kzalloc(derived_buf_len, GFP_KERNEL);
361*4882a593Smuzhiyun 	if (!derived_buf)
362*4882a593Smuzhiyun 		return -ENOMEM;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	if (key_type)
365*4882a593Smuzhiyun 		strcpy(derived_buf, "AUTH_KEY");
366*4882a593Smuzhiyun 	else
367*4882a593Smuzhiyun 		strcpy(derived_buf, "ENC_KEY");
368*4882a593Smuzhiyun 
369*4882a593Smuzhiyun 	memcpy(derived_buf + strlen(derived_buf) + 1, master_key,
370*4882a593Smuzhiyun 	       master_keylen);
371*4882a593Smuzhiyun 	ret = crypto_shash_tfm_digest(hash_tfm, derived_buf, derived_buf_len,
372*4882a593Smuzhiyun 				      derived_key);
373*4882a593Smuzhiyun 	kfree_sensitive(derived_buf);
374*4882a593Smuzhiyun 	return ret;
375*4882a593Smuzhiyun }
376*4882a593Smuzhiyun 
init_skcipher_req(const u8 * key,unsigned int key_len)377*4882a593Smuzhiyun static struct skcipher_request *init_skcipher_req(const u8 *key,
378*4882a593Smuzhiyun 						  unsigned int key_len)
379*4882a593Smuzhiyun {
380*4882a593Smuzhiyun 	struct skcipher_request *req;
381*4882a593Smuzhiyun 	struct crypto_skcipher *tfm;
382*4882a593Smuzhiyun 	int ret;
383*4882a593Smuzhiyun 
384*4882a593Smuzhiyun 	tfm = crypto_alloc_skcipher(blkcipher_alg, 0, CRYPTO_ALG_ASYNC);
385*4882a593Smuzhiyun 	if (IS_ERR(tfm)) {
386*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to load %s transform (%ld)\n",
387*4882a593Smuzhiyun 		       blkcipher_alg, PTR_ERR(tfm));
388*4882a593Smuzhiyun 		return ERR_CAST(tfm);
389*4882a593Smuzhiyun 	}
390*4882a593Smuzhiyun 
391*4882a593Smuzhiyun 	ret = crypto_skcipher_setkey(tfm, key, key_len);
392*4882a593Smuzhiyun 	if (ret < 0) {
393*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to setkey (%d)\n", ret);
394*4882a593Smuzhiyun 		crypto_free_skcipher(tfm);
395*4882a593Smuzhiyun 		return ERR_PTR(ret);
396*4882a593Smuzhiyun 	}
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	req = skcipher_request_alloc(tfm, GFP_KERNEL);
399*4882a593Smuzhiyun 	if (!req) {
400*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to allocate request for %s\n",
401*4882a593Smuzhiyun 		       blkcipher_alg);
402*4882a593Smuzhiyun 		crypto_free_skcipher(tfm);
403*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
404*4882a593Smuzhiyun 	}
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun 	skcipher_request_set_callback(req, 0, NULL, NULL);
407*4882a593Smuzhiyun 	return req;
408*4882a593Smuzhiyun }
409*4882a593Smuzhiyun 
request_master_key(struct encrypted_key_payload * epayload,const u8 ** master_key,size_t * master_keylen)410*4882a593Smuzhiyun static struct key *request_master_key(struct encrypted_key_payload *epayload,
411*4882a593Smuzhiyun 				      const u8 **master_key, size_t *master_keylen)
412*4882a593Smuzhiyun {
413*4882a593Smuzhiyun 	struct key *mkey = ERR_PTR(-EINVAL);
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun 	if (!strncmp(epayload->master_desc, KEY_TRUSTED_PREFIX,
416*4882a593Smuzhiyun 		     KEY_TRUSTED_PREFIX_LEN)) {
417*4882a593Smuzhiyun 		mkey = request_trusted_key(epayload->master_desc +
418*4882a593Smuzhiyun 					   KEY_TRUSTED_PREFIX_LEN,
419*4882a593Smuzhiyun 					   master_key, master_keylen);
420*4882a593Smuzhiyun 	} else if (!strncmp(epayload->master_desc, KEY_USER_PREFIX,
421*4882a593Smuzhiyun 			    KEY_USER_PREFIX_LEN)) {
422*4882a593Smuzhiyun 		mkey = request_user_key(epayload->master_desc +
423*4882a593Smuzhiyun 					KEY_USER_PREFIX_LEN,
424*4882a593Smuzhiyun 					master_key, master_keylen);
425*4882a593Smuzhiyun 	} else
426*4882a593Smuzhiyun 		goto out;
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun 	if (IS_ERR(mkey)) {
429*4882a593Smuzhiyun 		int ret = PTR_ERR(mkey);
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 		if (ret == -ENOTSUPP)
432*4882a593Smuzhiyun 			pr_info("encrypted_key: key %s not supported",
433*4882a593Smuzhiyun 				epayload->master_desc);
434*4882a593Smuzhiyun 		else
435*4882a593Smuzhiyun 			pr_info("encrypted_key: key %s not found",
436*4882a593Smuzhiyun 				epayload->master_desc);
437*4882a593Smuzhiyun 		goto out;
438*4882a593Smuzhiyun 	}
439*4882a593Smuzhiyun 
440*4882a593Smuzhiyun 	dump_master_key(*master_key, *master_keylen);
441*4882a593Smuzhiyun out:
442*4882a593Smuzhiyun 	return mkey;
443*4882a593Smuzhiyun }
444*4882a593Smuzhiyun 
445*4882a593Smuzhiyun /* Before returning data to userspace, encrypt decrypted data. */
derived_key_encrypt(struct encrypted_key_payload * epayload,const u8 * derived_key,unsigned int derived_keylen)446*4882a593Smuzhiyun static int derived_key_encrypt(struct encrypted_key_payload *epayload,
447*4882a593Smuzhiyun 			       const u8 *derived_key,
448*4882a593Smuzhiyun 			       unsigned int derived_keylen)
449*4882a593Smuzhiyun {
450*4882a593Smuzhiyun 	struct scatterlist sg_in[2];
451*4882a593Smuzhiyun 	struct scatterlist sg_out[1];
452*4882a593Smuzhiyun 	struct crypto_skcipher *tfm;
453*4882a593Smuzhiyun 	struct skcipher_request *req;
454*4882a593Smuzhiyun 	unsigned int encrypted_datalen;
455*4882a593Smuzhiyun 	u8 iv[AES_BLOCK_SIZE];
456*4882a593Smuzhiyun 	int ret;
457*4882a593Smuzhiyun 
458*4882a593Smuzhiyun 	encrypted_datalen = roundup(epayload->decrypted_datalen, blksize);
459*4882a593Smuzhiyun 
460*4882a593Smuzhiyun 	req = init_skcipher_req(derived_key, derived_keylen);
461*4882a593Smuzhiyun 	ret = PTR_ERR(req);
462*4882a593Smuzhiyun 	if (IS_ERR(req))
463*4882a593Smuzhiyun 		goto out;
464*4882a593Smuzhiyun 	dump_decrypted_data(epayload);
465*4882a593Smuzhiyun 
466*4882a593Smuzhiyun 	sg_init_table(sg_in, 2);
467*4882a593Smuzhiyun 	sg_set_buf(&sg_in[0], epayload->decrypted_data,
468*4882a593Smuzhiyun 		   epayload->decrypted_datalen);
469*4882a593Smuzhiyun 	sg_set_page(&sg_in[1], ZERO_PAGE(0), AES_BLOCK_SIZE, 0);
470*4882a593Smuzhiyun 
471*4882a593Smuzhiyun 	sg_init_table(sg_out, 1);
472*4882a593Smuzhiyun 	sg_set_buf(sg_out, epayload->encrypted_data, encrypted_datalen);
473*4882a593Smuzhiyun 
474*4882a593Smuzhiyun 	memcpy(iv, epayload->iv, sizeof(iv));
475*4882a593Smuzhiyun 	skcipher_request_set_crypt(req, sg_in, sg_out, encrypted_datalen, iv);
476*4882a593Smuzhiyun 	ret = crypto_skcipher_encrypt(req);
477*4882a593Smuzhiyun 	tfm = crypto_skcipher_reqtfm(req);
478*4882a593Smuzhiyun 	skcipher_request_free(req);
479*4882a593Smuzhiyun 	crypto_free_skcipher(tfm);
480*4882a593Smuzhiyun 	if (ret < 0)
481*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to encrypt (%d)\n", ret);
482*4882a593Smuzhiyun 	else
483*4882a593Smuzhiyun 		dump_encrypted_data(epayload, encrypted_datalen);
484*4882a593Smuzhiyun out:
485*4882a593Smuzhiyun 	return ret;
486*4882a593Smuzhiyun }
487*4882a593Smuzhiyun 
datablob_hmac_append(struct encrypted_key_payload * epayload,const u8 * master_key,size_t master_keylen)488*4882a593Smuzhiyun static int datablob_hmac_append(struct encrypted_key_payload *epayload,
489*4882a593Smuzhiyun 				const u8 *master_key, size_t master_keylen)
490*4882a593Smuzhiyun {
491*4882a593Smuzhiyun 	u8 derived_key[HASH_SIZE];
492*4882a593Smuzhiyun 	u8 *digest;
493*4882a593Smuzhiyun 	int ret;
494*4882a593Smuzhiyun 
495*4882a593Smuzhiyun 	ret = get_derived_key(derived_key, AUTH_KEY, master_key, master_keylen);
496*4882a593Smuzhiyun 	if (ret < 0)
497*4882a593Smuzhiyun 		goto out;
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	digest = epayload->format + epayload->datablob_len;
500*4882a593Smuzhiyun 	ret = calc_hmac(digest, derived_key, sizeof derived_key,
501*4882a593Smuzhiyun 			epayload->format, epayload->datablob_len);
502*4882a593Smuzhiyun 	if (!ret)
503*4882a593Smuzhiyun 		dump_hmac(NULL, digest, HASH_SIZE);
504*4882a593Smuzhiyun out:
505*4882a593Smuzhiyun 	memzero_explicit(derived_key, sizeof(derived_key));
506*4882a593Smuzhiyun 	return ret;
507*4882a593Smuzhiyun }
508*4882a593Smuzhiyun 
509*4882a593Smuzhiyun /* verify HMAC before decrypting encrypted key */
datablob_hmac_verify(struct encrypted_key_payload * epayload,const u8 * format,const u8 * master_key,size_t master_keylen)510*4882a593Smuzhiyun static int datablob_hmac_verify(struct encrypted_key_payload *epayload,
511*4882a593Smuzhiyun 				const u8 *format, const u8 *master_key,
512*4882a593Smuzhiyun 				size_t master_keylen)
513*4882a593Smuzhiyun {
514*4882a593Smuzhiyun 	u8 derived_key[HASH_SIZE];
515*4882a593Smuzhiyun 	u8 digest[HASH_SIZE];
516*4882a593Smuzhiyun 	int ret;
517*4882a593Smuzhiyun 	char *p;
518*4882a593Smuzhiyun 	unsigned short len;
519*4882a593Smuzhiyun 
520*4882a593Smuzhiyun 	ret = get_derived_key(derived_key, AUTH_KEY, master_key, master_keylen);
521*4882a593Smuzhiyun 	if (ret < 0)
522*4882a593Smuzhiyun 		goto out;
523*4882a593Smuzhiyun 
524*4882a593Smuzhiyun 	len = epayload->datablob_len;
525*4882a593Smuzhiyun 	if (!format) {
526*4882a593Smuzhiyun 		p = epayload->master_desc;
527*4882a593Smuzhiyun 		len -= strlen(epayload->format) + 1;
528*4882a593Smuzhiyun 	} else
529*4882a593Smuzhiyun 		p = epayload->format;
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun 	ret = calc_hmac(digest, derived_key, sizeof derived_key, p, len);
532*4882a593Smuzhiyun 	if (ret < 0)
533*4882a593Smuzhiyun 		goto out;
534*4882a593Smuzhiyun 	ret = crypto_memneq(digest, epayload->format + epayload->datablob_len,
535*4882a593Smuzhiyun 			    sizeof(digest));
536*4882a593Smuzhiyun 	if (ret) {
537*4882a593Smuzhiyun 		ret = -EINVAL;
538*4882a593Smuzhiyun 		dump_hmac("datablob",
539*4882a593Smuzhiyun 			  epayload->format + epayload->datablob_len,
540*4882a593Smuzhiyun 			  HASH_SIZE);
541*4882a593Smuzhiyun 		dump_hmac("calc", digest, HASH_SIZE);
542*4882a593Smuzhiyun 	}
543*4882a593Smuzhiyun out:
544*4882a593Smuzhiyun 	memzero_explicit(derived_key, sizeof(derived_key));
545*4882a593Smuzhiyun 	return ret;
546*4882a593Smuzhiyun }
547*4882a593Smuzhiyun 
derived_key_decrypt(struct encrypted_key_payload * epayload,const u8 * derived_key,unsigned int derived_keylen)548*4882a593Smuzhiyun static int derived_key_decrypt(struct encrypted_key_payload *epayload,
549*4882a593Smuzhiyun 			       const u8 *derived_key,
550*4882a593Smuzhiyun 			       unsigned int derived_keylen)
551*4882a593Smuzhiyun {
552*4882a593Smuzhiyun 	struct scatterlist sg_in[1];
553*4882a593Smuzhiyun 	struct scatterlist sg_out[2];
554*4882a593Smuzhiyun 	struct crypto_skcipher *tfm;
555*4882a593Smuzhiyun 	struct skcipher_request *req;
556*4882a593Smuzhiyun 	unsigned int encrypted_datalen;
557*4882a593Smuzhiyun 	u8 iv[AES_BLOCK_SIZE];
558*4882a593Smuzhiyun 	u8 *pad;
559*4882a593Smuzhiyun 	int ret;
560*4882a593Smuzhiyun 
561*4882a593Smuzhiyun 	/* Throwaway buffer to hold the unused zero padding at the end */
562*4882a593Smuzhiyun 	pad = kmalloc(AES_BLOCK_SIZE, GFP_KERNEL);
563*4882a593Smuzhiyun 	if (!pad)
564*4882a593Smuzhiyun 		return -ENOMEM;
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	encrypted_datalen = roundup(epayload->decrypted_datalen, blksize);
567*4882a593Smuzhiyun 	req = init_skcipher_req(derived_key, derived_keylen);
568*4882a593Smuzhiyun 	ret = PTR_ERR(req);
569*4882a593Smuzhiyun 	if (IS_ERR(req))
570*4882a593Smuzhiyun 		goto out;
571*4882a593Smuzhiyun 	dump_encrypted_data(epayload, encrypted_datalen);
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	sg_init_table(sg_in, 1);
574*4882a593Smuzhiyun 	sg_init_table(sg_out, 2);
575*4882a593Smuzhiyun 	sg_set_buf(sg_in, epayload->encrypted_data, encrypted_datalen);
576*4882a593Smuzhiyun 	sg_set_buf(&sg_out[0], epayload->decrypted_data,
577*4882a593Smuzhiyun 		   epayload->decrypted_datalen);
578*4882a593Smuzhiyun 	sg_set_buf(&sg_out[1], pad, AES_BLOCK_SIZE);
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	memcpy(iv, epayload->iv, sizeof(iv));
581*4882a593Smuzhiyun 	skcipher_request_set_crypt(req, sg_in, sg_out, encrypted_datalen, iv);
582*4882a593Smuzhiyun 	ret = crypto_skcipher_decrypt(req);
583*4882a593Smuzhiyun 	tfm = crypto_skcipher_reqtfm(req);
584*4882a593Smuzhiyun 	skcipher_request_free(req);
585*4882a593Smuzhiyun 	crypto_free_skcipher(tfm);
586*4882a593Smuzhiyun 	if (ret < 0)
587*4882a593Smuzhiyun 		goto out;
588*4882a593Smuzhiyun 	dump_decrypted_data(epayload);
589*4882a593Smuzhiyun out:
590*4882a593Smuzhiyun 	kfree(pad);
591*4882a593Smuzhiyun 	return ret;
592*4882a593Smuzhiyun }
593*4882a593Smuzhiyun 
594*4882a593Smuzhiyun /* Allocate memory for decrypted key and datablob. */
encrypted_key_alloc(struct key * key,const char * format,const char * master_desc,const char * datalen)595*4882a593Smuzhiyun static struct encrypted_key_payload *encrypted_key_alloc(struct key *key,
596*4882a593Smuzhiyun 							 const char *format,
597*4882a593Smuzhiyun 							 const char *master_desc,
598*4882a593Smuzhiyun 							 const char *datalen)
599*4882a593Smuzhiyun {
600*4882a593Smuzhiyun 	struct encrypted_key_payload *epayload = NULL;
601*4882a593Smuzhiyun 	unsigned short datablob_len;
602*4882a593Smuzhiyun 	unsigned short decrypted_datalen;
603*4882a593Smuzhiyun 	unsigned short payload_datalen;
604*4882a593Smuzhiyun 	unsigned int encrypted_datalen;
605*4882a593Smuzhiyun 	unsigned int format_len;
606*4882a593Smuzhiyun 	long dlen;
607*4882a593Smuzhiyun 	int ret;
608*4882a593Smuzhiyun 
609*4882a593Smuzhiyun 	ret = kstrtol(datalen, 10, &dlen);
610*4882a593Smuzhiyun 	if (ret < 0 || dlen < MIN_DATA_SIZE || dlen > MAX_DATA_SIZE)
611*4882a593Smuzhiyun 		return ERR_PTR(-EINVAL);
612*4882a593Smuzhiyun 
613*4882a593Smuzhiyun 	format_len = (!format) ? strlen(key_format_default) : strlen(format);
614*4882a593Smuzhiyun 	decrypted_datalen = dlen;
615*4882a593Smuzhiyun 	payload_datalen = decrypted_datalen;
616*4882a593Smuzhiyun 	if (format) {
617*4882a593Smuzhiyun 		if (!strcmp(format, key_format_ecryptfs)) {
618*4882a593Smuzhiyun 			if (dlen != ECRYPTFS_MAX_KEY_BYTES) {
619*4882a593Smuzhiyun 				pr_err("encrypted_key: keylen for the ecryptfs format must be equal to %d bytes\n",
620*4882a593Smuzhiyun 					ECRYPTFS_MAX_KEY_BYTES);
621*4882a593Smuzhiyun 				return ERR_PTR(-EINVAL);
622*4882a593Smuzhiyun 			}
623*4882a593Smuzhiyun 			decrypted_datalen = ECRYPTFS_MAX_KEY_BYTES;
624*4882a593Smuzhiyun 			payload_datalen = sizeof(struct ecryptfs_auth_tok);
625*4882a593Smuzhiyun 		} else if (!strcmp(format, key_format_enc32)) {
626*4882a593Smuzhiyun 			if (decrypted_datalen != KEY_ENC32_PAYLOAD_LEN) {
627*4882a593Smuzhiyun 				pr_err("encrypted_key: enc32 key payload incorrect length: %d\n",
628*4882a593Smuzhiyun 						decrypted_datalen);
629*4882a593Smuzhiyun 				return ERR_PTR(-EINVAL);
630*4882a593Smuzhiyun 			}
631*4882a593Smuzhiyun 		}
632*4882a593Smuzhiyun 	}
633*4882a593Smuzhiyun 
634*4882a593Smuzhiyun 	encrypted_datalen = roundup(decrypted_datalen, blksize);
635*4882a593Smuzhiyun 
636*4882a593Smuzhiyun 	datablob_len = format_len + 1 + strlen(master_desc) + 1
637*4882a593Smuzhiyun 	    + strlen(datalen) + 1 + ivsize + 1 + encrypted_datalen;
638*4882a593Smuzhiyun 
639*4882a593Smuzhiyun 	ret = key_payload_reserve(key, payload_datalen + datablob_len
640*4882a593Smuzhiyun 				  + HASH_SIZE + 1);
641*4882a593Smuzhiyun 	if (ret < 0)
642*4882a593Smuzhiyun 		return ERR_PTR(ret);
643*4882a593Smuzhiyun 
644*4882a593Smuzhiyun 	epayload = kzalloc(sizeof(*epayload) + payload_datalen +
645*4882a593Smuzhiyun 			   datablob_len + HASH_SIZE + 1, GFP_KERNEL);
646*4882a593Smuzhiyun 	if (!epayload)
647*4882a593Smuzhiyun 		return ERR_PTR(-ENOMEM);
648*4882a593Smuzhiyun 
649*4882a593Smuzhiyun 	epayload->payload_datalen = payload_datalen;
650*4882a593Smuzhiyun 	epayload->decrypted_datalen = decrypted_datalen;
651*4882a593Smuzhiyun 	epayload->datablob_len = datablob_len;
652*4882a593Smuzhiyun 	return epayload;
653*4882a593Smuzhiyun }
654*4882a593Smuzhiyun 
encrypted_key_decrypt(struct encrypted_key_payload * epayload,const char * format,const char * hex_encoded_iv)655*4882a593Smuzhiyun static int encrypted_key_decrypt(struct encrypted_key_payload *epayload,
656*4882a593Smuzhiyun 				 const char *format, const char *hex_encoded_iv)
657*4882a593Smuzhiyun {
658*4882a593Smuzhiyun 	struct key *mkey;
659*4882a593Smuzhiyun 	u8 derived_key[HASH_SIZE];
660*4882a593Smuzhiyun 	const u8 *master_key;
661*4882a593Smuzhiyun 	u8 *hmac;
662*4882a593Smuzhiyun 	const char *hex_encoded_data;
663*4882a593Smuzhiyun 	unsigned int encrypted_datalen;
664*4882a593Smuzhiyun 	size_t master_keylen;
665*4882a593Smuzhiyun 	size_t asciilen;
666*4882a593Smuzhiyun 	int ret;
667*4882a593Smuzhiyun 
668*4882a593Smuzhiyun 	encrypted_datalen = roundup(epayload->decrypted_datalen, blksize);
669*4882a593Smuzhiyun 	asciilen = (ivsize + 1 + encrypted_datalen + HASH_SIZE) * 2;
670*4882a593Smuzhiyun 	if (strlen(hex_encoded_iv) != asciilen)
671*4882a593Smuzhiyun 		return -EINVAL;
672*4882a593Smuzhiyun 
673*4882a593Smuzhiyun 	hex_encoded_data = hex_encoded_iv + (2 * ivsize) + 2;
674*4882a593Smuzhiyun 	ret = hex2bin(epayload->iv, hex_encoded_iv, ivsize);
675*4882a593Smuzhiyun 	if (ret < 0)
676*4882a593Smuzhiyun 		return -EINVAL;
677*4882a593Smuzhiyun 	ret = hex2bin(epayload->encrypted_data, hex_encoded_data,
678*4882a593Smuzhiyun 		      encrypted_datalen);
679*4882a593Smuzhiyun 	if (ret < 0)
680*4882a593Smuzhiyun 		return -EINVAL;
681*4882a593Smuzhiyun 
682*4882a593Smuzhiyun 	hmac = epayload->format + epayload->datablob_len;
683*4882a593Smuzhiyun 	ret = hex2bin(hmac, hex_encoded_data + (encrypted_datalen * 2),
684*4882a593Smuzhiyun 		      HASH_SIZE);
685*4882a593Smuzhiyun 	if (ret < 0)
686*4882a593Smuzhiyun 		return -EINVAL;
687*4882a593Smuzhiyun 
688*4882a593Smuzhiyun 	mkey = request_master_key(epayload, &master_key, &master_keylen);
689*4882a593Smuzhiyun 	if (IS_ERR(mkey))
690*4882a593Smuzhiyun 		return PTR_ERR(mkey);
691*4882a593Smuzhiyun 
692*4882a593Smuzhiyun 	ret = datablob_hmac_verify(epayload, format, master_key, master_keylen);
693*4882a593Smuzhiyun 	if (ret < 0) {
694*4882a593Smuzhiyun 		pr_err("encrypted_key: bad hmac (%d)\n", ret);
695*4882a593Smuzhiyun 		goto out;
696*4882a593Smuzhiyun 	}
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun 	ret = get_derived_key(derived_key, ENC_KEY, master_key, master_keylen);
699*4882a593Smuzhiyun 	if (ret < 0)
700*4882a593Smuzhiyun 		goto out;
701*4882a593Smuzhiyun 
702*4882a593Smuzhiyun 	ret = derived_key_decrypt(epayload, derived_key, sizeof derived_key);
703*4882a593Smuzhiyun 	if (ret < 0)
704*4882a593Smuzhiyun 		pr_err("encrypted_key: failed to decrypt key (%d)\n", ret);
705*4882a593Smuzhiyun out:
706*4882a593Smuzhiyun 	up_read(&mkey->sem);
707*4882a593Smuzhiyun 	key_put(mkey);
708*4882a593Smuzhiyun 	memzero_explicit(derived_key, sizeof(derived_key));
709*4882a593Smuzhiyun 	return ret;
710*4882a593Smuzhiyun }
711*4882a593Smuzhiyun 
__ekey_init(struct encrypted_key_payload * epayload,const char * format,const char * master_desc,const char * datalen)712*4882a593Smuzhiyun static void __ekey_init(struct encrypted_key_payload *epayload,
713*4882a593Smuzhiyun 			const char *format, const char *master_desc,
714*4882a593Smuzhiyun 			const char *datalen)
715*4882a593Smuzhiyun {
716*4882a593Smuzhiyun 	unsigned int format_len;
717*4882a593Smuzhiyun 
718*4882a593Smuzhiyun 	format_len = (!format) ? strlen(key_format_default) : strlen(format);
719*4882a593Smuzhiyun 	epayload->format = epayload->payload_data + epayload->payload_datalen;
720*4882a593Smuzhiyun 	epayload->master_desc = epayload->format + format_len + 1;
721*4882a593Smuzhiyun 	epayload->datalen = epayload->master_desc + strlen(master_desc) + 1;
722*4882a593Smuzhiyun 	epayload->iv = epayload->datalen + strlen(datalen) + 1;
723*4882a593Smuzhiyun 	epayload->encrypted_data = epayload->iv + ivsize + 1;
724*4882a593Smuzhiyun 	epayload->decrypted_data = epayload->payload_data;
725*4882a593Smuzhiyun 
726*4882a593Smuzhiyun 	if (!format)
727*4882a593Smuzhiyun 		memcpy(epayload->format, key_format_default, format_len);
728*4882a593Smuzhiyun 	else {
729*4882a593Smuzhiyun 		if (!strcmp(format, key_format_ecryptfs))
730*4882a593Smuzhiyun 			epayload->decrypted_data =
731*4882a593Smuzhiyun 				ecryptfs_get_auth_tok_key((struct ecryptfs_auth_tok *)epayload->payload_data);
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun 		memcpy(epayload->format, format, format_len);
734*4882a593Smuzhiyun 	}
735*4882a593Smuzhiyun 
736*4882a593Smuzhiyun 	memcpy(epayload->master_desc, master_desc, strlen(master_desc));
737*4882a593Smuzhiyun 	memcpy(epayload->datalen, datalen, strlen(datalen));
738*4882a593Smuzhiyun }
739*4882a593Smuzhiyun 
740*4882a593Smuzhiyun /*
741*4882a593Smuzhiyun  * encrypted_init - initialize an encrypted key
742*4882a593Smuzhiyun  *
743*4882a593Smuzhiyun  * For a new key, use a random number for both the iv and data
744*4882a593Smuzhiyun  * itself.  For an old key, decrypt the hex encoded data.
745*4882a593Smuzhiyun  */
encrypted_init(struct encrypted_key_payload * epayload,const char * key_desc,const char * format,const char * master_desc,const char * datalen,const char * hex_encoded_iv)746*4882a593Smuzhiyun static int encrypted_init(struct encrypted_key_payload *epayload,
747*4882a593Smuzhiyun 			  const char *key_desc, const char *format,
748*4882a593Smuzhiyun 			  const char *master_desc, const char *datalen,
749*4882a593Smuzhiyun 			  const char *hex_encoded_iv)
750*4882a593Smuzhiyun {
751*4882a593Smuzhiyun 	int ret = 0;
752*4882a593Smuzhiyun 
753*4882a593Smuzhiyun 	if (format && !strcmp(format, key_format_ecryptfs)) {
754*4882a593Smuzhiyun 		ret = valid_ecryptfs_desc(key_desc);
755*4882a593Smuzhiyun 		if (ret < 0)
756*4882a593Smuzhiyun 			return ret;
757*4882a593Smuzhiyun 
758*4882a593Smuzhiyun 		ecryptfs_fill_auth_tok((struct ecryptfs_auth_tok *)epayload->payload_data,
759*4882a593Smuzhiyun 				       key_desc);
760*4882a593Smuzhiyun 	}
761*4882a593Smuzhiyun 
762*4882a593Smuzhiyun 	__ekey_init(epayload, format, master_desc, datalen);
763*4882a593Smuzhiyun 	if (!hex_encoded_iv) {
764*4882a593Smuzhiyun 		get_random_bytes(epayload->iv, ivsize);
765*4882a593Smuzhiyun 
766*4882a593Smuzhiyun 		get_random_bytes(epayload->decrypted_data,
767*4882a593Smuzhiyun 				 epayload->decrypted_datalen);
768*4882a593Smuzhiyun 	} else
769*4882a593Smuzhiyun 		ret = encrypted_key_decrypt(epayload, format, hex_encoded_iv);
770*4882a593Smuzhiyun 	return ret;
771*4882a593Smuzhiyun }
772*4882a593Smuzhiyun 
773*4882a593Smuzhiyun /*
774*4882a593Smuzhiyun  * encrypted_instantiate - instantiate an encrypted key
775*4882a593Smuzhiyun  *
776*4882a593Smuzhiyun  * Decrypt an existing encrypted datablob or create a new encrypted key
777*4882a593Smuzhiyun  * based on a kernel random number.
778*4882a593Smuzhiyun  *
779*4882a593Smuzhiyun  * On success, return 0. Otherwise return errno.
780*4882a593Smuzhiyun  */
encrypted_instantiate(struct key * key,struct key_preparsed_payload * prep)781*4882a593Smuzhiyun static int encrypted_instantiate(struct key *key,
782*4882a593Smuzhiyun 				 struct key_preparsed_payload *prep)
783*4882a593Smuzhiyun {
784*4882a593Smuzhiyun 	struct encrypted_key_payload *epayload = NULL;
785*4882a593Smuzhiyun 	char *datablob = NULL;
786*4882a593Smuzhiyun 	const char *format = NULL;
787*4882a593Smuzhiyun 	char *master_desc = NULL;
788*4882a593Smuzhiyun 	char *decrypted_datalen = NULL;
789*4882a593Smuzhiyun 	char *hex_encoded_iv = NULL;
790*4882a593Smuzhiyun 	size_t datalen = prep->datalen;
791*4882a593Smuzhiyun 	int ret;
792*4882a593Smuzhiyun 
793*4882a593Smuzhiyun 	if (datalen <= 0 || datalen > 32767 || !prep->data)
794*4882a593Smuzhiyun 		return -EINVAL;
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun 	datablob = kmalloc(datalen + 1, GFP_KERNEL);
797*4882a593Smuzhiyun 	if (!datablob)
798*4882a593Smuzhiyun 		return -ENOMEM;
799*4882a593Smuzhiyun 	datablob[datalen] = 0;
800*4882a593Smuzhiyun 	memcpy(datablob, prep->data, datalen);
801*4882a593Smuzhiyun 	ret = datablob_parse(datablob, &format, &master_desc,
802*4882a593Smuzhiyun 			     &decrypted_datalen, &hex_encoded_iv);
803*4882a593Smuzhiyun 	if (ret < 0)
804*4882a593Smuzhiyun 		goto out;
805*4882a593Smuzhiyun 
806*4882a593Smuzhiyun 	epayload = encrypted_key_alloc(key, format, master_desc,
807*4882a593Smuzhiyun 				       decrypted_datalen);
808*4882a593Smuzhiyun 	if (IS_ERR(epayload)) {
809*4882a593Smuzhiyun 		ret = PTR_ERR(epayload);
810*4882a593Smuzhiyun 		goto out;
811*4882a593Smuzhiyun 	}
812*4882a593Smuzhiyun 	ret = encrypted_init(epayload, key->description, format, master_desc,
813*4882a593Smuzhiyun 			     decrypted_datalen, hex_encoded_iv);
814*4882a593Smuzhiyun 	if (ret < 0) {
815*4882a593Smuzhiyun 		kfree_sensitive(epayload);
816*4882a593Smuzhiyun 		goto out;
817*4882a593Smuzhiyun 	}
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun 	rcu_assign_keypointer(key, epayload);
820*4882a593Smuzhiyun out:
821*4882a593Smuzhiyun 	kfree_sensitive(datablob);
822*4882a593Smuzhiyun 	return ret;
823*4882a593Smuzhiyun }
824*4882a593Smuzhiyun 
encrypted_rcu_free(struct rcu_head * rcu)825*4882a593Smuzhiyun static void encrypted_rcu_free(struct rcu_head *rcu)
826*4882a593Smuzhiyun {
827*4882a593Smuzhiyun 	struct encrypted_key_payload *epayload;
828*4882a593Smuzhiyun 
829*4882a593Smuzhiyun 	epayload = container_of(rcu, struct encrypted_key_payload, rcu);
830*4882a593Smuzhiyun 	kfree_sensitive(epayload);
831*4882a593Smuzhiyun }
832*4882a593Smuzhiyun 
833*4882a593Smuzhiyun /*
834*4882a593Smuzhiyun  * encrypted_update - update the master key description
835*4882a593Smuzhiyun  *
836*4882a593Smuzhiyun  * Change the master key description for an existing encrypted key.
837*4882a593Smuzhiyun  * The next read will return an encrypted datablob using the new
838*4882a593Smuzhiyun  * master key description.
839*4882a593Smuzhiyun  *
840*4882a593Smuzhiyun  * On success, return 0. Otherwise return errno.
841*4882a593Smuzhiyun  */
encrypted_update(struct key * key,struct key_preparsed_payload * prep)842*4882a593Smuzhiyun static int encrypted_update(struct key *key, struct key_preparsed_payload *prep)
843*4882a593Smuzhiyun {
844*4882a593Smuzhiyun 	struct encrypted_key_payload *epayload = key->payload.data[0];
845*4882a593Smuzhiyun 	struct encrypted_key_payload *new_epayload;
846*4882a593Smuzhiyun 	char *buf;
847*4882a593Smuzhiyun 	char *new_master_desc = NULL;
848*4882a593Smuzhiyun 	const char *format = NULL;
849*4882a593Smuzhiyun 	size_t datalen = prep->datalen;
850*4882a593Smuzhiyun 	int ret = 0;
851*4882a593Smuzhiyun 
852*4882a593Smuzhiyun 	if (key_is_negative(key))
853*4882a593Smuzhiyun 		return -ENOKEY;
854*4882a593Smuzhiyun 	if (datalen <= 0 || datalen > 32767 || !prep->data)
855*4882a593Smuzhiyun 		return -EINVAL;
856*4882a593Smuzhiyun 
857*4882a593Smuzhiyun 	buf = kmalloc(datalen + 1, GFP_KERNEL);
858*4882a593Smuzhiyun 	if (!buf)
859*4882a593Smuzhiyun 		return -ENOMEM;
860*4882a593Smuzhiyun 
861*4882a593Smuzhiyun 	buf[datalen] = 0;
862*4882a593Smuzhiyun 	memcpy(buf, prep->data, datalen);
863*4882a593Smuzhiyun 	ret = datablob_parse(buf, &format, &new_master_desc, NULL, NULL);
864*4882a593Smuzhiyun 	if (ret < 0)
865*4882a593Smuzhiyun 		goto out;
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun 	ret = valid_master_desc(new_master_desc, epayload->master_desc);
868*4882a593Smuzhiyun 	if (ret < 0)
869*4882a593Smuzhiyun 		goto out;
870*4882a593Smuzhiyun 
871*4882a593Smuzhiyun 	new_epayload = encrypted_key_alloc(key, epayload->format,
872*4882a593Smuzhiyun 					   new_master_desc, epayload->datalen);
873*4882a593Smuzhiyun 	if (IS_ERR(new_epayload)) {
874*4882a593Smuzhiyun 		ret = PTR_ERR(new_epayload);
875*4882a593Smuzhiyun 		goto out;
876*4882a593Smuzhiyun 	}
877*4882a593Smuzhiyun 
878*4882a593Smuzhiyun 	__ekey_init(new_epayload, epayload->format, new_master_desc,
879*4882a593Smuzhiyun 		    epayload->datalen);
880*4882a593Smuzhiyun 
881*4882a593Smuzhiyun 	memcpy(new_epayload->iv, epayload->iv, ivsize);
882*4882a593Smuzhiyun 	memcpy(new_epayload->payload_data, epayload->payload_data,
883*4882a593Smuzhiyun 	       epayload->payload_datalen);
884*4882a593Smuzhiyun 
885*4882a593Smuzhiyun 	rcu_assign_keypointer(key, new_epayload);
886*4882a593Smuzhiyun 	call_rcu(&epayload->rcu, encrypted_rcu_free);
887*4882a593Smuzhiyun out:
888*4882a593Smuzhiyun 	kfree_sensitive(buf);
889*4882a593Smuzhiyun 	return ret;
890*4882a593Smuzhiyun }
891*4882a593Smuzhiyun 
892*4882a593Smuzhiyun /*
893*4882a593Smuzhiyun  * encrypted_read - format and copy out the encrypted data
894*4882a593Smuzhiyun  *
895*4882a593Smuzhiyun  * The resulting datablob format is:
896*4882a593Smuzhiyun  * <master-key name> <decrypted data length> <encrypted iv> <encrypted data>
897*4882a593Smuzhiyun  *
898*4882a593Smuzhiyun  * On success, return to userspace the encrypted key datablob size.
899*4882a593Smuzhiyun  */
encrypted_read(const struct key * key,char * buffer,size_t buflen)900*4882a593Smuzhiyun static long encrypted_read(const struct key *key, char *buffer,
901*4882a593Smuzhiyun 			   size_t buflen)
902*4882a593Smuzhiyun {
903*4882a593Smuzhiyun 	struct encrypted_key_payload *epayload;
904*4882a593Smuzhiyun 	struct key *mkey;
905*4882a593Smuzhiyun 	const u8 *master_key;
906*4882a593Smuzhiyun 	size_t master_keylen;
907*4882a593Smuzhiyun 	char derived_key[HASH_SIZE];
908*4882a593Smuzhiyun 	char *ascii_buf;
909*4882a593Smuzhiyun 	size_t asciiblob_len;
910*4882a593Smuzhiyun 	int ret;
911*4882a593Smuzhiyun 
912*4882a593Smuzhiyun 	epayload = dereference_key_locked(key);
913*4882a593Smuzhiyun 
914*4882a593Smuzhiyun 	/* returns the hex encoded iv, encrypted-data, and hmac as ascii */
915*4882a593Smuzhiyun 	asciiblob_len = epayload->datablob_len + ivsize + 1
916*4882a593Smuzhiyun 	    + roundup(epayload->decrypted_datalen, blksize)
917*4882a593Smuzhiyun 	    + (HASH_SIZE * 2);
918*4882a593Smuzhiyun 
919*4882a593Smuzhiyun 	if (!buffer || buflen < asciiblob_len)
920*4882a593Smuzhiyun 		return asciiblob_len;
921*4882a593Smuzhiyun 
922*4882a593Smuzhiyun 	mkey = request_master_key(epayload, &master_key, &master_keylen);
923*4882a593Smuzhiyun 	if (IS_ERR(mkey))
924*4882a593Smuzhiyun 		return PTR_ERR(mkey);
925*4882a593Smuzhiyun 
926*4882a593Smuzhiyun 	ret = get_derived_key(derived_key, ENC_KEY, master_key, master_keylen);
927*4882a593Smuzhiyun 	if (ret < 0)
928*4882a593Smuzhiyun 		goto out;
929*4882a593Smuzhiyun 
930*4882a593Smuzhiyun 	ret = derived_key_encrypt(epayload, derived_key, sizeof derived_key);
931*4882a593Smuzhiyun 	if (ret < 0)
932*4882a593Smuzhiyun 		goto out;
933*4882a593Smuzhiyun 
934*4882a593Smuzhiyun 	ret = datablob_hmac_append(epayload, master_key, master_keylen);
935*4882a593Smuzhiyun 	if (ret < 0)
936*4882a593Smuzhiyun 		goto out;
937*4882a593Smuzhiyun 
938*4882a593Smuzhiyun 	ascii_buf = datablob_format(epayload, asciiblob_len);
939*4882a593Smuzhiyun 	if (!ascii_buf) {
940*4882a593Smuzhiyun 		ret = -ENOMEM;
941*4882a593Smuzhiyun 		goto out;
942*4882a593Smuzhiyun 	}
943*4882a593Smuzhiyun 
944*4882a593Smuzhiyun 	up_read(&mkey->sem);
945*4882a593Smuzhiyun 	key_put(mkey);
946*4882a593Smuzhiyun 	memzero_explicit(derived_key, sizeof(derived_key));
947*4882a593Smuzhiyun 
948*4882a593Smuzhiyun 	memcpy(buffer, ascii_buf, asciiblob_len);
949*4882a593Smuzhiyun 	kfree_sensitive(ascii_buf);
950*4882a593Smuzhiyun 
951*4882a593Smuzhiyun 	return asciiblob_len;
952*4882a593Smuzhiyun out:
953*4882a593Smuzhiyun 	up_read(&mkey->sem);
954*4882a593Smuzhiyun 	key_put(mkey);
955*4882a593Smuzhiyun 	memzero_explicit(derived_key, sizeof(derived_key));
956*4882a593Smuzhiyun 	return ret;
957*4882a593Smuzhiyun }
958*4882a593Smuzhiyun 
959*4882a593Smuzhiyun /*
960*4882a593Smuzhiyun  * encrypted_destroy - clear and free the key's payload
961*4882a593Smuzhiyun  */
encrypted_destroy(struct key * key)962*4882a593Smuzhiyun static void encrypted_destroy(struct key *key)
963*4882a593Smuzhiyun {
964*4882a593Smuzhiyun 	kfree_sensitive(key->payload.data[0]);
965*4882a593Smuzhiyun }
966*4882a593Smuzhiyun 
967*4882a593Smuzhiyun struct key_type key_type_encrypted = {
968*4882a593Smuzhiyun 	.name = "encrypted",
969*4882a593Smuzhiyun 	.instantiate = encrypted_instantiate,
970*4882a593Smuzhiyun 	.update = encrypted_update,
971*4882a593Smuzhiyun 	.destroy = encrypted_destroy,
972*4882a593Smuzhiyun 	.describe = user_describe,
973*4882a593Smuzhiyun 	.read = encrypted_read,
974*4882a593Smuzhiyun };
975*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(key_type_encrypted);
976*4882a593Smuzhiyun 
init_encrypted(void)977*4882a593Smuzhiyun static int __init init_encrypted(void)
978*4882a593Smuzhiyun {
979*4882a593Smuzhiyun 	int ret;
980*4882a593Smuzhiyun 
981*4882a593Smuzhiyun 	hash_tfm = crypto_alloc_shash(hash_alg, 0, 0);
982*4882a593Smuzhiyun 	if (IS_ERR(hash_tfm)) {
983*4882a593Smuzhiyun 		pr_err("encrypted_key: can't allocate %s transform: %ld\n",
984*4882a593Smuzhiyun 		       hash_alg, PTR_ERR(hash_tfm));
985*4882a593Smuzhiyun 		return PTR_ERR(hash_tfm);
986*4882a593Smuzhiyun 	}
987*4882a593Smuzhiyun 
988*4882a593Smuzhiyun 	ret = aes_get_sizes();
989*4882a593Smuzhiyun 	if (ret < 0)
990*4882a593Smuzhiyun 		goto out;
991*4882a593Smuzhiyun 	ret = register_key_type(&key_type_encrypted);
992*4882a593Smuzhiyun 	if (ret < 0)
993*4882a593Smuzhiyun 		goto out;
994*4882a593Smuzhiyun 	return 0;
995*4882a593Smuzhiyun out:
996*4882a593Smuzhiyun 	crypto_free_shash(hash_tfm);
997*4882a593Smuzhiyun 	return ret;
998*4882a593Smuzhiyun 
999*4882a593Smuzhiyun }
1000*4882a593Smuzhiyun 
cleanup_encrypted(void)1001*4882a593Smuzhiyun static void __exit cleanup_encrypted(void)
1002*4882a593Smuzhiyun {
1003*4882a593Smuzhiyun 	crypto_free_shash(hash_tfm);
1004*4882a593Smuzhiyun 	unregister_key_type(&key_type_encrypted);
1005*4882a593Smuzhiyun }
1006*4882a593Smuzhiyun 
1007*4882a593Smuzhiyun late_initcall(init_encrypted);
1008*4882a593Smuzhiyun module_exit(cleanup_encrypted);
1009*4882a593Smuzhiyun 
1010*4882a593Smuzhiyun MODULE_LICENSE("GPL");
1011