commit d9cfac8b388ff952dd52a908a074424dd0fcf1af
Author: Christophe Fergeau <[email protected]>
Date: Fri Dec 31 22:44:35 2010 +0100
factor common code in hash functions
All the hash functions need the idevice firewire guid as a 20-byte
hex number. Introduce an internal itdb_device_get_hex_uuid function
to factor this code which is common to the 3 hash implementations.
src/itdb_device.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++----
src/itdb_device.h | 1 +
src/itdb_hash58.c | 50 ++++-----------------------------------------
src/itdb_hash72.c | 54 +------------------------------------------------
src/itdb_hashAB.c | 2 +-
5 files changed, 61 insertions(+), 103 deletions(-)
---
diff --git a/src/itdb_device.c b/src/itdb_device.c
index f1aabad..81e7bb9 100644
--- a/src/itdb_device.c
+++ b/src/itdb_device.c
@@ -1847,6 +1847,58 @@ const char *itdb_device_get_firewire_id (const
Itdb_Device *device)
return g_hash_table_lookup (device->sysinfo, "FirewireGuid");
}
+gchar *itdb_device_get_uuid(const Itdb_Device *device)
+{
+ return g_hash_table_lookup (device->sysinfo, "FirewireGuid");
+}
+
+static int ord_from_hex_char(const char c)
+{
+ if ('0' <= c && c <= '9')
+ return c - '0';
+ else if ('a' <= c && c <= 'f')
+ return 10 + (c - 'a');
+ else if ('A' <= c && c <= 'F')
+ return 10 + (c - 'A');
+ else
+ return -1;
+}
+
+static int
+itdb_hex_from_string(unsigned char *dest, const int array_size, const char *s)
+{
+ /* skip optional '0x' prefix */
+ if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
+ s += 2;
+
+ if (strlen(s) > array_size*2)
+ return -8;
+
+ do {
+ int low, high;
+ if((high = ord_from_hex_char(s[0])) == -1 ||
+ (low = ord_from_hex_char(s[1])) == -1)
+ return -9;
+ *dest++ = high<<4 | low;
+ } while(*(s+=2));
+ return 0;
+}
+
+gboolean itdb_device_get_hex_uuid (const Itdb_Device *device, unsigned char
uuid[20])
+{
+ const char *uuid_str;
+ int result;
+
+ uuid_str = itdb_device_get_firewire_id (device);
+ if (uuid_str == NULL) {
+ return FALSE;
+ }
+ memset (uuid, 0, 20);
+ result = itdb_hex_from_string (uuid, 20, uuid_str);
+
+ return (result == 0);
+}
+
ItdbChecksumType itdb_device_get_checksum_type (const Itdb_Device *device)
{
@@ -2150,11 +2202,6 @@ itdb_device_supports_podcast (const Itdb_Device *device)
}
}
-gchar *itdb_device_get_uuid(const Itdb_Device *device)
-{
- return g_hash_table_lookup (device->sysinfo, "FirewireGuid");
-}
-
gboolean itdb_device_is_shuffle (const Itdb_Device *device)
{
const Itdb_IpodInfo *info;
diff --git a/src/itdb_device.h b/src/itdb_device.h
index 465d398..935dbd2 100644
--- a/src/itdb_device.h
+++ b/src/itdb_device.h
@@ -186,6 +186,7 @@ G_GNUC_INTERNAL gboolean itdb_device_is_iphone_family
(const Itdb_Device *device
G_GNUC_INTERNAL gboolean itdb_device_is_shuffle (const Itdb_Device *device);
G_GNUC_INTERNAL ItdbChecksumType itdb_device_get_checksum_type (const
Itdb_Device *device);
G_GNUC_INTERNAL enum ItdbShadowDBVersion itdb_device_get_shadowdb_version
(const Itdb_Device *device);
+G_GNUC_INTERNAL gboolean itdb_device_get_hex_uuid (const Itdb_Device *device,
unsigned char uuid[20]);
const Itdb_IpodInfo *
itdb_ipod_info_from_serial (const char *serial);
diff --git a/src/itdb_hash58.c b/src/itdb_hash58.c
index 03b6cbb..4931f1f 100644
--- a/src/itdb_hash58.c
+++ b/src/itdb_hash58.c
@@ -117,38 +117,6 @@ static const unsigned char fixed[18] = {
0x21, 0x07, 0xC1, 0xD0, 0x12, 0xB2, 0xA1, 0x07, 0x81
};
-static int ord_from_hex_char(const char c)
-{
- if ('0' <= c && c <= '9')
- return c - '0';
- else if ('a' <= c && c <= 'f')
- return 10 + (c - 'a');
- else if ('A' <= c && c <= 'F')
- return 10 + (c - 'A');
- else
- return -1;
-}
-
-static int string_to_hex(unsigned char *dest, const int array_size,
- const char *s)
-{
- /* skip optional '0x' prefix */
- if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
- s += 2;
-
- if (strlen(s) > array_size*2)
- return -8;
-
- do {
- int low, high;
- if((high = ord_from_hex_char(s[0])) == -1 ||
- (low = ord_from_hex_char(s[1])) == -1)
- return -9;
- *dest++ = high<<4 | low;
- } while(*(s+=2));
- return 0;
-}
-
static int gcd(int a, int b){
while (TRUE)
{
@@ -169,20 +137,13 @@ static int lcm(int a, int b)
return (a*b)/gcd(a,b);
}
-static unsigned char *generate_key (const char *fwid)
+static unsigned char *generate_key (const unsigned char *firewire_id)
{
unsigned char *key;
unsigned char y[16];
GChecksum *checksum;
gsize checksum_len;
int i;
- unsigned char firewire_id[20];
- int result;
-
- result = string_to_hex (firewire_id, sizeof (firewire_id), fwid);
- if (result < 0) {
- return NULL;
- }
/* take LCM of each two bytes in the FWID in turn */
for (i=0; i<4; i++){
@@ -212,7 +173,7 @@ static unsigned char *generate_key (const char *fwid)
return key;
}
-static unsigned char *itdb_compute_hash (const char *firewire_id,
+static unsigned char *itdb_compute_hash (const unsigned char *firewire_id,
const unsigned char *itdb,
unsigned long size,
gsize *len)
@@ -268,7 +229,7 @@ gboolean itdb_hash58_write_hash (Itdb_Device *device,
gsize itdb_len,
GError **error)
{
- const char *fwid;
+ unsigned char firewire_id[20];
guchar backup18[8];
guchar backup32[20];
unsigned char *checksum;
@@ -277,8 +238,7 @@ gboolean itdb_hash58_write_hash (Itdb_Device *device,
g_assert (itdb_device_get_checksum_type (device) == ITDB_CHECKSUM_HASH58);
- fwid = itdb_device_get_firewire_id (device);
- if (fwid == NULL) {
+ if (!itdb_device_get_hex_uuid(device, firewire_id)) {
g_set_error (error, 0, -1, "Couldn't find the iPod firewire ID");
return FALSE;
}
@@ -300,7 +260,7 @@ gboolean itdb_hash58_write_hash (Itdb_Device *device,
header->hashing_scheme = GUINT16_FROM_LE (ITDB_CHECKSUM_HASH58);
- checksum = itdb_compute_hash (fwid, itdb_data, itdb_len, &len);
+ checksum = itdb_compute_hash (firewire_id, itdb_data, itdb_len, &len);
if (checksum == NULL) {
g_set_error (error, 0, -1, "Failed to compute checksum");
return FALSE;
diff --git a/src/itdb_hash72.c b/src/itdb_hash72.c
index f158e1e..e57c22f 100644
--- a/src/itdb_hash72.c
+++ b/src/itdb_hash72.c
@@ -100,56 +100,6 @@ static int hash_extract(const uint8_t signature[46],
return 0;
}
-static int ord_from_hex_char(const char c)
-{
- if ('0' <= c && c <= '9')
- return c - '0';
- else if ('a' <= c && c <= 'f')
- return 10 + (c - 'a');
- else if ('A' <= c && c <= 'F')
- return 10 + (c - 'A');
- else
- return -1;
-}
-
-static int string_to_hex(unsigned char *dest, const int array_size,
- const char *s)
-{
- /* skip optional '0x' prefix */
- if (s[0] == '0' && (s[1] == 'x' || s[1] == 'X'))
- s += 2;
-
- if (strlen(s) > array_size*2)
- return -8;
-
- do {
- int low, high;
- if((high = ord_from_hex_char(s[0])) == -1 ||
- (low = ord_from_hex_char(s[1])) == -1)
- return -9;
- *dest++ = high<<4 | low;
- } while(*(s+=2));
- return 0;
-}
-
-static gboolean get_uuid (const Itdb_Device *device, unsigned char uuid[20])
-{
- const char *uuid_str;
- int result;
-
- uuid_str = itdb_device_get_uuid (device);
- if (uuid_str == NULL) {
- uuid_str = itdb_device_get_firewire_id (device);
- }
- if (uuid_str == NULL) {
- return FALSE;
- }
- memset (uuid, 0, 20);
- result = string_to_hex (uuid, 20, uuid_str);
-
- return (result == 0);
-}
-
struct Hash78Info {
unsigned char header[6];
unsigned char uuid[20];
@@ -179,7 +129,7 @@ static gboolean write_hash_info (const Itdb_Device *device,
const char header[] = "HASHv0";
memcpy (hash_info.header, header, sizeof (header));
- success = get_uuid (device, hash_info.uuid);
+ success = itdb_device_get_hex_uuid (device, hash_info.uuid);
if (!success) {
return FALSE;
}
@@ -202,7 +152,7 @@ static struct Hash78Info *read_hash_info (const Itdb_Device
*device)
unsigned char uuid[20];
struct Hash78Info *info;
- if (!get_uuid (device, uuid)) {
+ if (!itdb_device_get_hex_uuid (device, uuid)) {
return NULL;
}
diff --git a/src/itdb_hashAB.c b/src/itdb_hashAB.c
index ce0f794..7b9f833 100644
--- a/src/itdb_hashAB.c
+++ b/src/itdb_hashAB.c
@@ -118,7 +118,7 @@ gboolean itdb_hashAB_compute_hash_for_sha1 (const
Itdb_Device *device,
}
}
- if (!get_uuid(device, uuid)) return FALSE;
+ if (!itdb_device_get_hex_uuid(device, uuid)) return FALSE;
calc_hashAB(signature, sha1, uuid, rndpart);
------------------------------------------------------------------------------
Learn how Oracle Real Application Clusters (RAC) One Node allows customers
to consolidate database storage, standardize their database environment, and,
should the need arise, upgrade to a full multi-node Oracle RAC database
without downtime or disruption
http://p.sf.net/sfu/oracle-sfdevnl
_______________________________________________
gtkpod-cvs2 mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/gtkpod-cvs2