ANDROID: Incremental fs: Pad hash blocks

Test: incfs_test passes
Bug: 133435829
Signed-off-by: Paul Lawrence <paullawrence@google.com>
Change-Id: I4e6fbd0938f00e7e6883ce1a26cbfd38fdcaa9a5
This commit is contained in:
Paul Lawrence 2020-02-19 10:07:25 -08:00
parent 70539f7cfd
commit 538096344f
2 changed files with 20 additions and 3 deletions

View file

@ -198,6 +198,20 @@ int incfs_calc_digest(struct incfs_hash_alg *alg, struct mem_range data,
return -EINVAL; return -EINVAL;
desc->tfm = alg->shash; desc->tfm = alg->shash;
if (data.len < INCFS_DATA_FILE_BLOCK_SIZE) {
int err;
void *buf = kzalloc(INCFS_DATA_FILE_BLOCK_SIZE, GFP_NOFS);
if (!buf)
return -ENOMEM;
memcpy(buf, data.data, data.len);
err = crypto_shash_digest(desc, buf, INCFS_DATA_FILE_BLOCK_SIZE,
digest.data);
kfree(buf);
return err;
}
return crypto_shash_digest(desc, data.data, data.len, digest.data); return crypto_shash_digest(desc, data.data, data.len, digest.data);
} }

View file

@ -750,8 +750,9 @@ static int build_mtree(struct test_file *file)
if (block_count == 1) { if (block_count == 1) {
int seed = get_file_block_seed(file->index, 0); int seed = get_file_block_seed(file->index, 0);
memset(data, 0, INCFS_DATA_FILE_BLOCK_SIZE);
rnd_buf((uint8_t *)data, file->size, seed); rnd_buf((uint8_t *)data, file->size, seed);
sha256(data, file->size, file->root_hash); sha256(data, INCFS_DATA_FILE_BLOCK_SIZE, file->root_hash);
return 0; return 0;
} }
@ -766,11 +767,13 @@ static int build_mtree(struct test_file *file)
int seed = get_file_block_seed(file->index, i); int seed = get_file_block_seed(file->index, i);
char *hash_ptr = file->mtree[block_index].data + block_off; char *hash_ptr = file->mtree[block_index].data + block_off;
if (file->size - offset < block_size) if (file->size - offset < block_size) {
block_size = file->size - offset; block_size = file->size - offset;
memset(data, 0, INCFS_DATA_FILE_BLOCK_SIZE);
}
rnd_buf((uint8_t *)data, block_size, seed); rnd_buf((uint8_t *)data, block_size, seed);
sha256(data, block_size, hash_ptr); sha256(data, INCFS_DATA_FILE_BLOCK_SIZE, hash_ptr);
} }
/* Build higher levels of hash tree. */ /* Build higher levels of hash tree. */