diff -Naur libiphone-0.9.5~/include/libiphone/lockdown.h libiphone-0.9.5/include/libiphone/lockdown.h --- libiphone-0.9.5~/include/libiphone/lockdown.h 2009-07-27 05:33:37.000000000 +0300 +++ libiphone-0.9.5/include/libiphone/lockdown.h 2009-12-01 02:34:05.000000000 +0200 @@ -64,6 +64,7 @@ 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 *uuid, char *host_id); +lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, char *uuid, 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 -Naur libiphone-0.9.5~/src/lockdown.c libiphone-0.9.5/src/lockdown.c --- libiphone-0.9.5~/src/lockdown.c 2009-11-19 22:07:42.000000000 +0200 +++ libiphone-0.9.5/src/lockdown.c 2009-12-01 15:58:48.000000000 +0200 @@ -692,7 +692,7 @@ * * @return an error code (LOCKDOWN_E_SUCCESS on success) */ -lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *uuid, char *host_id) +static lockdownd_error_t lockdownd_handshake(lockdownd_client_t client, char *uuid, char *u_host_id, const char *verb) { lockdownd_error_t ret = LOCKDOWN_E_UNKNOWN_ERROR; plist_t dict = NULL; @@ -703,6 +703,8 @@ gnutls_datum_t root_cert = { NULL, 0 }; gnutls_datum_t public_key = { NULL, 0 }; + char *host_id = u_host_id; + ret = lockdownd_get_device_public_key(client, &public_key); if (ret != LOCKDOWN_E_SUCCESS) { log_debug_msg("%s: device refused to send public key.\n", __func__); @@ -716,6 +718,10 @@ return ret; } + if (!u_host_id) { + userpref_get_host_id(&host_id); + } + /* Setup Pair request plist */ dict = plist_new_dict(); dict_record = plist_new_dict(); @@ -726,13 +732,17 @@ plist_dict_insert_item(dict_record, "HostID", plist_new_string(host_id)); 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); plist_free(dict); dict = NULL; + if (!u_host_id) { + free(host_id); + } + if (ret != LOCKDOWN_E_SUCCESS) return ret; @@ -742,8 +752,8 @@ if (ret != LOCKDOWN_E_SUCCESS) return ret; - if (lockdown_check_result(dict, "Pair") == RESULT_SUCCESS) { - ret = LOCKDOWN_E_SUCCESS; + if (lockdown_check_result(dict, verb) != RESULT_SUCCESS) { + ret = LOCKDOWN_E_PAIRING_FAILED; } plist_free(dict); dict = NULL; @@ -754,12 +764,21 @@ userpref_set_device_public_key(uuid, public_key); } else { log_dbg_msg(DBGMASK_LOCKDOWND, "%s: pair failure\n", __func__); - ret = LOCKDOWN_E_PAIRING_FAILED; } free(public_key.data); return ret; } +lockdownd_error_t lockdownd_pair(lockdownd_client_t client, char *uuid, char *host_id) +{ + return lockdownd_handshake(client, uuid, host_id, "Pair"); +} + +lockdownd_error_t lockdownd_validate_pair(lockdownd_client_t client, char *uuid, char *host_id) +{ + return lockdownd_handshake(client, uuid, host_id, "ValidatePair"); +} + /** * Tells the device to immediately enter recovery mode. *