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