summaryrefslogtreecommitdiffstats
path: root/src/mobileactivation.c
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2017-07-03 03:09:35 +0200
committerGravatar Nikias Bassen2017-07-03 03:09:35 +0200
commit0dbe76b4e75eef5d0e033aac99409fb6df36c512 (patch)
tree8e1be338944418ac92470610088a5d7f3bacd523 /src/mobileactivation.c
parent5250024b53b799a427a486ae133ecb927f5c555e (diff)
downloadlibimobiledevice-0dbe76b4e75eef5d0e033aac99409fb6df36c512.tar.gz
libimobiledevice-0dbe76b4e75eef5d0e033aac99409fb6df36c512.tar.bz2
mobileactivation: Add new functions required for drmHandshake / session mode device activation
Diffstat (limited to 'src/mobileactivation.c')
-rw-r--r--src/mobileactivation.c75
1 files changed, 73 insertions, 2 deletions
diff --git a/src/mobileactivation.c b/src/mobileactivation.c
index f14eb73..7ae35bb 100644
--- a/src/mobileactivation.c
+++ b/src/mobileactivation.c
@@ -2,7 +2,7 @@
2 * mobileactivation.c 2 * mobileactivation.c
3 * com.apple.mobileactivationd service implementation. 3 * com.apple.mobileactivationd service implementation.
4 * 4 *
5 * Copyright (c) 2016 Nikias Bassen, All Rights Reserved. 5 * Copyright (c) 2016-2017 Nikias Bassen, All Rights Reserved.
6 * 6 *
7 * This library is free software; you can redistribute it and/or 7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public 8 * modify it under the terms of the GNU Lesser General Public
@@ -89,6 +89,17 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_client_free(mobil
89 return MOBILEACTIVATION_E_SUCCESS; 89 return MOBILEACTIVATION_E_SUCCESS;
90} 90}
91 91
92static plist_t plist_data_from_plist(plist_t plist)
93{
94 plist_t result = NULL;
95 char *xml = NULL;
96 uint32_t xml_len = 0;
97 plist_to_xml(plist, &xml, &xml_len);
98 result = plist_new_data(xml, xml_len);
99 free(xml);
100 return result;
101}
102
92static mobileactivation_error_t mobileactivation_check_result(plist_t dict, const char *command) 103static mobileactivation_error_t mobileactivation_check_result(plist_t dict, const char *command)
93{ 104{
94 mobileactivation_error_t ret = MOBILEACTIVATION_E_UNKNOWN_ERROR; 105 mobileactivation_error_t ret = MOBILEACTIVATION_E_UNKNOWN_ERROR;
@@ -104,8 +115,8 @@ static mobileactivation_error_t mobileactivation_check_result(plist_t dict, cons
104 char *errmsg = NULL; 115 char *errmsg = NULL;
105 plist_get_string_val(err_node, &errmsg); 116 plist_get_string_val(err_node, &errmsg);
106 debug_info("ERROR: %s: %s", command, errmsg); 117 debug_info("ERROR: %s: %s", command, errmsg);
107 free(errmsg);
108 ret = MOBILEACTIVATION_E_REQUEST_FAILED; 118 ret = MOBILEACTIVATION_E_REQUEST_FAILED;
119 free(errmsg);
109 } 120 }
110 return ret; 121 return ret;
111} 122}
@@ -160,6 +171,26 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_get_activation_st
160 return ret; 171 return ret;
161} 172}
162 173
174LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation_session_info(mobileactivation_client_t client, plist_t *blob)
175{
176 if (!client || !blob)
177 return MOBILEACTIVATION_E_INVALID_ARG;
178
179 plist_t result = NULL;
180 mobileactivation_error_t ret = mobileactivation_send_command(client, "CreateTunnel1SessionInfoRequest", NULL, &result);
181 if (ret == MOBILEACTIVATION_E_SUCCESS) {
182 plist_t node = plist_dict_get_item(result, "Value");
183 if (!node) {
184 debug_info("ERROR: CreateTunnel1SessionInfoRequest command returned success but has no value in reply");
185 ret = MOBILEACTIVATION_E_UNKNOWN_ERROR;
186 } else {
187 *blob = plist_copy(node);
188 }
189 }
190
191 return ret;
192}
193
163LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation_info(mobileactivation_client_t client, plist_t *info) 194LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation_info(mobileactivation_client_t client, plist_t *info)
164{ 195{
165 if (!client || !info) 196 if (!client || !info)
@@ -179,6 +210,30 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation
179 plist_free(result); 210 plist_free(result);
180 result = NULL; 211 result = NULL;
181 212
213 return ret;
214}
215
216LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation_info_with_session(mobileactivation_client_t client, plist_t handshake_response, plist_t *info)
217{
218 if (!client || !info)
219 return MOBILEACTIVATION_E_INVALID_ARG;
220
221 plist_t result = NULL;
222 plist_t data = plist_data_from_plist(handshake_response);
223 mobileactivation_error_t ret = mobileactivation_send_command(client, "CreateTunnel1ActivationInfoRequest", data, &result);
224 plist_free(data);
225 if (ret == MOBILEACTIVATION_E_SUCCESS) {
226 plist_t node = plist_dict_get_item(result, "Value");
227 if (!node) {
228 debug_info("ERROR: CreateTunnel1ActivationInfoRequest command returned success but has no value in reply");
229 ret = MOBILEACTIVATION_E_UNKNOWN_ERROR;
230 } else {
231 *info = plist_copy(node);
232 }
233 }
234 plist_free(result);
235 result = NULL;
236
182 return ret; 237 return ret;
183} 238}
184 239
@@ -195,6 +250,22 @@ LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate(mobileac
195 return ret; 250 return ret;
196} 251}
197 252
253LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record)
254{
255 if (!client || !activation_record)
256 return MOBILEACTIVATION_E_INVALID_ARG;
257
258 plist_t result = NULL;
259 plist_t data = plist_data_from_plist(activation_record);
260 mobileactivation_error_t ret = mobileactivation_send_command(client, "HandleActivationInfoWithSessionRequest", data, &result);
261 plist_free(data);
262 plist_free(result);
263 result = NULL;
264
265 return ret;
266}
267
268
198LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_deactivate(mobileactivation_client_t client) 269LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_deactivate(mobileactivation_client_t client)
199{ 270{
200 if (!client) 271 if (!client)