mirror of
https://github.com/kdave/btrfs-progs
synced 2025-04-28 22:17:56 +00:00
btrfs-progs: image: add a function to calculate CRC32C collisions
The function uses the reverse CRC32C table to quickly calculate a 4-byte suffix, that when added to the original data will make it match desired checksum. Author: Piotr Pawlow <pp@siedziba.pl> [ minor adjustments ] Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
a172244163
commit
c859336f47
23
image/main.c
23
image/main.c
@ -408,6 +408,29 @@ static const u32 crc32c_rev_table[256] = {
|
|||||||
0x588982AFL,0x5D65F45EL,0x53516F4DL,0x56BD19BCL
|
0x588982AFL,0x5D65F45EL,0x53516F4DL,0x56BD19BCL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Calculate a 4-byte suffix to match desired CRC32C
|
||||||
|
*
|
||||||
|
* @current_crc: CRC32C checksum of all bytes before the suffix
|
||||||
|
* @desired_crc: the checksum that we want to get after adding the suffix
|
||||||
|
*
|
||||||
|
* Outputs: @suffix: pointer to where the suffix will be written (4-bytes)
|
||||||
|
*/
|
||||||
|
static void find_collision_calc_suffix(unsigned long current_crc,
|
||||||
|
unsigned long desired_crc,
|
||||||
|
char *suffix)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 3; i >= 0; i--) {
|
||||||
|
desired_crc = (desired_crc << 8)
|
||||||
|
^ crc32c_rev_table[desired_crc >> 24 & 0xFF]
|
||||||
|
^ ((current_crc >> i * 8) & 0xFF);
|
||||||
|
}
|
||||||
|
for (i = 0; i < 4; i++)
|
||||||
|
suffix[i] = (desired_crc >> i * 8) & 0xFF;
|
||||||
|
}
|
||||||
|
|
||||||
static int find_collision_brute_force(struct name *val, u32 name_len)
|
static int find_collision_brute_force(struct name *val, u32 name_len)
|
||||||
{
|
{
|
||||||
unsigned long checksum;
|
unsigned long checksum;
|
||||||
|
Loading…
Reference in New Issue
Block a user