summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/libiphone/lockdown.h1
-rw-r--r--src/lockdown.c47
2 files changed, 41 insertions, 7 deletions
diff --git a/include/libiphone/lockdown.h b/include/libiphone/lockdown.h
index e6b75da..31ffeab 100644
--- a/include/libiphone/lockdown.h
+++ b/include/libiphone/lockdown.h
@@ -64,6 +64,7 @@ lockdownd_error_t lockdownd_stop_session(lockdownd_client_t client);
lockdownd_error_t lockdownd_send(lockdownd_client_t client, plist_t plist);
lockdownd_error_t lockdownd_recv(lockdownd_client_t client, plist_t *plist);
lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id);
+lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, char *host_id);
lockdownd_error_t lockdownd_get_device_uuid(lockdownd_client_t control, char **uuid);
lockdownd_error_t lockdownd_get_device_name(lockdownd_client_t client, char **device_name);
lockdownd_error_t lockdownd_enter_recovery(lockdownd_client_t client);
diff --git a/src/lockdown.c b/src/lockdown.c
index d717c01..fb5f8f5 100644
--- a/src/lockdown.c
+++ b/src/lockdown.c
@@ -698,17 +698,17 @@ lockdownd_error_t lockdownd_client_new(iphone_device_t device, lockdownd_client_
return ret;
}
-/** Generates the appropriate keys and pairs the device. It's part of the
- * lockdownd handshake.
+/** Function used internally by lockdownd_pair() and lockdownd_validate_pair()
*
* @param client The lockdown client to pair with.
* @param host_id The HostID to use for pairing. If NULL is passed, then
* the HostID of the current machine is used. A new HostID will be
* generated automatically when pairing is done for the first time.
+ * @param verb This is either "Pair" or "ValidatePair".
*
* @return an error code (LOCKDOWN_E_SUCCESS on success)
*/
-lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id)
+static lockdownd_error_t lockdownd_do_pair(lockdownd_client_t client, char *host_id, const char *verb)
{
lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR;
plist_t dict = NULL;
@@ -748,7 +748,7 @@ lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id)
plist_dict_insert_item(dict_record, "HostID", plist_new_string(host_id_loc));
plist_dict_insert_item(dict_record, "RootCertificate", plist_new_data((const char*)root_cert.data, root_cert.size));
- plist_dict_insert_item(dict, "Request", plist_new_string("Pair"));
+ plist_dict_insert_item(dict, "Request", plist_new_string(verb));
/* send to iPhone */
ret = lockdownd_send(client, dict);
@@ -768,7 +768,7 @@ lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id)
if (ret != LOCKDOWN_E_SUCCESS)
return ret;
- if (lockdown_check_result(dict, "Pair") != RESULT_SUCCESS) {
+ if (lockdown_check_result(dict, verb) != RESULT_SUCCESS) {
ret = LOCKDOWN_E_PAIRING_FAILED;
}
plist_free(dict);
@@ -776,15 +776,48 @@ lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id)
/* store public key in config if pairing succeeded */
if (ret == LOCKDOWN_E_SUCCESS) {
- log_dbg_msg(DBGMASK_LOCKDOWND, "%s: pair success\n", __func__);
+ log_dbg_msg(DBGMASK_LOCKDOWND, "%s: %s success\n", __func__, verb);
userpref_set_device_public_key(client->uuid, public_key);
} else {
- log_dbg_msg(DBGMASK_LOCKDOWND, "%s: pair failure\n", __func__);
+ log_dbg_msg(DBGMASK_LOCKDOWND, "%s: %s failure\n", __func__, verb);
}
free(public_key.data);
return ret;
}
+/**
+ * Pairs the device with the given HostID.
+ * It's part of the lockdownd handshake.
+ *
+ * @param client The lockdown client to pair with.
+ * @param host_id The HostID to use for pairing. If NULL is passed, then
+ * the HostID of the current machine is used. A new HostID will be
+ * generated automatically when pairing is done for the first time.
+ *
+ * @return an error code (LOCKDOWN_E_SUCCESS on success)
+ */
+lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *host_id)
+{
+ return lockdownd_do_pair(client, host_id, "Pair");
+}
+
+/**
+ * Pairs the device with the given HostID. The difference to lockdownd_pair()
+ * is that the specified host will become trusted host of the device.
+ * It's part of the lockdownd handshake.
+ *
+ * @param client The lockdown client to pair with.
+ * @param host_id The HostID to use for pairing. If NULL is passed, then
+ * the HostID of the current machine is used. A new HostID will be
+ * generated automatically when pairing is done for the first time.
+ *
+ * @return an error code (LOCKDOWN_E_SUCCESS on success)
+ */
+lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, char *host_id)
+{
+ return lockdownd_do_pair(client, host_id, "ValidatePair");
+}
+
/**
* Tells the device to immediately enter recovery mode.
*