aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorTyler Hicks <tyhicks@canonical.com>2013-04-06 03:08:48 -0400
committerTyler Hicks <tyhicks@canonical.com>2013-06-07 20:28:27 -0400
commitd78de618962d1e9d28c602e3c75991fe9c94e961 (patch)
tree674894d0c1a3bf69f0b901f24113f35e2814db7f /fs
parenta8ca90e2071edb3d3f3272ae73d73411f0b70b54 (diff)
eCryptfs: Merge ecryptfs_encrypt_extent() and ecryptfs_decrypt_extent()
They are identical except if the src_page or dst_page index is used, so they can be merged safely if page_index is conditionally assigned. Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Diffstat (limited to 'fs')
-rw-r--r--fs/ecryptfs/crypto.c74
1 files changed, 20 insertions, 54 deletions
diff --git a/fs/ecryptfs/crypto.c b/fs/ecryptfs/crypto.c
index 609efc01d5c2..9845d2fd2506 100644
--- a/fs/ecryptfs/crypto.c
+++ b/fs/ecryptfs/crypto.c
@@ -416,28 +416,29 @@ static loff_t lower_offset_for_page(struct ecryptfs_crypt_stat *crypt_stat,
416} 416}
417 417
418/** 418/**
419 * ecryptfs_encrypt_extent 419 * crypt_extent
420 * @enc_extent_page: Allocated page into which to encrypt the data in 420 * @dst_page: The page to write the result into
421 * @page
422 * @crypt_stat: crypt_stat containing cryptographic context for the 421 * @crypt_stat: crypt_stat containing cryptographic context for the
423 * encryption operation 422 * encryption operation
424 * @page: Page containing plaintext data extent to encrypt 423 * @src_page: The page to read from
425 * @extent_offset: Page extent offset for use in generating IV 424 * @extent_offset: Page extent offset for use in generating IV
425 * @op: ENCRYPT or DECRYPT to indicate the desired operation
426 * 426 *
427 * Encrypts one extent of data. 427 * Encrypts or decrypts one extent of data.
428 * 428 *
429 * Return zero on success; non-zero otherwise 429 * Return zero on success; non-zero otherwise
430 */ 430 */
431static int ecryptfs_encrypt_extent(struct page *enc_extent_page, 431static int crypt_extent(struct page *dst_page,
432 struct ecryptfs_crypt_stat *crypt_stat, 432 struct ecryptfs_crypt_stat *crypt_stat,
433 struct page *page, 433 struct page *src_page,
434 unsigned long extent_offset) 434 unsigned long extent_offset, int op)
435{ 435{
436 pgoff_t page_index = op == ENCRYPT ? src_page->index : dst_page->index;
436 loff_t extent_base; 437 loff_t extent_base;
437 char extent_iv[ECRYPTFS_MAX_IV_BYTES]; 438 char extent_iv[ECRYPTFS_MAX_IV_BYTES];
438 int rc; 439 int rc;
439 440
440 extent_base = (((loff_t)page->index) 441 extent_base = (((loff_t)page_index)
441 * (PAGE_CACHE_SIZE / crypt_stat->extent_size)); 442 * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
442 rc = ecryptfs_derive_iv(extent_iv, crypt_stat, 443 rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
443 (extent_base + extent_offset)); 444 (extent_base + extent_offset));
@@ -447,14 +448,13 @@ static int ecryptfs_encrypt_extent(struct page *enc_extent_page,
447 (unsigned long long)(extent_base + extent_offset), rc); 448 (unsigned long long)(extent_base + extent_offset), rc);
448 goto out; 449 goto out;
449 } 450 }
450 rc = crypt_page_offset(crypt_stat, enc_extent_page, page, 451 rc = crypt_page_offset(crypt_stat, dst_page, src_page,
451 (extent_offset * crypt_stat->extent_size), 452 (extent_offset * crypt_stat->extent_size),
452 crypt_stat->extent_size, extent_iv, ENCRYPT); 453 crypt_stat->extent_size, extent_iv, op);
453 if (rc < 0) { 454 if (rc < 0) {
454 printk(KERN_ERR "%s: Error attempting to encrypt page with " 455 printk(KERN_ERR "%s: Error attempting to crypt page with "
455 "page->index = [%ld], extent_offset = [%ld]; " 456 "page_index = [%ld], extent_offset = [%ld]; "
456 "rc = [%d]\n", __func__, page->index, extent_offset, 457 "rc = [%d]\n", __func__, page_index, extent_offset, rc);
457 rc);
458 goto out; 458 goto out;
459 } 459 }
460 rc = 0; 460 rc = 0;
@@ -503,8 +503,8 @@ int ecryptfs_encrypt_page(struct page *page)
503 for (extent_offset = 0; 503 for (extent_offset = 0;
504 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size); 504 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
505 extent_offset++) { 505 extent_offset++) {
506 rc = ecryptfs_encrypt_extent(enc_extent_page, crypt_stat, page, 506 rc = crypt_extent(enc_extent_page, crypt_stat, page,
507 extent_offset); 507 extent_offset, ENCRYPT);
508 if (rc) { 508 if (rc) {
509 printk(KERN_ERR "%s: Error encrypting extent; " 509 printk(KERN_ERR "%s: Error encrypting extent; "
510 "rc = [%d]\n", __func__, rc); 510 "rc = [%d]\n", __func__, rc);
@@ -531,40 +531,6 @@ out:
531 return rc; 531 return rc;
532} 532}
533 533
534static int ecryptfs_decrypt_extent(struct page *page,
535 struct ecryptfs_crypt_stat *crypt_stat,
536 struct page *enc_extent_page,
537 unsigned long extent_offset)
538{
539 loff_t extent_base;
540 char extent_iv[ECRYPTFS_MAX_IV_BYTES];
541 int rc;
542
543 extent_base = (((loff_t)page->index)
544 * (PAGE_CACHE_SIZE / crypt_stat->extent_size));
545 rc = ecryptfs_derive_iv(extent_iv, crypt_stat,
546 (extent_base + extent_offset));
547 if (rc) {
548 ecryptfs_printk(KERN_ERR, "Error attempting to derive IV for "
549 "extent [0x%.16llx]; rc = [%d]\n",
550 (unsigned long long)(extent_base + extent_offset), rc);
551 goto out;
552 }
553 rc = crypt_page_offset(crypt_stat, page, enc_extent_page,
554 (extent_offset * crypt_stat->extent_size),
555 crypt_stat->extent_size, extent_iv, DECRYPT);
556 if (rc < 0) {
557 printk(KERN_ERR "%s: Error attempting to decrypt to page with "
558 "page->index = [%ld], extent_offset = [%ld]; "
559 "rc = [%d]\n", __func__, page->index, extent_offset,
560 rc);
561 goto out;
562 }
563 rc = 0;
564out:
565 return rc;
566}
567
568/** 534/**
569 * ecryptfs_decrypt_page 535 * ecryptfs_decrypt_page
570 * @page: Page mapped from the eCryptfs inode for the file; data read 536 * @page: Page mapped from the eCryptfs inode for the file; data read
@@ -610,8 +576,8 @@ int ecryptfs_decrypt_page(struct page *page)
610 for (extent_offset = 0; 576 for (extent_offset = 0;
611 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size); 577 extent_offset < (PAGE_CACHE_SIZE / crypt_stat->extent_size);
612 extent_offset++) { 578 extent_offset++) {
613 rc = ecryptfs_decrypt_extent(page, crypt_stat, page, 579 rc = crypt_extent(page, crypt_stat, page,
614 extent_offset); 580 extent_offset, DECRYPT);
615 if (rc) { 581 if (rc) {
616 printk(KERN_ERR "%s: Error encrypting extent; " 582 printk(KERN_ERR "%s: Error encrypting extent; "
617 "rc = [%d]\n", __func__, rc); 583 "rc = [%d]\n", __func__, rc);