Linux Audio

Check our new training course

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