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