diff options
| author | 2017-07-03 03:09:35 +0200 | |
|---|---|---|
| committer | 2017-07-03 03:09:35 +0200 | |
| commit | 0dbe76b4e75eef5d0e033aac99409fb6df36c512 (patch) | |
| tree | 8e1be338944418ac92470610088a5d7f3bacd523 /src | |
| parent | 5250024b53b799a427a486ae133ecb927f5c555e (diff) | |
| download | libimobiledevice-0dbe76b4e75eef5d0e033aac99409fb6df36c512.tar.gz libimobiledevice-0dbe76b4e75eef5d0e033aac99409fb6df36c512.tar.bz2 | |
mobileactivation: Add new functions required for drmHandshake / session mode device activation
Diffstat (limited to 'src')
| -rw-r--r-- | src/mobileactivation.c | 75 |
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 | ||
| 92 | static 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 | |||
| 92 | static mobileactivation_error_t mobileactivation_check_result(plist_t dict, const char *command) | 103 | static 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 | ||
| 174 | LIBIMOBILEDEVICE_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 | |||
| 163 | LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_create_activation_info(mobileactivation_client_t client, plist_t *info) | 194 | LIBIMOBILEDEVICE_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 | |||
| 216 | LIBIMOBILEDEVICE_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 | ||
| 253 | LIBIMOBILEDEVICE_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 | |||
| 198 | LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_deactivate(mobileactivation_client_t client) | 269 | LIBIMOBILEDEVICE_API mobileactivation_error_t mobileactivation_deactivate(mobileactivation_client_t client) |
| 199 | { | 270 | { |
| 200 | if (!client) | 271 | if (!client) |
