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