diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Makefile.am | 18 | ||||
| -rw-r--r-- | src/Makefile.in | 547 | ||||
| -rw-r--r-- | src/base64.c | 425 | ||||
| -rw-r--r-- | src/base64.h | 45 | ||||
| -rw-r--r-- | src/idevicerestore.c | 104 | ||||
| -rw-r--r-- | src/ipsw.c | 117 | ||||
| -rw-r--r-- | src/ipsw.h | 43 | ||||
| -rw-r--r-- | src/tss.c | 76 | ||||
| -rw-r--r-- | src/tss.h | 29 | 
9 files changed, 1404 insertions, 0 deletions
| diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..b997ca6 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,18 @@ +AM_CFLAGS =	                   \ +	$(GLOBAL_CFLAGS)           \ +	$(libimobiledevice_CFLAGS) \ +	$(libplist_CFLAGS)         \ +	$(libzip_CFLAGS)           \ +	$(libcurl_CFLAGS) + +AM_LDFLAGS =\ +	$(libimobiledevice_LIBS)   \ +	$(libplist_LIBS)           \ +	$(libzip_LIBS)             \ +	$(libcurl_LIBS) + +bin_PROGRAMS = idevicerestore + +idevicerestore_SOURCES = idevicerestore.c ipsw.c tss.c base64.c +idevicerestore_CFLAGS = $(AM_CFLAGS) +idevicerestore_LDFLAGS = $(AM_LDFLAGS)
\ No newline at end of file diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..48ce0de --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,547 @@ +# Makefile.in generated by automake 1.11 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation, +# Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +build_triplet = @build@ +host_triplet = @host@ +target_triplet = @target@ +bin_PROGRAMS = idevicerestore$(EXEEXT) +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ +	$(ACLOCAL_M4) +mkinstalldirs = $(install_sh) -d +CONFIG_CLEAN_FILES = +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" +PROGRAMS = $(bin_PROGRAMS) +am_idevicerestore_OBJECTS = idevicerestore-idevicerestore.$(OBJEXT) \ +	idevicerestore-ipsw.$(OBJEXT) idevicerestore-tss.$(OBJEXT) \ +	idevicerestore-base64.$(OBJEXT) +idevicerestore_OBJECTS = $(am_idevicerestore_OBJECTS) +idevicerestore_LDADD = $(LDADD) +idevicerestore_LINK = $(CCLD) $(idevicerestore_CFLAGS) $(CFLAGS) \ +	$(idevicerestore_LDFLAGS) $(LDFLAGS) -o $@ +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ +	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(idevicerestore_SOURCES) +DIST_SOURCES = $(idevicerestore_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +PKG_CONFIG = @PKG_CONFIG@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libcurl_CFLAGS = @libcurl_CFLAGS@ +libcurl_LIBS = @libcurl_LIBS@ +libdir = @libdir@ +libexecdir = @libexecdir@ +libimobiledevice_CFLAGS = @libimobiledevice_CFLAGS@ +libimobiledevice_LIBS = @libimobiledevice_LIBS@ +libplist_CFLAGS = @libplist_CFLAGS@ +libplist_LIBS = @libplist_LIBS@ +libzip_CFLAGS = @libzip_CFLAGS@ +libzip_LIBS = @libzip_LIBS@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target = @target@ +target_alias = @target_alias@ +target_cpu = @target_cpu@ +target_os = @target_os@ +target_vendor = @target_vendor@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ +AM_CFLAGS = \ +	$(GLOBAL_CFLAGS)           \ +	$(libimobiledevice_CFLAGS) \ +	$(libplist_CFLAGS)         \ +	$(libzip_CFLAGS)           \ +	$(libcurl_CFLAGS) + +AM_LDFLAGS = \ +	$(libimobiledevice_LIBS)   \ +	$(libplist_LIBS)           \ +	$(libzip_LIBS)             \ +	$(libcurl_LIBS) + +idevicerestore_SOURCES = idevicerestore.c ipsw.c tss.c base64.c +idevicerestore_CFLAGS = $(AM_CFLAGS) +idevicerestore_LDFLAGS = $(AM_LDFLAGS) +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps) +	@for dep in $?; do \ +	  case '$(am__configure_deps)' in \ +	    *$$dep*) \ +	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ +	        && { if test -f $@; then exit 0; else break; fi; }; \ +	      exit 1;; \ +	  esac; \ +	done; \ +	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ +	$(am__cd) $(top_srcdir) && \ +	  $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +	@case '$?' in \ +	  *config.status*) \ +	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ +	  *) \ +	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ +	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ +	esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure:  $(am__configure_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4):  $(am__aclocal_m4_deps) +	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(am__aclocal_m4_deps): +install-binPROGRAMS: $(bin_PROGRAMS) +	@$(NORMAL_INSTALL) +	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)" +	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ +	for p in $$list; do echo "$$p $$p"; done | \ +	sed 's/$(EXEEXT)$$//' | \ +	while read p p1; do if test -f $$p; \ +	  then echo "$$p"; echo "$$p"; else :; fi; \ +	done | \ +	sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \ +	    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ +	sed 'N;N;N;s,\n, ,g' | \ +	$(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ +	  { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ +	    if ($$2 == $$4) files[d] = files[d] " " $$1; \ +	    else { print "f", $$3 "/" $$4, $$1; } } \ +	  END { for (d in files) print "f", d, files[d] }' | \ +	while read type dir files; do \ +	    if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ +	    test -z "$$files" || { \ +	      echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ +	      $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ +	    } \ +	; done + +uninstall-binPROGRAMS: +	@$(NORMAL_UNINSTALL) +	@list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ +	files=`for p in $$list; do echo "$$p"; done | \ +	  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ +	      -e 's/$$/$(EXEEXT)/' `; \ +	test -n "$$list" || exit 0; \ +	echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ +	cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: +	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +idevicerestore$(EXEEXT): $(idevicerestore_OBJECTS) $(idevicerestore_DEPENDENCIES)  +	@rm -f idevicerestore$(EXEEXT) +	$(idevicerestore_LINK) $(idevicerestore_OBJECTS) $(idevicerestore_LDADD) $(LIBS) + +mostlyclean-compile: +	-rm -f *.$(OBJEXT) + +distclean-compile: +	-rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idevicerestore-base64.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idevicerestore-idevicerestore.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idevicerestore-ipsw.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/idevicerestore-tss.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(COMPILE) -c `$(CYGPATH_W) '$<'` + +idevicerestore-idevicerestore.o: idevicerestore.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-idevicerestore.o -MD -MP -MF $(DEPDIR)/idevicerestore-idevicerestore.Tpo -c -o idevicerestore-idevicerestore.o `test -f 'idevicerestore.c' || echo '$(srcdir)/'`idevicerestore.c +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-idevicerestore.Tpo $(DEPDIR)/idevicerestore-idevicerestore.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='idevicerestore.c' object='idevicerestore-idevicerestore.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-idevicerestore.o `test -f 'idevicerestore.c' || echo '$(srcdir)/'`idevicerestore.c + +idevicerestore-idevicerestore.obj: idevicerestore.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-idevicerestore.obj -MD -MP -MF $(DEPDIR)/idevicerestore-idevicerestore.Tpo -c -o idevicerestore-idevicerestore.obj `if test -f 'idevicerestore.c'; then $(CYGPATH_W) 'idevicerestore.c'; else $(CYGPATH_W) '$(srcdir)/idevicerestore.c'; fi` +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-idevicerestore.Tpo $(DEPDIR)/idevicerestore-idevicerestore.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='idevicerestore.c' object='idevicerestore-idevicerestore.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-idevicerestore.obj `if test -f 'idevicerestore.c'; then $(CYGPATH_W) 'idevicerestore.c'; else $(CYGPATH_W) '$(srcdir)/idevicerestore.c'; fi` + +idevicerestore-ipsw.o: ipsw.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-ipsw.o -MD -MP -MF $(DEPDIR)/idevicerestore-ipsw.Tpo -c -o idevicerestore-ipsw.o `test -f 'ipsw.c' || echo '$(srcdir)/'`ipsw.c +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-ipsw.Tpo $(DEPDIR)/idevicerestore-ipsw.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ipsw.c' object='idevicerestore-ipsw.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-ipsw.o `test -f 'ipsw.c' || echo '$(srcdir)/'`ipsw.c + +idevicerestore-ipsw.obj: ipsw.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-ipsw.obj -MD -MP -MF $(DEPDIR)/idevicerestore-ipsw.Tpo -c -o idevicerestore-ipsw.obj `if test -f 'ipsw.c'; then $(CYGPATH_W) 'ipsw.c'; else $(CYGPATH_W) '$(srcdir)/ipsw.c'; fi` +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-ipsw.Tpo $(DEPDIR)/idevicerestore-ipsw.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='ipsw.c' object='idevicerestore-ipsw.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-ipsw.obj `if test -f 'ipsw.c'; then $(CYGPATH_W) 'ipsw.c'; else $(CYGPATH_W) '$(srcdir)/ipsw.c'; fi` + +idevicerestore-tss.o: tss.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-tss.o -MD -MP -MF $(DEPDIR)/idevicerestore-tss.Tpo -c -o idevicerestore-tss.o `test -f 'tss.c' || echo '$(srcdir)/'`tss.c +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-tss.Tpo $(DEPDIR)/idevicerestore-tss.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tss.c' object='idevicerestore-tss.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-tss.o `test -f 'tss.c' || echo '$(srcdir)/'`tss.c + +idevicerestore-tss.obj: tss.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-tss.obj -MD -MP -MF $(DEPDIR)/idevicerestore-tss.Tpo -c -o idevicerestore-tss.obj `if test -f 'tss.c'; then $(CYGPATH_W) 'tss.c'; else $(CYGPATH_W) '$(srcdir)/tss.c'; fi` +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-tss.Tpo $(DEPDIR)/idevicerestore-tss.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='tss.c' object='idevicerestore-tss.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-tss.obj `if test -f 'tss.c'; then $(CYGPATH_W) 'tss.c'; else $(CYGPATH_W) '$(srcdir)/tss.c'; fi` + +idevicerestore-base64.o: base64.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-base64.o -MD -MP -MF $(DEPDIR)/idevicerestore-base64.Tpo -c -o idevicerestore-base64.o `test -f 'base64.c' || echo '$(srcdir)/'`base64.c +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-base64.Tpo $(DEPDIR)/idevicerestore-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='base64.c' object='idevicerestore-base64.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-base64.o `test -f 'base64.c' || echo '$(srcdir)/'`base64.c + +idevicerestore-base64.obj: base64.c +@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -MT idevicerestore-base64.obj -MD -MP -MF $(DEPDIR)/idevicerestore-base64.Tpo -c -o idevicerestore-base64.obj `if test -f 'base64.c'; then $(CYGPATH_W) 'base64.c'; else $(CYGPATH_W) '$(srcdir)/base64.c'; fi` +@am__fastdepCC_TRUE@	$(am__mv) $(DEPDIR)/idevicerestore-base64.Tpo $(DEPDIR)/idevicerestore-base64.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='base64.c' object='idevicerestore-base64.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(idevicerestore_CFLAGS) $(CFLAGS) -c -o idevicerestore-base64.obj `if test -f 'base64.c'; then $(CYGPATH_W) 'base64.c'; else $(CYGPATH_W) '$(srcdir)/base64.c'; fi` + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) +	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	mkid -fID $$unique +tags: TAGS + +TAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \ +		$(TAGS_FILES) $(LISP) +	set x; \ +	here=`pwd`; \ +	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	shift; \ +	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ +	  test -n "$$unique" || unique=$$empty_fix; \ +	  if test $$# -gt 0; then \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      "$$@" $$unique; \ +	  else \ +	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ +	      $$unique; \ +	  fi; \ +	fi +ctags: CTAGS +CTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \ +		$(TAGS_FILES) $(LISP) +	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \ +	unique=`for i in $$list; do \ +	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ +	  done | \ +	  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \ +	      END { if (nonempty) { for (i in files) print i; }; }'`; \ +	test -z "$(CTAGS_ARGS)$$unique" \ +	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ +	     $$unique + +GTAGS: +	here=`$(am__cd) $(top_builddir) && pwd` \ +	  && $(am__cd) $(top_srcdir) \ +	  && gtags -i $(GTAGS_ARGS) "$$here" + +distclean-tags: +	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) +	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ +	list='$(DISTFILES)'; \ +	  dist_files=`for file in $$list; do echo $$file; done | \ +	  sed -e "s|^$$srcdirstrip/||;t" \ +	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ +	case $$dist_files in \ +	  */*) $(MKDIR_P) `echo "$$dist_files" | \ +			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ +			   sort -u` ;; \ +	esac; \ +	for file in $$dist_files; do \ +	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ +	  if test -d $$d/$$file; then \ +	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ +	    if test -d "$(distdir)/$$file"; then \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ +	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ +	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ +	    fi; \ +	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ +	  else \ +	    test -f "$(distdir)/$$file" \ +	    || cp -p $$d/$$file "$(distdir)/$$file" \ +	    || exit 1; \ +	  fi; \ +	done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) +installdirs: +	for dir in "$(DESTDIR)$(bindir)"; do \ +	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \ +	done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am +	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: +	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ +	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ +	  `test -z '$(STRIP)' || \ +	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: +	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) +	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + +maintainer-clean-generic: +	@echo "This command is intended for maintainers to use" +	@echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ +	distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am +	-rm -rf ./$(DEPDIR) +	-rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS + +.MAKE: install-am install-strip + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ +	clean-generic ctags distclean distclean-compile \ +	distclean-generic distclean-tags distdir dvi dvi-am html \ +	html-am info info-am install install-am install-binPROGRAMS \ +	install-data install-data-am install-dvi install-dvi-am \ +	install-exec install-exec-am install-html install-html-am \ +	install-info install-info-am install-man install-pdf \ +	install-pdf-am install-ps install-ps-am install-strip \ +	installcheck installcheck-am installdirs maintainer-clean \ +	maintainer-clean-generic mostlyclean mostlyclean-compile \ +	mostlyclean-generic pdf pdf-am ps ps-am tags uninstall \ +	uninstall-am uninstall-binPROGRAMS + + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/base64.c b/src/base64.c new file mode 100644 index 0000000..217b8c6 --- /dev/null +++ b/src/base64.c @@ -0,0 +1,425 @@ +/* base64.c -- Encode binary data using printable characters. +   Copyright (C) 1999, 2000, 2001, 2004, 2005, 2006 Free Software +   Foundation, Inc. + +   This program is free software; you can redistribute it and/or modify +   it under the terms of the GNU General Public License as published by +   the Free Software Foundation; either version 2, or (at your option) +   any later version. + +   This program 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 General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program; if not, write to the Free Software Foundation, +   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */ + +/* Written by Simon Josefsson.  Partially adapted from GNU MailUtils + * (mailbox/filter_trans.c, as of 2004-11-28).  Improved by review + * from Paul Eggert, Bruno Haible, and Stepan Kasal. + * + * See also RFC 3548 <http://www.ietf.org/rfc/rfc3548.txt>. + * + * Be careful with error checking.  Here is how you would typically + * use these functions: + * + * bool ok = base64_decode_alloc (in, inlen, &out, &outlen); + * if (!ok) + *   FAIL: input was not valid base64 + * if (out == NULL) + *   FAIL: memory allocation error + * OK: data in OUT/OUTLEN + * + * size_t outlen = base64_encode_alloc (in, inlen, &out); + * if (out == NULL && outlen == 0 && inlen != 0) + *   FAIL: input too long + * if (out == NULL) + *   FAIL: memory allocation error + * OK: data in OUT/OUTLEN. + * + */ + +//#include <config.h> + +/* Get prototype. */ +#include "base64.h" + +/* Get malloc. */ +#include <stdlib.h> + +/* Get UCHAR_MAX. */ +#include <limits.h> + +/* C89 compliant way to cast 'char' to 'unsigned char'. */ +static inline unsigned char +to_uchar (char ch) +{ +  return ch; +} + +/* Base64 encode IN array of size INLEN into OUT array of size OUTLEN. +   If OUTLEN is less than BASE64_LENGTH(INLEN), write as many bytes as +   possible.  If OUTLEN is larger than BASE64_LENGTH(INLEN), also zero +   terminate the output buffer. */ +void +base64_encode (const char *in, size_t inlen, +	       char *out, size_t outlen) +{ +  static const char b64str[64] = +    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + +  while (inlen && outlen) +    { +      *out++ = b64str[(to_uchar (in[0]) >> 2) & 0x3f]; +      if (!--outlen) +	break; +      *out++ = b64str[((to_uchar (in[0]) << 4) +		       + (--inlen ? to_uchar (in[1]) >> 4 : 0)) +		      & 0x3f]; +      if (!--outlen) +	break; +      *out++ = +	(inlen +	 ? b64str[((to_uchar (in[1]) << 2) +		   + (--inlen ? to_uchar (in[2]) >> 6 : 0)) +		  & 0x3f] +	 : '='); +      if (!--outlen) +	break; +      *out++ = inlen ? b64str[to_uchar (in[2]) & 0x3f] : '='; +      if (!--outlen) +	break; +      if (inlen) +	inlen--; +      if (inlen) +	in += 3; +    } + +  if (outlen) +    *out = '\0'; +} + +/* Allocate a buffer and store zero terminated base64 encoded data +   from array IN of size INLEN, returning BASE64_LENGTH(INLEN), i.e., +   the length of the encoded data, excluding the terminating zero.  On +   return, the OUT variable will hold a pointer to newly allocated +   memory that must be deallocated by the caller.  If output string +   length would overflow, 0 is returned and OUT is set to NULL.  If +   memory allocation failed, OUT is set to NULL, and the return value +   indicates length of the requested memory block, i.e., +   BASE64_LENGTH(inlen) + 1. */ +size_t +base64_encode_alloc (const char *in, size_t inlen, char **out) +{ +  size_t outlen = 1 + BASE64_LENGTH (inlen); + +  /* Check for overflow in outlen computation. +   * +   * If there is no overflow, outlen >= inlen. +   * +   * If the operation (inlen + 2) overflows then it yields at most +1, so +   * outlen is 0. +   * +   * If the multiplication overflows, we lose at least half of the +   * correct value, so the result is < ((inlen + 2) / 3) * 2, which is +   * less than (inlen + 2) * 0.66667, which is less than inlen as soon as +   * (inlen > 4). +   */ +  if (inlen > outlen) +    { +      *out = NULL; +      return 0; +    } + +  *out = malloc (outlen); +  if (!*out) +    return outlen; + +  base64_encode (in, inlen, *out, outlen); + +  return outlen - 1; +} + +/* With this approach this file works independent of the charset used +   (think EBCDIC).  However, it does assume that the characters in the +   Base64 alphabet (A-Za-z0-9+/) are encoded in 0..255.  POSIX +   1003.1-2001 require that char and unsigned char are 8-bit +   quantities, though, taking care of that problem.  But this may be a +   potential problem on non-POSIX C99 platforms. + +   IBM C V6 for AIX mishandles "#define B64(x) ...'x'...", so use "_" +   as the formal parameter rather than "x".  */ +#define B64(_)					\ +  ((_) == 'A' ? 0				\ +   : (_) == 'B' ? 1				\ +   : (_) == 'C' ? 2				\ +   : (_) == 'D' ? 3				\ +   : (_) == 'E' ? 4				\ +   : (_) == 'F' ? 5				\ +   : (_) == 'G' ? 6				\ +   : (_) == 'H' ? 7				\ +   : (_) == 'I' ? 8				\ +   : (_) == 'J' ? 9				\ +   : (_) == 'K' ? 10				\ +   : (_) == 'L' ? 11				\ +   : (_) == 'M' ? 12				\ +   : (_) == 'N' ? 13				\ +   : (_) == 'O' ? 14				\ +   : (_) == 'P' ? 15				\ +   : (_) == 'Q' ? 16				\ +   : (_) == 'R' ? 17				\ +   : (_) == 'S' ? 18				\ +   : (_) == 'T' ? 19				\ +   : (_) == 'U' ? 20				\ +   : (_) == 'V' ? 21				\ +   : (_) == 'W' ? 22				\ +   : (_) == 'X' ? 23				\ +   : (_) == 'Y' ? 24				\ +   : (_) == 'Z' ? 25				\ +   : (_) == 'a' ? 26				\ +   : (_) == 'b' ? 27				\ +   : (_) == 'c' ? 28				\ +   : (_) == 'd' ? 29				\ +   : (_) == 'e' ? 30				\ +   : (_) == 'f' ? 31				\ +   : (_) == 'g' ? 32				\ +   : (_) == 'h' ? 33				\ +   : (_) == 'i' ? 34				\ +   : (_) == 'j' ? 35				\ +   : (_) == 'k' ? 36				\ +   : (_) == 'l' ? 37				\ +   : (_) == 'm' ? 38				\ +   : (_) == 'n' ? 39				\ +   : (_) == 'o' ? 40				\ +   : (_) == 'p' ? 41				\ +   : (_) == 'q' ? 42				\ +   : (_) == 'r' ? 43				\ +   : (_) == 's' ? 44				\ +   : (_) == 't' ? 45				\ +   : (_) == 'u' ? 46				\ +   : (_) == 'v' ? 47				\ +   : (_) == 'w' ? 48				\ +   : (_) == 'x' ? 49				\ +   : (_) == 'y' ? 50				\ +   : (_) == 'z' ? 51				\ +   : (_) == '0' ? 52				\ +   : (_) == '1' ? 53				\ +   : (_) == '2' ? 54				\ +   : (_) == '3' ? 55				\ +   : (_) == '4' ? 56				\ +   : (_) == '5' ? 57				\ +   : (_) == '6' ? 58				\ +   : (_) == '7' ? 59				\ +   : (_) == '8' ? 60				\ +   : (_) == '9' ? 61				\ +   : (_) == '+' ? 62				\ +   : (_) == '/' ? 63				\ +   : -1) + +static const signed char b64[0x100] = { +  B64 (0), B64 (1), B64 (2), B64 (3), +  B64 (4), B64 (5), B64 (6), B64 (7), +  B64 (8), B64 (9), B64 (10), B64 (11), +  B64 (12), B64 (13), B64 (14), B64 (15), +  B64 (16), B64 (17), B64 (18), B64 (19), +  B64 (20), B64 (21), B64 (22), B64 (23), +  B64 (24), B64 (25), B64 (26), B64 (27), +  B64 (28), B64 (29), B64 (30), B64 (31), +  B64 (32), B64 (33), B64 (34), B64 (35), +  B64 (36), B64 (37), B64 (38), B64 (39), +  B64 (40), B64 (41), B64 (42), B64 (43), +  B64 (44), B64 (45), B64 (46), B64 (47), +  B64 (48), B64 (49), B64 (50), B64 (51), +  B64 (52), B64 (53), B64 (54), B64 (55), +  B64 (56), B64 (57), B64 (58), B64 (59), +  B64 (60), B64 (61), B64 (62), B64 (63), +  B64 (64), B64 (65), B64 (66), B64 (67), +  B64 (68), B64 (69), B64 (70), B64 (71), +  B64 (72), B64 (73), B64 (74), B64 (75), +  B64 (76), B64 (77), B64 (78), B64 (79), +  B64 (80), B64 (81), B64 (82), B64 (83), +  B64 (84), B64 (85), B64 (86), B64 (87), +  B64 (88), B64 (89), B64 (90), B64 (91), +  B64 (92), B64 (93), B64 (94), B64 (95), +  B64 (96), B64 (97), B64 (98), B64 (99), +  B64 (100), B64 (101), B64 (102), B64 (103), +  B64 (104), B64 (105), B64 (106), B64 (107), +  B64 (108), B64 (109), B64 (110), B64 (111), +  B64 (112), B64 (113), B64 (114), B64 (115), +  B64 (116), B64 (117), B64 (118), B64 (119), +  B64 (120), B64 (121), B64 (122), B64 (123), +  B64 (124), B64 (125), B64 (126), B64 (127), +  B64 (128), B64 (129), B64 (130), B64 (131), +  B64 (132), B64 (133), B64 (134), B64 (135), +  B64 (136), B64 (137), B64 (138), B64 (139), +  B64 (140), B64 (141), B64 (142), B64 (143), +  B64 (144), B64 (145), B64 (146), B64 (147), +  B64 (148), B64 (149), B64 (150), B64 (151), +  B64 (152), B64 (153), B64 (154), B64 (155), +  B64 (156), B64 (157), B64 (158), B64 (159), +  B64 (160), B64 (161), B64 (162), B64 (163), +  B64 (164), B64 (165), B64 (166), B64 (167), +  B64 (168), B64 (169), B64 (170), B64 (171), +  B64 (172), B64 (173), B64 (174), B64 (175), +  B64 (176), B64 (177), B64 (178), B64 (179), +  B64 (180), B64 (181), B64 (182), B64 (183), +  B64 (184), B64 (185), B64 (186), B64 (187), +  B64 (188), B64 (189), B64 (190), B64 (191), +  B64 (192), B64 (193), B64 (194), B64 (195), +  B64 (196), B64 (197), B64 (198), B64 (199), +  B64 (200), B64 (201), B64 (202), B64 (203), +  B64 (204), B64 (205), B64 (206), B64 (207), +  B64 (208), B64 (209), B64 (210), B64 (211), +  B64 (212), B64 (213), B64 (214), B64 (215), +  B64 (216), B64 (217), B64 (218), B64 (219), +  B64 (220), B64 (221), B64 (222), B64 (223), +  B64 (224), B64 (225), B64 (226), B64 (227), +  B64 (228), B64 (229), B64 (230), B64 (231), +  B64 (232), B64 (233), B64 (234), B64 (235), +  B64 (236), B64 (237), B64 (238), B64 (239), +  B64 (240), B64 (241), B64 (242), B64 (243), +  B64 (244), B64 (245), B64 (246), B64 (247), +  B64 (248), B64 (249), B64 (250), B64 (251), +  B64 (252), B64 (253), B64 (254), B64 (255) +}; + +#if UCHAR_MAX == 255 +# define uchar_in_range(c) true +#else +# define uchar_in_range(c) ((c) <= 255) +#endif + +/* Return true if CH is a character from the Base64 alphabet, and +   false otherwise.  Note that '=' is padding and not considered to be +   part of the alphabet.  */ +bool +isbase64 (char ch) +{ +  return uchar_in_range (to_uchar (ch)) && 0 <= b64[to_uchar (ch)]; +} + +/* Decode base64 encoded input array IN of length INLEN to output +   array OUT that can hold *OUTLEN bytes.  Return true if decoding was +   successful, i.e. if the input was valid base64 data, false +   otherwise.  If *OUTLEN is too small, as many bytes as possible will +   be written to OUT.  On return, *OUTLEN holds the length of decoded +   bytes in OUT.  Note that as soon as any non-alphabet characters are +   encountered, decoding is stopped and false is returned.  This means +   that, when applicable, you must remove any line terminators that is +   part of the data stream before calling this function.  */ +bool +base64_decode (const char *in, size_t inlen, +	       char *out, size_t *outlen) +{ +  size_t outleft = *outlen; + +  while (inlen >= 2) +    { +      if (!isbase64 (in[0]) || !isbase64 (in[1])) +	break; + +      if (outleft) +	{ +	  *out++ = ((b64[to_uchar (in[0])] << 2) +		    | (b64[to_uchar (in[1])] >> 4)); +	  outleft--; +	} + +      if (inlen == 2) +	break; + +      if (in[2] == '=') +	{ +	  if (inlen != 4) +	    break; + +	  if (in[3] != '=') +	    break; + +	} +      else +	{ +	  if (!isbase64 (in[2])) +	    break; + +	  if (outleft) +	    { +	      *out++ = (((b64[to_uchar (in[1])] << 4) & 0xf0) +			| (b64[to_uchar (in[2])] >> 2)); +	      outleft--; +	    } + +	  if (inlen == 3) +	    break; + +	  if (in[3] == '=') +	    { +	      if (inlen != 4) +		break; +	    } +	  else +	    { +	      if (!isbase64 (in[3])) +		break; + +	      if (outleft) +		{ +		  *out++ = (((b64[to_uchar (in[2])] << 6) & 0xc0) +			    | b64[to_uchar (in[3])]); +		  outleft--; +		} +	    } +	} + +      in += 4; +      inlen -= 4; +    } + +  *outlen -= outleft; + +  if (inlen != 0) +    return false; + +  return true; +} + +/* Allocate an output buffer in *OUT, and decode the base64 encoded +   data stored in IN of size INLEN to the *OUT buffer.  On return, the +   size of the decoded data is stored in *OUTLEN.  OUTLEN may be NULL, +   if the caller is not interested in the decoded length.  *OUT may be +   NULL to indicate an out of memory error, in which case *OUTLEN +   contains the size of the memory block needed.  The function returns +   true on successful decoding and memory allocation errors.  (Use the +   *OUT and *OUTLEN parameters to differentiate between successful +   decoding and memory error.)  The function returns false if the +   input was invalid, in which case *OUT is NULL and *OUTLEN is +   undefined. */ +bool +base64_decode_alloc (const char *in, size_t inlen, char **out, +		     size_t *outlen) +{ +  /* This may allocate a few bytes too much, depending on input, +     but it's not worth the extra CPU time to compute the exact amount. +     The exact amount is 3 * inlen / 4, minus 1 if the input ends +     with "=" and minus another 1 if the input ends with "==". +     Dividing before multiplying avoids the possibility of overflow.  */ +  size_t needlen = 3 * (inlen / 4) + 2; + +  *out = malloc (needlen); +  if (!*out) +    return true; + +  if (!base64_decode (in, inlen, *out, &needlen)) +    { +      free (*out); +      *out = NULL; +      return false; +    } + +  if (outlen) +    *outlen = needlen; + +  return true; +} diff --git a/src/base64.h b/src/base64.h new file mode 100644 index 0000000..0e1f5c5 --- /dev/null +++ b/src/base64.h @@ -0,0 +1,45 @@ +/* base64.h -- Encode binary data using printable characters. +   Copyright (C) 2004, 2005, 2006 Free Software Foundation, Inc. +   Written by Simon Josefsson. + +   This program is free software; you can redistribute it and/or modify +   it under the terms of the GNU General Public License as published by +   the Free Software Foundation; either version 2, or (at your option) +   any later version. + +   This program 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 General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program; if not, write to the Free Software Foundation, +   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */ + +#ifndef BASE64_H +# define BASE64_H + +/* Get size_t. */ +# include <stddef.h> + +/* Get bool. */ +# include <stdbool.h> + +/* This uses that the expression (n+(k-1))/k means the smallest +   integer >= n/k, i.e., the ceiling of n/k.  */ +# define BASE64_LENGTH(inlen) ((((inlen) + 2) / 3) * 4) + +extern bool isbase64 (char ch); + +extern void base64_encode (const char *in, size_t inlen, +			   char *out, size_t outlen); + +extern size_t base64_encode_alloc (const char *in, size_t inlen, char **out); + +extern bool base64_decode (const char *in, size_t inlen, +			   char *out, size_t *outlen); + +extern bool base64_decode_alloc (const char *in, size_t inlen, +				 char **out, size_t *outlen); + +#endif /* BASE64_H */ diff --git a/src/idevicerestore.c b/src/idevicerestore.c new file mode 100644 index 0000000..51c74d0 --- /dev/null +++ b/src/idevicerestore.c @@ -0,0 +1,104 @@ +/* + * idevicerestore.c + * 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 + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <plist/plist.h> + +#include "ipsw.h" + +#define error(...) fprintf(stderr, __VA_ARGS__) +#define info(...) if(verbose >= 2) fprintf(stderr, __VA_ARGS__) +#define warn(...) if(verbose >= 1) fprintf(stderr, __VA_ARGS__) +#define debug(...) if(verbose >= 3) fprintf(stderr, __VA_ARGS__) + +static int verbose = 0; + +void usage(int argc, char* argv[]); + +int main(int argc, char* argv[]) { +	int opt = 0; +	char* ipsw = NULL; +	while ((opt = getopt(argc, argv, "vhi:")) > 0) { +		switch (opt) { +		case 'h': +			usage(argc, argv); +			break; + +		case 'v': +			verbose += 1; +			break; + +		case 'i': +			ipsw = optarg; +			break; + +		default: +			usage(argc, argv); +			break; +		} +	} + +	if(ipsw == NULL) { +		error("ERROR: Please supply an IPSW\n"); +		return -1; +	} + +	debug("Extracting BuildManifest.plist from IPSW\n"); +	ipsw_archive* archive = ipsw_open(ipsw); +	ipsw_file* buildmanifest = ipsw_extract_file(archive, "BuildManifest.plist"); +	if(buildmanifest == NULL) { +		error("ERRPR: Unable to extract BuildManifest.plist IPSW\n"); +		ipsw_close(archive); +		return -1; +	} + +	plist_t manifest = NULL; +	plist_from_xml(buildmanifest->data, buildmanifest->size, &manifest); +	ipsw_free_file(buildmanifest); +	ipsw_close(archive); + +	debug("Creating TSS request\n"); +	plist_t tss_request = tss_create_request(manifest); +	if(tss_request != NULL) { +		error("ERROR: Unable to create TSS request\n"); +		plist_free(manifest); +		return -1; +	} + +	plist_free(manifest); +	return 0; +} + +void usage(int argc, char* argv[]) { +	char *name = strrchr(argv[0], '/'); +	printf("Usage: %s [OPTIONS]\n", (name ? name + 1: argv[0])); +	printf("Restore firmware and filesystem to iPhone/iPod Touch.\n"); +	printf("  -d, \t\tenable communication debugging\n"); +	printf("  -r, \t\tput device into recovery mode\n"); +	printf("  -i, \t\ttarget filesystem to install onto device\n"); +	printf("  -u, \t\ttarget specific device by its 40-digit device UUID\n"); +	printf("  -h, \t\tprints usage information\n"); +	printf("\n"); +	exit(1); +} diff --git a/src/ipsw.c b/src/ipsw.c new file mode 100644 index 0000000..d33d95f --- /dev/null +++ b/src/ipsw.c @@ -0,0 +1,117 @@ +/* + * ipsw.h + * Utilities for extracting and manipulating IPSWs + * + * 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 + */ + +#include <zip.h> +#include <stdlib.h> +#include <string.h> +#include "ipsw.h" + +ipsw_archive* ipsw_open(const char* ipsw) { +	int err = 0; +	ipsw_archive* archive = (ipsw_archive*) malloc(sizeof(ipsw_archive)); +	if(archive == NULL) { +		error("ERROR: Out of memory\n"); +		return NULL; +	} + +	archive->zip = zip_open(ipsw, 0, &err); +	if(archive->zip == NULL) { +		error("ERROR: zip_open: %s: %d\n", ipsw, err); +		free(archive); +		return NULL; +	} + +	return archive; +} + +ipsw_file* ipsw_extract_file(ipsw_archive* archive, const char* filename) { +	if(archive == NULL || archive->zip == NULL) { +		error("ERROR: Invalid archive\n"); +		return NULL; +	} + +	int zindex = zip_name_locate(archive->zip, filename, 0); +	if(zindex < 0) { +		error("ERROR: zip_name_locate: %s\n", filename); +		return NULL; +	} + +	struct zip_stat zstat; +	zip_stat_init(&zstat); +	if(zip_stat_index(archive->zip, zindex, 0, &zstat) != 0) { +		error("ERROR: zip_stat_index: %s\n", filename); +		return NULL; +	} + +	struct zip_file* zfile = zip_fopen_index(archive->zip, zindex, 0); +	if(zfile == NULL) { +		error("ERROR: zip_fopen_index: %s\n", filename); +		return NULL; +	} + +	ipsw_file* file = (ipsw_file*) malloc(sizeof(ipsw_file)); +	if(file == NULL) { +		error("ERROR: Out of memory\n"); +		zip_fclose(zfile); +		return NULL; +	} + +	file->size = zstat.size; +	file->index = zstat.index; +	file->name = strdup(zstat.name); +	file->data = (unsigned char*) malloc(file->size); +	if(file->data == NULL) { +		error("ERROR: Out of memory\n"); +		ipsw_free_file(file); +		zip_fclose(zfile); +		return NULL; +	} + +	if(zip_fread(zfile, file->data, file->size) != file->size) { +		error("ERROR: zip_fread: %s\n", filename); +		ipsw_free_file(file); +		zip_fclose(zfile); +		return NULL; +	} + +	zip_fclose(zfile); +	return file; +} + +void ipsw_free_file(ipsw_file* file) { +	if(file != NULL) { +		if(file->name != NULL) { +			free(file->name); +		} +		if(file->data != NULL) { +			free(file->data); +		} +		free(file); +	} +} + +void ipsw_close(ipsw_archive* archive) { +	if(archive != NULL) { +		zip_unchange_all(archive->zip); +		zip_close(archive->zip); +		free(archive); +	} +} diff --git a/src/ipsw.h b/src/ipsw.h new file mode 100644 index 0000000..12a0985 --- /dev/null +++ b/src/ipsw.h @@ -0,0 +1,43 @@ +/* + * ipsw.c + * Definitions for IPSW utilities + * + * 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 IPSW_H +#define IPSW_H + +#include <zip.h> + +typedef struct { +	struct zip* zip; +} ipsw_archive; + +typedef struct { +	int index; +	const char* name; +	unsigned int size; +	unsigned char* data; +} ipsw_file; + +ipsw_archive* ipsw_open(const char* ipsw); +ipsw_file* ipsw_extract_file(ipsw_archive* archive, const char* filename); +void ipsw_free_file(ipsw_file* file); +void ipsw_close(ipsw_archive* archive); + +#endif diff --git a/src/tss.c b/src/tss.c new file mode 100644 index 0000000..c557604 --- /dev/null +++ b/src/tss.c @@ -0,0 +1,76 @@ +/* + * tss.c + * Functions for communicating with Apple's TSS server + * + * 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 + */ + +#include <stdio.h> +#include <stdlib.h> +#include <plist/plist.h> + +plist_t tss_create_request(plist_t buildmanifest) { +	plist_t build_identities_array = plist_dict_get_item(buildmanifest, "BuildIdentities"); +	if(!build_identities_array || plist_get_node_type(build_identities_array) != PLIST_ARRAY) { +		error("ERROR: Unable to find BuildIdentities array\n"); +		return NULL; +	} + +	plist_t restore_identity_dict = plist_array_get_item(build_identities_array, 0); +	if(!restore_identity_dict || plist_get_node_type(restore_identity_dict) != PLIST_DICT) { +		error("ERROR: Unable to find restore identity\n"); +		return NULL; +	} + +	plist_t unique_build_node = plist_dict_get_item(restore_identity_dict, "UniqueBuildID"); +	if(!unique_build_node || plist_get_node_type(unique_build_node) != PLIST_DATA) { +		error("ERROR: Unable to find UniqueBuildID node\n"); +		return NULL; +	} + +	int chip_id = 0; +	char* chip_id_string = NULL; +	plist_t chip_id_node = plist_dict_get_item(restore_identity_dict, "ApChipID"); +	if(!chip_id_node || plist_get_node_type(chip_id_node) != PLIST_STRING) { +		error("ERROR: Unable to find ApChipID node\n"); +		return NULL; +	} +	plist_get_string_val(chip_id_node, &chip_id_string); +    sscanf(chip_id_string, "%x", &chip_id); + +    int board_id = 0; +    char* board_id_string = NULL; +    plist_t board_id_node =  plist_dict_get_item(restore_identity_dict, "ApBoardID"); +    if(!board_id_node || plist_get_node_type(board_id_node) != PLIST_STRING) { +    	error("ERROR: Unable to find ApBoardID node\n"); +    	return NULL; +    } +    plist_get_string_val(board_id_node, &board_id_string); +    sscanf(board_id_string, "%x", &board_id); + +    int security_domain = 0; +    char* security_domain_string = NULL; +    plist_t security_domain_node = plist_dict_get_item(restore_identity_dict, "ApSecurityDomain"); +    if(!security_domain_node || plist_get_node_type(security_domain_node) != PLIST_STRING) { +    	error("ERROR: Unable to find ApSecurityDomain node\n"); +    	return NULL; +    } +    plist_get_string_val(security_domain_node, &security_domain_string); +    sscanf(security_domain_string, "%x", &security_domain); + +	return NULL; +} diff --git a/src/tss.h b/src/tss.h new file mode 100644 index 0000000..b14c90b --- /dev/null +++ b/src/tss.h @@ -0,0 +1,29 @@ +/* + * ipsw.c + * Definitions for communicating with Apple's TSS server. + * + * 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 TSS_H +#define TSS_H + +#include <plist/plist.h> + +plist_t tss_create_request(plist_t buildmanifest); + +#endif | 
