Merge tag 'selinux-pr-20190507' of git://git.kernel.org/pub/scm/linux/kernel/git...
[sfrench/cifs-2.6.git] / fs / ecryptfs / keystore.c
1 /**
2  * eCryptfs: Linux filesystem encryption layer
3  * In-kernel key management code.  Includes functions to parse and
4  * write authentication token-related packets with the underlying
5  * file.
6  *
7  * Copyright (C) 2004-2006 International Business Machines Corp.
8  *   Author(s): Michael A. Halcrow <mhalcrow@us.ibm.com>
9  *              Michael C. Thompson <mcthomps@us.ibm.com>
10  *              Trevor S. Highland <trevor.highland@gmail.com>
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License as
14  * published by the Free Software Foundation; either version 2 of the
15  * License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful, but
18  * WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20  * General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
25  * 02111-1307, USA.
26  */
27
28 #include <crypto/hash.h>
29 #include <crypto/skcipher.h>
30 #include <linux/string.h>
31 #include <linux/pagemap.h>
32 #include <linux/key.h>
33 #include <linux/random.h>
34 #include <linux/scatterlist.h>
35 #include <linux/slab.h>
36 #include "ecryptfs_kernel.h"
37
38 /**
39  * request_key returned an error instead of a valid key address;
40  * determine the type of error, make appropriate log entries, and
41  * return an error code.
42  */
43 static int process_request_key_err(long err_code)
44 {
45         int rc = 0;
46
47         switch (err_code) {
48         case -ENOKEY:
49                 ecryptfs_printk(KERN_WARNING, "No key\n");
50                 rc = -ENOENT;
51                 break;
52         case -EKEYEXPIRED:
53                 ecryptfs_printk(KERN_WARNING, "Key expired\n");
54                 rc = -ETIME;
55                 break;
56         case -EKEYREVOKED:
57                 ecryptfs_printk(KERN_WARNING, "Key revoked\n");
58                 rc = -EINVAL;
59                 break;
60         default:
61                 ecryptfs_printk(KERN_WARNING, "Unknown error code: "
62                                 "[0x%.16lx]\n", err_code);
63                 rc = -EINVAL;
64         }
65         return rc;
66 }
67
68 static int process_find_global_auth_tok_for_sig_err(int err_code)
69 {
70         int rc = err_code;
71
72         switch (err_code) {
73         case -ENOENT:
74                 ecryptfs_printk(KERN_WARNING, "Missing auth tok\n");
75                 break;
76         case -EINVAL:
77                 ecryptfs_printk(KERN_WARNING, "Invalid auth tok\n");
78                 break;
79         default:
80                 rc = process_request_key_err(err_code);
81                 break;
82         }
83         return rc;
84 }
85
86 /**
87  * ecryptfs_parse_packet_length
88  * @data: Pointer to memory containing length at offset
89  * @size: This function writes the decoded size to this memory
90  *        address; zero on error
91  * @length_size: The number of bytes occupied by the encoded length
92  *
93  * Returns zero on success; non-zero on error
94  */
95 int ecryptfs_parse_packet_length(unsigned char *data, size_t *size,
96                                  size_t *length_size)
97 {
98         int rc = 0;
99
100         (*length_size) = 0;
101         (*size) = 0;
102         if (data[0] < 192) {
103                 /* One-byte length */
104                 (*size) = data[0];
105                 (*length_size) = 1;
106         } else if (data[0] < 224) {
107                 /* Two-byte length */
108                 (*size) = (data[0] - 192) * 256;
109                 (*size) += data[1] + 192;
110                 (*length_size) = 2;
111         } else if (data[0] == 255) {
112                 /* If support is added, adjust ECRYPTFS_MAX_PKT_LEN_SIZE */
113                 ecryptfs_printk(KERN_ERR, "Five-byte packet length not "
114                                 "supported\n");
115                 rc = -EINVAL;
116                 goto out;
117         } else {
118                 ecryptfs_printk(KERN_ERR, "Error parsing packet length\n");
119                 rc = -EINVAL;
120                 goto out;
121         }
122 out:
123         return rc;
124 }
125
126 /**
127  * ecryptfs_write_packet_length
128  * @dest: The byte array target into which to write the length. Must
129  *        have at least ECRYPTFS_MAX_PKT_LEN_SIZE bytes allocated.
130  * @size: The length to write.
131  * @packet_size_length: The number of bytes used to encode the packet
132  *                      length is written to this address.
133  *
134  * Returns zero on success; non-zero on error.
135  */
136 int ecryptfs_write_packet_length(char *dest, size_t size,
137                                  size_t *packet_size_length)
138 {
139         int rc = 0;
140
141         if (size < 192) {
142                 dest[0] = size;
143                 (*packet_size_length) = 1;
144         } else if (size < 65536) {
145                 dest[0] = (((size - 192) / 256) + 192);
146                 dest[1] = ((size - 192) % 256);
147                 (*packet_size_length) = 2;
148         } else {
149                 /* If support is added, adjust ECRYPTFS_MAX_PKT_LEN_SIZE */
150                 rc = -EINVAL;
151                 ecryptfs_printk(KERN_WARNING,
152                                 "Unsupported packet size: [%zd]\n", size);
153         }
154         return rc;
155 }
156
157 static int
158 write_tag_64_packet(char *signature, struct ecryptfs_session_key *session_key,
159                     char **packet, size_t *packet_len)
160 {
161         size_t i = 0;
162         size_t data_len;
163         size_t packet_size_len;
164         char *message;
165         int rc;
166
167         /*
168          *              ***** TAG 64 Packet Format *****
169          *    | Content Type                       | 1 byte       |
170          *    | Key Identifier Size                | 1 or 2 bytes |
171          *    | Key Identifier                     | arbitrary    |
172          *    | Encrypted File Encryption Key Size | 1 or 2 bytes |
173          *    | Encrypted File Encryption Key      | arbitrary    |
174          */
175         data_len = (5 + ECRYPTFS_SIG_SIZE_HEX
176                     + session_key->encrypted_key_size);
177         *packet = kmalloc(data_len, GFP_KERNEL);
178         message = *packet;
179         if (!message) {
180                 ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
181                 rc = -ENOMEM;
182                 goto out;
183         }
184         message[i++] = ECRYPTFS_TAG_64_PACKET_TYPE;
185         rc = ecryptfs_write_packet_length(&message[i], ECRYPTFS_SIG_SIZE_HEX,
186                                           &packet_size_len);
187         if (rc) {
188                 ecryptfs_printk(KERN_ERR, "Error generating tag 64 packet "
189                                 "header; cannot generate packet length\n");
190                 goto out;
191         }
192         i += packet_size_len;
193         memcpy(&message[i], signature, ECRYPTFS_SIG_SIZE_HEX);
194         i += ECRYPTFS_SIG_SIZE_HEX;
195         rc = ecryptfs_write_packet_length(&message[i],
196                                           session_key->encrypted_key_size,
197                                           &packet_size_len);
198         if (rc) {
199                 ecryptfs_printk(KERN_ERR, "Error generating tag 64 packet "
200                                 "header; cannot generate packet length\n");
201                 goto out;
202         }
203         i += packet_size_len;
204         memcpy(&message[i], session_key->encrypted_key,
205                session_key->encrypted_key_size);
206         i += session_key->encrypted_key_size;
207         *packet_len = i;
208 out:
209         return rc;
210 }
211
212 static int
213 parse_tag_65_packet(struct ecryptfs_session_key *session_key, u8 *cipher_code,
214                     struct ecryptfs_message *msg)
215 {
216         size_t i = 0;
217         char *data;
218         size_t data_len;
219         size_t m_size;
220         size_t message_len;
221         u16 checksum = 0;
222         u16 expected_checksum = 0;
223         int rc;
224
225         /*
226          *              ***** TAG 65 Packet Format *****
227          *         | Content Type             | 1 byte       |
228          *         | Status Indicator         | 1 byte       |
229          *         | File Encryption Key Size | 1 or 2 bytes |
230          *         | File Encryption Key      | arbitrary    |
231          */
232         message_len = msg->data_len;
233         data = msg->data;
234         if (message_len < 4) {
235                 rc = -EIO;
236                 goto out;
237         }
238         if (data[i++] != ECRYPTFS_TAG_65_PACKET_TYPE) {
239                 ecryptfs_printk(KERN_ERR, "Type should be ECRYPTFS_TAG_65\n");
240                 rc = -EIO;
241                 goto out;
242         }
243         if (data[i++]) {
244                 ecryptfs_printk(KERN_ERR, "Status indicator has non-zero value "
245                                 "[%d]\n", data[i-1]);
246                 rc = -EIO;
247                 goto out;
248         }
249         rc = ecryptfs_parse_packet_length(&data[i], &m_size, &data_len);
250         if (rc) {
251                 ecryptfs_printk(KERN_WARNING, "Error parsing packet length; "
252                                 "rc = [%d]\n", rc);
253                 goto out;
254         }
255         i += data_len;
256         if (message_len < (i + m_size)) {
257                 ecryptfs_printk(KERN_ERR, "The message received from ecryptfsd "
258                                 "is shorter than expected\n");
259                 rc = -EIO;
260                 goto out;
261         }
262         if (m_size < 3) {
263                 ecryptfs_printk(KERN_ERR,
264                                 "The decrypted key is not long enough to "
265                                 "include a cipher code and checksum\n");
266                 rc = -EIO;
267                 goto out;
268         }
269         *cipher_code = data[i++];
270         /* The decrypted key includes 1 byte cipher code and 2 byte checksum */
271         session_key->decrypted_key_size = m_size - 3;
272         if (session_key->decrypted_key_size > ECRYPTFS_MAX_KEY_BYTES) {
273                 ecryptfs_printk(KERN_ERR, "key_size [%d] larger than "
274                                 "the maximum key size [%d]\n",
275                                 session_key->decrypted_key_size,
276                                 ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES);
277                 rc = -EIO;
278                 goto out;
279         }
280         memcpy(session_key->decrypted_key, &data[i],
281                session_key->decrypted_key_size);
282         i += session_key->decrypted_key_size;
283         expected_checksum += (unsigned char)(data[i++]) << 8;
284         expected_checksum += (unsigned char)(data[i++]);
285         for (i = 0; i < session_key->decrypted_key_size; i++)
286                 checksum += session_key->decrypted_key[i];
287         if (expected_checksum != checksum) {
288                 ecryptfs_printk(KERN_ERR, "Invalid checksum for file "
289                                 "encryption  key; expected [%x]; calculated "
290                                 "[%x]\n", expected_checksum, checksum);
291                 rc = -EIO;
292         }
293 out:
294         return rc;
295 }
296
297
298 static int
299 write_tag_66_packet(char *signature, u8 cipher_code,
300                     struct ecryptfs_crypt_stat *crypt_stat, char **packet,
301                     size_t *packet_len)
302 {
303         size_t i = 0;
304         size_t j;
305         size_t data_len;
306         size_t checksum = 0;
307         size_t packet_size_len;
308         char *message;
309         int rc;
310
311         /*
312          *              ***** TAG 66 Packet Format *****
313          *         | Content Type             | 1 byte       |
314          *         | Key Identifier Size      | 1 or 2 bytes |
315          *         | Key Identifier           | arbitrary    |
316          *         | File Encryption Key Size | 1 or 2 bytes |
317          *         | File Encryption Key      | arbitrary    |
318          */
319         data_len = (5 + ECRYPTFS_SIG_SIZE_HEX + crypt_stat->key_size);
320         *packet = kmalloc(data_len, GFP_KERNEL);
321         message = *packet;
322         if (!message) {
323                 ecryptfs_printk(KERN_ERR, "Unable to allocate memory\n");
324                 rc = -ENOMEM;
325                 goto out;
326         }
327         message[i++] = ECRYPTFS_TAG_66_PACKET_TYPE;
328         rc = ecryptfs_write_packet_length(&message[i], ECRYPTFS_SIG_SIZE_HEX,
329                                           &packet_size_len);
330         if (rc) {
331                 ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet "
332                                 "header; cannot generate packet length\n");
333                 goto out;
334         }
335         i += packet_size_len;
336         memcpy(&message[i], signature, ECRYPTFS_SIG_SIZE_HEX);
337         i += ECRYPTFS_SIG_SIZE_HEX;
338         /* The encrypted key includes 1 byte cipher code and 2 byte checksum */
339         rc = ecryptfs_write_packet_length(&message[i], crypt_stat->key_size + 3,
340                                           &packet_size_len);
341         if (rc) {
342                 ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet "
343                                 "header; cannot generate packet length\n");
344                 goto out;
345         }
346         i += packet_size_len;
347         message[i++] = cipher_code;
348         memcpy(&message[i], crypt_stat->key, crypt_stat->key_size);
349         i += crypt_stat->key_size;
350         for (j = 0; j < crypt_stat->key_size; j++)
351                 checksum += crypt_stat->key[j];
352         message[i++] = (checksum / 256) % 256;
353         message[i++] = (checksum % 256);
354         *packet_len = i;
355 out:
356         return rc;
357 }
358
359 static int
360 parse_tag_67_packet(struct ecryptfs_key_record *key_rec,
361                     struct ecryptfs_message *msg)
362 {
363         size_t i = 0;
364         char *data;
365         size_t data_len;
366         size_t message_len;
367         int rc;
368
369         /*
370          *              ***** TAG 65 Packet Format *****
371          *    | Content Type                       | 1 byte       |
372          *    | Status Indicator                   | 1 byte       |
373          *    | Encrypted File Encryption Key Size | 1 or 2 bytes |
374          *    | Encrypted File Encryption Key      | arbitrary    |
375          */
376         message_len = msg->data_len;
377         data = msg->data;
378         /* verify that everything through the encrypted FEK size is present */
379         if (message_len < 4) {
380                 rc = -EIO;
381                 printk(KERN_ERR "%s: message_len is [%zd]; minimum acceptable "
382                        "message length is [%d]\n", __func__, message_len, 4);
383                 goto out;
384         }
385         if (data[i++] != ECRYPTFS_TAG_67_PACKET_TYPE) {
386                 rc = -EIO;
387                 printk(KERN_ERR "%s: Type should be ECRYPTFS_TAG_67\n",
388                        __func__);
389                 goto out;
390         }
391         if (data[i++]) {
392                 rc = -EIO;
393                 printk(KERN_ERR "%s: Status indicator has non zero "
394                        "value [%d]\n", __func__, data[i-1]);
395
396                 goto out;
397         }
398         rc = ecryptfs_parse_packet_length(&data[i], &key_rec->enc_key_size,
399                                           &data_len);
400         if (rc) {
401                 ecryptfs_printk(KERN_WARNING, "Error parsing packet length; "
402                                 "rc = [%d]\n", rc);
403                 goto out;
404         }
405         i += data_len;
406         if (message_len < (i + key_rec->enc_key_size)) {
407                 rc = -EIO;
408                 printk(KERN_ERR "%s: message_len [%zd]; max len is [%zd]\n",
409                        __func__, message_len, (i + key_rec->enc_key_size));
410                 goto out;
411         }
412         if (key_rec->enc_key_size > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
413                 rc = -EIO;
414                 printk(KERN_ERR "%s: Encrypted key_size [%zd] larger than "
415                        "the maximum key size [%d]\n", __func__,
416                        key_rec->enc_key_size,
417                        ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES);
418                 goto out;
419         }
420         memcpy(key_rec->enc_key, &data[i], key_rec->enc_key_size);
421 out:
422         return rc;
423 }
424
425 /**
426  * ecryptfs_verify_version
427  * @version: The version number to confirm
428  *
429  * Returns zero on good version; non-zero otherwise
430  */
431 static int ecryptfs_verify_version(u16 version)
432 {
433         int rc = 0;
434         unsigned char major;
435         unsigned char minor;
436
437         major = ((version >> 8) & 0xFF);
438         minor = (version & 0xFF);
439         if (major != ECRYPTFS_VERSION_MAJOR) {
440                 ecryptfs_printk(KERN_ERR, "Major version number mismatch. "
441                                 "Expected [%d]; got [%d]\n",
442                                 ECRYPTFS_VERSION_MAJOR, major);
443                 rc = -EINVAL;
444                 goto out;
445         }
446         if (minor != ECRYPTFS_VERSION_MINOR) {
447                 ecryptfs_printk(KERN_ERR, "Minor version number mismatch. "
448                                 "Expected [%d]; got [%d]\n",
449                                 ECRYPTFS_VERSION_MINOR, minor);
450                 rc = -EINVAL;
451                 goto out;
452         }
453 out:
454         return rc;
455 }
456
457 /**
458  * ecryptfs_verify_auth_tok_from_key
459  * @auth_tok_key: key containing the authentication token
460  * @auth_tok: authentication token
461  *
462  * Returns zero on valid auth tok; -EINVAL if the payload is invalid; or
463  * -EKEYREVOKED if the key was revoked before we acquired its semaphore.
464  */
465 static int
466 ecryptfs_verify_auth_tok_from_key(struct key *auth_tok_key,
467                                   struct ecryptfs_auth_tok **auth_tok)
468 {
469         int rc = 0;
470
471         (*auth_tok) = ecryptfs_get_key_payload_data(auth_tok_key);
472         if (IS_ERR(*auth_tok)) {
473                 rc = PTR_ERR(*auth_tok);
474                 *auth_tok = NULL;
475                 goto out;
476         }
477
478         if (ecryptfs_verify_version((*auth_tok)->version)) {
479                 printk(KERN_ERR "Data structure version mismatch. Userspace "
480                        "tools must match eCryptfs kernel module with major "
481                        "version [%d] and minor version [%d]\n",
482                        ECRYPTFS_VERSION_MAJOR, ECRYPTFS_VERSION_MINOR);
483                 rc = -EINVAL;
484                 goto out;
485         }
486         if ((*auth_tok)->token_type != ECRYPTFS_PASSWORD
487             && (*auth_tok)->token_type != ECRYPTFS_PRIVATE_KEY) {
488                 printk(KERN_ERR "Invalid auth_tok structure "
489                        "returned from key query\n");
490                 rc = -EINVAL;
491                 goto out;
492         }
493 out:
494         return rc;
495 }
496
497 static int
498 ecryptfs_find_global_auth_tok_for_sig(
499         struct key **auth_tok_key,
500         struct ecryptfs_auth_tok **auth_tok,
501         struct ecryptfs_mount_crypt_stat *mount_crypt_stat, char *sig)
502 {
503         struct ecryptfs_global_auth_tok *walker;
504         int rc = 0;
505
506         (*auth_tok_key) = NULL;
507         (*auth_tok) = NULL;
508         mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex);
509         list_for_each_entry(walker,
510                             &mount_crypt_stat->global_auth_tok_list,
511                             mount_crypt_stat_list) {
512                 if (memcmp(walker->sig, sig, ECRYPTFS_SIG_SIZE_HEX))
513                         continue;
514
515                 if (walker->flags & ECRYPTFS_AUTH_TOK_INVALID) {
516                         rc = -EINVAL;
517                         goto out;
518                 }
519
520                 rc = key_validate(walker->global_auth_tok_key);
521                 if (rc) {
522                         if (rc == -EKEYEXPIRED)
523                                 goto out;
524                         goto out_invalid_auth_tok;
525                 }
526
527                 down_write(&(walker->global_auth_tok_key->sem));
528                 rc = ecryptfs_verify_auth_tok_from_key(
529                                 walker->global_auth_tok_key, auth_tok);
530                 if (rc)
531                         goto out_invalid_auth_tok_unlock;
532
533                 (*auth_tok_key) = walker->global_auth_tok_key;
534                 key_get(*auth_tok_key);
535                 goto out;
536         }
537         rc = -ENOENT;
538         goto out;
539 out_invalid_auth_tok_unlock:
540         up_write(&(walker->global_auth_tok_key->sem));
541 out_invalid_auth_tok:
542         printk(KERN_WARNING "Invalidating auth tok with sig = [%s]\n", sig);
543         walker->flags |= ECRYPTFS_AUTH_TOK_INVALID;
544         key_put(walker->global_auth_tok_key);
545         walker->global_auth_tok_key = NULL;
546 out:
547         mutex_unlock(&mount_crypt_stat->global_auth_tok_list_mutex);
548         return rc;
549 }
550
551 /**
552  * ecryptfs_find_auth_tok_for_sig
553  * @auth_tok: Set to the matching auth_tok; NULL if not found
554  * @crypt_stat: inode crypt_stat crypto context
555  * @sig: Sig of auth_tok to find
556  *
557  * For now, this function simply looks at the registered auth_tok's
558  * linked off the mount_crypt_stat, so all the auth_toks that can be
559  * used must be registered at mount time. This function could
560  * potentially try a lot harder to find auth_tok's (e.g., by calling
561  * out to ecryptfsd to dynamically retrieve an auth_tok object) so
562  * that static registration of auth_tok's will no longer be necessary.
563  *
564  * Returns zero on no error; non-zero on error
565  */
566 static int
567 ecryptfs_find_auth_tok_for_sig(
568         struct key **auth_tok_key,
569         struct ecryptfs_auth_tok **auth_tok,
570         struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
571         char *sig)
572 {
573         int rc = 0;
574
575         rc = ecryptfs_find_global_auth_tok_for_sig(auth_tok_key, auth_tok,
576                                                    mount_crypt_stat, sig);
577         if (rc == -ENOENT) {
578                 /* if the flag ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY is set in the
579                  * mount_crypt_stat structure, we prevent to use auth toks that
580                  * are not inserted through the ecryptfs_add_global_auth_tok
581                  * function.
582                  */
583                 if (mount_crypt_stat->flags
584                                 & ECRYPTFS_GLOBAL_MOUNT_AUTH_TOK_ONLY)
585                         return -EINVAL;
586
587                 rc = ecryptfs_keyring_auth_tok_for_sig(auth_tok_key, auth_tok,
588                                                        sig);
589         }
590         return rc;
591 }
592
593 /**
594  * write_tag_70_packet can gobble a lot of stack space. We stuff most
595  * of the function's parameters in a kmalloc'd struct to help reduce
596  * eCryptfs' overall stack usage.
597  */
598 struct ecryptfs_write_tag_70_packet_silly_stack {
599         u8 cipher_code;
600         size_t max_packet_size;
601         size_t packet_size_len;
602         size_t block_aligned_filename_size;
603         size_t block_size;
604         size_t i;
605         size_t j;
606         size_t num_rand_bytes;
607         struct mutex *tfm_mutex;
608         char *block_aligned_filename;
609         struct ecryptfs_auth_tok *auth_tok;
610         struct scatterlist src_sg[2];
611         struct scatterlist dst_sg[2];
612         struct crypto_skcipher *skcipher_tfm;
613         struct skcipher_request *skcipher_req;
614         char iv[ECRYPTFS_MAX_IV_BYTES];
615         char hash[ECRYPTFS_TAG_70_DIGEST_SIZE];
616         char tmp_hash[ECRYPTFS_TAG_70_DIGEST_SIZE];
617         struct crypto_shash *hash_tfm;
618         struct shash_desc *hash_desc;
619 };
620
621 /**
622  * write_tag_70_packet - Write encrypted filename (EFN) packet against FNEK
623  * @filename: NULL-terminated filename string
624  *
625  * This is the simplest mechanism for achieving filename encryption in
626  * eCryptfs. It encrypts the given filename with the mount-wide
627  * filename encryption key (FNEK) and stores it in a packet to @dest,
628  * which the callee will encode and write directly into the dentry
629  * name.
630  */
631 int
632 ecryptfs_write_tag_70_packet(char *dest, size_t *remaining_bytes,
633                              size_t *packet_size,
634                              struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
635                              char *filename, size_t filename_size)
636 {
637         struct ecryptfs_write_tag_70_packet_silly_stack *s;
638         struct key *auth_tok_key = NULL;
639         int rc = 0;
640
641         s = kzalloc(sizeof(*s), GFP_KERNEL);
642         if (!s)
643                 return -ENOMEM;
644
645         (*packet_size) = 0;
646         rc = ecryptfs_find_auth_tok_for_sig(
647                 &auth_tok_key,
648                 &s->auth_tok, mount_crypt_stat,
649                 mount_crypt_stat->global_default_fnek_sig);
650         if (rc) {
651                 printk(KERN_ERR "%s: Error attempting to find auth tok for "
652                        "fnek sig [%s]; rc = [%d]\n", __func__,
653                        mount_crypt_stat->global_default_fnek_sig, rc);
654                 goto out;
655         }
656         rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(
657                 &s->skcipher_tfm,
658                 &s->tfm_mutex, mount_crypt_stat->global_default_fn_cipher_name);
659         if (unlikely(rc)) {
660                 printk(KERN_ERR "Internal error whilst attempting to get "
661                        "tfm and mutex for cipher name [%s]; rc = [%d]\n",
662                        mount_crypt_stat->global_default_fn_cipher_name, rc);
663                 goto out;
664         }
665         mutex_lock(s->tfm_mutex);
666         s->block_size = crypto_skcipher_blocksize(s->skcipher_tfm);
667         /* Plus one for the \0 separator between the random prefix
668          * and the plaintext filename */
669         s->num_rand_bytes = (ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES + 1);
670         s->block_aligned_filename_size = (s->num_rand_bytes + filename_size);
671         if ((s->block_aligned_filename_size % s->block_size) != 0) {
672                 s->num_rand_bytes += (s->block_size
673                                       - (s->block_aligned_filename_size
674                                          % s->block_size));
675                 s->block_aligned_filename_size = (s->num_rand_bytes
676                                                   + filename_size);
677         }
678         /* Octet 0: Tag 70 identifier
679          * Octets 1-N1: Tag 70 packet size (includes cipher identifier
680          *              and block-aligned encrypted filename size)
681          * Octets N1-N2: FNEK sig (ECRYPTFS_SIG_SIZE)
682          * Octet N2-N3: Cipher identifier (1 octet)
683          * Octets N3-N4: Block-aligned encrypted filename
684          *  - Consists of a minimum number of random characters, a \0
685          *    separator, and then the filename */
686         s->max_packet_size = (ECRYPTFS_TAG_70_MAX_METADATA_SIZE
687                               + s->block_aligned_filename_size);
688         if (!dest) {
689                 (*packet_size) = s->max_packet_size;
690                 goto out_unlock;
691         }
692         if (s->max_packet_size > (*remaining_bytes)) {
693                 printk(KERN_WARNING "%s: Require [%zd] bytes to write; only "
694                        "[%zd] available\n", __func__, s->max_packet_size,
695                        (*remaining_bytes));
696                 rc = -EINVAL;
697                 goto out_unlock;
698         }
699
700         s->skcipher_req = skcipher_request_alloc(s->skcipher_tfm, GFP_KERNEL);
701         if (!s->skcipher_req) {
702                 printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
703                        "skcipher_request_alloc for %s\n", __func__,
704                        crypto_skcipher_driver_name(s->skcipher_tfm));
705                 rc = -ENOMEM;
706                 goto out_unlock;
707         }
708
709         skcipher_request_set_callback(s->skcipher_req,
710                                       CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
711
712         s->block_aligned_filename = kzalloc(s->block_aligned_filename_size,
713                                             GFP_KERNEL);
714         if (!s->block_aligned_filename) {
715                 rc = -ENOMEM;
716                 goto out_unlock;
717         }
718         dest[s->i++] = ECRYPTFS_TAG_70_PACKET_TYPE;
719         rc = ecryptfs_write_packet_length(&dest[s->i],
720                                           (ECRYPTFS_SIG_SIZE
721                                            + 1 /* Cipher code */
722                                            + s->block_aligned_filename_size),
723                                           &s->packet_size_len);
724         if (rc) {
725                 printk(KERN_ERR "%s: Error generating tag 70 packet "
726                        "header; cannot generate packet length; rc = [%d]\n",
727                        __func__, rc);
728                 goto out_free_unlock;
729         }
730         s->i += s->packet_size_len;
731         ecryptfs_from_hex(&dest[s->i],
732                           mount_crypt_stat->global_default_fnek_sig,
733                           ECRYPTFS_SIG_SIZE);
734         s->i += ECRYPTFS_SIG_SIZE;
735         s->cipher_code = ecryptfs_code_for_cipher_string(
736                 mount_crypt_stat->global_default_fn_cipher_name,
737                 mount_crypt_stat->global_default_fn_cipher_key_bytes);
738         if (s->cipher_code == 0) {
739                 printk(KERN_WARNING "%s: Unable to generate code for "
740                        "cipher [%s] with key bytes [%zd]\n", __func__,
741                        mount_crypt_stat->global_default_fn_cipher_name,
742                        mount_crypt_stat->global_default_fn_cipher_key_bytes);
743                 rc = -EINVAL;
744                 goto out_free_unlock;
745         }
746         dest[s->i++] = s->cipher_code;
747         /* TODO: Support other key modules than passphrase for
748          * filename encryption */
749         if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) {
750                 rc = -EOPNOTSUPP;
751                 printk(KERN_INFO "%s: Filename encryption only supports "
752                        "password tokens\n", __func__);
753                 goto out_free_unlock;
754         }
755         s->hash_tfm = crypto_alloc_shash(ECRYPTFS_TAG_70_DIGEST, 0, 0);
756         if (IS_ERR(s->hash_tfm)) {
757                         rc = PTR_ERR(s->hash_tfm);
758                         printk(KERN_ERR "%s: Error attempting to "
759                                "allocate hash crypto context; rc = [%d]\n",
760                                __func__, rc);
761                         goto out_free_unlock;
762         }
763
764         s->hash_desc = kmalloc(sizeof(*s->hash_desc) +
765                                crypto_shash_descsize(s->hash_tfm), GFP_KERNEL);
766         if (!s->hash_desc) {
767                 rc = -ENOMEM;
768                 goto out_release_free_unlock;
769         }
770
771         s->hash_desc->tfm = s->hash_tfm;
772
773         rc = crypto_shash_digest(s->hash_desc,
774                                  (u8 *)s->auth_tok->token.password.session_key_encryption_key,
775                                  s->auth_tok->token.password.session_key_encryption_key_bytes,
776                                  s->hash);
777         if (rc) {
778                 printk(KERN_ERR
779                        "%s: Error computing crypto hash; rc = [%d]\n",
780                        __func__, rc);
781                 goto out_release_free_unlock;
782         }
783         for (s->j = 0; s->j < (s->num_rand_bytes - 1); s->j++) {
784                 s->block_aligned_filename[s->j] =
785                         s->hash[(s->j % ECRYPTFS_TAG_70_DIGEST_SIZE)];
786                 if ((s->j % ECRYPTFS_TAG_70_DIGEST_SIZE)
787                     == (ECRYPTFS_TAG_70_DIGEST_SIZE - 1)) {
788                         rc = crypto_shash_digest(s->hash_desc, (u8 *)s->hash,
789                                                 ECRYPTFS_TAG_70_DIGEST_SIZE,
790                                                 s->tmp_hash);
791                         if (rc) {
792                                 printk(KERN_ERR
793                                        "%s: Error computing crypto hash; "
794                                        "rc = [%d]\n", __func__, rc);
795                                 goto out_release_free_unlock;
796                         }
797                         memcpy(s->hash, s->tmp_hash,
798                                ECRYPTFS_TAG_70_DIGEST_SIZE);
799                 }
800                 if (s->block_aligned_filename[s->j] == '\0')
801                         s->block_aligned_filename[s->j] = ECRYPTFS_NON_NULL;
802         }
803         memcpy(&s->block_aligned_filename[s->num_rand_bytes], filename,
804                filename_size);
805         rc = virt_to_scatterlist(s->block_aligned_filename,
806                                  s->block_aligned_filename_size, s->src_sg, 2);
807         if (rc < 1) {
808                 printk(KERN_ERR "%s: Internal error whilst attempting to "
809                        "convert filename memory to scatterlist; rc = [%d]. "
810                        "block_aligned_filename_size = [%zd]\n", __func__, rc,
811                        s->block_aligned_filename_size);
812                 goto out_release_free_unlock;
813         }
814         rc = virt_to_scatterlist(&dest[s->i], s->block_aligned_filename_size,
815                                  s->dst_sg, 2);
816         if (rc < 1) {
817                 printk(KERN_ERR "%s: Internal error whilst attempting to "
818                        "convert encrypted filename memory to scatterlist; "
819                        "rc = [%d]. block_aligned_filename_size = [%zd]\n",
820                        __func__, rc, s->block_aligned_filename_size);
821                 goto out_release_free_unlock;
822         }
823         /* The characters in the first block effectively do the job
824          * of the IV here, so we just use 0's for the IV. Note the
825          * constraint that ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES
826          * >= ECRYPTFS_MAX_IV_BYTES. */
827         rc = crypto_skcipher_setkey(
828                 s->skcipher_tfm,
829                 s->auth_tok->token.password.session_key_encryption_key,
830                 mount_crypt_stat->global_default_fn_cipher_key_bytes);
831         if (rc < 0) {
832                 printk(KERN_ERR "%s: Error setting key for crypto context; "
833                        "rc = [%d]. s->auth_tok->token.password.session_key_"
834                        "encryption_key = [0x%p]; mount_crypt_stat->"
835                        "global_default_fn_cipher_key_bytes = [%zd]\n", __func__,
836                        rc,
837                        s->auth_tok->token.password.session_key_encryption_key,
838                        mount_crypt_stat->global_default_fn_cipher_key_bytes);
839                 goto out_release_free_unlock;
840         }
841         skcipher_request_set_crypt(s->skcipher_req, s->src_sg, s->dst_sg,
842                                    s->block_aligned_filename_size, s->iv);
843         rc = crypto_skcipher_encrypt(s->skcipher_req);
844         if (rc) {
845                 printk(KERN_ERR "%s: Error attempting to encrypt filename; "
846                        "rc = [%d]\n", __func__, rc);
847                 goto out_release_free_unlock;
848         }
849         s->i += s->block_aligned_filename_size;
850         (*packet_size) = s->i;
851         (*remaining_bytes) -= (*packet_size);
852 out_release_free_unlock:
853         crypto_free_shash(s->hash_tfm);
854 out_free_unlock:
855         kzfree(s->block_aligned_filename);
856 out_unlock:
857         mutex_unlock(s->tfm_mutex);
858 out:
859         if (auth_tok_key) {
860                 up_write(&(auth_tok_key->sem));
861                 key_put(auth_tok_key);
862         }
863         skcipher_request_free(s->skcipher_req);
864         kzfree(s->hash_desc);
865         kfree(s);
866         return rc;
867 }
868
869 struct ecryptfs_parse_tag_70_packet_silly_stack {
870         u8 cipher_code;
871         size_t max_packet_size;
872         size_t packet_size_len;
873         size_t parsed_tag_70_packet_size;
874         size_t block_aligned_filename_size;
875         size_t block_size;
876         size_t i;
877         struct mutex *tfm_mutex;
878         char *decrypted_filename;
879         struct ecryptfs_auth_tok *auth_tok;
880         struct scatterlist src_sg[2];
881         struct scatterlist dst_sg[2];
882         struct crypto_skcipher *skcipher_tfm;
883         struct skcipher_request *skcipher_req;
884         char fnek_sig_hex[ECRYPTFS_SIG_SIZE_HEX + 1];
885         char iv[ECRYPTFS_MAX_IV_BYTES];
886         char cipher_string[ECRYPTFS_MAX_CIPHER_NAME_SIZE + 1];
887 };
888
889 /**
890  * parse_tag_70_packet - Parse and process FNEK-encrypted passphrase packet
891  * @filename: This function kmalloc's the memory for the filename
892  * @filename_size: This function sets this to the amount of memory
893  *                 kmalloc'd for the filename
894  * @packet_size: This function sets this to the the number of octets
895  *               in the packet parsed
896  * @mount_crypt_stat: The mount-wide cryptographic context
897  * @data: The memory location containing the start of the tag 70
898  *        packet
899  * @max_packet_size: The maximum legal size of the packet to be parsed
900  *                   from @data
901  *
902  * Returns zero on success; non-zero otherwise
903  */
904 int
905 ecryptfs_parse_tag_70_packet(char **filename, size_t *filename_size,
906                              size_t *packet_size,
907                              struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
908                              char *data, size_t max_packet_size)
909 {
910         struct ecryptfs_parse_tag_70_packet_silly_stack *s;
911         struct key *auth_tok_key = NULL;
912         int rc = 0;
913
914         (*packet_size) = 0;
915         (*filename_size) = 0;
916         (*filename) = NULL;
917         s = kzalloc(sizeof(*s), GFP_KERNEL);
918         if (!s)
919                 return -ENOMEM;
920
921         if (max_packet_size < ECRYPTFS_TAG_70_MIN_METADATA_SIZE) {
922                 printk(KERN_WARNING "%s: max_packet_size is [%zd]; it must be "
923                        "at least [%d]\n", __func__, max_packet_size,
924                        ECRYPTFS_TAG_70_MIN_METADATA_SIZE);
925                 rc = -EINVAL;
926                 goto out;
927         }
928         /* Octet 0: Tag 70 identifier
929          * Octets 1-N1: Tag 70 packet size (includes cipher identifier
930          *              and block-aligned encrypted filename size)
931          * Octets N1-N2: FNEK sig (ECRYPTFS_SIG_SIZE)
932          * Octet N2-N3: Cipher identifier (1 octet)
933          * Octets N3-N4: Block-aligned encrypted filename
934          *  - Consists of a minimum number of random numbers, a \0
935          *    separator, and then the filename */
936         if (data[(*packet_size)++] != ECRYPTFS_TAG_70_PACKET_TYPE) {
937                 printk(KERN_WARNING "%s: Invalid packet tag [0x%.2x]; must be "
938                        "tag [0x%.2x]\n", __func__,
939                        data[((*packet_size) - 1)], ECRYPTFS_TAG_70_PACKET_TYPE);
940                 rc = -EINVAL;
941                 goto out;
942         }
943         rc = ecryptfs_parse_packet_length(&data[(*packet_size)],
944                                           &s->parsed_tag_70_packet_size,
945                                           &s->packet_size_len);
946         if (rc) {
947                 printk(KERN_WARNING "%s: Error parsing packet length; "
948                        "rc = [%d]\n", __func__, rc);
949                 goto out;
950         }
951         s->block_aligned_filename_size = (s->parsed_tag_70_packet_size
952                                           - ECRYPTFS_SIG_SIZE - 1);
953         if ((1 + s->packet_size_len + s->parsed_tag_70_packet_size)
954             > max_packet_size) {
955                 printk(KERN_WARNING "%s: max_packet_size is [%zd]; real packet "
956                        "size is [%zd]\n", __func__, max_packet_size,
957                        (1 + s->packet_size_len + 1
958                         + s->block_aligned_filename_size));
959                 rc = -EINVAL;
960                 goto out;
961         }
962         (*packet_size) += s->packet_size_len;
963         ecryptfs_to_hex(s->fnek_sig_hex, &data[(*packet_size)],
964                         ECRYPTFS_SIG_SIZE);
965         s->fnek_sig_hex[ECRYPTFS_SIG_SIZE_HEX] = '\0';
966         (*packet_size) += ECRYPTFS_SIG_SIZE;
967         s->cipher_code = data[(*packet_size)++];
968         rc = ecryptfs_cipher_code_to_string(s->cipher_string, s->cipher_code);
969         if (rc) {
970                 printk(KERN_WARNING "%s: Cipher code [%d] is invalid\n",
971                        __func__, s->cipher_code);
972                 goto out;
973         }
974         rc = ecryptfs_find_auth_tok_for_sig(&auth_tok_key,
975                                             &s->auth_tok, mount_crypt_stat,
976                                             s->fnek_sig_hex);
977         if (rc) {
978                 printk(KERN_ERR "%s: Error attempting to find auth tok for "
979                        "fnek sig [%s]; rc = [%d]\n", __func__, s->fnek_sig_hex,
980                        rc);
981                 goto out;
982         }
983         rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&s->skcipher_tfm,
984                                                         &s->tfm_mutex,
985                                                         s->cipher_string);
986         if (unlikely(rc)) {
987                 printk(KERN_ERR "Internal error whilst attempting to get "
988                        "tfm and mutex for cipher name [%s]; rc = [%d]\n",
989                        s->cipher_string, rc);
990                 goto out;
991         }
992         mutex_lock(s->tfm_mutex);
993         rc = virt_to_scatterlist(&data[(*packet_size)],
994                                  s->block_aligned_filename_size, s->src_sg, 2);
995         if (rc < 1) {
996                 printk(KERN_ERR "%s: Internal error whilst attempting to "
997                        "convert encrypted filename memory to scatterlist; "
998                        "rc = [%d]. block_aligned_filename_size = [%zd]\n",
999                        __func__, rc, s->block_aligned_filename_size);
1000                 goto out_unlock;
1001         }
1002         (*packet_size) += s->block_aligned_filename_size;
1003         s->decrypted_filename = kmalloc(s->block_aligned_filename_size,
1004                                         GFP_KERNEL);
1005         if (!s->decrypted_filename) {
1006                 rc = -ENOMEM;
1007                 goto out_unlock;
1008         }
1009         rc = virt_to_scatterlist(s->decrypted_filename,
1010                                  s->block_aligned_filename_size, s->dst_sg, 2);
1011         if (rc < 1) {
1012                 printk(KERN_ERR "%s: Internal error whilst attempting to "
1013                        "convert decrypted filename memory to scatterlist; "
1014                        "rc = [%d]. block_aligned_filename_size = [%zd]\n",
1015                        __func__, rc, s->block_aligned_filename_size);
1016                 goto out_free_unlock;
1017         }
1018
1019         s->skcipher_req = skcipher_request_alloc(s->skcipher_tfm, GFP_KERNEL);
1020         if (!s->skcipher_req) {
1021                 printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
1022                        "skcipher_request_alloc for %s\n", __func__,
1023                        crypto_skcipher_driver_name(s->skcipher_tfm));
1024                 rc = -ENOMEM;
1025                 goto out_free_unlock;
1026         }
1027
1028         skcipher_request_set_callback(s->skcipher_req,
1029                                       CRYPTO_TFM_REQ_MAY_SLEEP, NULL, NULL);
1030
1031         /* The characters in the first block effectively do the job of
1032          * the IV here, so we just use 0's for the IV. Note the
1033          * constraint that ECRYPTFS_FILENAME_MIN_RANDOM_PREPEND_BYTES
1034          * >= ECRYPTFS_MAX_IV_BYTES. */
1035         /* TODO: Support other key modules than passphrase for
1036          * filename encryption */
1037         if (s->auth_tok->token_type != ECRYPTFS_PASSWORD) {
1038                 rc = -EOPNOTSUPP;
1039                 printk(KERN_INFO "%s: Filename encryption only supports "
1040                        "password tokens\n", __func__);
1041                 goto out_free_unlock;
1042         }
1043         rc = crypto_skcipher_setkey(
1044                 s->skcipher_tfm,
1045                 s->auth_tok->token.password.session_key_encryption_key,
1046                 mount_crypt_stat->global_default_fn_cipher_key_bytes);
1047         if (rc < 0) {
1048                 printk(KERN_ERR "%s: Error setting key for crypto context; "
1049                        "rc = [%d]. s->auth_tok->token.password.session_key_"
1050                        "encryption_key = [0x%p]; mount_crypt_stat->"
1051                        "global_default_fn_cipher_key_bytes = [%zd]\n", __func__,
1052                        rc,
1053                        s->auth_tok->token.password.session_key_encryption_key,
1054                        mount_crypt_stat->global_default_fn_cipher_key_bytes);
1055                 goto out_free_unlock;
1056         }
1057         skcipher_request_set_crypt(s->skcipher_req, s->src_sg, s->dst_sg,
1058                                    s->block_aligned_filename_size, s->iv);
1059         rc = crypto_skcipher_decrypt(s->skcipher_req);
1060         if (rc) {
1061                 printk(KERN_ERR "%s: Error attempting to decrypt filename; "
1062                        "rc = [%d]\n", __func__, rc);
1063                 goto out_free_unlock;
1064         }
1065         while (s->decrypted_filename[s->i] != '\0'
1066                && s->i < s->block_aligned_filename_size)
1067                 s->i++;
1068         if (s->i == s->block_aligned_filename_size) {
1069                 printk(KERN_WARNING "%s: Invalid tag 70 packet; could not "
1070                        "find valid separator between random characters and "
1071                        "the filename\n", __func__);
1072                 rc = -EINVAL;
1073                 goto out_free_unlock;
1074         }
1075         s->i++;
1076         (*filename_size) = (s->block_aligned_filename_size - s->i);
1077         if (!((*filename_size) > 0 && (*filename_size < PATH_MAX))) {
1078                 printk(KERN_WARNING "%s: Filename size is [%zd], which is "
1079                        "invalid\n", __func__, (*filename_size));
1080                 rc = -EINVAL;
1081                 goto out_free_unlock;
1082         }
1083         (*filename) = kmalloc(((*filename_size) + 1), GFP_KERNEL);
1084         if (!(*filename)) {
1085                 rc = -ENOMEM;
1086                 goto out_free_unlock;
1087         }
1088         memcpy((*filename), &s->decrypted_filename[s->i], (*filename_size));
1089         (*filename)[(*filename_size)] = '\0';
1090 out_free_unlock:
1091         kfree(s->decrypted_filename);
1092 out_unlock:
1093         mutex_unlock(s->tfm_mutex);
1094 out:
1095         if (rc) {
1096                 (*packet_size) = 0;
1097                 (*filename_size) = 0;
1098                 (*filename) = NULL;
1099         }
1100         if (auth_tok_key) {
1101                 up_write(&(auth_tok_key->sem));
1102                 key_put(auth_tok_key);
1103         }
1104         skcipher_request_free(s->skcipher_req);
1105         kfree(s);
1106         return rc;
1107 }
1108
1109 static int
1110 ecryptfs_get_auth_tok_sig(char **sig, struct ecryptfs_auth_tok *auth_tok)
1111 {
1112         int rc = 0;
1113
1114         (*sig) = NULL;
1115         switch (auth_tok->token_type) {
1116         case ECRYPTFS_PASSWORD:
1117                 (*sig) = auth_tok->token.password.signature;
1118                 break;
1119         case ECRYPTFS_PRIVATE_KEY:
1120                 (*sig) = auth_tok->token.private_key.signature;
1121                 break;
1122         default:
1123                 printk(KERN_ERR "Cannot get sig for auth_tok of type [%d]\n",
1124                        auth_tok->token_type);
1125                 rc = -EINVAL;
1126         }
1127         return rc;
1128 }
1129
1130 /**
1131  * decrypt_pki_encrypted_session_key - Decrypt the session key with the given auth_tok.
1132  * @auth_tok: The key authentication token used to decrypt the session key
1133  * @crypt_stat: The cryptographic context
1134  *
1135  * Returns zero on success; non-zero error otherwise.
1136  */
1137 static int
1138 decrypt_pki_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
1139                                   struct ecryptfs_crypt_stat *crypt_stat)
1140 {
1141         u8 cipher_code = 0;
1142         struct ecryptfs_msg_ctx *msg_ctx;
1143         struct ecryptfs_message *msg = NULL;
1144         char *auth_tok_sig;
1145         char *payload = NULL;
1146         size_t payload_len = 0;
1147         int rc;
1148
1149         rc = ecryptfs_get_auth_tok_sig(&auth_tok_sig, auth_tok);
1150         if (rc) {
1151                 printk(KERN_ERR "Unrecognized auth tok type: [%d]\n",
1152                        auth_tok->token_type);
1153                 goto out;
1154         }
1155         rc = write_tag_64_packet(auth_tok_sig, &(auth_tok->session_key),
1156                                  &payload, &payload_len);
1157         if (rc) {
1158                 ecryptfs_printk(KERN_ERR, "Failed to write tag 64 packet\n");
1159                 goto out;
1160         }
1161         rc = ecryptfs_send_message(payload, payload_len, &msg_ctx);
1162         if (rc) {
1163                 ecryptfs_printk(KERN_ERR, "Error sending message to "
1164                                 "ecryptfsd: %d\n", rc);
1165                 goto out;
1166         }
1167         rc = ecryptfs_wait_for_response(msg_ctx, &msg);
1168         if (rc) {
1169                 ecryptfs_printk(KERN_ERR, "Failed to receive tag 65 packet "
1170                                 "from the user space daemon\n");
1171                 rc = -EIO;
1172                 goto out;
1173         }
1174         rc = parse_tag_65_packet(&(auth_tok->session_key),
1175                                  &cipher_code, msg);
1176         if (rc) {
1177                 printk(KERN_ERR "Failed to parse tag 65 packet; rc = [%d]\n",
1178                        rc);
1179                 goto out;
1180         }
1181         auth_tok->session_key.flags |= ECRYPTFS_CONTAINS_DECRYPTED_KEY;
1182         memcpy(crypt_stat->key, auth_tok->session_key.decrypted_key,
1183                auth_tok->session_key.decrypted_key_size);
1184         crypt_stat->key_size = auth_tok->session_key.decrypted_key_size;
1185         rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher, cipher_code);
1186         if (rc) {
1187                 ecryptfs_printk(KERN_ERR, "Cipher code [%d] is invalid\n",
1188                                 cipher_code)
1189                 goto out;
1190         }
1191         crypt_stat->flags |= ECRYPTFS_KEY_VALID;
1192         if (ecryptfs_verbosity > 0) {
1193                 ecryptfs_printk(KERN_DEBUG, "Decrypted session key:\n");
1194                 ecryptfs_dump_hex(crypt_stat->key,
1195                                   crypt_stat->key_size);
1196         }
1197 out:
1198         kfree(msg);
1199         kfree(payload);
1200         return rc;
1201 }
1202
1203 static void wipe_auth_tok_list(struct list_head *auth_tok_list_head)
1204 {
1205         struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
1206         struct ecryptfs_auth_tok_list_item *auth_tok_list_item_tmp;
1207
1208         list_for_each_entry_safe(auth_tok_list_item, auth_tok_list_item_tmp,
1209                                  auth_tok_list_head, list) {
1210                 list_del(&auth_tok_list_item->list);
1211                 kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
1212                                 auth_tok_list_item);
1213         }
1214 }
1215
1216 struct kmem_cache *ecryptfs_auth_tok_list_item_cache;
1217
1218 /**
1219  * parse_tag_1_packet
1220  * @crypt_stat: The cryptographic context to modify based on packet contents
1221  * @data: The raw bytes of the packet.
1222  * @auth_tok_list: eCryptfs parses packets into authentication tokens;
1223  *                 a new authentication token will be placed at the
1224  *                 end of this list for this packet.
1225  * @new_auth_tok: Pointer to a pointer to memory that this function
1226  *                allocates; sets the memory address of the pointer to
1227  *                NULL on error. This object is added to the
1228  *                auth_tok_list.
1229  * @packet_size: This function writes the size of the parsed packet
1230  *               into this memory location; zero on error.
1231  * @max_packet_size: The maximum allowable packet size
1232  *
1233  * Returns zero on success; non-zero on error.
1234  */
1235 static int
1236 parse_tag_1_packet(struct ecryptfs_crypt_stat *crypt_stat,
1237                    unsigned char *data, struct list_head *auth_tok_list,
1238                    struct ecryptfs_auth_tok **new_auth_tok,
1239                    size_t *packet_size, size_t max_packet_size)
1240 {
1241         size_t body_size;
1242         struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
1243         size_t length_size;
1244         int rc = 0;
1245
1246         (*packet_size) = 0;
1247         (*new_auth_tok) = NULL;
1248         /**
1249          * This format is inspired by OpenPGP; see RFC 2440
1250          * packet tag 1
1251          *
1252          * Tag 1 identifier (1 byte)
1253          * Max Tag 1 packet size (max 3 bytes)
1254          * Version (1 byte)
1255          * Key identifier (8 bytes; ECRYPTFS_SIG_SIZE)
1256          * Cipher identifier (1 byte)
1257          * Encrypted key size (arbitrary)
1258          *
1259          * 12 bytes minimum packet size
1260          */
1261         if (unlikely(max_packet_size < 12)) {
1262                 printk(KERN_ERR "Invalid max packet size; must be >=12\n");
1263                 rc = -EINVAL;
1264                 goto out;
1265         }
1266         if (data[(*packet_size)++] != ECRYPTFS_TAG_1_PACKET_TYPE) {
1267                 printk(KERN_ERR "Enter w/ first byte != 0x%.2x\n",
1268                        ECRYPTFS_TAG_1_PACKET_TYPE);
1269                 rc = -EINVAL;
1270                 goto out;
1271         }
1272         /* Released: wipe_auth_tok_list called in ecryptfs_parse_packet_set or
1273          * at end of function upon failure */
1274         auth_tok_list_item =
1275                 kmem_cache_zalloc(ecryptfs_auth_tok_list_item_cache,
1276                                   GFP_KERNEL);
1277         if (!auth_tok_list_item) {
1278                 printk(KERN_ERR "Unable to allocate memory\n");
1279                 rc = -ENOMEM;
1280                 goto out;
1281         }
1282         (*new_auth_tok) = &auth_tok_list_item->auth_tok;
1283         rc = ecryptfs_parse_packet_length(&data[(*packet_size)], &body_size,
1284                                           &length_size);
1285         if (rc) {
1286                 printk(KERN_WARNING "Error parsing packet length; "
1287                        "rc = [%d]\n", rc);
1288                 goto out_free;
1289         }
1290         if (unlikely(body_size < (ECRYPTFS_SIG_SIZE + 2))) {
1291                 printk(KERN_WARNING "Invalid body size ([%td])\n", body_size);
1292                 rc = -EINVAL;
1293                 goto out_free;
1294         }
1295         (*packet_size) += length_size;
1296         if (unlikely((*packet_size) + body_size > max_packet_size)) {
1297                 printk(KERN_WARNING "Packet size exceeds max\n");
1298                 rc = -EINVAL;
1299                 goto out_free;
1300         }
1301         if (unlikely(data[(*packet_size)++] != 0x03)) {
1302                 printk(KERN_WARNING "Unknown version number [%d]\n",
1303                        data[(*packet_size) - 1]);
1304                 rc = -EINVAL;
1305                 goto out_free;
1306         }
1307         ecryptfs_to_hex((*new_auth_tok)->token.private_key.signature,
1308                         &data[(*packet_size)], ECRYPTFS_SIG_SIZE);
1309         *packet_size += ECRYPTFS_SIG_SIZE;
1310         /* This byte is skipped because the kernel does not need to
1311          * know which public key encryption algorithm was used */
1312         (*packet_size)++;
1313         (*new_auth_tok)->session_key.encrypted_key_size =
1314                 body_size - (ECRYPTFS_SIG_SIZE + 2);
1315         if ((*new_auth_tok)->session_key.encrypted_key_size
1316             > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
1317                 printk(KERN_WARNING "Tag 1 packet contains key larger "
1318                        "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n");
1319                 rc = -EINVAL;
1320                 goto out;
1321         }
1322         memcpy((*new_auth_tok)->session_key.encrypted_key,
1323                &data[(*packet_size)], (body_size - (ECRYPTFS_SIG_SIZE + 2)));
1324         (*packet_size) += (*new_auth_tok)->session_key.encrypted_key_size;
1325         (*new_auth_tok)->session_key.flags &=
1326                 ~ECRYPTFS_CONTAINS_DECRYPTED_KEY;
1327         (*new_auth_tok)->session_key.flags |=
1328                 ECRYPTFS_CONTAINS_ENCRYPTED_KEY;
1329         (*new_auth_tok)->token_type = ECRYPTFS_PRIVATE_KEY;
1330         (*new_auth_tok)->flags = 0;
1331         (*new_auth_tok)->session_key.flags &=
1332                 ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_DECRYPT);
1333         (*new_auth_tok)->session_key.flags &=
1334                 ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_ENCRYPT);
1335         list_add(&auth_tok_list_item->list, auth_tok_list);
1336         goto out;
1337 out_free:
1338         (*new_auth_tok) = NULL;
1339         memset(auth_tok_list_item, 0,
1340                sizeof(struct ecryptfs_auth_tok_list_item));
1341         kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
1342                         auth_tok_list_item);
1343 out:
1344         if (rc)
1345                 (*packet_size) = 0;
1346         return rc;
1347 }
1348
1349 /**
1350  * parse_tag_3_packet
1351  * @crypt_stat: The cryptographic context to modify based on packet
1352  *              contents.
1353  * @data: The raw bytes of the packet.
1354  * @auth_tok_list: eCryptfs parses packets into authentication tokens;
1355  *                 a new authentication token will be placed at the end
1356  *                 of this list for this packet.
1357  * @new_auth_tok: Pointer to a pointer to memory that this function
1358  *                allocates; sets the memory address of the pointer to
1359  *                NULL on error. This object is added to the
1360  *                auth_tok_list.
1361  * @packet_size: This function writes the size of the parsed packet
1362  *               into this memory location; zero on error.
1363  * @max_packet_size: maximum number of bytes to parse
1364  *
1365  * Returns zero on success; non-zero on error.
1366  */
1367 static int
1368 parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
1369                    unsigned char *data, struct list_head *auth_tok_list,
1370                    struct ecryptfs_auth_tok **new_auth_tok,
1371                    size_t *packet_size, size_t max_packet_size)
1372 {
1373         size_t body_size;
1374         struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
1375         size_t length_size;
1376         int rc = 0;
1377
1378         (*packet_size) = 0;
1379         (*new_auth_tok) = NULL;
1380         /**
1381          *This format is inspired by OpenPGP; see RFC 2440
1382          * packet tag 3
1383          *
1384          * Tag 3 identifier (1 byte)
1385          * Max Tag 3 packet size (max 3 bytes)
1386          * Version (1 byte)
1387          * Cipher code (1 byte)
1388          * S2K specifier (1 byte)
1389          * Hash identifier (1 byte)
1390          * Salt (ECRYPTFS_SALT_SIZE)
1391          * Hash iterations (1 byte)
1392          * Encrypted key (arbitrary)
1393          *
1394          * (ECRYPTFS_SALT_SIZE + 7) minimum packet size
1395          */
1396         if (max_packet_size < (ECRYPTFS_SALT_SIZE + 7)) {
1397                 printk(KERN_ERR "Max packet size too large\n");
1398                 rc = -EINVAL;
1399                 goto out;
1400         }
1401         if (data[(*packet_size)++] != ECRYPTFS_TAG_3_PACKET_TYPE) {
1402                 printk(KERN_ERR "First byte != 0x%.2x; invalid packet\n",
1403                        ECRYPTFS_TAG_3_PACKET_TYPE);
1404                 rc = -EINVAL;
1405                 goto out;
1406         }
1407         /* Released: wipe_auth_tok_list called in ecryptfs_parse_packet_set or
1408          * at end of function upon failure */
1409         auth_tok_list_item =
1410             kmem_cache_zalloc(ecryptfs_auth_tok_list_item_cache, GFP_KERNEL);
1411         if (!auth_tok_list_item) {
1412                 printk(KERN_ERR "Unable to allocate memory\n");
1413                 rc = -ENOMEM;
1414                 goto out;
1415         }
1416         (*new_auth_tok) = &auth_tok_list_item->auth_tok;
1417         rc = ecryptfs_parse_packet_length(&data[(*packet_size)], &body_size,
1418                                           &length_size);
1419         if (rc) {
1420                 printk(KERN_WARNING "Error parsing packet length; rc = [%d]\n",
1421                        rc);
1422                 goto out_free;
1423         }
1424         if (unlikely(body_size < (ECRYPTFS_SALT_SIZE + 5))) {
1425                 printk(KERN_WARNING "Invalid body size ([%td])\n", body_size);
1426                 rc = -EINVAL;
1427                 goto out_free;
1428         }
1429         (*packet_size) += length_size;
1430         if (unlikely((*packet_size) + body_size > max_packet_size)) {
1431                 printk(KERN_ERR "Packet size exceeds max\n");
1432                 rc = -EINVAL;
1433                 goto out_free;
1434         }
1435         (*new_auth_tok)->session_key.encrypted_key_size =
1436                 (body_size - (ECRYPTFS_SALT_SIZE + 5));
1437         if ((*new_auth_tok)->session_key.encrypted_key_size
1438             > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
1439                 printk(KERN_WARNING "Tag 3 packet contains key larger "
1440                        "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n");
1441                 rc = -EINVAL;
1442                 goto out_free;
1443         }
1444         if (unlikely(data[(*packet_size)++] != 0x04)) {
1445                 printk(KERN_WARNING "Unknown version number [%d]\n",
1446                        data[(*packet_size) - 1]);
1447                 rc = -EINVAL;
1448                 goto out_free;
1449         }
1450         rc = ecryptfs_cipher_code_to_string(crypt_stat->cipher,
1451                                             (u16)data[(*packet_size)]);
1452         if (rc)
1453                 goto out_free;
1454         /* A little extra work to differentiate among the AES key
1455          * sizes; see RFC2440 */
1456         switch(data[(*packet_size)++]) {
1457         case RFC2440_CIPHER_AES_192:
1458                 crypt_stat->key_size = 24;
1459                 break;
1460         default:
1461                 crypt_stat->key_size =
1462                         (*new_auth_tok)->session_key.encrypted_key_size;
1463         }
1464         rc = ecryptfs_init_crypt_ctx(crypt_stat);
1465         if (rc)
1466                 goto out_free;
1467         if (unlikely(data[(*packet_size)++] != 0x03)) {
1468                 printk(KERN_WARNING "Only S2K ID 3 is currently supported\n");
1469                 rc = -ENOSYS;
1470                 goto out_free;
1471         }
1472         /* TODO: finish the hash mapping */
1473         switch (data[(*packet_size)++]) {
1474         case 0x01: /* See RFC2440 for these numbers and their mappings */
1475                 /* Choose MD5 */
1476                 memcpy((*new_auth_tok)->token.password.salt,
1477                        &data[(*packet_size)], ECRYPTFS_SALT_SIZE);
1478                 (*packet_size) += ECRYPTFS_SALT_SIZE;
1479                 /* This conversion was taken straight from RFC2440 */
1480                 (*new_auth_tok)->token.password.hash_iterations =
1481                         ((u32) 16 + (data[(*packet_size)] & 15))
1482                                 << ((data[(*packet_size)] >> 4) + 6);
1483                 (*packet_size)++;
1484                 /* Friendly reminder:
1485                  * (*new_auth_tok)->session_key.encrypted_key_size =
1486                  *         (body_size - (ECRYPTFS_SALT_SIZE + 5)); */
1487                 memcpy((*new_auth_tok)->session_key.encrypted_key,
1488                        &data[(*packet_size)],
1489                        (*new_auth_tok)->session_key.encrypted_key_size);
1490                 (*packet_size) +=
1491                         (*new_auth_tok)->session_key.encrypted_key_size;
1492                 (*new_auth_tok)->session_key.flags &=
1493                         ~ECRYPTFS_CONTAINS_DECRYPTED_KEY;
1494                 (*new_auth_tok)->session_key.flags |=
1495                         ECRYPTFS_CONTAINS_ENCRYPTED_KEY;
1496                 (*new_auth_tok)->token.password.hash_algo = 0x01; /* MD5 */
1497                 break;
1498         default:
1499                 ecryptfs_printk(KERN_ERR, "Unsupported hash algorithm: "
1500                                 "[%d]\n", data[(*packet_size) - 1]);
1501                 rc = -ENOSYS;
1502                 goto out_free;
1503         }
1504         (*new_auth_tok)->token_type = ECRYPTFS_PASSWORD;
1505         /* TODO: Parametarize; we might actually want userspace to
1506          * decrypt the session key. */
1507         (*new_auth_tok)->session_key.flags &=
1508                             ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_DECRYPT);
1509         (*new_auth_tok)->session_key.flags &=
1510                             ~(ECRYPTFS_USERSPACE_SHOULD_TRY_TO_ENCRYPT);
1511         list_add(&auth_tok_list_item->list, auth_tok_list);
1512         goto out;
1513 out_free:
1514         (*new_auth_tok) = NULL;
1515         memset(auth_tok_list_item, 0,
1516                sizeof(struct ecryptfs_auth_tok_list_item));
1517         kmem_cache_free(ecryptfs_auth_tok_list_item_cache,
1518                         auth_tok_list_item);
1519 out:
1520         if (rc)
1521                 (*packet_size) = 0;
1522         return rc;
1523 }
1524
1525 /**
1526  * parse_tag_11_packet
1527  * @data: The raw bytes of the packet
1528  * @contents: This function writes the data contents of the literal
1529  *            packet into this memory location
1530  * @max_contents_bytes: The maximum number of bytes that this function
1531  *                      is allowed to write into contents
1532  * @tag_11_contents_size: This function writes the size of the parsed
1533  *                        contents into this memory location; zero on
1534  *                        error
1535  * @packet_size: This function writes the size of the parsed packet
1536  *               into this memory location; zero on error
1537  * @max_packet_size: maximum number of bytes to parse
1538  *
1539  * Returns zero on success; non-zero on error.
1540  */
1541 static int
1542 parse_tag_11_packet(unsigned char *data, unsigned char *contents,
1543                     size_t max_contents_bytes, size_t *tag_11_contents_size,
1544                     size_t *packet_size, size_t max_packet_size)
1545 {
1546         size_t body_size;
1547         size_t length_size;
1548         int rc = 0;
1549
1550         (*packet_size) = 0;
1551         (*tag_11_contents_size) = 0;
1552         /* This format is inspired by OpenPGP; see RFC 2440
1553          * packet tag 11
1554          *
1555          * Tag 11 identifier (1 byte)
1556          * Max Tag 11 packet size (max 3 bytes)
1557          * Binary format specifier (1 byte)
1558          * Filename length (1 byte)
1559          * Filename ("_CONSOLE") (8 bytes)
1560          * Modification date (4 bytes)
1561          * Literal data (arbitrary)
1562          *
1563          * We need at least 16 bytes of data for the packet to even be
1564          * valid.
1565          */
1566         if (max_packet_size < 16) {
1567                 printk(KERN_ERR "Maximum packet size too small\n");
1568                 rc = -EINVAL;
1569                 goto out;
1570         }
1571         if (data[(*packet_size)++] != ECRYPTFS_TAG_11_PACKET_TYPE) {
1572                 printk(KERN_WARNING "Invalid tag 11 packet format\n");
1573                 rc = -EINVAL;
1574                 goto out;
1575         }
1576         rc = ecryptfs_parse_packet_length(&data[(*packet_size)], &body_size,
1577                                           &length_size);
1578         if (rc) {
1579                 printk(KERN_WARNING "Invalid tag 11 packet format\n");
1580                 goto out;
1581         }
1582         if (body_size < 14) {
1583                 printk(KERN_WARNING "Invalid body size ([%td])\n", body_size);
1584                 rc = -EINVAL;
1585                 goto out;
1586         }
1587         (*packet_size) += length_size;
1588         (*tag_11_contents_size) = (body_size - 14);
1589         if (unlikely((*packet_size) + body_size + 1 > max_packet_size)) {
1590                 printk(KERN_ERR "Packet size exceeds max\n");
1591                 rc = -EINVAL;
1592                 goto out;
1593         }
1594         if (unlikely((*tag_11_contents_size) > max_contents_bytes)) {
1595                 printk(KERN_ERR "Literal data section in tag 11 packet exceeds "
1596                        "expected size\n");
1597                 rc = -EINVAL;
1598                 goto out;
1599         }
1600         if (data[(*packet_size)++] != 0x62) {
1601                 printk(KERN_WARNING "Unrecognizable packet\n");
1602                 rc = -EINVAL;
1603                 goto out;
1604         }
1605         if (data[(*packet_size)++] != 0x08) {
1606                 printk(KERN_WARNING "Unrecognizable packet\n");
1607                 rc = -EINVAL;
1608                 goto out;
1609         }
1610         (*packet_size) += 12; /* Ignore filename and modification date */
1611         memcpy(contents, &data[(*packet_size)], (*tag_11_contents_size));
1612         (*packet_size) += (*tag_11_contents_size);
1613 out:
1614         if (rc) {
1615                 (*packet_size) = 0;
1616                 (*tag_11_contents_size) = 0;
1617         }
1618         return rc;
1619 }
1620
1621 int ecryptfs_keyring_auth_tok_for_sig(struct key **auth_tok_key,
1622                                       struct ecryptfs_auth_tok **auth_tok,
1623                                       char *sig)
1624 {
1625         int rc = 0;
1626
1627         (*auth_tok_key) = request_key(&key_type_user, sig, NULL);
1628         if (!(*auth_tok_key) || IS_ERR(*auth_tok_key)) {
1629                 (*auth_tok_key) = ecryptfs_get_encrypted_key(sig);
1630                 if (!(*auth_tok_key) || IS_ERR(*auth_tok_key)) {
1631                         printk(KERN_ERR "Could not find key with description: [%s]\n",
1632                               sig);
1633                         rc = process_request_key_err(PTR_ERR(*auth_tok_key));
1634                         (*auth_tok_key) = NULL;
1635                         goto out;
1636                 }
1637         }
1638         down_write(&(*auth_tok_key)->sem);
1639         rc = ecryptfs_verify_auth_tok_from_key(*auth_tok_key, auth_tok);
1640         if (rc) {
1641                 up_write(&(*auth_tok_key)->sem);
1642                 key_put(*auth_tok_key);
1643                 (*auth_tok_key) = NULL;
1644                 goto out;
1645         }
1646 out:
1647         return rc;
1648 }
1649
1650 /**
1651  * decrypt_passphrase_encrypted_session_key - Decrypt the session key with the given auth_tok.
1652  * @auth_tok: The passphrase authentication token to use to encrypt the FEK
1653  * @crypt_stat: The cryptographic context
1654  *
1655  * Returns zero on success; non-zero error otherwise
1656  */
1657 static int
1658 decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
1659                                          struct ecryptfs_crypt_stat *crypt_stat)
1660 {
1661         struct scatterlist dst_sg[2];
1662         struct scatterlist src_sg[2];
1663         struct mutex *tfm_mutex;
1664         struct crypto_skcipher *tfm;
1665         struct skcipher_request *req = NULL;
1666         int rc = 0;
1667
1668         if (unlikely(ecryptfs_verbosity > 0)) {
1669                 ecryptfs_printk(
1670                         KERN_DEBUG, "Session key encryption key (size [%d]):\n",
1671                         auth_tok->token.password.session_key_encryption_key_bytes);
1672                 ecryptfs_dump_hex(
1673                         auth_tok->token.password.session_key_encryption_key,
1674                         auth_tok->token.password.session_key_encryption_key_bytes);
1675         }
1676         rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&tfm, &tfm_mutex,
1677                                                         crypt_stat->cipher);
1678         if (unlikely(rc)) {
1679                 printk(KERN_ERR "Internal error whilst attempting to get "
1680                        "tfm and mutex for cipher name [%s]; rc = [%d]\n",
1681                        crypt_stat->cipher, rc);
1682                 goto out;
1683         }
1684         rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key,
1685                                  auth_tok->session_key.encrypted_key_size,
1686                                  src_sg, 2);
1687         if (rc < 1 || rc > 2) {
1688                 printk(KERN_ERR "Internal error whilst attempting to convert "
1689                         "auth_tok->session_key.encrypted_key to scatterlist; "
1690                         "expected rc = 1; got rc = [%d]. "
1691                        "auth_tok->session_key.encrypted_key_size = [%d]\n", rc,
1692                         auth_tok->session_key.encrypted_key_size);
1693                 goto out;
1694         }
1695         auth_tok->session_key.decrypted_key_size =
1696                 auth_tok->session_key.encrypted_key_size;
1697         rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key,
1698                                  auth_tok->session_key.decrypted_key_size,
1699                                  dst_sg, 2);
1700         if (rc < 1 || rc > 2) {
1701                 printk(KERN_ERR "Internal error whilst attempting to convert "
1702                         "auth_tok->session_key.decrypted_key to scatterlist; "
1703                         "expected rc = 1; got rc = [%d]\n", rc);
1704                 goto out;
1705         }
1706         mutex_lock(tfm_mutex);
1707         req = skcipher_request_alloc(tfm, GFP_KERNEL);
1708         if (!req) {
1709                 mutex_unlock(tfm_mutex);
1710                 printk(KERN_ERR "%s: Out of kernel memory whilst attempting to "
1711                        "skcipher_request_alloc for %s\n", __func__,
1712                        crypto_skcipher_driver_name(tfm));
1713                 rc = -ENOMEM;
1714                 goto out;
1715         }
1716
1717         skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
1718                                       NULL, NULL);
1719         rc = crypto_skcipher_setkey(
1720                 tfm, auth_tok->token.password.session_key_encryption_key,
1721                 crypt_stat->key_size);
1722         if (unlikely(rc < 0)) {
1723                 mutex_unlock(tfm_mutex);
1724                 printk(KERN_ERR "Error setting key for crypto context\n");
1725                 rc = -EINVAL;
1726                 goto out;
1727         }
1728         skcipher_request_set_crypt(req, src_sg, dst_sg,
1729                                    auth_tok->session_key.encrypted_key_size,
1730                                    NULL);
1731         rc = crypto_skcipher_decrypt(req);
1732         mutex_unlock(tfm_mutex);
1733         if (unlikely(rc)) {
1734                 printk(KERN_ERR "Error decrypting; rc = [%d]\n", rc);
1735                 goto out;
1736         }
1737         auth_tok->session_key.flags |= ECRYPTFS_CONTAINS_DECRYPTED_KEY;
1738         memcpy(crypt_stat->key, auth_tok->session_key.decrypted_key,
1739                auth_tok->session_key.decrypted_key_size);
1740         crypt_stat->flags |= ECRYPTFS_KEY_VALID;
1741         if (unlikely(ecryptfs_verbosity > 0)) {
1742                 ecryptfs_printk(KERN_DEBUG, "FEK of size [%zd]:\n",
1743                                 crypt_stat->key_size);
1744                 ecryptfs_dump_hex(crypt_stat->key,
1745                                   crypt_stat->key_size);
1746         }
1747 out:
1748         skcipher_request_free(req);
1749         return rc;
1750 }
1751
1752 /**
1753  * ecryptfs_parse_packet_set
1754  * @crypt_stat: The cryptographic context
1755  * @src: Virtual address of region of memory containing the packets
1756  * @ecryptfs_dentry: The eCryptfs dentry associated with the packet set
1757  *
1758  * Get crypt_stat to have the file's session key if the requisite key
1759  * is available to decrypt the session key.
1760  *
1761  * Returns Zero if a valid authentication token was retrieved and
1762  * processed; negative value for file not encrypted or for error
1763  * conditions.
1764  */
1765 int ecryptfs_parse_packet_set(struct ecryptfs_crypt_stat *crypt_stat,
1766                               unsigned char *src,
1767                               struct dentry *ecryptfs_dentry)
1768 {
1769         size_t i = 0;
1770         size_t found_auth_tok;
1771         size_t next_packet_is_auth_tok_packet;
1772         struct list_head auth_tok_list;
1773         struct ecryptfs_auth_tok *matching_auth_tok;
1774         struct ecryptfs_auth_tok *candidate_auth_tok;
1775         char *candidate_auth_tok_sig;
1776         size_t packet_size;
1777         struct ecryptfs_auth_tok *new_auth_tok;
1778         unsigned char sig_tmp_space[ECRYPTFS_SIG_SIZE];
1779         struct ecryptfs_auth_tok_list_item *auth_tok_list_item;
1780         size_t tag_11_contents_size;
1781         size_t tag_11_packet_size;
1782         struct key *auth_tok_key = NULL;
1783         int rc = 0;
1784
1785         INIT_LIST_HEAD(&auth_tok_list);
1786         /* Parse the header to find as many packets as we can; these will be
1787          * added the our &auth_tok_list */
1788         next_packet_is_auth_tok_packet = 1;
1789         while (next_packet_is_auth_tok_packet) {
1790                 size_t max_packet_size = ((PAGE_SIZE - 8) - i);
1791
1792                 switch (src[i]) {
1793                 case ECRYPTFS_TAG_3_PACKET_TYPE:
1794                         rc = parse_tag_3_packet(crypt_stat,
1795                                                 (unsigned char *)&src[i],
1796                                                 &auth_tok_list, &new_auth_tok,
1797                                                 &packet_size, max_packet_size);
1798                         if (rc) {
1799                                 ecryptfs_printk(KERN_ERR, "Error parsing "
1800                                                 "tag 3 packet\n");
1801                                 rc = -EIO;
1802                                 goto out_wipe_list;
1803                         }
1804                         i += packet_size;
1805                         rc = parse_tag_11_packet((unsigned char *)&src[i],
1806                                                  sig_tmp_space,
1807                                                  ECRYPTFS_SIG_SIZE,
1808                                                  &tag_11_contents_size,
1809                                                  &tag_11_packet_size,
1810                                                  max_packet_size);
1811                         if (rc) {
1812                                 ecryptfs_printk(KERN_ERR, "No valid "
1813                                                 "(ecryptfs-specific) literal "
1814                                                 "packet containing "
1815                                                 "authentication token "
1816                                                 "signature found after "
1817                                                 "tag 3 packet\n");
1818                                 rc = -EIO;
1819                                 goto out_wipe_list;
1820                         }
1821                         i += tag_11_packet_size;
1822                         if (ECRYPTFS_SIG_SIZE != tag_11_contents_size) {
1823                                 ecryptfs_printk(KERN_ERR, "Expected "
1824                                                 "signature of size [%d]; "
1825                                                 "read size [%zd]\n",
1826                                                 ECRYPTFS_SIG_SIZE,
1827                                                 tag_11_contents_size);
1828                                 rc = -EIO;
1829                                 goto out_wipe_list;
1830                         }
1831                         ecryptfs_to_hex(new_auth_tok->token.password.signature,
1832                                         sig_tmp_space, tag_11_contents_size);
1833                         new_auth_tok->token.password.signature[
1834                                 ECRYPTFS_PASSWORD_SIG_SIZE] = '\0';
1835                         crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
1836                         break;
1837                 case ECRYPTFS_TAG_1_PACKET_TYPE:
1838                         rc = parse_tag_1_packet(crypt_stat,
1839                                                 (unsigned char *)&src[i],
1840                                                 &auth_tok_list, &new_auth_tok,
1841                                                 &packet_size, max_packet_size);
1842                         if (rc) {
1843                                 ecryptfs_printk(KERN_ERR, "Error parsing "
1844                                                 "tag 1 packet\n");
1845                                 rc = -EIO;
1846                                 goto out_wipe_list;
1847                         }
1848                         i += packet_size;
1849                         crypt_stat->flags |= ECRYPTFS_ENCRYPTED;
1850                         break;
1851                 case ECRYPTFS_TAG_11_PACKET_TYPE:
1852                         ecryptfs_printk(KERN_WARNING, "Invalid packet set "
1853                                         "(Tag 11 not allowed by itself)\n");
1854                         rc = -EIO;
1855                         goto out_wipe_list;
1856                 default:
1857                         ecryptfs_printk(KERN_DEBUG, "No packet at offset [%zd] "
1858                                         "of the file header; hex value of "
1859                                         "character is [0x%.2x]\n", i, src[i]);
1860                         next_packet_is_auth_tok_packet = 0;
1861                 }
1862         }
1863         if (list_empty(&auth_tok_list)) {
1864                 printk(KERN_ERR "The lower file appears to be a non-encrypted "
1865                        "eCryptfs file; this is not supported in this version "
1866                        "of the eCryptfs kernel module\n");
1867                 rc = -EINVAL;
1868                 goto out;
1869         }
1870         /* auth_tok_list contains the set of authentication tokens
1871          * parsed from the metadata. We need to find a matching
1872          * authentication token that has the secret component(s)
1873          * necessary to decrypt the EFEK in the auth_tok parsed from
1874          * the metadata. There may be several potential matches, but
1875          * just one will be sufficient to decrypt to get the FEK. */
1876 find_next_matching_auth_tok:
1877         found_auth_tok = 0;
1878         list_for_each_entry(auth_tok_list_item, &auth_tok_list, list) {
1879                 candidate_auth_tok = &auth_tok_list_item->auth_tok;
1880                 if (unlikely(ecryptfs_verbosity > 0)) {
1881                         ecryptfs_printk(KERN_DEBUG,
1882                                         "Considering candidate auth tok:\n");
1883                         ecryptfs_dump_auth_tok(candidate_auth_tok);
1884                 }
1885                 rc = ecryptfs_get_auth_tok_sig(&candidate_auth_tok_sig,
1886                                                candidate_auth_tok);
1887                 if (rc) {
1888                         printk(KERN_ERR
1889                                "Unrecognized candidate auth tok type: [%d]\n",
1890                                candidate_auth_tok->token_type);
1891                         rc = -EINVAL;
1892                         goto out_wipe_list;
1893                 }
1894                 rc = ecryptfs_find_auth_tok_for_sig(&auth_tok_key,
1895                                                &matching_auth_tok,
1896                                                crypt_stat->mount_crypt_stat,
1897                                                candidate_auth_tok_sig);
1898                 if (!rc) {
1899                         found_auth_tok = 1;
1900                         goto found_matching_auth_tok;
1901                 }
1902         }
1903         if (!found_auth_tok) {
1904                 ecryptfs_printk(KERN_ERR, "Could not find a usable "
1905                                 "authentication token\n");
1906                 rc = -EIO;
1907                 goto out_wipe_list;
1908         }
1909 found_matching_auth_tok:
1910         if (candidate_auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) {
1911                 memcpy(&(candidate_auth_tok->token.private_key),
1912                        &(matching_auth_tok->token.private_key),
1913                        sizeof(struct ecryptfs_private_key));
1914                 up_write(&(auth_tok_key->sem));
1915                 key_put(auth_tok_key);
1916                 rc = decrypt_pki_encrypted_session_key(candidate_auth_tok,
1917                                                        crypt_stat);
1918         } else if (candidate_auth_tok->token_type == ECRYPTFS_PASSWORD) {
1919                 memcpy(&(candidate_auth_tok->token.password),
1920                        &(matching_auth_tok->token.password),
1921                        sizeof(struct ecryptfs_password));
1922                 up_write(&(auth_tok_key->sem));
1923                 key_put(auth_tok_key);
1924                 rc = decrypt_passphrase_encrypted_session_key(
1925                         candidate_auth_tok, crypt_stat);
1926         } else {
1927                 up_write(&(auth_tok_key->sem));
1928                 key_put(auth_tok_key);
1929                 rc = -EINVAL;
1930         }
1931         if (rc) {
1932                 struct ecryptfs_auth_tok_list_item *auth_tok_list_item_tmp;
1933
1934                 ecryptfs_printk(KERN_WARNING, "Error decrypting the "
1935                                 "session key for authentication token with sig "
1936                                 "[%.*s]; rc = [%d]. Removing auth tok "
1937                                 "candidate from the list and searching for "
1938                                 "the next match.\n", ECRYPTFS_SIG_SIZE_HEX,
1939                                 candidate_auth_tok_sig, rc);
1940                 list_for_each_entry_safe(auth_tok_list_item,
1941                                          auth_tok_list_item_tmp,
1942                                          &auth_tok_list, list) {
1943                         if (candidate_auth_tok
1944                             == &auth_tok_list_item->auth_tok) {
1945                                 list_del(&auth_tok_list_item->list);
1946                                 kmem_cache_free(
1947                                         ecryptfs_auth_tok_list_item_cache,
1948                                         auth_tok_list_item);
1949                                 goto find_next_matching_auth_tok;
1950                         }
1951                 }
1952                 BUG();
1953         }
1954         rc = ecryptfs_compute_root_iv(crypt_stat);
1955         if (rc) {
1956                 ecryptfs_printk(KERN_ERR, "Error computing "
1957                                 "the root IV\n");
1958                 goto out_wipe_list;
1959         }
1960         rc = ecryptfs_init_crypt_ctx(crypt_stat);
1961         if (rc) {
1962                 ecryptfs_printk(KERN_ERR, "Error initializing crypto "
1963                                 "context for cipher [%s]; rc = [%d]\n",
1964                                 crypt_stat->cipher, rc);
1965         }
1966 out_wipe_list:
1967         wipe_auth_tok_list(&auth_tok_list);
1968 out:
1969         return rc;
1970 }
1971
1972 static int
1973 pki_encrypt_session_key(struct key *auth_tok_key,
1974                         struct ecryptfs_auth_tok *auth_tok,
1975                         struct ecryptfs_crypt_stat *crypt_stat,
1976                         struct ecryptfs_key_record *key_rec)
1977 {
1978         struct ecryptfs_msg_ctx *msg_ctx = NULL;
1979         char *payload = NULL;
1980         size_t payload_len = 0;
1981         struct ecryptfs_message *msg;
1982         int rc;
1983
1984         rc = write_tag_66_packet(auth_tok->token.private_key.signature,
1985                                  ecryptfs_code_for_cipher_string(
1986                                          crypt_stat->cipher,
1987                                          crypt_stat->key_size),
1988                                  crypt_stat, &payload, &payload_len);
1989         up_write(&(auth_tok_key->sem));
1990         key_put(auth_tok_key);
1991         if (rc) {
1992                 ecryptfs_printk(KERN_ERR, "Error generating tag 66 packet\n");
1993                 goto out;
1994         }
1995         rc = ecryptfs_send_message(payload, payload_len, &msg_ctx);
1996         if (rc) {
1997                 ecryptfs_printk(KERN_ERR, "Error sending message to "
1998                                 "ecryptfsd: %d\n", rc);
1999                 goto out;
2000         }
2001         rc = ecryptfs_wait_for_response(msg_ctx, &msg);
2002         if (rc) {
2003                 ecryptfs_printk(KERN_ERR, "Failed to receive tag 67 packet "
2004                                 "from the user space daemon\n");
2005                 rc = -EIO;
2006                 goto out;
2007         }
2008         rc = parse_tag_67_packet(key_rec, msg);
2009         if (rc)
2010                 ecryptfs_printk(KERN_ERR, "Error parsing tag 67 packet\n");
2011         kfree(msg);
2012 out:
2013         kfree(payload);
2014         return rc;
2015 }
2016 /**
2017  * write_tag_1_packet - Write an RFC2440-compatible tag 1 (public key) packet
2018  * @dest: Buffer into which to write the packet
2019  * @remaining_bytes: Maximum number of bytes that can be writtn
2020  * @auth_tok_key: The authentication token key to unlock and put when done with
2021  *                @auth_tok
2022  * @auth_tok: The authentication token used for generating the tag 1 packet
2023  * @crypt_stat: The cryptographic context
2024  * @key_rec: The key record struct for the tag 1 packet
2025  * @packet_size: This function will write the number of bytes that end
2026  *               up constituting the packet; set to zero on error
2027  *
2028  * Returns zero on success; non-zero on error.
2029  */
2030 static int
2031 write_tag_1_packet(char *dest, size_t *remaining_bytes,
2032                    struct key *auth_tok_key, struct ecryptfs_auth_tok *auth_tok,
2033                    struct ecryptfs_crypt_stat *crypt_stat,
2034                    struct ecryptfs_key_record *key_rec, size_t *packet_size)
2035 {
2036         size_t i;
2037         size_t encrypted_session_key_valid = 0;
2038         size_t packet_size_length;
2039         size_t max_packet_size;
2040         int rc = 0;
2041
2042         (*packet_size) = 0;
2043         ecryptfs_from_hex(key_rec->sig, auth_tok->token.private_key.signature,
2044                           ECRYPTFS_SIG_SIZE);
2045         encrypted_session_key_valid = 0;
2046         for (i = 0; i < crypt_stat->key_size; i++)
2047                 encrypted_session_key_valid |=
2048                         auth_tok->session_key.encrypted_key[i];
2049         if (encrypted_session_key_valid) {
2050                 memcpy(key_rec->enc_key,
2051                        auth_tok->session_key.encrypted_key,
2052                        auth_tok->session_key.encrypted_key_size);
2053                 up_write(&(auth_tok_key->sem));
2054                 key_put(auth_tok_key);
2055                 goto encrypted_session_key_set;
2056         }
2057         if (auth_tok->session_key.encrypted_key_size == 0)
2058                 auth_tok->session_key.encrypted_key_size =
2059                         auth_tok->token.private_key.key_size;
2060         rc = pki_encrypt_session_key(auth_tok_key, auth_tok, crypt_stat,
2061                                      key_rec);
2062         if (rc) {
2063                 printk(KERN_ERR "Failed to encrypt session key via a key "
2064                        "module; rc = [%d]\n", rc);
2065                 goto out;
2066         }
2067         if (ecryptfs_verbosity > 0) {
2068                 ecryptfs_printk(KERN_DEBUG, "Encrypted key:\n");
2069                 ecryptfs_dump_hex(key_rec->enc_key, key_rec->enc_key_size);
2070         }
2071 encrypted_session_key_set:
2072         /* This format is inspired by OpenPGP; see RFC 2440
2073          * packet tag 1 */
2074         max_packet_size = (1                         /* Tag 1 identifier */
2075                            + 3                       /* Max Tag 1 packet size */
2076                            + 1                       /* Version */
2077                            + ECRYPTFS_SIG_SIZE       /* Key identifier */
2078                            + 1                       /* Cipher identifier */
2079                            + key_rec->enc_key_size); /* Encrypted key size */
2080         if (max_packet_size > (*remaining_bytes)) {
2081                 printk(KERN_ERR "Packet length larger than maximum allowable; "
2082                        "need up to [%td] bytes, but there are only [%td] "
2083                        "available\n", max_packet_size, (*remaining_bytes));
2084                 rc = -EINVAL;
2085                 goto out;
2086         }
2087         dest[(*packet_size)++] = ECRYPTFS_TAG_1_PACKET_TYPE;
2088         rc = ecryptfs_write_packet_length(&dest[(*packet_size)],
2089                                           (max_packet_size - 4),
2090                                           &packet_size_length);
2091         if (rc) {
2092                 ecryptfs_printk(KERN_ERR, "Error generating tag 1 packet "
2093                                 "header; cannot generate packet length\n");
2094                 goto out;
2095         }
2096         (*packet_size) += packet_size_length;
2097         dest[(*packet_size)++] = 0x03; /* version 3 */
2098         memcpy(&dest[(*packet_size)], key_rec->sig, ECRYPTFS_SIG_SIZE);
2099         (*packet_size) += ECRYPTFS_SIG_SIZE;
2100         dest[(*packet_size)++] = RFC2440_CIPHER_RSA;
2101         memcpy(&dest[(*packet_size)], key_rec->enc_key,
2102                key_rec->enc_key_size);
2103         (*packet_size) += key_rec->enc_key_size;
2104 out:
2105         if (rc)
2106                 (*packet_size) = 0;
2107         else
2108                 (*remaining_bytes) -= (*packet_size);
2109         return rc;
2110 }
2111
2112 /**
2113  * write_tag_11_packet
2114  * @dest: Target into which Tag 11 packet is to be written
2115  * @remaining_bytes: Maximum packet length
2116  * @contents: Byte array of contents to copy in
2117  * @contents_length: Number of bytes in contents
2118  * @packet_length: Length of the Tag 11 packet written; zero on error
2119  *
2120  * Returns zero on success; non-zero on error.
2121  */
2122 static int
2123 write_tag_11_packet(char *dest, size_t *remaining_bytes, char *contents,
2124                     size_t contents_length, size_t *packet_length)
2125 {
2126         size_t packet_size_length;
2127         size_t max_packet_size;
2128         int rc = 0;
2129
2130         (*packet_length) = 0;
2131         /* This format is inspired by OpenPGP; see RFC 2440
2132          * packet tag 11 */
2133         max_packet_size = (1                   /* Tag 11 identifier */
2134                            + 3                 /* Max Tag 11 packet size */
2135                            + 1                 /* Binary format specifier */
2136                            + 1                 /* Filename length */
2137                            + 8                 /* Filename ("_CONSOLE") */
2138                            + 4                 /* Modification date */
2139                            + contents_length); /* Literal data */
2140         if (max_packet_size > (*remaining_bytes)) {
2141                 printk(KERN_ERR "Packet length larger than maximum allowable; "
2142                        "need up to [%td] bytes, but there are only [%td] "
2143                        "available\n", max_packet_size, (*remaining_bytes));
2144                 rc = -EINVAL;
2145                 goto out;
2146         }
2147         dest[(*packet_length)++] = ECRYPTFS_TAG_11_PACKET_TYPE;
2148         rc = ecryptfs_write_packet_length(&dest[(*packet_length)],
2149                                           (max_packet_size - 4),
2150                                           &packet_size_length);
2151         if (rc) {
2152                 printk(KERN_ERR "Error generating tag 11 packet header; cannot "
2153                        "generate packet length. rc = [%d]\n", rc);
2154                 goto out;
2155         }
2156         (*packet_length) += packet_size_length;
2157         dest[(*packet_length)++] = 0x62; /* binary data format specifier */
2158         dest[(*packet_length)++] = 8;
2159         memcpy(&dest[(*packet_length)], "_CONSOLE", 8);
2160         (*packet_length) += 8;
2161         memset(&dest[(*packet_length)], 0x00, 4);
2162         (*packet_length) += 4;
2163         memcpy(&dest[(*packet_length)], contents, contents_length);
2164         (*packet_length) += contents_length;
2165  out:
2166         if (rc)
2167                 (*packet_length) = 0;
2168         else
2169                 (*remaining_bytes) -= (*packet_length);
2170         return rc;
2171 }
2172
2173 /**
2174  * write_tag_3_packet
2175  * @dest: Buffer into which to write the packet
2176  * @remaining_bytes: Maximum number of bytes that can be written
2177  * @auth_tok: Authentication token
2178  * @crypt_stat: The cryptographic context
2179  * @key_rec: encrypted key
2180  * @packet_size: This function will write the number of bytes that end
2181  *               up constituting the packet; set to zero on error
2182  *
2183  * Returns zero on success; non-zero on error.
2184  */
2185 static int
2186 write_tag_3_packet(char *dest, size_t *remaining_bytes,
2187                    struct ecryptfs_auth_tok *auth_tok,
2188                    struct ecryptfs_crypt_stat *crypt_stat,
2189                    struct ecryptfs_key_record *key_rec, size_t *packet_size)
2190 {
2191         size_t i;
2192         size_t encrypted_session_key_valid = 0;
2193         char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES];
2194         struct scatterlist dst_sg[2];
2195         struct scatterlist src_sg[2];
2196         struct mutex *tfm_mutex = NULL;
2197         u8 cipher_code;
2198         size_t packet_size_length;
2199         size_t max_packet_size;
2200         struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
2201                 crypt_stat->mount_crypt_stat;
2202         struct crypto_skcipher *tfm;
2203         struct skcipher_request *req;
2204         int rc = 0;
2205
2206         (*packet_size) = 0;
2207         ecryptfs_from_hex(key_rec->sig, auth_tok->token.password.signature,
2208                           ECRYPTFS_SIG_SIZE);
2209         rc = ecryptfs_get_tfm_and_mutex_for_cipher_name(&tfm, &tfm_mutex,
2210                                                         crypt_stat->cipher);
2211         if (unlikely(rc)) {
2212                 printk(KERN_ERR "Internal error whilst attempting to get "
2213                        "tfm and mutex for cipher name [%s]; rc = [%d]\n",
2214                        crypt_stat->cipher, rc);
2215                 goto out;
2216         }
2217         if (mount_crypt_stat->global_default_cipher_key_size == 0) {
2218                 printk(KERN_WARNING "No key size specified at mount; "
2219                        "defaulting to [%d]\n",
2220                        crypto_skcipher_default_keysize(tfm));
2221                 mount_crypt_stat->global_default_cipher_key_size =
2222                         crypto_skcipher_default_keysize(tfm);
2223         }
2224         if (crypt_stat->key_size == 0)
2225                 crypt_stat->key_size =
2226                         mount_crypt_stat->global_default_cipher_key_size;
2227         if (auth_tok->session_key.encrypted_key_size == 0)
2228                 auth_tok->session_key.encrypted_key_size =
2229                         crypt_stat->key_size;
2230         if (crypt_stat->key_size == 24
2231             && strcmp("aes", crypt_stat->cipher) == 0) {
2232                 memset((crypt_stat->key + 24), 0, 8);
2233                 auth_tok->session_key.encrypted_key_size = 32;
2234         } else
2235                 auth_tok->session_key.encrypted_key_size = crypt_stat->key_size;
2236         key_rec->enc_key_size =
2237                 auth_tok->session_key.encrypted_key_size;
2238         encrypted_session_key_valid = 0;
2239         for (i = 0; i < auth_tok->session_key.encrypted_key_size; i++)
2240                 encrypted_session_key_valid |=
2241                         auth_tok->session_key.encrypted_key[i];
2242         if (encrypted_session_key_valid) {
2243                 ecryptfs_printk(KERN_DEBUG, "encrypted_session_key_valid != 0; "
2244                                 "using auth_tok->session_key.encrypted_key, "
2245                                 "where key_rec->enc_key_size = [%zd]\n",
2246                                 key_rec->enc_key_size);
2247                 memcpy(key_rec->enc_key,
2248                        auth_tok->session_key.encrypted_key,
2249                        key_rec->enc_key_size);
2250                 goto encrypted_session_key_set;
2251         }
2252         if (auth_tok->token.password.flags &
2253             ECRYPTFS_SESSION_KEY_ENCRYPTION_KEY_SET) {
2254                 ecryptfs_printk(KERN_DEBUG, "Using previously generated "
2255                                 "session key encryption key of size [%d]\n",
2256                                 auth_tok->token.password.
2257                                 session_key_encryption_key_bytes);
2258                 memcpy(session_key_encryption_key,
2259                        auth_tok->token.password.session_key_encryption_key,
2260                        crypt_stat->key_size);
2261                 ecryptfs_printk(KERN_DEBUG,
2262                                 "Cached session key encryption key:\n");
2263                 if (ecryptfs_verbosity > 0)
2264                         ecryptfs_dump_hex(session_key_encryption_key, 16);
2265         }
2266         if (unlikely(ecryptfs_verbosity > 0)) {
2267                 ecryptfs_printk(KERN_DEBUG, "Session key encryption key:\n");
2268                 ecryptfs_dump_hex(session_key_encryption_key, 16);
2269         }
2270         rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size,
2271                                  src_sg, 2);
2272         if (rc < 1 || rc > 2) {
2273                 ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
2274                                 "for crypt_stat session key; expected rc = 1; "
2275                                 "got rc = [%d]. key_rec->enc_key_size = [%zd]\n",
2276                                 rc, key_rec->enc_key_size);
2277                 rc = -ENOMEM;
2278                 goto out;
2279         }
2280         rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size,
2281                                  dst_sg, 2);
2282         if (rc < 1 || rc > 2) {
2283                 ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
2284                                 "for crypt_stat encrypted session key; "
2285                                 "expected rc = 1; got rc = [%d]. "
2286                                 "key_rec->enc_key_size = [%zd]\n", rc,
2287                                 key_rec->enc_key_size);
2288                 rc = -ENOMEM;
2289                 goto out;
2290         }
2291         mutex_lock(tfm_mutex);
2292         rc = crypto_skcipher_setkey(tfm, session_key_encryption_key,
2293                                     crypt_stat->key_size);
2294         if (rc < 0) {
2295                 mutex_unlock(tfm_mutex);
2296                 ecryptfs_printk(KERN_ERR, "Error setting key for crypto "
2297                                 "context; rc = [%d]\n", rc);
2298                 goto out;
2299         }
2300
2301         req = skcipher_request_alloc(tfm, GFP_KERNEL);
2302         if (!req) {
2303                 mutex_unlock(tfm_mutex);
2304                 ecryptfs_printk(KERN_ERR, "Out of kernel memory whilst "
2305                                 "attempting to skcipher_request_alloc for "
2306                                 "%s\n", crypto_skcipher_driver_name(tfm));
2307                 rc = -ENOMEM;
2308                 goto out;
2309         }
2310
2311         skcipher_request_set_callback(req, CRYPTO_TFM_REQ_MAY_SLEEP,
2312                                       NULL, NULL);
2313
2314         rc = 0;
2315         ecryptfs_printk(KERN_DEBUG, "Encrypting [%zd] bytes of the key\n",
2316                         crypt_stat->key_size);
2317         skcipher_request_set_crypt(req, src_sg, dst_sg,
2318                                    (*key_rec).enc_key_size, NULL);
2319         rc = crypto_skcipher_encrypt(req);
2320         mutex_unlock(tfm_mutex);
2321         skcipher_request_free(req);
2322         if (rc) {
2323                 printk(KERN_ERR "Error encrypting; rc = [%d]\n", rc);
2324                 goto out;
2325         }
2326         ecryptfs_printk(KERN_DEBUG, "This should be the encrypted key:\n");
2327         if (ecryptfs_verbosity > 0) {
2328                 ecryptfs_printk(KERN_DEBUG, "EFEK of size [%zd]:\n",
2329                                 key_rec->enc_key_size);
2330                 ecryptfs_dump_hex(key_rec->enc_key,
2331                                   key_rec->enc_key_size);
2332         }
2333 encrypted_session_key_set:
2334         /* This format is inspired by OpenPGP; see RFC 2440
2335          * packet tag 3 */
2336         max_packet_size = (1                         /* Tag 3 identifier */
2337                            + 3                       /* Max Tag 3 packet size */
2338                            + 1                       /* Version */
2339                            + 1                       /* Cipher code */
2340                            + 1                       /* S2K specifier */
2341                            + 1                       /* Hash identifier */
2342                            + ECRYPTFS_SALT_SIZE      /* Salt */
2343                            + 1                       /* Hash iterations */
2344                            + key_rec->enc_key_size); /* Encrypted key size */
2345         if (max_packet_size > (*remaining_bytes)) {
2346                 printk(KERN_ERR "Packet too large; need up to [%td] bytes, but "
2347                        "there are only [%td] available\n", max_packet_size,
2348                        (*remaining_bytes));
2349                 rc = -EINVAL;
2350                 goto out;
2351         }
2352         dest[(*packet_size)++] = ECRYPTFS_TAG_3_PACKET_TYPE;
2353         /* Chop off the Tag 3 identifier(1) and Tag 3 packet size(3)
2354          * to get the number of octets in the actual Tag 3 packet */
2355         rc = ecryptfs_write_packet_length(&dest[(*packet_size)],
2356                                           (max_packet_size - 4),
2357                                           &packet_size_length);
2358         if (rc) {
2359                 printk(KERN_ERR "Error generating tag 3 packet header; cannot "
2360                        "generate packet length. rc = [%d]\n", rc);
2361                 goto out;
2362         }
2363         (*packet_size) += packet_size_length;
2364         dest[(*packet_size)++] = 0x04; /* version 4 */
2365         /* TODO: Break from RFC2440 so that arbitrary ciphers can be
2366          * specified with strings */
2367         cipher_code = ecryptfs_code_for_cipher_string(crypt_stat->cipher,
2368                                                       crypt_stat->key_size);
2369         if (cipher_code == 0) {
2370                 ecryptfs_printk(KERN_WARNING, "Unable to generate code for "
2371                                 "cipher [%s]\n", crypt_stat->cipher);
2372                 rc = -EINVAL;
2373                 goto out;
2374         }
2375         dest[(*packet_size)++] = cipher_code;
2376         dest[(*packet_size)++] = 0x03;  /* S2K */
2377         dest[(*packet_size)++] = 0x01;  /* MD5 (TODO: parameterize) */
2378         memcpy(&dest[(*packet_size)], auth_tok->token.password.salt,
2379                ECRYPTFS_SALT_SIZE);
2380         (*packet_size) += ECRYPTFS_SALT_SIZE;   /* salt */
2381         dest[(*packet_size)++] = 0x60;  /* hash iterations (65536) */
2382         memcpy(&dest[(*packet_size)], key_rec->enc_key,
2383                key_rec->enc_key_size);
2384         (*packet_size) += key_rec->enc_key_size;
2385 out:
2386         if (rc)
2387                 (*packet_size) = 0;
2388         else
2389                 (*remaining_bytes) -= (*packet_size);
2390         return rc;
2391 }
2392
2393 struct kmem_cache *ecryptfs_key_record_cache;
2394
2395 /**
2396  * ecryptfs_generate_key_packet_set
2397  * @dest_base: Virtual address from which to write the key record set
2398  * @crypt_stat: The cryptographic context from which the
2399  *              authentication tokens will be retrieved
2400  * @ecryptfs_dentry: The dentry, used to retrieve the mount crypt stat
2401  *                   for the global parameters
2402  * @len: The amount written
2403  * @max: The maximum amount of data allowed to be written
2404  *
2405  * Generates a key packet set and writes it to the virtual address
2406  * passed in.
2407  *
2408  * Returns zero on success; non-zero on error.
2409  */
2410 int
2411 ecryptfs_generate_key_packet_set(char *dest_base,
2412                                  struct ecryptfs_crypt_stat *crypt_stat,
2413                                  struct dentry *ecryptfs_dentry, size_t *len,
2414                                  size_t max)
2415 {
2416         struct ecryptfs_auth_tok *auth_tok;
2417         struct key *auth_tok_key = NULL;
2418         struct ecryptfs_mount_crypt_stat *mount_crypt_stat =
2419                 &ecryptfs_superblock_to_private(
2420                         ecryptfs_dentry->d_sb)->mount_crypt_stat;
2421         size_t written;
2422         struct ecryptfs_key_record *key_rec;
2423         struct ecryptfs_key_sig *key_sig;
2424         int rc = 0;
2425
2426         (*len) = 0;
2427         mutex_lock(&crypt_stat->keysig_list_mutex);
2428         key_rec = kmem_cache_alloc(ecryptfs_key_record_cache, GFP_KERNEL);
2429         if (!key_rec) {
2430                 rc = -ENOMEM;
2431                 goto out;
2432         }
2433         list_for_each_entry(key_sig, &crypt_stat->keysig_list,
2434                             crypt_stat_list) {
2435                 memset(key_rec, 0, sizeof(*key_rec));
2436                 rc = ecryptfs_find_global_auth_tok_for_sig(&auth_tok_key,
2437                                                            &auth_tok,
2438                                                            mount_crypt_stat,
2439                                                            key_sig->keysig);
2440                 if (rc) {
2441                         printk(KERN_WARNING "Unable to retrieve auth tok with "
2442                                "sig = [%s]\n", key_sig->keysig);
2443                         rc = process_find_global_auth_tok_for_sig_err(rc);
2444                         goto out_free;
2445                 }
2446                 if (auth_tok->token_type == ECRYPTFS_PASSWORD) {
2447                         rc = write_tag_3_packet((dest_base + (*len)),
2448                                                 &max, auth_tok,
2449                                                 crypt_stat, key_rec,
2450                                                 &written);
2451                         up_write(&(auth_tok_key->sem));
2452                         key_put(auth_tok_key);
2453                         if (rc) {
2454                                 ecryptfs_printk(KERN_WARNING, "Error "
2455                                                 "writing tag 3 packet\n");
2456                                 goto out_free;
2457                         }
2458                         (*len) += written;
2459                         /* Write auth tok signature packet */
2460                         rc = write_tag_11_packet((dest_base + (*len)), &max,
2461                                                  key_rec->sig,
2462                                                  ECRYPTFS_SIG_SIZE, &written);
2463                         if (rc) {
2464                                 ecryptfs_printk(KERN_ERR, "Error writing "
2465                                                 "auth tok signature packet\n");
2466                                 goto out_free;
2467                         }
2468                         (*len) += written;
2469                 } else if (auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) {
2470                         rc = write_tag_1_packet(dest_base + (*len), &max,
2471                                                 auth_tok_key, auth_tok,
2472                                                 crypt_stat, key_rec, &written);
2473                         if (rc) {
2474                                 ecryptfs_printk(KERN_WARNING, "Error "
2475                                                 "writing tag 1 packet\n");
2476                                 goto out_free;
2477                         }
2478                         (*len) += written;
2479                 } else {
2480                         up_write(&(auth_tok_key->sem));
2481                         key_put(auth_tok_key);
2482                         ecryptfs_printk(KERN_WARNING, "Unsupported "
2483                                         "authentication token type\n");
2484                         rc = -EINVAL;
2485                         goto out_free;
2486                 }
2487         }
2488         if (likely(max > 0)) {
2489                 dest_base[(*len)] = 0x00;
2490         } else {
2491                 ecryptfs_printk(KERN_ERR, "Error writing boundary byte\n");
2492                 rc = -EIO;
2493         }
2494 out_free:
2495         kmem_cache_free(ecryptfs_key_record_cache, key_rec);
2496 out:
2497         if (rc)
2498                 (*len) = 0;
2499         mutex_unlock(&crypt_stat->keysig_list_mutex);
2500         return rc;
2501 }
2502
2503 struct kmem_cache *ecryptfs_key_sig_cache;
2504
2505 int ecryptfs_add_keysig(struct ecryptfs_crypt_stat *crypt_stat, char *sig)
2506 {
2507         struct ecryptfs_key_sig *new_key_sig;
2508
2509         new_key_sig = kmem_cache_alloc(ecryptfs_key_sig_cache, GFP_KERNEL);
2510         if (!new_key_sig)
2511                 return -ENOMEM;
2512
2513         memcpy(new_key_sig->keysig, sig, ECRYPTFS_SIG_SIZE_HEX);
2514         new_key_sig->keysig[ECRYPTFS_SIG_SIZE_HEX] = '\0';
2515         /* Caller must hold keysig_list_mutex */
2516         list_add(&new_key_sig->crypt_stat_list, &crypt_stat->keysig_list);
2517
2518         return 0;
2519 }
2520
2521 struct kmem_cache *ecryptfs_global_auth_tok_cache;
2522
2523 int
2524 ecryptfs_add_global_auth_tok(struct ecryptfs_mount_crypt_stat *mount_crypt_stat,
2525                              char *sig, u32 global_auth_tok_flags)
2526 {
2527         struct ecryptfs_global_auth_tok *new_auth_tok;
2528
2529         new_auth_tok = kmem_cache_zalloc(ecryptfs_global_auth_tok_cache,
2530                                         GFP_KERNEL);
2531         if (!new_auth_tok)
2532                 return -ENOMEM;
2533
2534         memcpy(new_auth_tok->sig, sig, ECRYPTFS_SIG_SIZE_HEX);
2535         new_auth_tok->flags = global_auth_tok_flags;
2536         new_auth_tok->sig[ECRYPTFS_SIG_SIZE_HEX] = '\0';
2537         mutex_lock(&mount_crypt_stat->global_auth_tok_list_mutex);
2538         list_add(&new_auth_tok->mount_crypt_stat_list,
2539                  &mount_crypt_stat->global_auth_tok_list);
2540         mutex_unlock(&mount_crypt_stat->global_auth_tok_list_mutex);
2541         return 0;
2542 }
2543