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