summaryrefslogtreecommitdiffstats
path: root/src/idevicerestore.h
blob: 20578a96e3a5c5a7e3cafba6060a3f57e3a3d2a2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
/*
 * idevicerestore.h
 * Restore device firmware and filesystem
 *
 * Copyright (c) 2010 Joshua Hill. All Rights Reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 */

#ifndef IDEVICERESTORE_H
#define IDEVICERESTORE_H

#include <stdio.h>
#include <stdlib.h>
#include <plist/plist.h>

#define info(...) printf(__VA_ARGS__)
#define error(...) fprintf(stderr, __VA_ARGS__)
#define debug(...) if(idevicerestore_debug >= 1) fprintf(stderr, __VA_ARGS__)

#define MODE_UNKNOWN        -1
#define MODE_DFU             0
#define MODE_RECOVERY        1
#define MODE_RESTORE         2
#define MODE_NORMAL          3

#define CPID_UNKNOWN        -1
#define CPID_IPHONE2G     8900
#define CPID_IPOD1G       8900
#define CPID_IPHONE3G     8900
#define CPID_IPOD2G       8720
#define CPID_IPHONE3GS    8920
#define CPID_IPOD3G       8922
#define CPID_IPAD1G       8930

#define BDID_UNKNOWN        -1
#define BDID_IPHONE2G        0
#define BDID_IPOD1G          2
#define BDID_IPHONE3G        4
#define BDID_IPOD2G          0
#define BDID_IPHONE3GS       0
#define BDID_IPOD3G          2
#define BDID_IPAD1G          2

#define DEVICE_UNKNOWN      -1
#define DEVICE_IPHONE2G      0
#define DEVICE_IPOD1G        1
#define DEVICE_IPHONE3G      2
#define DEVICE_IPOD2G        3
#define DEVICE_IPHONE3GS     4
#define DEVICE_IPOD3G        5
#define DEVICE_IPAD1G        6

typedef struct idevicerestore_entry {
	char* name;
	char* path;
	char* filename;
	char* blob_data;
	uint32_t blob_size;
	struct idevicerestore_entry* next;
	struct idevicerestore_entry* prev;
} idevicerestore_entry_t;

typedef struct {
	int device_id;
	const char* product;
	const char* model;
	int board_id;
	int chip_id;
} idevicerestore_device_t;
/*
typedef struct {
	int mode;
	idevice_t device;
	irecv_client_t recovery;
	restored_client_t restore;
	lockdownd_client_t lockdown;
	int erase; // 1
	int custom; // 2
	int exclude; // 4
	int verbose; // 8
	idevicerestore_device_t* idevicerestore_device;
	idevicerestore_entry_t** entries;
} idevicerestore_context_t;
*/
static idevicerestore_device_t idevicerestore_devices[] = {
	{  0, "iPhone1,1", "M68AP",  0,  8900 },
	{  1, "iPod1,1",   "N45AP",  2,  8900 },
	{  2, "iPhone1,2", "N82AP",  4,  8900 },
	{  3, "iPod2,1",   "N72AP",  0,  8720 },
	{  4, "iPhone2,1", "N88AP",  0,  8920 },
	{  5, "iPod3,1",   "N18AP",  2,  8922 },
	{  6, "iPad1,1",   "K48AP",  2,  8930 },
	{  6, "iPhone4,1", "XXXAP",  0,     0 },
	{ -1,  NULL,        NULL,   -1,    -1 }
};

extern int idevicerestore_mode;
extern int idevicerestore_quit;
extern int idevicerestore_debug;
extern int idevicerestore_erase;
extern int idevicerestore_custom;
extern int idevicerestore_exclude;
extern int idevicerestore_verbose;
extern idevicerestore_device_t* idevicerestore_device;
extern idevicerestore_entry_t** idevicerestore_entries;

int check_mode(const char* uuid);
int check_device(const char* uuid);
void usage(int argc, char* argv[]);
int get_ecid(const char* uuid, uint64_t* ecid);
int get_bdid(const char* uuid, uint32_t* bdid);
int get_cpid(const char* uuid, uint32_t* cpid);
int extract_buildmanifest(const char* ipsw, plist_t* buildmanifest);
plist_t get_build_identity(plist_t buildmanifest, uint32_t identity);
int write_file(const char* filename, const void* data, size_t size);
int read_file(const char* filename, char** data, uint32_t* size);
int get_shsh_blobs(uint64_t ecid, plist_t build_identity, plist_t* tss);
int extract_filesystem(const char* ipsw, plist_t buildmanifest, char** filesystem);
int get_signed_component(const char* ipsw, plist_t tss, const char* path, char** data, uint32_t* size);

inline static void debug_plist(plist_t plist) {
	int size = 0;
	char* data = NULL;
	plist_to_xml(plist, &data, &size);
	debug("%s", data);
	free(data);
}

inline static void print_progress_bar(const char* operation, double progress) {
	int i = 0;
	if(progress < 0) return;
	if(progress > 100) progress = 100;
	info("\r%s [", operation);
	for(i = 0; i < 50; i++) {
		if(i < progress / 2) info("=");
		else info(" ");
	}
	info("] %3.1f%%", progress);
	if(progress == 100) info("\n");
	fflush(stdout);
}

#endif