summaryrefslogtreecommitdiffstats
path: root/common
diff options
context:
space:
mode:
authorGravatar Nikias Bassen2013-09-06 05:52:49 +0200
committerGravatar Martin Szulecki2013-09-17 11:43:34 +0200
commite2f5717487f6950ff6253ccce6a967b0ad9ebbea (patch)
treec62b8477bcb0d20a7b8ac4f4285686bcd31a5484 /common
parentf89e375e1334996591322cf6a454f9e121e423d2 (diff)
downloadlibimobiledevice-e2f5717487f6950ff6253ccce6a967b0ad9ebbea.tar.gz
libimobiledevice-e2f5717487f6950ff6253ccce6a967b0ad9ebbea.tar.bz2
Make sure to re-use the DeviceCertificate instead of generating a new one every time
This prevented iTunes from using a pairing made by libimobiledevice giving an error that the device sent invalid data.
Diffstat (limited to 'common')
-rw-r--r--common/userpref.c15
-rw-r--r--common/userpref.h2
2 files changed, 15 insertions, 2 deletions
diff --git a/common/userpref.c b/common/userpref.c
index 571b660..55ab9c4 100644
--- a/common/userpref.c
+++ b/common/userpref.c
@@ -1115,7 +1115,7 @@ userpref_error_t userpref_device_record_get_keys_and_certs(const char *udid, gnu
*
* @return 1 if the certificates were successfully retrieved, 0 otherwise
*/
-userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_data_t *pem_root_cert, key_data_t *pem_host_cert)
+userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_data_t *pem_root_cert, key_data_t *pem_host_cert, key_data_t *pem_device_cert)
{
if (!udid || !pem_root_cert || !pem_host_cert)
return USERPREF_E_INVALID_ARG;
@@ -1124,6 +1124,7 @@ userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_d
uint64_t length = 0;
plist_t root_cert = NULL;
plist_t host_cert = NULL;
+ plist_t dev_cert = NULL;
if (userpref_device_record_get_value(udid, USERPREF_HOST_CERTIFICATE_KEY, &host_cert) &&
userpref_device_record_get_value(udid, USERPREF_ROOT_CERTIFICATE_KEY, &root_cert)) {
if (host_cert && plist_get_node_type(host_cert) == PLIST_DATA) {
@@ -1143,6 +1144,18 @@ userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_d
buffer = NULL;
}
+ if (pem_device_cert) {
+ userpref_device_record_get_value(udid, USERPREF_DEVICE_CERTIFICATE_KEY, &dev_cert);
+ if (dev_cert && plist_get_node_type(dev_cert) == PLIST_DATA) {
+ plist_get_data_val(dev_cert, &buffer, &length);
+ pem_device_cert->data = (unsigned char*)malloc(length);
+ memcpy(pem_device_cert->data, buffer, length);
+ pem_device_cert->size = length;
+ free(buffer);
+ buffer = NULL;
+ }
+ }
+
return USERPREF_E_SUCCESS;
} else {
if (pem_root_cert->data) {
diff --git a/common/userpref.h b/common/userpref.h
index 8e38136..da9d454 100644
--- a/common/userpref.h
+++ b/common/userpref.h
@@ -75,7 +75,7 @@ LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_device_record_get_keys_and_c
LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_device_record_get_keys_and_certs(const char *udid, gnutls_x509_privkey_t root_privkey, gnutls_x509_crt_t root_crt, gnutls_x509_privkey_t host_privkey, gnutls_x509_crt_t host_crt);
#endif
LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_device_record_set_keys_and_certs(const char *udid, key_data_t * root_key, key_data_t * root_cert, key_data_t * host_key, key_data_t * host_cert);
-LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_data_t *pem_root_cert, key_data_t *pem_host_cert);
+LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_device_record_get_certs_as_pem(const char *udid, key_data_t *pem_root_cert, key_data_t *pem_host_cert, key_data_t *pem_device_cert);
LIBIMOBILEDEVICE_INTERNAL userpref_error_t userpref_set_device_record(const char *udid, plist_t device_record);
userpref_error_t userpref_remove_device_record(const char *udid);