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