blob: 774c116dd3678efdd7f7dadcbb8782b39d80c2b7 [file] [log] [blame]
/**
* @file libimobiledevice/mobileactivation.h
* @brief Handle device activation and deactivation.
* \internal
*
* Copyright (c) 2016-2017 Nikias Bassen, 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 IMOBILEACTIVATION_H
#define IMOBILEACTIVATION_H
#ifdef __cplusplus
extern "C" {
#endif
#include <libimobiledevice/libimobiledevice.h>
#include <libimobiledevice/lockdown.h>
/** Service identifier passed to lockdownd_start_service() to start the mobile activation service */
#define MOBILEACTIVATION_SERVICE_NAME "com.apple.mobileactivationd"
/** Error Codes */
typedef enum {
MOBILEACTIVATION_E_SUCCESS = 0,
MOBILEACTIVATION_E_INVALID_ARG = -1,
MOBILEACTIVATION_E_PLIST_ERROR = -2,
MOBILEACTIVATION_E_MUX_ERROR = -3,
MOBILEACTIVATION_E_UNKNOWN_REQUEST = -4,
MOBILEACTIVATION_E_REQUEST_FAILED = -5,
MOBILEACTIVATION_E_UNKNOWN_ERROR = -256
} mobileactivation_error_t;
typedef struct mobileactivation_client_private mobileactivation_client_private; /**< \private */
typedef mobileactivation_client_private *mobileactivation_client_t; /**< The client handle. */
/**
* Connects to the mobileactivation service on the specified device.
*
* @param device The device to connect to.
* @param service The service descriptor returned by lockdownd_start_service.
* @param client Reference that will point to a newly allocated
* mobileactivation_client_t upon successful return.
*
* @return MOBILEACTIVATION_E_SUCCESS on success,
* MOBILEACTIVATION_E_INVALID_ARG when one of the parameters is invalid,
* or MOBILEACTIVATION_E_MUX_ERROR when the connection failed.
*/
mobileactivation_error_t mobileactivation_client_new(idevice_t device, lockdownd_service_descriptor_t service, mobileactivation_client_t *client);
/**
* Starts a new mobileactivation service on the specified device and connects to it.
*
* @param device The device to connect to.
* @param client Pointer that will point to a newly allocated
* mobileactivation_client_t upon successful return. Must be freed using
* mobileactivation_client_free() after use.
* @param label The label to use for communication. Usually the program name.
* Pass NULL to disable sending the label in requests to lockdownd.
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_client_start_service(idevice_t device, mobileactivation_client_t* client, const char* label);
/**
* Disconnects a mobileactivation client from the device and frees up the
* mobileactivation client data.
*
* @param client The mobileactivation client to disconnect and free.
*
* @return MOBILEACTIVATION_E_SUCCESS on success,
* MOBILEACTIVATION_E_INVALID_ARG when one of client or client->parent
* is invalid, or MOBILEACTIVATION_E_UNKNOWN_ERROR when the was an
* error freeing the parent property_list_service client.
*/
mobileactivation_error_t mobileactivation_client_free(mobileactivation_client_t client);
/**
* Retrieves the device's activation state.
*
* @param client The mobileactivation client.
* @param state Pointer to a plist_t variable that will be set to the
* activation state reported by the mobileactivation service. The
* consumer is responsible for freeing the returned object using
* plist_free().
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_get_activation_state(mobileactivation_client_t client, plist_t *state);
/**
* Retrieves a session blob required for 'drmHandshake' via albert.apple.com.
*
* @param client The mobileactivation client
* @param blob Pointer to a plist_t variable that will be set to the
* session blob created by the mobielactivation service. The
* consumer is responsible for freeing the returned object using
* plist_free().
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_create_activation_session_info(mobileactivation_client_t client, plist_t *blob);
/**
* Retrieves the activation info required for device activation.
*
* @param client The mobileactivation client
* @param info Pointer to a plist_t variable that will be set to the
* activation info created by the mobileactivation service. The
* consumer is responsible for freeing the returned object using
* plist_free().
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_create_activation_info(mobileactivation_client_t client, plist_t *info);
/**
* Retrieves the activation info required for device activation in 'session'
* mode. This function expects a handshake result retrieved from
* https://albert.apple.com/deviceservies/drmHandshake with a blob
* provided by mobileactivation_create_activation_session_info().
*
* @param client The mobileactivation client
* @param handshake_response The handshake response returned from drmHandshake
* @param info Pointer to a plist_t variable that will be set to the
* activation info created by the mobileactivation service. The
* consumer is responsible for freeing the returned object using
* plist_free().
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_create_activation_info_with_session(mobileactivation_client_t client, plist_t handshake_response, plist_t *info);
/**
* Activates the device with the given activation record.
* The activation record plist dictionary must be obtained using the
* activation protocol requesting from Apple's https webservice.
*
* @param client The mobileactivation client
* @param activation_record The activation record plist dictionary
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_activate(mobileactivation_client_t client, plist_t activation_record);
/**
* Activates the device with the given activation record in 'session' mode.
* The activation record plist must be obtained using the
* activation protocol requesting from Apple's https webservice.
*
* @param client The mobileactivation client
* @param activation_record The activation record in plist format
* @param headers A plist dictionary with the activation response headers
* as returned from Apple's https webservice with the activation record
*
* @return MOBILEACTIVATION_E_SUCCESS on success, or an MOBILEACTIVATION_E_*
* error code otherwise.
*/
mobileactivation_error_t mobileactivation_activate_with_session(mobileactivation_client_t client, plist_t activation_record, plist_t headers);
/**
* Deactivates the device.
*
* @param client The mobileactivation client
*/
mobileactivation_error_t mobileactivation_deactivate(mobileactivation_client_t client);
#ifdef __cplusplus
}
#endif
#endif