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