+2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
+
+ 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 <phcoder@gmail.com>
* grub-core/disk/raid.c (scan_devices): Fix condition.
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)
#include <grub/err.h>
#include <grub/misc.h>
#include <grub/raid.h>
+#include <grub/crypto.h>
GRUB_MOD_LICENSE ("GPLv3+");
return err;
}
- grub_raid_block_xor (buf, buf2, size);
+ grub_crypto_xor (buf, buf2, buf2, size);
}
grub_free (buf2);
#include <grub/err.h>
#include <grub/misc.h>
#include <grub/raid.h>
+#include <grub/crypto.h>
GRUB_MOD_LICENSE ("GPLv3+");
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
{
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;
}
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);
}
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);
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);
}
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)
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,