From 496bd07446c4e8a09146004a16971ad37fc973c1 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Tue, 13 Dec 2011 01:26:53 +0100 Subject: [PATCH] Unify and improve RAID and crypto xor. * grub-core/disk/raid.c (grub_raid_block_xor): Removed. All users changed to grub_crypto_xor * grub-core/lib/crypto.c (grub_crypto_xor): Moved from here ... * include/grub/crypto.h (grub_crypto_xor): ... here. Inlined. Use bigger types when possible. --- ChangeLog | 10 ++++++++++ grub-core/disk/raid.c | 17 ---------------- grub-core/disk/raid5_recover.c | 3 ++- grub-core/disk/raid6_recover.c | 15 +++++++------- grub-core/lib/crypto.c | 14 ------------- include/grub/crypto.h | 36 ++++++++++++++++++++++++++++++++-- 6 files changed, 54 insertions(+), 41 deletions(-) diff --git a/ChangeLog b/ChangeLog index b157a8e40..801681ef5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2011-12-13 Vladimir Serbinenko + + Unify and improve RAID and crypto xor. + + * grub-core/disk/raid.c (grub_raid_block_xor): Removed. All users + changed to grub_crypto_xor + * grub-core/lib/crypto.c (grub_crypto_xor): Moved from here ... + * include/grub/crypto.h (grub_crypto_xor): ... here. Inlined. + Use bigger types when possible. + 2011-12-13 Vladimir Serbinenko * grub-core/disk/raid.c (scan_devices): Fix condition. diff --git a/grub-core/disk/raid.c b/grub-core/disk/raid.c index aeba2a22f..db1e969b3 100644 --- a/grub-core/disk/raid.c +++ b/grub-core/disk/raid.c @@ -332,23 +332,6 @@ grub_raid_close (grub_disk_t disk __attribute ((unused))) return; } -void -grub_raid_block_xor (char *buf1, const char *buf2, int size) -{ - grub_size_t *p1; - const grub_size_t *p2; - - p1 = (grub_size_t *) buf1; - p2 = (const grub_size_t *) buf2; - size /= GRUB_CPU_SIZEOF_VOID_P; - - while (size) - { - *(p1++) ^= *(p2++); - size--; - } -} - static grub_err_t grub_raid_read (grub_disk_t disk, grub_disk_addr_t sector, grub_size_t size, char *buf) diff --git a/grub-core/disk/raid5_recover.c b/grub-core/disk/raid5_recover.c index c26d05e94..dfc89a71d 100644 --- a/grub-core/disk/raid5_recover.c +++ b/grub-core/disk/raid5_recover.c @@ -23,6 +23,7 @@ #include #include #include +#include GRUB_MOD_LICENSE ("GPLv3+"); @@ -57,7 +58,7 @@ grub_raid5_recover (struct grub_raid_array *array, int disknr, return err; } - grub_raid_block_xor (buf, buf2, size); + grub_crypto_xor (buf, buf2, buf2, size); } grub_free (buf2); diff --git a/grub-core/disk/raid6_recover.c b/grub-core/disk/raid6_recover.c index e91992547..05d8511c5 100644 --- a/grub-core/disk/raid6_recover.c +++ b/grub-core/disk/raid6_recover.c @@ -23,6 +23,7 @@ #include #include #include +#include GRUB_MOD_LICENSE ("GPLv3+"); @@ -98,9 +99,9 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p, array->members[pos].start_sector + sector, 0, size, buf))) { - grub_raid_block_xor (pbuf, buf, size); + grub_crypto_xor (pbuf, pbuf, buf, size); grub_raid_block_mulx (i, buf, size); - grub_raid_block_xor (qbuf, buf, size); + grub_crypto_xor (qbuf, qbuf, buf, size); } else { @@ -130,7 +131,7 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p, array->members[p].start_sector + sector, 0, size, buf))) { - grub_raid_block_xor (buf, pbuf, size); + grub_crypto_xor (buf, buf, pbuf, size); goto quit; } @@ -145,7 +146,7 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p, array->members[q].start_sector + sector, 0, size, buf)) goto quit; - grub_raid_block_xor (buf, qbuf, size); + grub_crypto_xor (buf, buf, qbuf, size); grub_raid_block_mulx (255 - bad1, buf, size); } @@ -165,14 +166,14 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p, 0, size, buf)) goto quit; - grub_raid_block_xor (pbuf, buf, size); + grub_crypto_xor (pbuf, pbuf, buf, size); if (grub_disk_read (array->members[q].device, array->members[q].start_sector + sector, 0, size, buf)) goto quit; - grub_raid_block_xor (qbuf, buf, size); + grub_crypto_xor (qbuf, qbuf, buf, size); c = (255 - bad1 + (255 - powx_inv[(powx[bad2 - bad1 + 255] ^ 1)])) % 255; grub_raid_block_mulx (c, qbuf, size); @@ -180,7 +181,7 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p, c = (bad2 + c) % 255; grub_raid_block_mulx (c, pbuf, size); - grub_raid_block_xor (pbuf, qbuf, size); + grub_crypto_xor (pbuf, pbuf, qbuf, size); grub_memcpy (buf, pbuf, size); } diff --git a/grub-core/lib/crypto.c b/grub-core/lib/crypto.c index 4dec5c694..48d860335 100644 --- a/grub-core/lib/crypto.c +++ b/grub-core/lib/crypto.c @@ -169,20 +169,6 @@ grub_crypto_cipher_set_key (grub_crypto_cipher_handle_t cipher, return cipher->cipher->setkey (cipher->ctx, key, keylen); } -void -grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size) -{ - const grub_uint8_t *in1ptr = in1, *in2ptr = in2; - grub_uint8_t *outptr = out; - while (size--) - { - *outptr = *in1ptr ^ *in2ptr; - in1ptr++; - in2ptr++; - outptr++; - } -} - gcry_err_code_t grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher, void *out, const void *in, grub_size_t size) diff --git a/include/grub/crypto.h b/include/grub/crypto.h index b8a5b3a22..9a67c5e11 100644 --- a/include/grub/crypto.h +++ b/include/grub/crypto.h @@ -198,8 +198,40 @@ grub_crypto_cipher_close (grub_crypto_cipher_handle_t cipher) grub_free (cipher); } -void -grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size); +static inline void +grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size) +{ + const grub_uint8_t *in1ptr = in1, *in2ptr = in2; + grub_uint8_t *outptr = out; + while (size && (((grub_addr_t) in1ptr & (sizeof (grub_uint64_t) - 1)) + || ((grub_addr_t) in2ptr & (sizeof (grub_uint64_t) - 1)) + || ((grub_addr_t) outptr & (sizeof (grub_uint64_t) - 1)))) + { + *outptr = *in1ptr ^ *in2ptr; + in1ptr++; + in2ptr++; + outptr++; + size--; + } + while (size >= sizeof (grub_uint64_t)) + { + *(grub_uint64_t *) (void *) outptr + = (*(grub_uint64_t *) (void *) in1ptr + ^ *(grub_uint64_t *) (void *) in2ptr); + in1ptr += sizeof (grub_uint64_t); + in2ptr += sizeof (grub_uint64_t); + outptr += sizeof (grub_uint64_t); + size -= sizeof (grub_uint64_t); + } + while (size) + { + *outptr = *in1ptr ^ *in2ptr; + in1ptr++; + in2ptr++; + outptr++; + size--; + } +} gcry_err_code_t grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,