Linux Audio

Check our new training course

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