cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

keystore.c (80480B)


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