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