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.
This commit is contained in:
parent
ef6e433586
commit
496bd07446
6 changed files with 54 additions and 41 deletions
10
ChangeLog
10
ChangeLog
|
@ -1,3 +1,13 @@
|
||||||
|
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>
|
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/disk/raid.c (scan_devices): Fix condition.
|
* grub-core/disk/raid.c (scan_devices): Fix condition.
|
||||||
|
|
|
@ -332,23 +332,6 @@ grub_raid_close (grub_disk_t disk __attribute ((unused)))
|
||||||
return;
|
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
|
static grub_err_t
|
||||||
grub_raid_read (grub_disk_t disk, grub_disk_addr_t sector,
|
grub_raid_read (grub_disk_t disk, grub_disk_addr_t sector,
|
||||||
grub_size_t size, char *buf)
|
grub_size_t size, char *buf)
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/raid.h>
|
#include <grub/raid.h>
|
||||||
|
#include <grub/crypto.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
GRUB_MOD_LICENSE ("GPLv3+");
|
||||||
|
|
||||||
|
@ -57,7 +58,7 @@ grub_raid5_recover (struct grub_raid_array *array, int disknr,
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_raid_block_xor (buf, buf2, size);
|
grub_crypto_xor (buf, buf2, buf2, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
grub_free (buf2);
|
grub_free (buf2);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <grub/err.h>
|
#include <grub/err.h>
|
||||||
#include <grub/misc.h>
|
#include <grub/misc.h>
|
||||||
#include <grub/raid.h>
|
#include <grub/raid.h>
|
||||||
|
#include <grub/crypto.h>
|
||||||
|
|
||||||
GRUB_MOD_LICENSE ("GPLv3+");
|
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,
|
array->members[pos].start_sector + sector,
|
||||||
0, size, buf)))
|
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_mulx (i, buf, size);
|
||||||
grub_raid_block_xor (qbuf, buf, size);
|
grub_crypto_xor (qbuf, qbuf, buf, size);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -130,7 +131,7 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p,
|
||||||
array->members[p].start_sector + sector,
|
array->members[p].start_sector + sector,
|
||||||
0, size, buf)))
|
0, size, buf)))
|
||||||
{
|
{
|
||||||
grub_raid_block_xor (buf, pbuf, size);
|
grub_crypto_xor (buf, buf, pbuf, size);
|
||||||
goto quit;
|
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))
|
array->members[q].start_sector + sector, 0, size, buf))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
grub_raid_block_xor (buf, qbuf, size);
|
grub_crypto_xor (buf, buf, qbuf, size);
|
||||||
grub_raid_block_mulx (255 - bad1, buf,
|
grub_raid_block_mulx (255 - bad1, buf,
|
||||||
size);
|
size);
|
||||||
}
|
}
|
||||||
|
@ -165,14 +166,14 @@ grub_raid6_recover (struct grub_raid_array *array, int disknr, int p,
|
||||||
0, size, buf))
|
0, size, buf))
|
||||||
goto quit;
|
goto quit;
|
||||||
|
|
||||||
grub_raid_block_xor (pbuf, buf, size);
|
grub_crypto_xor (pbuf, pbuf, buf, size);
|
||||||
|
|
||||||
if (grub_disk_read (array->members[q].device,
|
if (grub_disk_read (array->members[q].device,
|
||||||
array->members[q].start_sector + sector,
|
array->members[q].start_sector + sector,
|
||||||
0, size, buf))
|
0, size, buf))
|
||||||
goto quit;
|
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;
|
c = (255 - bad1 + (255 - powx_inv[(powx[bad2 - bad1 + 255] ^ 1)])) % 255;
|
||||||
grub_raid_block_mulx (c, qbuf, size);
|
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;
|
c = (bad2 + c) % 255;
|
||||||
grub_raid_block_mulx (c, pbuf, size);
|
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);
|
grub_memcpy (buf, pbuf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -169,20 +169,6 @@ grub_crypto_cipher_set_key (grub_crypto_cipher_handle_t cipher,
|
||||||
return cipher->cipher->setkey (cipher->ctx, key, keylen);
|
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
|
gcry_err_code_t
|
||||||
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
void *out, const void *in, grub_size_t size)
|
void *out, const void *in, grub_size_t size)
|
||||||
|
|
|
@ -198,8 +198,40 @@ grub_crypto_cipher_close (grub_crypto_cipher_handle_t cipher)
|
||||||
grub_free (cipher);
|
grub_free (cipher);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static inline void
|
||||||
grub_crypto_xor (void *out, const void *in1, const void *in2, grub_size_t size);
|
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
|
gcry_err_code_t
|
||||||
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
grub_crypto_ecb_decrypt (grub_crypto_cipher_handle_t cipher,
|
||||||
|
|
Loading…
Reference in a new issue