summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/libirecovery.c169
1 files changed, 57 insertions, 112 deletions
diff --git a/src/libirecovery.c b/src/libirecovery.c
index a85cd97..e5369ce 100644
--- a/src/libirecovery.c
+++ b/src/libirecovery.c
@@ -1174,8 +1174,6 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid)
1174 } 1174 }
1175 1175
1176 irecv_load_device_info_from_iboot_string(_client, serial_str); 1176 irecv_load_device_info_from_iboot_string(_client, serial_str);
1177 irecv_copy_nonce_with_tag(_client, "NONC", &_client->device_info.ap_nonce, &_client->device_info.ap_nonce_size);
1178 irecv_copy_nonce_with_tag(_client, "SNON", &_client->device_info.sep_nonce, &_client->device_info.sep_nonce_size);
1179 1177
1180 if (ecid != 0) { 1178 if (ecid != 0) {
1181 if (_client->device_info.ecid != ecid) { 1179 if (_client->device_info.ecid != ecid) {
@@ -1258,8 +1256,6 @@ irecv_error_t mobiledevice_connect(irecv_client_t* client, uint64_t ecid)
1258 } 1256 }
1259 1257
1260 irecv_load_device_info_from_iboot_string(_client, serial_str); 1258 irecv_load_device_info_from_iboot_string(_client, serial_str);
1261 irecv_copy_nonce_with_tag(_client, "NONC", &_client->device_info.ap_nonce, &_client->device_info.ap_nonce_size);
1262 irecv_copy_nonce_with_tag(_client, "SNON", &_client->device_info.sep_nonce, &_client->device_info.sep_nonce_size);
1263 1259
1264 if (ecid != 0) { 1260 if (ecid != 0) {
1265 if (_client->device_info.ecid != ecid) { 1261 if (_client->device_info.ecid != ecid) {
@@ -1569,7 +1565,6 @@ int irecv_usb_bulk_transfer(irecv_client_t client,
1569static irecv_error_t iokit_usb_open_service(irecv_client_t *pclient, io_service_t service) 1565static irecv_error_t iokit_usb_open_service(irecv_client_t *pclient, io_service_t service)
1570{ 1566{
1571 IOReturn result; 1567 IOReturn result;
1572 irecv_error_t error;
1573 irecv_client_t client; 1568 irecv_client_t client;
1574 SInt32 score; 1569 SInt32 score;
1575 UInt16 mode; 1570 UInt16 mode;
@@ -1620,52 +1615,6 @@ static irecv_error_t iokit_usb_open_service(irecv_client_t *pclient, io_service_
1620 return IRECV_E_UNABLE_TO_CONNECT; 1615 return IRECV_E_UNABLE_TO_CONNECT;
1621 } 1616 }
1622 1617
1623 error = irecv_usb_set_configuration(client, 1);
1624 if (error != IRECV_E_SUCCESS) {
1625 free(client);
1626 return error;
1627 }
1628
1629 // DFU mode has no endpoints, so no need to open the interface
1630 if (client->mode == IRECV_K_DFU_MODE || client->mode == IRECV_K_WTF_MODE || client->mode == KIS_PRODUCT_ID) {
1631 error = irecv_usb_set_interface(client, 0, 0);
1632 if (error != IRECV_E_SUCCESS) {
1633 free(client);
1634 return error;
1635 }
1636 }
1637 else {
1638 error = irecv_usb_set_interface(client, 0, 0);
1639 if (error != IRECV_E_SUCCESS) {
1640 free(client);
1641 return error;
1642 }
1643 if (client->mode > IRECV_K_RECOVERY_MODE_2) {
1644 error = irecv_usb_set_interface(client, 1, 1);
1645 if (error != IRECV_E_SUCCESS) {
1646 free(client);
1647 return error;
1648 }
1649 }
1650 }
1651
1652 if (client->mode == KIS_PRODUCT_ID) {
1653 error = irecv_kis_init(client);
1654 if (error != IRECV_E_SUCCESS) {
1655 debug("irecv_kis_init failed, error %d\n", error);
1656 return error;
1657 }
1658
1659 error = irecv_kis_load_device_info(client);
1660 if (error != IRECV_E_SUCCESS) {
1661 debug("irecv_kis_load_device_info failed, error %d\n", error);
1662 return error;
1663 }
1664 } else {
1665 irecv_copy_nonce_with_tag(client, "NONC", &client->device_info.ap_nonce, &client->device_info.ap_nonce_size);
1666 irecv_copy_nonce_with_tag(client, "SNON", &client->device_info.sep_nonce, &client->device_info.sep_nonce_size);
1667 }
1668
1669 *pclient = client; 1618 *pclient = client;
1670 return IRECV_E_SUCCESS; 1619 return IRECV_E_SUCCESS;
1671} 1620}
@@ -1789,7 +1738,8 @@ static irecv_error_t iokit_open_with_ecid(irecv_client_t* pclient, uint64_t ecid
1789 1738
1790#ifndef WIN32 1739#ifndef WIN32
1791#ifndef HAVE_IOKIT 1740#ifndef HAVE_IOKIT
1792static irecv_error_t libusb_usb_open_handle_with_descriptor_and_ecid(irecv_client_t *pclient, struct libusb_device_handle *usb_handle, struct libusb_device_descriptor *usb_descriptor, uint64_t ecid){ 1741static irecv_error_t libusb_usb_open_handle_with_descriptor_and_ecid(irecv_client_t *pclient, struct libusb_device_handle *usb_handle, struct libusb_device_descriptor *usb_descriptor, uint64_t ecid)
1742{
1793 irecv_error_t ret = IRECV_E_UNABLE_TO_CONNECT; 1743 irecv_error_t ret = IRECV_E_UNABLE_TO_CONNECT;
1794 irecv_error_t error = IRECV_E_UNABLE_TO_CONNECT; 1744 irecv_error_t error = IRECV_E_UNABLE_TO_CONNECT;
1795 1745
@@ -1819,48 +1769,6 @@ static irecv_error_t libusb_usb_open_handle_with_descriptor_and_ecid(irecv_clien
1819 debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid); 1769 debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid);
1820 } 1770 }
1821 1771
1822 error = irecv_usb_set_configuration(client, 1);
1823 if (error != IRECV_E_SUCCESS) {
1824 irecv_close(client);
1825 return error;
1826 }
1827
1828 if ((client->mode != IRECV_K_DFU_MODE) && (client->mode != IRECV_K_WTF_MODE) && (client->mode != KIS_PRODUCT_ID)) {
1829 error = irecv_usb_set_interface(client, 0, 0);
1830 if (client->mode > IRECV_K_RECOVERY_MODE_2) {
1831 error = irecv_usb_set_interface(client, 1, 1);
1832 }
1833 } else {
1834 error = irecv_usb_set_interface(client, 0, 0);
1835 }
1836
1837 if (error != IRECV_E_SUCCESS) {
1838 irecv_close(client);
1839 return error;
1840 }
1841
1842 if (client->mode == KIS_PRODUCT_ID) {
1843 error = irecv_kis_init(client);
1844 if (error != IRECV_E_SUCCESS) {
1845 debug("irecv_kis_init failed, error %d\n", error);
1846 return error;
1847 }
1848
1849 error = irecv_kis_load_device_info(client);
1850 if (error != IRECV_E_SUCCESS) {
1851 debug("irecv_kis_load_device_info failed, error %d\n", error);
1852 return error;
1853 }
1854 if (ecid != 0 && client->device_info.ecid != ecid) {
1855 irecv_close(client);
1856 return IRECV_E_NO_DEVICE; //wrong device
1857 }
1858 debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid);
1859 } else {
1860 irecv_copy_nonce_with_tag(client, "NONC", &client->device_info.ap_nonce, &client->device_info.ap_nonce_size);
1861 irecv_copy_nonce_with_tag(client, "SNON", &client->device_info.sep_nonce, &client->device_info.sep_nonce_size);
1862 }
1863
1864 ret = IRECV_E_SUCCESS; 1772 ret = IRECV_E_SUCCESS;
1865 *pclient = client; 1773 *pclient = client;
1866 return ret; 1774 return ret;
@@ -1936,36 +1844,73 @@ irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, uint64_t ecid)
1936#ifdef USE_DUMMY 1844#ifdef USE_DUMMY
1937 return IRECV_E_UNSUPPORTED; 1845 return IRECV_E_UNSUPPORTED;
1938#else 1846#else
1939 int ret = IRECV_E_UNABLE_TO_CONNECT; 1847 irecv_error_t error = IRECV_E_UNABLE_TO_CONNECT;
1940 1848
1941 if (libirecovery_debug) { 1849 if (libirecovery_debug) {
1942 irecv_set_debug_level(libirecovery_debug); 1850 irecv_set_debug_level(libirecovery_debug);
1943 } 1851 }
1944#ifndef WIN32 1852#ifndef WIN32
1945#ifdef HAVE_IOKIT 1853#ifdef HAVE_IOKIT
1946 ret = iokit_open_with_ecid(pclient, ecid); 1854 error = iokit_open_with_ecid(pclient, ecid);
1947#else 1855#else
1948 ret = libusb_open_with_ecid(pclient, ecid); 1856 error = libusb_open_with_ecid(pclient, ecid);
1949#endif 1857#endif
1950#else 1858#else
1951 ret = mobiledevice_connect(pclient, ecid); 1859 error = mobiledevice_connect(pclient, ecid);
1952 if (ret == IRECV_E_SUCCESS) { 1860#endif
1953 irecv_client_t client = *pclient; 1861 irecv_client_t client = *pclient;
1954 int error = IRECV_E_SUCCESS; 1862 if (error != IRECV_E_SUCCESS) {
1955 if ((client->mode != IRECV_K_DFU_MODE) && (client->mode != IRECV_K_WTF_MODE)) { 1863 irecv_close(client);
1956 error = irecv_usb_set_interface(client, 0, 0); 1864 return error;
1957 if (client->mode > IRECV_K_RECOVERY_MODE_2) { 1865 }
1958 error = irecv_usb_set_interface(client, 1, 1); 1866
1959 } 1867 error = irecv_usb_set_configuration(client, 1);
1960 } else { 1868 if (error != IRECV_E_SUCCESS) {
1961 error = irecv_usb_set_interface(client, 0, 0); 1869 debug("Failed to set configuration, error %d\n", error);
1870 irecv_close(client);
1871 return error;
1872 }
1873
1874 if (client->mode == IRECV_K_DFU_MODE || client->mode == IRECV_K_WTF_MODE || client->mode == KIS_PRODUCT_ID) {
1875 error = irecv_usb_set_interface(client, 0, 0);
1876 } else {
1877 error = irecv_usb_set_interface(client, 0, 0);
1878 if (error == IRECV_E_SUCCESS && client->mode > IRECV_K_RECOVERY_MODE_2) {
1879 error = irecv_usb_set_interface(client, 1, 1);
1962 } 1880 }
1881 }
1882
1883 if (error != IRECV_E_SUCCESS) {
1884 debug("Failed to set interface, error %d\n", error);
1885 irecv_close(client);
1886 return error;
1887 }
1888
1889 if (client->mode == KIS_PRODUCT_ID) {
1890 error = irecv_kis_init(client);
1963 if (error != IRECV_E_SUCCESS) { 1891 if (error != IRECV_E_SUCCESS) {
1964 debug("WARNING: set interface failed, error %d\n", error); 1892 debug("irecv_kis_init failed, error %d\n", error);
1893 irecv_close(client);
1894 return error;
1965 } 1895 }
1896
1897 error = irecv_kis_load_device_info(client);
1898 if (error != IRECV_E_SUCCESS) {
1899 debug("irecv_kis_load_device_info failed, error %d\n", error);
1900 irecv_close(client);
1901 return error;
1902 }
1903 if (ecid != 0 && client->device_info.ecid != ecid) {
1904 irecv_close(client);
1905 return IRECV_E_NO_DEVICE; //wrong device
1906 }
1907 debug("found device with ECID %016" PRIx64 "\n", (uint64_t)ecid);
1908 } else {
1909 irecv_copy_nonce_with_tag(client, "NONC", &client->device_info.ap_nonce, &client->device_info.ap_nonce_size);
1910 irecv_copy_nonce_with_tag(client, "SNON", &client->device_info.sep_nonce, &client->device_info.sep_nonce_size);
1966 } 1911 }
1967#endif 1912
1968 if (ret == IRECV_E_SUCCESS) { 1913 if (error == IRECV_E_SUCCESS) {
1969 if ((*pclient)->connected_callback != NULL) { 1914 if ((*pclient)->connected_callback != NULL) {
1970 irecv_event_t event; 1915 irecv_event_t event;
1971 event.size = 0; 1916 event.size = 0;
@@ -1975,7 +1920,7 @@ irecv_error_t irecv_open_with_ecid(irecv_client_t* pclient, uint64_t ecid)
1975 (*pclient)->connected_callback(*pclient, &event); 1920 (*pclient)->connected_callback(*pclient, &event);
1976 } 1921 }
1977 } 1922 }
1978 return ret; 1923 return error;
1979#endif 1924#endif
1980} 1925}
1981 1926