summaryrefslogtreecommitdiffstats
path: root/src/tss.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tss.c')
-rw-r--r--src/tss.c125
1 files changed, 113 insertions, 12 deletions
diff --git a/src/tss.c b/src/tss.c
index a9e9456..6696b60 100644
--- a/src/tss.c
+++ b/src/tss.c
@@ -125,11 +125,13 @@ plist_t tss_create_request(plist_t build_identity, uint64_t ecid) {
free(key);
}
- int sz = 0;
- char* xml = NULL;
- plist_to_xml(tss_request, &xml, &sz);
- debug("%s", xml);
- free(xml);
+ if (idevicerestore_debug) {
+ int sz = 0;
+ char* xml = NULL;
+ plist_to_xml(tss_request, &xml, &sz);
+ debug("%s", xml);
+ free(xml);
+ }
return tss_request;
}
@@ -184,7 +186,6 @@ plist_t tss_send_request(plist_t tss_request) {
curl_global_cleanup();
if (strstr(response->content, "MESSAGE=SUCCESS") == NULL) {
- error("ERROR: Unable to get signature from this firmware\n");
free(response->content);
free(response);
return NULL;
@@ -205,15 +206,115 @@ plist_t tss_send_request(plist_t tss_request) {
free(response->content);
free(response);
- int sz = 0;
- char* xml = NULL;
- plist_to_xml(tss_response, &xml, &sz);
- debug("%s", xml);
- free(xml);
+ if (idevicerestore_debug) {
+ int sz = 0;
+ char* xml = NULL;
+ plist_to_xml(tss_response, &xml, &sz);
+ debug("%s", xml);
+ free(xml);
+ }
return tss_response;
}
-void tss_stitch_img3(img3_file* file, plist_t signature) {
+int tss_get_entry_path(plist_t tss, const char* entry, char** path) {
+ char* path_string = NULL;
+ plist_t path_node = NULL;
+ plist_t entry_node = NULL;
+
+ *path = NULL;
+
+ entry_node = plist_dict_get_item(tss, entry);
+ if (!entry_node || plist_get_node_type(entry_node) != PLIST_DICT) {
+ error("ERROR: Unable to find %s entry in TSS response\n", entry);
+ return -1;
+ }
+
+ path_node = plist_dict_get_item(entry_node, "Path");
+ if (!path_node || plist_get_node_type(path_node) != PLIST_STRING) {
+ error("ERROR: Unable to find %s path in entry\n", path_string);
+ return -1;
+ }
+ plist_get_string_val(path_node, &path_string);
+
+ *path = path_string;
+ return 0;
+}
+
+int tss_get_blob_by_path(plist_t tss, const char* path, char** blob) {
+ int i = 0;
+ uint32_t tss_size = 0;
+ uint64_t blob_size = 0;
+ char* entry_key = NULL;
+ char* blob_data = NULL;
+ char* entry_path = NULL;
+ plist_t tss_entry = NULL;
+ plist_t blob_node = NULL;
+ plist_t path_node = NULL;
+ plist_dict_iter iter = NULL;
+
+ *blob = NULL;
+
+ plist_dict_new_iter(tss, &iter);
+ tss_size = plist_dict_get_size(tss);
+ for (i = 0; i < tss_size; i++) {
+ plist_dict_next_item(tss, iter, &entry_key, &tss_entry);
+ if (entry_key == NULL)
+ break;
+
+ if (!tss_entry || plist_get_node_type(tss_entry) != PLIST_DICT) {
+ continue;
+ }
+
+ path_node = plist_dict_get_item(tss_entry, "Path");
+ if (!path_node || plist_get_node_type(path_node) != PLIST_STRING) {
+ error("ERROR: Unable to find TSS path node in entry %s\n", entry_key);
+ return -1;
+ }
+
+ plist_get_string_val(path_node, &entry_path);
+ if (strcmp(path, entry_path) == 0) {
+ blob_node = plist_dict_get_item(tss_entry, "Blob");
+ if (!blob_node || plist_get_node_type(blob_node) != PLIST_DATA) {
+ error("ERROR: Unable to find TSS blob node in entry %s\n", entry_key);
+ return -1;
+ }
+ plist_get_data_val(blob_node, &blob_data, &blob_size);
+ break;
+ }
+
+ free(entry_key);
+ }
+
+ if (blob_data == NULL || blob_size <= 0) {
+ return -1;
+ }
+
+ *blob = blob_data;
+ return 0;
+}
+
+int tss_get_blob_by_name(plist_t tss, const char* entry, char** blob) {
+ uint64_t blob_size = 0;
+ char* blob_data = NULL;
+ plist_t blob_node = NULL;
+ plist_t tss_entry = NULL;
+
+ *blob = NULL;
+
+ tss_entry = plist_dict_get_item(tss, entry);
+ if (!tss_entry || plist_get_node_type(tss_entry) != PLIST_DICT) {
+ error("ERROR: Unable to find %s entry in TSS response\n", entry);
+ return -1;
+ }
+
+ blob_node = plist_dict_get_item(tss_entry, "Blob");
+ if (!blob_node || plist_get_node_type(blob_node) != PLIST_DATA) {
+ error("ERROR: Unable to find blob in %s entry\n", entry);
+ return -1;
+ }
+ plist_get_data_val(blob_node, &blob_data, &blob_size);
+ *blob = blob_data;
+ return 0;
}