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