summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/idevicerestore.c2
-rw-r--r--src/idevicerestore.h1
-rw-r--r--src/ipsw.c22
-rw-r--r--src/ipsw.h2
4 files changed, 25 insertions, 2 deletions
diff --git a/src/idevicerestore.c b/src/idevicerestore.c
index dde163d..6b3dee4 100644
--- a/src/idevicerestore.c
+++ b/src/idevicerestore.c
@@ -149,7 +149,7 @@ int main(int argc, char* argv[]) {
// extract buildmanifest
plist_t buildmanifest = NULL;
info("Extracting BuildManifest from IPSW\n");
- if (extract_buildmanifest(client, ipsw, &buildmanifest) < 0) {
+ if (ipsw_extract_build_manifest(ipsw, &buildmanifest) < 0) {
error("ERROR: Unable to extract BuildManifest from %s\n", ipsw);
return -1;
}
diff --git a/src/idevicerestore.h b/src/idevicerestore.h
index f42ed6f..27128a7 100644
--- a/src/idevicerestore.h
+++ b/src/idevicerestore.h
@@ -38,7 +38,6 @@ int get_build_count(plist_t buildmanifest);
int get_ecid(struct idevicerestore_client_t* client, uint64_t* ecid);
int get_bdid(struct idevicerestore_client_t* client, uint32_t* bdid);
int get_cpid(struct idevicerestore_client_t* client, uint32_t* cpid);
-int extract_buildmanifest(struct idevicerestore_client_t* client, const char* ipsw, plist_t* buildmanifest);
plist_t get_build_identity(struct idevicerestore_client_t* client, plist_t buildmanifest, uint32_t identity);
int get_shsh_blobs(struct idevicerestore_client_t* client, uint64_t ecid, plist_t build_identity, plist_t* tss);
int extract_filesystem(struct idevicerestore_client_t* client, const char* ipsw, plist_t buildmanifest, char** filesystem);
diff --git a/src/ipsw.c b/src/ipsw.c
index f08e2fd..9cd7290 100644
--- a/src/ipsw.c
+++ b/src/ipsw.c
@@ -173,6 +173,28 @@ int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer,
return 0;
}
+int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest) {
+ int size = 0;
+ char* data = NULL;
+
+ /* older devices don't require personalized firmwares and use a BuildManifesto.plist */
+ if (ipsw_extract_to_memory(ipsw, "BuildManifesto.plist", &data, &size) == 0) {
+ plist_from_xml(data, size, buildmanifest);
+ return 0;
+ }
+
+ data = NULL;
+ size = 0;
+
+ /* whereas newer devices do not require personalized firmwares and use a BuildManifest.plist */
+ if (ipsw_extract_to_memory(ipsw, "BuildManifest.plist", &data, &size) == 0) {
+ plist_from_xml(data, size, buildmanifest);
+ return 0;
+ }
+
+ return -1;
+}
+
void ipsw_close(ipsw_archive* archive) {
if (archive != NULL) {
zip_unchange_all(archive->zip);
diff --git a/src/ipsw.h b/src/ipsw.h
index cd11406..f1694ef 100644
--- a/src/ipsw.h
+++ b/src/ipsw.h
@@ -28,6 +28,7 @@ extern "C" {
#include <zip.h>
#include <stdint.h>
+#include <plist/plist.h>
typedef struct {
int index;
@@ -37,6 +38,7 @@ typedef struct {
} ipsw_file;
int ipsw_extract_to_memory(const char* ipsw, const char* infile, char** pbuffer, uint32_t* psize);
+int ipsw_extract_build_manifest(const char* ipsw, plist_t* buildmanifest);
void ipsw_free_file(ipsw_file* file);
#ifdef __cplusplus