[Forensics-changes] [afflib] 01/02: Imported Upstream version 3.7.10

Joao Eriberto Mota Filho eriberto at moszumanska.debian.org
Sun Oct 9 00:40:43 UTC 2016


This is an automated email from the git hooks/post-receive script.

eriberto pushed a commit to branch debian
in repository afflib.

commit b387421077f7bbda9fc9f12265eb395c7fd37060
Author: Joao Eriberto Mota Filho <eriberto at debian.org>
Date:   Sat Oct 8 21:40:29 2016 -0300

    Imported Upstream version 3.7.10
---
 configure.ac        |   2 +-
 lib/aftest.cpp      |  33 +++++++++------
 lib/crypto.cpp      | 114 ++++++++++++++++++++++++++++++++--------------------
 tools/aff_bom.cpp   |  28 ++++++++-----
 tools/affverify.cpp |  32 ++++++++++-----
 tools/hashextent.h  |  19 ++++++---
 win32/affconfig.h   |   2 +-
 7 files changed, 145 insertions(+), 85 deletions(-)

diff --git a/configure.ac b/configure.ac
index 54e89ee..7de2900 100644
--- a/configure.ac
+++ b/configure.ac
@@ -4,7 +4,7 @@
 # See http://autotoolset.sourceforge.net/tutorial.html
 # and http://www.openismus.com/documents/linux/automake/automake.shtml
 
-AC_INIT([AFFLIB],[3.7.8],[https://github.com/sshock/AFFLIBv3])
+AC_INIT([AFFLIB],[3.7.10],[https://github.com/sshock/AFFLIBv3])
 AM_INIT_AUTOMAKE
 AM_MAINTAINER_MODE
 
diff --git a/lib/aftest.cpp b/lib/aftest.cpp
index c568e6c..ef733c9 100644
--- a/lib/aftest.cpp
+++ b/lib/aftest.cpp
@@ -38,6 +38,11 @@ const char *tempdir = "/tmp/";
 #define MIN(x,y) ((x)<(y)?(x):(y))
 #endif
 
+/* Support OpenSSL before 1.1.0 */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define EVP_MD_CTX_new EVP_MD_CTX_create
+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
 
 const char *filename(char *buf,int buflen,const char *base)
 {
@@ -769,12 +774,12 @@ void rsatest()
       return;
     }
 
-    EVP_MD_CTX md;
+    EVP_MD_CTX *md = EVP_MD_CTX_new();
     EVP_PKEY *pkey = PEM_read_bio_PrivateKey(bp,0,0,0);
 
-    EVP_SignInit(&md,sha256);
-    EVP_SignUpdate(&md,ptext,sizeof(ptext));
-    EVP_SignFinal(&md,sig,&siglen,pkey);
+    EVP_SignInit(md,sha256);
+    EVP_SignUpdate(md,ptext,sizeof(ptext));
+    EVP_SignFinal(md,sig,&siglen,pkey);
 
     /* let's try to verify it */
     bp = BIO_new_file("signing_cert.pem","r");
@@ -789,23 +794,25 @@ void rsatest()
 
     printf("pubkey=%p\n",pubkey);
 
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,ptext,sizeof(ptext));
-    int r = EVP_VerifyFinal(&md,sig,siglen,pubkey);
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,ptext,sizeof(ptext));
+    int r = EVP_VerifyFinal(md,sig,siglen,pubkey);
     printf("r=%d\n",r);
 
     printf("do it again...\n");
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,ptext,sizeof(ptext));
-    r = EVP_VerifyFinal(&md,sig,siglen,pubkey);
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,ptext,sizeof(ptext));
+    r = EVP_VerifyFinal(md,sig,siglen,pubkey);
     printf("r=%d\n",r);
 
     printf("make a tiny change...\n");
     ptext[0]='f';
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,ptext,sizeof(ptext));
-    r = EVP_VerifyFinal(&md,sig,siglen,pubkey);
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,ptext,sizeof(ptext));
+    r = EVP_VerifyFinal(md,sig,siglen,pubkey);
     printf("r=%d\n",r);
+
+    EVP_MD_CTX_free(md);
 }
 
 void xmlseg(BIO *bp,AFFILE *af,const char *segname)
diff --git a/lib/crypto.cpp b/lib/crypto.cpp
index 9cc13bf..42dce9a 100644
--- a/lib/crypto.cpp
+++ b/lib/crypto.cpp
@@ -25,8 +25,11 @@ using namespace std;
 #include <cstring>
 #endif
 
-
-
+/* Support OpenSSL before 1.1.0 */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define EVP_MD_CTX_new EVP_MD_CTX_create
+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
 
 
 /****************************************************************
@@ -82,10 +85,14 @@ int af_SHA256(const unsigned char *data,size_t datalen,unsigned char md[32])
     if(!sha256) return -1;
 
     uint32_t sha256_buflen = 32;
-    EVP_MD_CTX ctx;
-    EVP_DigestInit(&ctx,sha256);
-    EVP_DigestUpdate(&ctx,data,datalen);
-    if(EVP_DigestFinal(&ctx,md,&sha256_buflen)!=1) return -1; // EVP_DigestFinal returns 1 for success
+    EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+    EVP_DigestInit(ctx,sha256);
+    EVP_DigestUpdate(ctx,data,datalen);
+    if(EVP_DigestFinal(ctx,md,&sha256_buflen)!=1){ // EVP_DigestFinal returns 1 for success
+	EVP_MD_CTX_free(ctx);
+	return -1;
+    }
+    EVP_MD_CTX_free(ctx);
     return 0;
 }
 
@@ -387,22 +394,23 @@ static int check_keys(EVP_PKEY *privkey,EVP_PKEY *pubkey)
     const EVP_MD *sha256 = EVP_get_digestbyname("SHA256");
     if(!sha256) return -1;		// no SHA256.
 
-    EVP_MD_CTX md;			/* EVP message digest */
-
+    EVP_MD_CTX *md = EVP_MD_CTX_new();	/* EVP message digest */
 
     /* make the plaintext message */
     memset(ptext,0,sizeof(ptext));
     strcpy(ptext,"Test Message");
-    EVP_SignInit(&md,sha256);
-    EVP_SignUpdate(&md,ptext,sizeof(ptext));
-    EVP_SignFinal(&md,sig,&siglen,privkey);
+    EVP_SignInit(md,sha256);
+    EVP_SignUpdate(md,ptext,sizeof(ptext));
+    EVP_SignFinal(md,sig,&siglen,privkey);
 
     /* Verify the message */
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,ptext,sizeof(ptext));
-    if(EVP_VerifyFinal(&md,sig,siglen,pubkey)!=1){
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,ptext,sizeof(ptext));
+    if(EVP_VerifyFinal(md,sig,siglen,pubkey)!=1){
+	EVP_MD_CTX_free(md);
 	return -3;
     }
+    EVP_MD_CTX_free(md);
     return 0;
 }
 
@@ -494,12 +502,13 @@ int af_sign_seg3(AFFILE *af,const char *segname,
     unsigned char sig[1024];		/* signature; bigger than needed */
     uint32_t siglen = sizeof(sig);	/* length of signature */
 
-    EVP_MD_CTX md;			/* EVP message digest */
-    EVP_SignInit(&md,sha256);
-    EVP_SignUpdate(&md,(const unsigned char *)segname,strlen(segname)+1);
-    EVP_SignUpdate(&md,(const unsigned char *)&arg_net,sizeof(arg_net));
-    EVP_SignUpdate(&md,data,datalen);
-    EVP_SignFinal(&md,sig,&siglen,af->crypto->sign_privkey);
+    EVP_MD_CTX *md = EVP_MD_CTX_new();	/* EVP message digest */
+    EVP_SignInit(md,sha256);
+    EVP_SignUpdate(md,(const unsigned char *)segname,strlen(segname)+1);
+    EVP_SignUpdate(md,(const unsigned char *)&arg_net,sizeof(arg_net));
+    EVP_SignUpdate(md,data,datalen);
+    EVP_SignFinal(md,sig,&siglen,af->crypto->sign_privkey);
+    EVP_MD_CTX_free(md);
     return (*af->v->update_seg)(af,signed_segname,signmode,sig,siglen);
 }
 
@@ -618,12 +627,13 @@ int af_hash_verify_seg2(AFFILE *af,const char *segname,u_char *sigbuf_,size_t si
     uint8_t sigbuf[1024];
     uint32_t sigbuf_len = sizeof(sigbuf);
     uint32_t arg_net = htonl(arg);
-    EVP_MD_CTX md;			/* EVP message digest */
-    EVP_DigestInit(&md,sha256);
-    EVP_DigestUpdate(&md,(const unsigned char *)segname,strlen(segname)+1);
-    EVP_DigestUpdate(&md,(const unsigned char *)&arg_net,sizeof(arg_net));
-    EVP_DigestUpdate(&md,segbuf,seglen);
-    EVP_DigestFinal(&md,sigbuf,&sigbuf_len);
+    EVP_MD_CTX *md = EVP_MD_CTX_new();	/* EVP message digest */
+    EVP_DigestInit(md,sha256);
+    EVP_DigestUpdate(md,(const unsigned char *)segname,strlen(segname)+1);
+    EVP_DigestUpdate(md,(const unsigned char *)&arg_net,sizeof(arg_net));
+    EVP_DigestUpdate(md,segbuf,seglen);
+    EVP_DigestFinal(md,sigbuf,&sigbuf_len);
+    EVP_MD_CTX_free(md);
     int r = memcmp(sigbuf,sigbuf_,sigbuf_len);
     if(sigbuf_len != sigbuf_len_) r = -1; // doesn't match
     free(segbuf);
@@ -677,12 +687,13 @@ int af_sig_verify_seg2(AFFILE *af,const char *segname,EVP_PKEY * /*pubkey*/,u_ch
 
     /* Verify the signature*/
     uint32_t arg_net = htonl(arg);
-    EVP_MD_CTX md;			/* EVP message digest */
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,(const unsigned char *)segname,strlen(segname)+1);
-    EVP_VerifyUpdate(&md,(const unsigned char *)&arg_net,sizeof(arg_net));
-    EVP_VerifyUpdate(&md,segbuf,seglen);
-    int r = EVP_VerifyFinal(&md,sigbuf,sigbuf_len,af->crypto->sign_pubkey);
+    EVP_MD_CTX *md = EVP_MD_CTX_new();	/* EVP message digest */
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,(const unsigned char *)segname,strlen(segname)+1);
+    EVP_VerifyUpdate(md,(const unsigned char *)&arg_net,sizeof(arg_net));
+    EVP_VerifyUpdate(md,segbuf,seglen);
+    EVP_MD_CTX_free(md);
+    int r = EVP_VerifyFinal(md,sigbuf,sigbuf_len,af->crypto->sign_pubkey);
     free(segbuf);
 
     if(r==1) return 0;			// verifies
@@ -803,7 +814,7 @@ int  af_seal_affkey_using_certificates(AFFILE *af,const char *certfiles[],int nu
 	unsigned char affkey_copy[32];
 	memcpy(affkey_copy,affkey,32);
 
-	EVP_CIPHER_CTX cipher_ctx;
+	EVP_CIPHER_CTX *cipher_ctx = EVP_CIPHER_CTX_new();
 
 	/* IV */
 	unsigned char iv[EVP_MAX_IV_LENGTH];
@@ -822,15 +833,26 @@ int  af_seal_affkey_using_certificates(AFFILE *af,const char *certfiles[],int nu
 	int encrypted_bytes = 0;
 	memset(encrypted_affkey,0,sizeof(encrypted_affkey));
 
-	r = EVP_SealInit(&cipher_ctx,EVP_aes_256_cbc(),ek_array,&ek_size,&iv[0],&seal_pubkey,1);
-	if(r!=1) return -10;		// bad
+	r = EVP_SealInit(cipher_ctx,EVP_aes_256_cbc(),ek_array,&ek_size,&iv[0],&seal_pubkey,1);
+	if(r!=1){
+	    EVP_CIPHER_CTX_free(cipher_ctx);
+	    return -10;		// bad
+	}
 
-	r = EVP_SealUpdate(&cipher_ctx,encrypted_affkey,&encrypted_bytes,affkey_copy,sizeof(affkey_copy));
-	if(r!=1) return -11;		// bad
+	r = EVP_SealUpdate(cipher_ctx,encrypted_affkey,&encrypted_bytes,affkey_copy,sizeof(affkey_copy));
+	if(r!=1){
+	    EVP_CIPHER_CTX_free(cipher_ctx);
+	    return -11;		// bad
+	}
 
 	int total_encrypted_bytes = encrypted_bytes;
-	r = EVP_SealFinal(&cipher_ctx,encrypted_affkey+total_encrypted_bytes,&encrypted_bytes);
-	if(r!=1) return -12;
+	r = EVP_SealFinal(cipher_ctx,encrypted_affkey+total_encrypted_bytes,&encrypted_bytes);
+	if(r!=1){
+	    EVP_CIPHER_CTX_free(cipher_ctx);
+	    return -12;
+	}
+
+	EVP_CIPHER_CTX_free(cipher_ctx);
 
 	total_encrypted_bytes += encrypted_bytes;
 
@@ -926,20 +948,23 @@ int af_get_affkey_using_keyfile(AFFILE *af, const char *private_keyfile,u_char a
 	    unsigned char *encrypted_affkey = buf+int3+EVP_MAX_IV_LENGTH+ek_size;
 
 	    /* Now let's see if we can decode it*/
-	    EVP_CIPHER_CTX cipher_ctx;
-	    int r = EVP_OpenInit(&cipher_ctx,EVP_aes_256_cbc(),ek,ek_size,iv,seal_privkey);
+	    EVP_CIPHER_CTX *cipher_ctx = EVP_CIPHER_CTX_new();
+	    int r = EVP_OpenInit(cipher_ctx,EVP_aes_256_cbc(),ek,ek_size,iv,seal_privkey);
 	    if(r==1){
 		/* allocate a buffer for the decrypted data */
 		decrypted = (unsigned char *)malloc(total_encrypted_bytes);
-		if(!decrypted) return -1; // shouldn't fail
+		if(!decrypted){
+		    EVP_CIPHER_CTX_free(cipher_ctx);
+		    return -1; // shouldn't fail
+		}
 
 		int decrypted_len;
-		r = EVP_OpenUpdate(&cipher_ctx,decrypted,&decrypted_len,encrypted_affkey,total_encrypted_bytes);
+		r = EVP_OpenUpdate(cipher_ctx,decrypted,&decrypted_len,encrypted_affkey,total_encrypted_bytes);
 		if(r==1){
 		    /* OpenSSL requires that we call EVP_OpenFinal to finish the decryption */
 		    unsigned char *decrypted2 = decrypted+decrypted_len; // where the decryption continues
 		    int decrypted2_len = 0;
-		    r = EVP_OpenFinal(&cipher_ctx,decrypted2,&decrypted2_len);
+		    r = EVP_OpenFinal(cipher_ctx,decrypted2,&decrypted2_len);
 		    if(r==1){
 			memcpy(affkey,decrypted,32);
 			ret = 0;		// successful return
@@ -948,6 +973,7 @@ int af_get_affkey_using_keyfile(AFFILE *af, const char *private_keyfile,u_char a
 		memset(decrypted,0,total_encrypted_bytes); // overwrite our temp buffer
 		free(decrypted);
 	    }
+	    EVP_CIPHER_CTX_free(cipher_ctx);
 	}
     next:;
 	free(buf);
diff --git a/tools/aff_bom.cpp b/tools/aff_bom.cpp
index 72d7b46..efd00e8 100644
--- a/tools/aff_bom.cpp
+++ b/tools/aff_bom.cpp
@@ -35,6 +35,12 @@
 #include <readline/readline.h>
 #endif
 
+/* Support OpenSSL before 1.1.0 */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define EVP_MD_CTX_new EVP_MD_CTX_create
+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
+
 using namespace std;
 
 int parse_chain(const string &name)
@@ -188,10 +194,11 @@ void aff_bom::close()
 	unsigned char sig[1024];
 	u_int  siglen = sizeof(sig);
 
-	EVP_MD_CTX md;
-	EVP_SignInit(&md,sha256);
-	EVP_SignUpdate(&md,xbuf,xlen);
-	EVP_SignFinal(&md,sig,&siglen,privkey);
+	EVP_MD_CTX *md = EVP_MD_CTX_new();
+	EVP_SignInit(md,sha256);
+	EVP_SignUpdate(md,xbuf,xlen);
+	EVP_SignFinal(md,sig,&siglen,privkey);
+	EVP_MD_CTX_free(md);
 
 	/* Write the signature in base64 encoding... */
 	BIO *b64 = BIO_new(BIO_f_base64());
@@ -224,12 +231,13 @@ void aff_bom::make_hash(u_char seghash[SHA256_SIZE], uint32_t arg,const char *se
     if(sha256){
 	unsigned int seghash_len = SHA256_SIZE;
 	uint32_t arg_net = htonl(arg);
-	EVP_MD_CTX md;		/* EVP message digest */
-	EVP_DigestInit(&md,sha256);
-	EVP_DigestUpdate(&md,(const unsigned char *)segname,strlen(segname)+1);
-	EVP_DigestUpdate(&md,(const unsigned char *)&arg_net,sizeof(arg_net));
-	EVP_DigestUpdate(&md,segbuf,segsize);
-	EVP_DigestFinal(&md,seghash,&seghash_len);
+	EVP_MD_CTX *md = EVP_MD_CTX_new();		/* EVP message digest */
+	EVP_DigestInit(md,sha256);
+	EVP_DigestUpdate(md,(const unsigned char *)segname,strlen(segname)+1);
+	EVP_DigestUpdate(md,(const unsigned char *)&arg_net,sizeof(arg_net));
+	EVP_DigestUpdate(md,segbuf,segsize);
+	EVP_DigestFinal(md,seghash,&seghash_len);
+	EVP_MD_CTX_free(md);
     }
 }
 
diff --git a/tools/affverify.cpp b/tools/affverify.cpp
index b89d53d..1568ee6 100644
--- a/tools/affverify.cpp
+++ b/tools/affverify.cpp
@@ -27,6 +27,12 @@
 #include <openssl/pem.h>
 #include <openssl/x509.h>
 
+/* Support OpenSSL before 1.1.0 */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define EVP_MD_CTX_new EVP_MD_CTX_create
+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
+
 using namespace std;
 using namespace aff;
 
@@ -248,10 +254,11 @@ int  verify_bom_signature(AFFILE *af,const char *buf)
     }
 
     /* Try to verify it */
-    EVP_MD_CTX md;
-    EVP_VerifyInit(&md,sha256);
-    EVP_VerifyUpdate(&md,buf,sig_start-buf);
-    int r = EVP_VerifyFinal(&md,sigbuf,sigbuf_len,X509_get_pubkey(cert));
+    EVP_MD_CTX *md = EVP_MD_CTX_new();
+    EVP_VerifyInit(md,sha256);
+    EVP_VerifyUpdate(md,buf,sig_start-buf);
+    int r = EVP_VerifyFinal(md,sigbuf,sigbuf_len,X509_get_pubkey(cert));
+    EVP_MD_CTX_free(md);
     if(r!=1){ 
 	printf("BAD SIGNATURE ON BOM\n");
 	return -1;
@@ -430,16 +437,17 @@ int hash_verify(AFFILE *af)
     size_t md5_len  =sizeof(md5_buf);
     const EVP_MD *md5_evp = 0;
     const EVP_MD *sha1_evp = 0;
-    EVP_MD_CTX md5,sha1;
+    EVP_MD_CTX *md5 = EVP_MD_CTX_new();
+    EVP_MD_CTX *sha1 = EVP_MD_CTX_new();
     if(af_get_seg(af,AF_SHA1,0,sha1_buf,&sha1_len)==0){
 	printf("SHA1 stored in file:     %s\n",af_hexbuf(hexbuf,sizeof(hexbuf),sha1_buf,sha1_len,0));
 	sha1_evp = EVP_get_digestbyname("sha1");
-	EVP_DigestInit(&sha1,sha1_evp);
+	EVP_DigestInit(sha1,sha1_evp);
     }
     if(af_get_seg(af,AF_MD5,0,md5_buf,&md5_len)==0){
 	printf("MD5 stored in file:      %s\n",af_hexbuf(hexbuf,sizeof(hexbuf),md5_buf,md5_len,0));
 	md5_evp = EVP_get_digestbyname("md5");
-	EVP_DigestInit(&md5,md5_evp);
+	EVP_DigestInit(md5,md5_evp);
     }
     /* Might as well read this puppy */
     u_char *buf = (u_char *)malloc(af_get_pagesize(af));
@@ -457,8 +465,8 @@ int hash_verify(AFFILE *af)
 	       t.eta_text(frac).c_str());
 	readsize = af_read(af,buf,af_get_pagesize(af));
 	if(readsize<1) break;
-	if(md5_evp) EVP_DigestUpdate(&md5,buf,readsize);
-	if(sha1_evp) EVP_DigestUpdate(&sha1,buf,readsize);
+	if(md5_evp) EVP_DigestUpdate(md5,buf,readsize);
+	if(sha1_evp) EVP_DigestUpdate(sha1,buf,readsize);
 	total_read += readsize;
     } while(total_read < af_get_imagesize(af));
 	
@@ -468,7 +476,7 @@ int hash_verify(AFFILE *af)
 	unsigned char sha1_calc[32];
 	unsigned int sha1_calc_len = sizeof(sha1_calc);
 	
-	EVP_DigestFinal(&sha1,sha1_calc,(unsigned int *)&sha1_calc_len);
+	EVP_DigestFinal(sha1,sha1_calc,(unsigned int *)&sha1_calc_len);
 	printf("Calculated SHA1: %s  ",af_hexbuf(hexbuf,sizeof(hexbuf),sha1_calc,sha1_calc_len,0));
 	if(memcmp(sha1_buf,sha1_calc,sha1_len)==0){
 	    printf("VERIFIES\n");
@@ -481,7 +489,7 @@ int hash_verify(AFFILE *af)
 	unsigned char md5_calc[32];
 	unsigned int md5_calc_len = sizeof(md5_calc);
 	
-	EVP_DigestFinal(&md5,md5_calc,(unsigned int *)&md5_calc_len);
+	EVP_DigestFinal(md5,md5_calc,(unsigned int *)&md5_calc_len);
 	printf("Calculated MD5:  %s          ",af_hexbuf(hexbuf,sizeof(hexbuf),md5_calc,md5_calc_len,0));
 	if(memcmp(md5_buf,md5_calc,md5_len)==0){
 	    printf("VERIFIES\n");
@@ -490,6 +498,8 @@ int hash_verify(AFFILE *af)
 	}
     }
 
+    EVP_MD_CTX_free(md5);
+    EVP_MD_CTX_free(sha1);
     af_close(af);
     return 0;
 }
diff --git a/tools/hashextent.h b/tools/hashextent.h
index 9d30f4c..4fff444 100644
--- a/tools/hashextent.h
+++ b/tools/hashextent.h
@@ -18,6 +18,11 @@
 #include <set>
 #include <algorithm>
 
+/* Support OpenSSL before 1.1.0 */
+#if OPENSSL_VERSION_NUMBER < 0x10100000L
+#define EVP_MD_CTX_new EVP_MD_CTX_create
+#define EVP_MD_CTX_free EVP_MD_CTX_destroy
+#endif
 
 using std::string;
 using std::ostream;
@@ -95,25 +100,29 @@ public:
      */
     int compute_digest(AFFILE *af,string digestToUse){
 	const EVP_MD *md = EVP_get_digestbyname(digestToUse.c_str());
-	EVP_MD_CTX ctx;
 	if(!md) return -1;		// digest not available
-	EVP_DigestInit(&ctx,md);
 	if(af_seek(af,start,0)!=start) return -1; // can't seek
+	EVP_MD_CTX *ctx = EVP_MD_CTX_new();
+	EVP_DigestInit(ctx,md);
 
 	uint64_t bytes_read = 0;
 	while(bytes_read < this->bytes){
 	    u_char buf[65536];
 	    int to_read = (this->bytes-bytes_read) < sizeof(buf) ? (this->bytes-bytes_read) : sizeof(buf);
-	    if(af_read(af,buf,to_read)!=to_read) return -1; // error reading
+	    if(af_read(af,buf,to_read)!=to_read){
+		EVP_MD_CTX_free(ctx);
+		return -1; // error reading
+	    }
 	    /* compute the hash */
-	    EVP_DigestUpdate(&ctx,buf,to_read);
+	    EVP_DigestUpdate(ctx,buf,to_read);
 	    bytes_read += to_read;
 	}
 	/* Compute the results */
 	if(digest!=0) free(digest);
 	u_int digest_bytes = 1024;
 	digest = (u_char *)malloc(digest_bytes);		// big enough for any conceivable digest
-	EVP_DigestFinal(&ctx,digest,&digest_bytes);
+	EVP_DigestFinal(ctx,digest,&digest_bytes);
+	EVP_MD_CTX_free(ctx);
 	digest_bits_ = digest_bytes*8;
 	digest_name  = digestToUse;
 	hexdigest    = bin2hex(digest,digest_bits_/8);
diff --git a/win32/affconfig.h b/win32/affconfig.h
index 65ac991..8318c33 100644
--- a/win32/affconfig.h
+++ b/win32/affconfig.h
@@ -1,6 +1,6 @@
 #include <windows.h>
 
-#define PACKAGE_VERSION "3.7.8"
+#define PACKAGE_VERSION "3.7.10"
 
 #undef USE_LIBEWF
 #undef USE_QEMU

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/forensics/afflib.git



More information about the forensics-changes mailing list