From 5dcf12654c7a0c243750c877160d4b57aaf90f18 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Adam=20Go=C5=82=C4=99biowski?= Date: Mon, 24 Sep 2018 23:23:30 +0200 Subject: [PATCH] - openssl-1.1 buildfix (cherry-picked commit f16f247 from https://github.com/Lekensteyn/dmg2img) - release 3 --- dmg2img-openssl-1.1.patch | 217 ++++++++++++++++++++++++++++++++++++++ dmg2img.spec | 4 +- 2 files changed, 220 insertions(+), 1 deletion(-) create mode 100644 dmg2img-openssl-1.1.patch diff --git a/dmg2img-openssl-1.1.patch b/dmg2img-openssl-1.1.patch new file mode 100644 index 0000000..0e30fba --- /dev/null +++ b/dmg2img-openssl-1.1.patch @@ -0,0 +1,217 @@ +commit f16f247d30f868e84f31e24792b4464488f1c009 +Author: Peter Wu +Date: Tue May 2 15:53:38 2017 +0200 + + vfdecrypt: OpenSSL 1.1 compatibility + + Allocate contexts from the heap on all OpenSSL versions, this is needed + since OpenSSL 1.1.0. No attempt is done at addressing issues like global + variables and fixing potential memleaks on error paths. + + Compile-tested only with OpenSSL 1.1.0e (Arch Linux) and OpenSSL 1.0.2g + (Ubuntu 16.04), I have no test file. + + Fixes https://github.com/Lekensteyn/dmg2img/issues/4 + +diff --git a/vfdecrypt.c b/vfdecrypt.c +index 56d3530..b1a36d3 100644 +--- a/vfdecrypt.c ++++ b/vfdecrypt.c +@@ -183,7 +183,7 @@ void adjust_v2_header_byteorder(cencrypted_v2_pwheader *pwhdr) { + pwhdr->encrypted_keyblob_size = htonl(pwhdr->encrypted_keyblob_size); + } + +-HMAC_CTX hmacsha1_ctx; ++HMAC_CTX *hmacsha1_ctx; + AES_KEY aes_decrypt_key; + int CHUNK_SIZE=4096; // default + +@@ -196,9 +196,9 @@ void compute_iv(uint32_t chunk_no, uint8_t *iv) { + unsigned int mdLen; + + chunk_no = OSSwapHostToBigInt32(chunk_no); +- HMAC_Init_ex(&hmacsha1_ctx, NULL, 0, NULL, NULL); +- HMAC_Update(&hmacsha1_ctx, (void *) &chunk_no, sizeof(uint32_t)); +- HMAC_Final(&hmacsha1_ctx, mdResult, &mdLen); ++ HMAC_Init_ex(hmacsha1_ctx, NULL, 0, NULL, NULL); ++ HMAC_Update(hmacsha1_ctx, (void *) &chunk_no, sizeof(uint32_t)); ++ HMAC_Final(hmacsha1_ctx, mdResult, &mdLen); + memcpy(iv, mdResult, CIPHER_BLOCKSIZE); + } + +@@ -212,52 +212,75 @@ void decrypt_chunk(uint8_t *ctext, uint8_t *ptext, uint32_t chunk_no) { + /* DES3-EDE unwrap operation loosely based on to RFC 2630, section 12.6 + * wrapped_key has to be 40 bytes in length. */ + int apple_des3_ede_unwrap_key(uint8_t *wrapped_key, int wrapped_key_len, uint8_t *decryptKey, uint8_t *unwrapped_key) { +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + uint8_t *TEMP1, *TEMP2, *CEKICV; + uint8_t IV[8] = { 0x4a, 0xdd, 0xa2, 0x2c, 0x79, 0xe8, 0x21, 0x05 }; + int outlen, tmplen, i; + +- EVP_CIPHER_CTX_init(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ ctx = EVP_CIPHER_CTX_new(); ++#else ++ ctx = malloc(sizeof(*ctx)); ++#endif ++ if (!ctx) { ++ fprintf(stderr, "Out of memory: EVP_CIPHER_CTX!\n"); ++ return(-1); ++ } ++ ++ EVP_CIPHER_CTX_init(ctx); + /* result of the decryption operation shouldn't be bigger than ciphertext */ + TEMP1 = malloc(wrapped_key_len); + TEMP2 = malloc(wrapped_key_len); + CEKICV = malloc(wrapped_key_len); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, decryptKey, IV); ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, decryptKey, IV); + +- if(!EVP_DecryptUpdate(&ctx, TEMP1, &outlen, wrapped_key, wrapped_key_len)) { ++ if(!EVP_DecryptUpdate(ctx, TEMP1, &outlen, wrapped_key, wrapped_key_len)) { + fprintf(stderr, "internal error (1) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, TEMP1 + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, TEMP1 + outlen, &tmplen)) { + fprintf(stderr, "internal error (2) during key unwrap operation!\n"); + return(-1); + } + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_reset(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++#endif + + /* reverse order of TEMP3 */ + for(i = 0; i < outlen; i++) TEMP2[i] = TEMP1[outlen - i - 1]; + +- EVP_CIPHER_CTX_init(&ctx); ++ EVP_CIPHER_CTX_init(ctx); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, decryptKey, TEMP2); +- if(!EVP_DecryptUpdate(&ctx, CEKICV, &outlen, TEMP2+8, outlen-8)) { ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, decryptKey, TEMP2); ++ if(!EVP_DecryptUpdate(ctx, CEKICV, &outlen, TEMP2+8, outlen-8)) { + fprintf(stderr, "internal error (3) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, CEKICV + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, CEKICV + outlen, &tmplen)) { + fprintf(stderr, "internal error (4) during key unwrap operation!\n"); + return(-1); + } + + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_reset(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++#endif + + memcpy(unwrapped_key, CEKICV+4, outlen-4); + free(TEMP1); + free(TEMP2); + free(CEKICV); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(ctx); ++#else ++ free(ctx); ++#endif + return(0); + } + +@@ -279,31 +302,46 @@ int unwrap_v1_header(char *passphrase, cencrypted_v1_header *header, uint8_t *ae + int unwrap_v2_header(char *passphrase, cencrypted_v2_pwheader *header, uint8_t *aes_key, uint8_t *hmacsha1_key) { + /* derived key is a 3DES-EDE key */ + uint8_t derived_key[192/8]; +- EVP_CIPHER_CTX ctx; ++ EVP_CIPHER_CTX *ctx; + uint8_t *TEMP1; + int outlen, tmplen; + ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ ctx = EVP_CIPHER_CTX_new(); ++#else ++ ctx = malloc(sizeof(*ctx)); ++#endif ++ if (!ctx) { ++ fprintf(stderr, "Out of memory: EVP_CIPHER_CTX!\n"); ++ return(-1); ++ } ++ + PKCS5_PBKDF2_HMAC_SHA1(passphrase, strlen(passphrase), (unsigned char*)header->kdf_salt, 20, + PBKDF2_ITERATION_COUNT, sizeof(derived_key), derived_key); + + print_hex(derived_key, 192/8); + +- EVP_CIPHER_CTX_init(&ctx); ++ EVP_CIPHER_CTX_init(ctx); + /* result of the decryption operation shouldn't be bigger than ciphertext */ + TEMP1 = malloc(header->encrypted_keyblob_size); + /* uses PKCS#7 padding for symmetric key operations by default */ +- EVP_DecryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, derived_key, header->blob_enc_iv); ++ EVP_DecryptInit_ex(ctx, EVP_des_ede3_cbc(), NULL, derived_key, header->blob_enc_iv); + +- if(!EVP_DecryptUpdate(&ctx, TEMP1, &outlen, header->encrypted_keyblob, header->encrypted_keyblob_size)) { ++ if(!EVP_DecryptUpdate(ctx, TEMP1, &outlen, header->encrypted_keyblob, header->encrypted_keyblob_size)) { + fprintf(stderr, "internal error (1) during key unwrap operation!\n"); + return(-1); + } +- if(!EVP_DecryptFinal_ex(&ctx, TEMP1 + outlen, &tmplen)) { ++ if(!EVP_DecryptFinal_ex(ctx, TEMP1 + outlen, &tmplen)) { + fprintf(stderr, "internal error (2) during key unwrap operation!\n"); + return(-1); + } + outlen += tmplen; +- EVP_CIPHER_CTX_cleanup(&ctx); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ EVP_CIPHER_CTX_free(ctx); ++#else ++ EVP_CIPHER_CTX_cleanup(ctx); ++ free(ctx); ++#endif + memcpy(aes_key, TEMP1, 16); + memcpy(hmacsha1_key, TEMP1, 20); + +@@ -446,8 +484,21 @@ int main(int argc, char *argv[]) { + CHUNK_SIZE = v2header.blocksize; + } + +- HMAC_CTX_init(&hmacsha1_ctx); +- HMAC_Init_ex(&hmacsha1_ctx, hmacsha1_key, sizeof(hmacsha1_key), EVP_sha1(), NULL); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ hmacsha1_ctx = HMAC_CTX_new(); ++#else ++ hmacsha1_ctx = malloc(sizeof(*hmacsha1_ctx)); ++#endif ++ if (!hmacsha1_ctx) { ++ fprintf(stderr, "Out of memory: HMAC CTX!\n"); ++ exit(1); ++ } ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ HMAC_CTX_reset(hmacsha1_ctx); ++#else ++ HMAC_CTX_init(hmacsha1_ctx); ++#endif ++ HMAC_Init_ex(hmacsha1_ctx, hmacsha1_key, sizeof(hmacsha1_key), EVP_sha1(), NULL); + AES_set_decrypt_key(aes_key, CIPHER_KEY_LENGTH * 8, &aes_decrypt_key); + + if (verbose >= 1) { +@@ -472,5 +523,11 @@ int main(int argc, char *argv[]) { + } + + if (verbose) fprintf(stderr, "%"PRIX32" chunks written\n", chunk_no); ++#if OPENSSL_VERSION_NUMBER >= 0x10100000L ++ HMAC_CTX_free(hmacsha1_ctx); ++#else ++ HMAC_CTX_cleanup(hmacsha1_ctx); ++ free(hmacsha1_ctx); ++#endif + return(0); + } diff --git a/dmg2img.spec b/dmg2img.spec index 8469843..7baf79f 100644 --- a/dmg2img.spec +++ b/dmg2img.spec @@ -2,11 +2,12 @@ Summary: Tool to convert Apple's compressed DMG to standard (hfsplus) disk image Summary(pl.UTF-8): Narzędzie konwertujące skompresowane pliki Apple DMG na obrazy dysków (hfsplus) Name: dmg2img Version: 1.6.7 -Release: 2 +Release: 3 License: GPL v2 Group: Applications/File Source0: http://vu1tur.eu.org/tools/%{name}-%{version}.tar.gz # Source0-md5: 1f0e66285ee4a46b480f3130bc112512 +Patch0: %{name}-openssl-1.1.patch URL: http://vu1tur.eu.org/tools/ BuildRequires: bzip2-devel BuildRequires: openssl-devel @@ -24,6 +25,7 @@ pliki obrazów dysków (hfsplus). %prep %setup -q +%patch0 -p1 %{__sed} -i -e '/CC/s/-s /$(LDFLAGS)/' Makefile -- 2.44.0