diff options
author | 2023-07-05 10:30:52 +0200 | |
---|---|---|
committer | 2023-07-05 10:30:52 +0200 | |
commit | e57b6e7163277c6a63f22a7e2942cf666cf71a80 (patch) | |
tree | 56c083f63bffb238a1aabd8f43a42489c19570d6 | |
parent | 474fd9284b76d8ddd3a3aec41cbca3cc48271cc1 (diff) | |
download | libimobiledevice-e57b6e7163277c6a63f22a7e2942cf666cf71a80.tar.gz libimobiledevice-e57b6e7163277c6a63f22a7e2942cf666cf71a80.tar.bz2 |
Updated OpenSSL-specific code to use OpenSSL 3.0+ API
-rw-r--r-- | common/userpref.c | 25 | ||||
-rw-r--r-- | src/idevice.c | 34 | ||||
-rw-r--r-- | tools/idevicebackup.c | 18 |
3 files changed, 69 insertions, 8 deletions
diff --git a/common/userpref.c b/common/userpref.c index 11e28ba..b64c703 100644 --- a/common/userpref.c +++ b/common/userpref.c | |||
@@ -435,6 +435,10 @@ userpref_error_t pair_record_generate_keys_and_certs(plist_t pair_record, key_da | |||
435 | debug_info("Generating keys and certificates..."); | 435 | debug_info("Generating keys and certificates..."); |
436 | 436 | ||
437 | #if defined(HAVE_OPENSSL) | 437 | #if defined(HAVE_OPENSSL) |
438 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
439 | EVP_PKEY* root_pkey = EVP_RSA_gen(2048); | ||
440 | EVP_PKEY* host_pkey = EVP_RSA_gen(2048); | ||
441 | #else | ||
438 | BIGNUM *e = BN_new(); | 442 | BIGNUM *e = BN_new(); |
439 | RSA* root_keypair = RSA_new(); | 443 | RSA* root_keypair = RSA_new(); |
440 | RSA* host_keypair = RSA_new(); | 444 | RSA* host_keypair = RSA_new(); |
@@ -451,6 +455,7 @@ userpref_error_t pair_record_generate_keys_and_certs(plist_t pair_record, key_da | |||
451 | 455 | ||
452 | EVP_PKEY* host_pkey = EVP_PKEY_new(); | 456 | EVP_PKEY* host_pkey = EVP_PKEY_new(); |
453 | EVP_PKEY_assign_RSA(host_pkey, host_keypair); | 457 | EVP_PKEY_assign_RSA(host_pkey, host_keypair); |
458 | #endif | ||
454 | 459 | ||
455 | /* generate root certificate */ | 460 | /* generate root certificate */ |
456 | X509* root_cert = X509_new(); | 461 | X509* root_cert = X509_new(); |
@@ -561,12 +566,22 @@ userpref_error_t pair_record_generate_keys_and_certs(plist_t pair_record, key_da | |||
561 | } | 566 | } |
562 | } | 567 | } |
563 | 568 | ||
564 | RSA *pubkey = NULL; | 569 | EVP_PKEY *pubkey = NULL; |
565 | { | 570 | { |
566 | BIO *membp = BIO_new_mem_buf(public_key.data, public_key.size); | 571 | BIO *membp = BIO_new_mem_buf(public_key.data, public_key.size); |
567 | if (!PEM_read_bio_RSAPublicKey(membp, &pubkey, NULL, NULL)) { | 572 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L |
573 | if (!PEM_read_bio_PUBKEY(membp, &pubkey, NULL, NULL)) { | ||
568 | debug_info("WARNING: Could not read public key"); | 574 | debug_info("WARNING: Could not read public key"); |
569 | } | 575 | } |
576 | #else | ||
577 | RSA *rsa_pubkey = NULL; | ||
578 | if (!PEM_read_bio_RSAPublicKey(membp, &rsa_pubkey, NULL, NULL)) { | ||
579 | debug_info("WARNING: Could not read public key"); | ||
580 | } else { | ||
581 | pubkey = EVP_PKEY_new(); | ||
582 | EVP_PKEY_assign_RSA(pubkey, rsa_pubkey); | ||
583 | } | ||
584 | #endif | ||
570 | BIO_free(membp); | 585 | BIO_free(membp); |
571 | } | 586 | } |
572 | 587 | ||
@@ -588,10 +603,7 @@ userpref_error_t pair_record_generate_keys_and_certs(plist_t pair_record, key_da | |||
588 | X509_set1_notAfter(dev_cert, asn1time); | 603 | X509_set1_notAfter(dev_cert, asn1time); |
589 | ASN1_TIME_free(asn1time); | 604 | ASN1_TIME_free(asn1time); |
590 | 605 | ||
591 | EVP_PKEY* pkey = EVP_PKEY_new(); | 606 | X509_set_pubkey(dev_cert, pubkey); |
592 | EVP_PKEY_assign_RSA(pkey, pubkey); | ||
593 | X509_set_pubkey(dev_cert, pkey); | ||
594 | EVP_PKEY_free(pkey); | ||
595 | 607 | ||
596 | X509_add_ext_helper(dev_cert, NID_subject_key_identifier, (char*)"hash"); | 608 | X509_add_ext_helper(dev_cert, NID_subject_key_identifier, (char*)"hash"); |
597 | X509_add_ext_helper(dev_cert, NID_key_usage, (char*)"critical,digitalSignature,keyEncipherment"); | 609 | X509_add_ext_helper(dev_cert, NID_key_usage, (char*)"critical,digitalSignature,keyEncipherment"); |
@@ -618,6 +630,7 @@ userpref_error_t pair_record_generate_keys_and_certs(plist_t pair_record, key_da | |||
618 | X509V3_EXT_cleanup(); | 630 | X509V3_EXT_cleanup(); |
619 | X509_free(dev_cert); | 631 | X509_free(dev_cert); |
620 | 632 | ||
633 | EVP_PKEY_free(pubkey); | ||
621 | EVP_PKEY_free(root_pkey); | 634 | EVP_PKEY_free(root_pkey); |
622 | EVP_PKEY_free(host_pkey); | 635 | EVP_PKEY_free(host_pkey); |
623 | 636 | ||
diff --git a/src/idevice.c b/src/idevice.c index 8545317..719cd28 100644 --- a/src/idevice.c +++ b/src/idevice.c | |||
@@ -1057,18 +1057,33 @@ static void internal_ssl_cleanup(ssl_data_t ssl_data) | |||
1057 | } | 1057 | } |
1058 | 1058 | ||
1059 | #ifdef HAVE_OPENSSL | 1059 | #ifdef HAVE_OPENSSL |
1060 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
1061 | static long ssl_idevice_bio_callback(BIO *b, int oper, const char *argp, size_t len, int argi, long argl, int retvalue, size_t *processed) | ||
1062 | #else | ||
1060 | static long ssl_idevice_bio_callback(BIO *b, int oper, const char *argp, int argi, long argl, long retvalue) | 1063 | static long ssl_idevice_bio_callback(BIO *b, int oper, const char *argp, int argi, long argl, long retvalue) |
1064 | #endif | ||
1061 | { | 1065 | { |
1066 | ssize_t bytes = 0; | ||
1062 | idevice_connection_t conn = (idevice_connection_t)BIO_get_callback_arg(b); | 1067 | idevice_connection_t conn = (idevice_connection_t)BIO_get_callback_arg(b); |
1068 | #if OPENSSL_VERSION_NUMBER < 0x30000000L | ||
1063 | size_t len = (size_t)argi; | 1069 | size_t len = (size_t)argi; |
1070 | size_t *processed = (size_t*)&bytes; | ||
1071 | #endif | ||
1064 | switch (oper) { | 1072 | switch (oper) { |
1065 | case (BIO_CB_READ|BIO_CB_RETURN): | 1073 | case (BIO_CB_READ|BIO_CB_RETURN): |
1066 | return argp ? (long)internal_ssl_read(conn, (char *)argp, len) : 0; | 1074 | if (argp) { |
1075 | bytes = internal_ssl_read(conn, (char *)argp, len); | ||
1076 | *processed = bytes; | ||
1077 | return (long)bytes; | ||
1078 | } | ||
1079 | return 0; | ||
1067 | case (BIO_CB_PUTS|BIO_CB_RETURN): | 1080 | case (BIO_CB_PUTS|BIO_CB_RETURN): |
1068 | len = strlen(argp); | 1081 | len = strlen(argp); |
1069 | // fallthrough | 1082 | // fallthrough |
1070 | case (BIO_CB_WRITE|BIO_CB_RETURN): | 1083 | case (BIO_CB_WRITE|BIO_CB_RETURN): |
1071 | return (long)internal_ssl_write(conn, argp, len); | 1084 | bytes = internal_ssl_write(conn, argp, len); |
1085 | *processed = bytes; | ||
1086 | return (long)bytes; | ||
1072 | default: | 1087 | default: |
1073 | return retvalue; | 1088 | return retvalue; |
1074 | } | 1089 | } |
@@ -1079,7 +1094,11 @@ static BIO *ssl_idevice_bio_new(idevice_connection_t conn) | |||
1079 | BIO *b = BIO_new(BIO_s_null()); | 1094 | BIO *b = BIO_new(BIO_s_null()); |
1080 | if (!b) return NULL; | 1095 | if (!b) return NULL; |
1081 | BIO_set_callback_arg(b, (char *)conn); | 1096 | BIO_set_callback_arg(b, (char *)conn); |
1097 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
1098 | BIO_set_callback_ex(b, ssl_idevice_bio_callback); | ||
1099 | #else | ||
1082 | BIO_set_callback(b, ssl_idevice_bio_callback); | 1100 | BIO_set_callback(b, ssl_idevice_bio_callback); |
1101 | #endif | ||
1083 | return b; | 1102 | return b; |
1084 | } | 1103 | } |
1085 | 1104 | ||
@@ -1257,6 +1276,16 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connection_enable_ssl(idevice_conne | |||
1257 | X509_free(rootCert); | 1276 | X509_free(rootCert); |
1258 | free(root_cert.data); | 1277 | free(root_cert.data); |
1259 | 1278 | ||
1279 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
1280 | EVP_PKEY* rootPrivKey = NULL; | ||
1281 | membp = BIO_new_mem_buf(root_privkey.data, root_privkey.size); | ||
1282 | PEM_read_bio_PrivateKey(membp, &rootPrivKey, NULL, NULL); | ||
1283 | BIO_free(membp); | ||
1284 | if (SSL_CTX_use_PrivateKey(ssl_ctx, rootPrivKey) != 1) { | ||
1285 | debug_info("WARNING: Could not load RootPrivateKey"); | ||
1286 | } | ||
1287 | EVP_PKEY_free(rootPrivKey); | ||
1288 | #else | ||
1260 | RSA* rootPrivKey = NULL; | 1289 | RSA* rootPrivKey = NULL; |
1261 | membp = BIO_new_mem_buf(root_privkey.data, root_privkey.size); | 1290 | membp = BIO_new_mem_buf(root_privkey.data, root_privkey.size); |
1262 | PEM_read_bio_RSAPrivateKey(membp, &rootPrivKey, NULL, NULL); | 1291 | PEM_read_bio_RSAPrivateKey(membp, &rootPrivKey, NULL, NULL); |
@@ -1265,6 +1294,7 @@ LIBIMOBILEDEVICE_API idevice_error_t idevice_connection_enable_ssl(idevice_conne | |||
1265 | debug_info("WARNING: Could not load RootPrivateKey"); | 1294 | debug_info("WARNING: Could not load RootPrivateKey"); |
1266 | } | 1295 | } |
1267 | RSA_free(rootPrivKey); | 1296 | RSA_free(rootPrivKey); |
1297 | #endif | ||
1268 | free(root_privkey.data); | 1298 | free(root_privkey.data); |
1269 | 1299 | ||
1270 | SSL *ssl = SSL_new(ssl_ctx); | 1300 | SSL *ssl = SSL_new(ssl_ctx); |
diff --git a/tools/idevicebackup.c b/tools/idevicebackup.c index 1684666..5694c12 100644 --- a/tools/idevicebackup.c +++ b/tools/idevicebackup.c | |||
@@ -34,6 +34,9 @@ | |||
34 | #include <getopt.h> | 34 | #include <getopt.h> |
35 | #if defined(HAVE_OPENSSL) | 35 | #if defined(HAVE_OPENSSL) |
36 | #include <openssl/sha.h> | 36 | #include <openssl/sha.h> |
37 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
38 | #include <openssl/evp.h> | ||
39 | #endif | ||
37 | #elif defined(HAVE_GNUTLS) | 40 | #elif defined(HAVE_GNUTLS) |
38 | #include <gcrypt.h> | 41 | #include <gcrypt.h> |
39 | #elif defined(HAVE_MBEDTLS) | 42 | #elif defined(HAVE_MBEDTLS) |
@@ -113,7 +116,11 @@ static int compare_hash(const unsigned char *hash1, const unsigned char *hash2, | |||
113 | static void _sha1_update(void* context, const char* data, size_t len) | 116 | static void _sha1_update(void* context, const char* data, size_t len) |
114 | { | 117 | { |
115 | #if defined(HAVE_OPENSSL) | 118 | #if defined(HAVE_OPENSSL) |
119 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
120 | EVP_DigestUpdate(context, data, len); | ||
121 | #else | ||
116 | SHA1_Update(context, data, len); | 122 | SHA1_Update(context, data, len); |
123 | #endif | ||
117 | #elif defined(HAVE_GNUTLS) | 124 | #elif defined(HAVE_GNUTLS) |
118 | gcry_md_write(context, data, len); | 125 | gcry_md_write(context, data, len); |
119 | #elif defined(HAVE_MBEDTLS) | 126 | #elif defined(HAVE_MBEDTLS) |
@@ -124,9 +131,15 @@ static void _sha1_update(void* context, const char* data, size_t len) | |||
124 | static void compute_datahash(const char *path, const char *destpath, uint8_t greylist, const char *domain, const char *appid, const char *version, unsigned char *hash_out) | 131 | static void compute_datahash(const char *path, const char *destpath, uint8_t greylist, const char *domain, const char *appid, const char *version, unsigned char *hash_out) |
125 | { | 132 | { |
126 | #if defined(HAVE_OPENSSL) | 133 | #if defined(HAVE_OPENSSL) |
134 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
135 | EVP_MD_CTX* sha1 = EVP_MD_CTX_new(); | ||
136 | EVP_DigestInit(sha1, EVP_sha1()); | ||
137 | void* psha1 = sha1; | ||
138 | #else | ||
127 | SHA_CTX sha1; | 139 | SHA_CTX sha1; |
128 | SHA1_Init(&sha1); | 140 | SHA1_Init(&sha1); |
129 | void* psha1 = &sha1; | 141 | void* psha1 = &sha1; |
142 | #endif | ||
130 | #elif defined(HAVE_GNUTLS) | 143 | #elif defined(HAVE_GNUTLS) |
131 | gcry_md_hd_t hd = NULL; | 144 | gcry_md_hd_t hd = NULL; |
132 | gcry_md_open(&hd, GCRY_MD_SHA1, 0); | 145 | gcry_md_open(&hd, GCRY_MD_SHA1, 0); |
@@ -180,7 +193,12 @@ static void compute_datahash(const char *path, const char *destpath, uint8_t gre | |||
180 | _sha1_update(psha1, "(null)", 6); | 193 | _sha1_update(psha1, "(null)", 6); |
181 | } | 194 | } |
182 | #if defined(HAVE_OPENSSL) | 195 | #if defined(HAVE_OPENSSL) |
196 | #if OPENSSL_VERSION_NUMBER >= 0x30000000L | ||
197 | EVP_DigestFinal(sha1, hash_out, NULL); | ||
198 | EVP_MD_CTX_destroy(sha1); | ||
199 | #else | ||
183 | SHA1_Final(hash_out, &sha1); | 200 | SHA1_Final(hash_out, &sha1); |
201 | #endif | ||
184 | #elif defined(HAVE_GNUTLS) | 202 | #elif defined(HAVE_GNUTLS) |
185 | unsigned char *newhash = gcry_md_read(hd, GCRY_MD_SHA1); | 203 | unsigned char *newhash = gcry_md_read(hd, GCRY_MD_SHA1); |
186 | memcpy(hash_out, newhash, 20); | 204 | memcpy(hash_out, newhash, 20); |