summaryrefslogtreecommitdiffstats
path: root/tools/idevicebackup.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/idevicebackup.c')
-rw-r--r--tools/idevicebackup.c134
1 files changed, 35 insertions, 99 deletions
diff --git a/tools/idevicebackup.c b/tools/idevicebackup.c
index 2856fda..c0537b8 100644
--- a/tools/idevicebackup.c
+++ b/tools/idevicebackup.c
@@ -32,21 +32,6 @@
#include <stdlib.h>
#include <signal.h>
#include <getopt.h>
-#if defined(HAVE_OPENSSL)
-#include <openssl/sha.h>
-#elif defined(HAVE_GNUTLS)
-#include <gcrypt.h>
-#elif defined(HAVE_MBEDTLS)
-#include <mbedtls/sha1.h>
-#if MBEDTLS_VERSION_NUMBER < 0x03000000
-#define mbedtls_sha1 mbedtls_sha1_ret
-#define mbedtls_sha1_starts mbedtls_sha1_starts_ret
-#define mbedtls_sha1_update mbedtls_sha1_update_ret
-#define mbedtls_sha1_finish mbedtls_sha1_finish_ret
-#endif
-#else
-#error No supported crypto library enabled
-#endif
#include <unistd.h>
#include <ctype.h>
#include <time.h>
@@ -56,7 +41,9 @@
#include <libimobiledevice/mobilebackup.h>
#include <libimobiledevice/notification_proxy.h>
#include <libimobiledevice/afc.h>
+#include <libimobiledevice-glue/sha.h>
#include <libimobiledevice-glue/utils.h>
+#include <plist/plist.h>
#define MOBILEBACKUP_SERVICE_NAME "com.apple.mobilebackup"
#define NP_SERVICE_NAME "com.apple.mobile.notification_proxy"
@@ -87,17 +74,6 @@ enum device_link_file_status_t {
DEVICE_LINK_FILE_STATUS_LAST_HUNK
};
-static void sha1_of_data(const char *input, uint32_t size, unsigned char *hash_out)
-{
-#if defined(HAVE_OPENSSL)
- SHA1((const unsigned char*)input, size, hash_out);
-#elif defined(HAVE_GNUTLS)
- gcry_md_hash_buffer(GCRY_MD_SHA1, hash_out, input, size);
-#elif defined(HAVE_MBEDTLS)
- mbedtls_sha1((unsigned char*)input, size, hash_out);
-#endif
-}
-
static int compare_hash(const unsigned char *hash1, const unsigned char *hash2, int hash_len)
{
int i;
@@ -109,89 +85,49 @@ static int compare_hash(const unsigned char *hash1, const unsigned char *hash2,
return 1;
}
-static void _sha1_update(void* context, const char* data, size_t len)
-{
-#if defined(HAVE_OPENSSL)
- SHA1_Update(context, data, len);
-#elif defined(HAVE_GNUTLS)
- gcry_md_write(context, data, len);
-#elif defined(HAVE_MBEDTLS)
- mbedtls_sha1_update(context, (const unsigned char*)data, len);
-#endif
-}
-
static void compute_datahash(const char *path, const char *destpath, uint8_t greylist, const char *domain, const char *appid, const char *version, unsigned char *hash_out)
{
-#if defined(HAVE_OPENSSL)
- SHA_CTX sha1;
- SHA1_Init(&sha1);
- void* psha1 = &sha1;
-#elif defined(HAVE_GNUTLS)
- gcry_md_hd_t hd = NULL;
- gcry_md_open(&hd, GCRY_MD_SHA1, 0);
- if (!hd) {
- printf("ERROR: Could not initialize libgcrypt/SHA1\n");
- return;
- }
- gcry_md_reset(hd);
- void* psha1 = hd;
-#elif defined(HAVE_MBEDTLS)
- mbedtls_sha1_context sha1;
- mbedtls_sha1_init(&sha1);
- mbedtls_sha1_starts(&sha1);
- void* psha1 = &sha1;
-#endif
+ sha1_context sha1;
+ sha1_init(&sha1);
FILE *f = fopen(path, "rb");
if (f) {
unsigned char buf[16384];
size_t len;
while ((len = fread(buf, 1, 16384, f)) > 0) {
- _sha1_update(psha1, (const char*)buf, len);
+ sha1_update(&sha1, buf, len);
}
fclose(f);
- _sha1_update(psha1, destpath, strlen(destpath));
- _sha1_update(psha1, ";", 1);
+ sha1_update(&sha1, destpath, strlen(destpath));
+ sha1_update(&sha1, ";", 1);
if (greylist == 1) {
- _sha1_update(psha1, "true", 4);
+ sha1_update(&sha1, "true", 4);
} else {
- _sha1_update(psha1, "false", 5);
+ sha1_update(&sha1, "false", 5);
}
- _sha1_update(psha1, ";", 1);
+ sha1_update(&sha1, ";", 1);
if (domain) {
- _sha1_update(psha1, domain, strlen(domain));
+ sha1_update(&sha1, domain, strlen(domain));
} else {
- _sha1_update(psha1, "(null)", 6);
+ sha1_update(&sha1, "(null)", 6);
}
- _sha1_update(psha1, ";", 1);
+ sha1_update(&sha1, ";", 1);
if (appid) {
- _sha1_update(psha1, appid, strlen(appid));
+ sha1_update(&sha1, appid, strlen(appid));
} else {
- _sha1_update(psha1, "(null)", 6);
+ sha1_update(&sha1, "(null)", 6);
}
- _sha1_update(psha1, ";", 1);
+ sha1_update(&sha1, ";", 1);
if (version) {
- _sha1_update(psha1, version, strlen(version));
+ sha1_update(&sha1, version, strlen(version));
} else {
- _sha1_update(psha1, "(null)", 6);
+ sha1_update(&sha1, "(null)", 6);
}
-#if defined(HAVE_OPENSSL)
- SHA1_Final(hash_out, &sha1);
-#elif defined(HAVE_GNUTLS)
- unsigned char *newhash = gcry_md_read(hd, GCRY_MD_SHA1);
- memcpy(hash_out, newhash, 20);
-#elif defined(HAVE_MBEDTLS)
- mbedtls_sha1_finish(&sha1, hash_out);
-#endif
+ sha1_final(&sha1, hash_out);
}
-#if defined(HAVE_GNUTLS)
- gcry_md_close(hd);
-#elif defined(HAVE_MBEDTLS)
- mbedtls_sha1_free(&sha1);
-#endif
}
static void print_hash(const unsigned char *hash, int len)
@@ -317,7 +253,7 @@ static void mobilebackup_write_status(const char *path, int status)
if (stat(file_path, &st) == 0)
remove(file_path);
- plist_write_to_filename(status_plist, file_path, PLIST_FORMAT_XML);
+ plist_write_to_file(status_plist, file_path, PLIST_FORMAT_XML, 0);
plist_free(status_plist);
status_plist = NULL;
@@ -331,7 +267,7 @@ static int mobilebackup_read_status(const char *path)
plist_t status_plist = NULL;
char *file_path = mobilebackup_build_path(path, "Status", ".plist");
- plist_read_from_filename(&status_plist, file_path);
+ plist_read_from_file(file_path, &status_plist, NULL);
free(file_path);
if (!status_plist) {
printf("Could not read Status.plist!\n");
@@ -454,7 +390,7 @@ static int mobilebackup_check_file_integrity(const char *backup_directory, const
}
infopath = mobilebackup_build_path(backup_directory, hash, ".mdinfo");
- plist_read_from_filename(&mdinfo, infopath);
+ plist_read_from_file(infopath, &mdinfo, NULL);
free(infopath);
if (!mdinfo) {
printf("\r\n");
@@ -528,7 +464,7 @@ static int mobilebackup_check_file_integrity(const char *backup_directory, const
unsigned char fnhash[20];
char fnamehash[41];
char *p = fnamehash;
- sha1_of_data(fnstr, strlen(fnstr), fnhash);
+ sha1((const unsigned char*)fnstr, strlen(fnstr), fnhash);
free(fnstr);
int i;
for ( i = 0; i < 20; i++, p += 2 ) {
@@ -882,7 +818,7 @@ int main(int argc, char *argv[])
/* verify existing Info.plist */
if (stat(info_path, &st) == 0) {
printf("Reading Info.plist from backup.\n");
- plist_read_from_filename(&info_plist, info_path);
+ plist_read_from_file(info_path, &info_plist, NULL);
if (!info_plist) {
printf("Could not read Info.plist\n");
@@ -893,7 +829,7 @@ int main(int argc, char *argv[])
/* update the last backup time within Info.plist */
mobilebackup_info_update_last_backup_date(info_plist);
remove(info_path);
- plist_write_to_filename(info_plist, info_path, PLIST_FORMAT_XML);
+ plist_write_to_file(info_plist, info_path, PLIST_FORMAT_XML, 0);
} else {
printf("Aborting backup. Backup is not compatible with the current device.\n");
cmd = CMD_LEAVE;
@@ -959,7 +895,7 @@ int main(int argc, char *argv[])
/* read the last Manifest.plist */
if (!is_full_backup) {
printf("Reading existing Manifest.\n");
- plist_read_from_filename(&manifest_plist, manifest_path);
+ plist_read_from_file(manifest_path, &manifest_plist, NULL);
if (!manifest_plist) {
printf("Could not read Manifest.plist, switching to full backup mode.\n");
is_full_backup = 1;
@@ -977,7 +913,7 @@ int main(int argc, char *argv[])
remove(info_path);
printf("Creating Info.plist for new backup.\n");
info_plist = mobilebackup_factory_info_plist_new(udid);
- plist_write_to_filename(info_plist, info_path, PLIST_FORMAT_XML);
+ plist_write_to_file(info_plist, info_path, PLIST_FORMAT_XML, 0);
}
free(info_path);
@@ -1116,7 +1052,7 @@ int main(int argc, char *argv[])
remove(filename_mdinfo);
node = plist_dict_get_item(node_tmp, "BackupFileInfo");
- plist_write_to_filename(node, filename_mdinfo, PLIST_FORMAT_BINARY);
+ plist_write_to_file(node, filename_mdinfo, PLIST_FORMAT_BINARY, 0);
free(filename_mdinfo);
}
@@ -1228,7 +1164,7 @@ files_out:
if (manifest_plist) {
remove(manifest_path);
printf("Storing Manifest.plist...\n");
- plist_write_to_filename(manifest_plist, manifest_path, PLIST_FORMAT_XML);
+ plist_write_to_file(manifest_plist, manifest_path, PLIST_FORMAT_XML, 0);
}
backup_ok = 1;
@@ -1259,21 +1195,21 @@ files_out:
}
/* now make sure backup integrity is ok! verify all files */
printf("Reading existing Manifest.\n");
- plist_read_from_filename(&manifest_plist, manifest_path);
+ plist_read_from_file(manifest_path, &manifest_plist, NULL);
if (!manifest_plist) {
printf("Could not read Manifest.plist. Aborting.\n");
break;
}
printf("Verifying backup integrity, please wait.\n");
- char *bin = NULL;
+ unsigned char *bin = NULL;
uint64_t binsize = 0;
node = plist_dict_get_item(manifest_plist, "Data");
if (!node || (plist_get_node_type(node) != PLIST_DATA)) {
printf("Could not read Data key from Manifest.plist!\n");
break;
}
- plist_get_data_val(node, &bin, &binsize);
+ plist_get_data_val(node, (char**)&bin, &binsize);
plist_t backup_data = NULL;
if (bin) {
char *auth_ver = NULL;
@@ -1290,7 +1226,7 @@ files_out:
if (auth_sig && (auth_sig_len == 20)) {
/* calculate the sha1, then compare */
unsigned char data_sha1[20];
- sha1_of_data(bin, binsize, data_sha1);
+ sha1(bin, binsize, data_sha1);
if (compare_hash(auth_sig, data_sha1, 20)) {
printf("AuthSignature is valid\n");
} else {
@@ -1303,7 +1239,7 @@ files_out:
} else if (auth_ver) {
printf("Unknown AuthVersion '%s', cannot verify AuthSignature\n", auth_ver);
}
- plist_from_bin(bin, (uint32_t)binsize, &backup_data);
+ plist_from_bin((char*)bin, (uint32_t)binsize, &backup_data);
free(bin);
}
if (!backup_data) {
@@ -1386,7 +1322,7 @@ files_out:
while (node) {
/* TODO: read mddata/mdinfo files and send to device using DLSendFile */
file_info_path = mobilebackup_build_path(backup_directory, hash, ".mdinfo");
- plist_read_from_filename(&file_info, file_info_path);
+ plist_read_from_file(file_info_path, &file_info, NULL);
/* get encryption state */
tmp_node = plist_dict_get_item(file_info, "IsEncrypted");