Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
| 2 // Use of this source code is governed by the GPL v2 license that can | 2 // Use of this source code is governed by the GPL v2 license that can |
| 3 // be found in the LICENSE file. | 3 // be found in the LICENSE file. |
| 4 // | 4 // |
| 5 // Implementation of FileHasher | 5 // Implementation of FileHasher |
| 6 | 6 |
| 7 #define __STDC_LIMIT_MACROS 1 | 7 #define __STDC_LIMIT_MACROS 1 |
| 8 #define __STDC_FORMAT_MACROS 1 | 8 #define __STDC_FORMAT_MACROS 1 |
| 9 #include <errno.h> | 9 #include <errno.h> |
| 10 #include <inttypes.h> | 10 #include <inttypes.h> |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 38 if (!f->WriteAt(to_bytes(count), dst, offset)) { | 38 if (!f->WriteAt(to_bytes(count), dst, offset)) { |
| 39 dm_bht_write_completed(entry, -EIO); | 39 dm_bht_write_completed(entry, -EIO); |
| 40 return -1; | 40 return -1; |
| 41 } | 41 } |
| 42 dm_bht_write_completed(entry, 0); | 42 dm_bht_write_completed(entry, 0); |
| 43 return 0; | 43 return 0; |
| 44 } | 44 } |
| 45 | 45 |
| 46 bool FileHasher::Initialize(simple_file::File *source, | 46 bool FileHasher::Initialize(simple_file::File *source, |
| 47 simple_file::File *destination, | 47 simple_file::File *destination, |
| 48 unsigned int depth, | |
| 49 unsigned int blocks, | 48 unsigned int blocks, |
| 50 const char *alg) { | 49 const char *alg) { |
| 51 if (!alg || !source || !destination) { | 50 if (!alg || !source || !destination) { |
| 52 LOG(ERROR) << "Invalid arguments supplied to Initialize"; | 51 LOG(ERROR) << "Invalid arguments supplied to Initialize"; |
| 53 LOG(INFO) << "depth: " << depth; | |
| 54 LOG(INFO) << "s: " << source << " d: " << destination; | 52 LOG(INFO) << "s: " << source << " d: " << destination; |
| 55 return false; | 53 return false; |
| 56 } | 54 } |
| 57 if (source_ || destination_) { | 55 if (source_ || destination_) { |
| 58 LOG(ERROR) << "Initialize called more than once"; | 56 LOG(ERROR) << "Initialize called more than once"; |
| 59 return false; | 57 return false; |
| 60 } | 58 } |
| 61 if (blocks > source->Size() / PAGE_SIZE) { | 59 if (blocks > source->Size() / PAGE_SIZE) { |
| 62 LOG(ERROR) << blocks << " blocks exceeds image size of " << source->Size(); | 60 LOG(ERROR) << blocks << " blocks exceeds image size of " << source->Size(); |
| 63 return false; | 61 return false; |
| 64 } else if (blocks == 0) { | 62 } else if (blocks == 0) { |
| 65 blocks = source->Size() / PAGE_SIZE; | 63 blocks = source->Size() / PAGE_SIZE; |
| 66 if (source->Size() % PAGE_SIZE) { | 64 if (source->Size() % PAGE_SIZE) { |
| 67 LOG(ERROR) << "The source file size must be divisible by the block size"; | 65 LOG(ERROR) << "The source file size must be divisible by the block size"; |
| 68 LOG(ERROR) << "Size: " << source->Size(); | 66 LOG(ERROR) << "Size: " << source->Size(); |
| 69 LOG(INFO) << "Suggested size: " << ALIGN(source->Size(),PAGE_SIZE); | 67 LOG(INFO) << "Suggested size: " << ALIGN(source->Size(),PAGE_SIZE); |
| 70 return false; | 68 return false; |
| 71 } | 69 } |
| 72 } | 70 } |
| 73 alg_ = alg; | 71 alg_ = alg; |
| 74 source_ = source; | 72 source_ = source; |
| 75 destination_ = destination; | 73 destination_ = destination; |
| 76 depth_ = depth; | |
| 77 block_limit_ = blocks; | 74 block_limit_ = blocks; |
| 78 | 75 |
| 79 // Now we initialize the tree | 76 // Now we initialize the tree |
| 80 if (dm_bht_create(&tree_, depth_, block_limit_, alg_)) { | 77 if (dm_bht_create(&tree_, block_limit_, alg_)) { |
| 81 LOG(ERROR) << "Could not create the BH tree"; | 78 LOG(ERROR) << "Could not create the BH tree"; |
| 82 return false; | 79 return false; |
| 83 } | 80 } |
| 84 dm_bht_set_write_cb(&tree_, FileHasher::WriteCallback); | 81 dm_bht_set_write_cb(&tree_, FileHasher::WriteCallback); |
| 85 // No reading is needed. | 82 // No reading is needed. |
| 86 dm_bht_set_read_cb(&tree_, dm_bht_zeroread_callback); | 83 dm_bht_set_read_cb(&tree_, dm_bht_zeroread_callback); |
| 87 | 84 |
| 88 return true; | 85 return true; |
| 89 } | 86 } |
| 90 | 87 |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 113 | 110 |
| 114 void FileHasher::PrintTable(bool colocated) { | 111 void FileHasher::PrintTable(bool colocated) { |
| 115 // Grab the digest (up to 1kbit supported) | 112 // Grab the digest (up to 1kbit supported) |
| 116 uint8_t digest[128]; | 113 uint8_t digest[128]; |
| 117 dm_bht_root_hexdigest(&tree_, digest, sizeof(digest)); | 114 dm_bht_root_hexdigest(&tree_, digest, sizeof(digest)); |
| 118 | 115 |
| 119 // TODO(wad) later support sizes that need 64-bit sectors. | 116 // TODO(wad) later support sizes that need 64-bit sectors. |
| 120 unsigned int hash_start = 0; | 117 unsigned int hash_start = 0; |
| 121 unsigned int root_end = to_sector(block_limit_ << PAGE_SHIFT); | 118 unsigned int root_end = to_sector(block_limit_ << PAGE_SHIFT); |
| 122 if (colocated) hash_start = root_end; | 119 if (colocated) hash_start = root_end; |
| 123 printf("0 %u verity ROOT_DEV HASH_DEV %u %u %s %s\n", | 120 printf("0 %u verity ROOT_DEV HASH_DEV %u 0 %s %s\n", |
| 124 root_end, hash_start, depth_, alg_, digest); | 121 root_end, hash_start, alg_, digest); |
|
Paul T
2011/04/07 21:54:33
Do you need to keep the 0? or should it just be de
Will Drewry
2011/04/07 22:45:17
It needs to stay for now until we change the kerne
| |
| 125 } | 122 } |
| 126 | 123 |
| 127 } // namespace verity | 124 } // namespace verity |
| 128 | 125 |
| 129 | 126 |
| OLD | NEW |