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