--- cksum.c.orig	2010-12-13 14:42:49.000000000 +1100
+++ cksum.c	2020-01-29 08:49:22.000000000 +1100
@@ -41,20 +41,26 @@ do_fcksum( int fd, char *cksum_b64 )
     off_t		size = 0;
     unsigned char	buf[ 8192 ];
     extern EVP_MD	*md;
-    EVP_MD_CTX		mdctx;
+    EVP_MD_CTX		*mdctx;
     unsigned char 	md_value[ EVP_MAX_MD_SIZE ];
 
-    EVP_DigestInit( &mdctx, md );
+    mdctx = EVP_MD_CTX_new();
+    if (!mdctx) {
+        return( -1 );
+    }
+    EVP_DigestInit( mdctx, md );
 
     while (( rr = read( fd, buf, sizeof( buf ))) > 0 ) {
 	size += rr;
-	EVP_DigestUpdate( &mdctx, buf, (unsigned int)rr );
+	EVP_DigestUpdate( mdctx, buf, (unsigned int)rr );
     }
     if ( rr < 0 ) {
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
-    EVP_DigestFinal( &mdctx, md_value, &md_len );
+    EVP_DigestFinal( mdctx, md_value, &md_len );
+    EVP_MD_CTX_free( mdctx );
     base64_e( md_value, md_len, cksum_b64 );
 
     return( size );
@@ -103,13 +109,17 @@ do_acksum( char *path, char *cksum_b64, 
     struct as_entry		as_entries_endian[ 3 ];
     unsigned int		md_len;
     extern EVP_MD		*md;
-    EVP_MD_CTX          	mdctx;
+    EVP_MD_CTX          	*mdctx;
     unsigned char       	md_value[ EVP_MAX_MD_SIZE ];
 
-    EVP_DigestInit( &mdctx, md ); 
+    mdctx = EVP_MD_CTX_new();
+    if (!mdctx) {
+        return( -1 );
+    }
+    EVP_DigestInit( mdctx, md ); 
 
     /* checksum applesingle header */
-    EVP_DigestUpdate( &mdctx, (char *)&as_header, AS_HEADERLEN );
+    EVP_DigestUpdate( mdctx, (char *)&as_header, AS_HEADERLEN );
     size += (size_t)AS_HEADERLEN;
 
     /* endian handling, sum big-endian header entries */
@@ -120,53 +130,61 @@ do_acksum( char *path, char *cksum_b64, 
     as_entry_netswap( &as_entries_endian[ AS_DFE ] );
 
     /* checksum header entries */
-    EVP_DigestUpdate( &mdctx, (char *)&as_entries_endian,
+    EVP_DigestUpdate( mdctx, (char *)&as_entries_endian,
 		(unsigned int)( 3 * sizeof( struct as_entry )));
     size += sizeof( 3 * sizeof( struct as_entry ));
 
     /* checksum finder info data */
-    EVP_DigestUpdate( &mdctx, afinfo->ai.ai_data, FINFOLEN );
+    EVP_DigestUpdate( mdctx, afinfo->ai.ai_data, FINFOLEN );
     size += FINFOLEN;
 
     /* checksum rsrc fork data */
     if ( afinfo->as_ents[ AS_RFE ].ae_length > 0 ) {
         if ( snprintf( rsrc_path, MAXPATHLEN, "%s%s",
 		path, _PATH_RSRCFORKSPEC ) >= MAXPATHLEN ) {
+            EVP_MD_CTX_free( mdctx );
             errno = ENAMETOOLONG;
             return( -1 );
         }
 
 	if (( rfd = open( rsrc_path, O_RDONLY )) < 0 ) {
+	    EVP_MD_CTX_free( mdctx );
 	    return( -1 );
 	}
 	while (( rc = read( rfd, buf, sizeof( buf ))) > 0 ) {
-	    EVP_DigestUpdate( &mdctx, buf, (unsigned int)rc );
+	    EVP_DigestUpdate( mdctx, buf, (unsigned int)rc );
 	    size += (size_t)rc;
 	}
 	if ( close( rfd ) < 0 ) {
+	    EVP_MD_CTX_free( mdctx );
 	    return( -1 );
 	}
 	if ( rc < 0 ) {
+	    EVP_MD_CTX_free( mdctx );
 	    return( -1 );
 	}
     }
 
     if (( dfd = open( path, O_RDONLY, 0 )) < 0 ) {
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     /* checksum data fork */
     while (( rc = read( dfd, buf, sizeof( buf ))) > 0 ) {
-	EVP_DigestUpdate( &mdctx, buf, (unsigned int)rc );
+	EVP_DigestUpdate( mdctx, buf, (unsigned int)rc );
 	size += (size_t)rc;
     }
     if ( rc < 0 ) {
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
     if ( close( dfd ) < 0 ) {
+	EVP_MD_CTX_free( mdctx );
 	return( -1 );
     }
 
-    EVP_DigestFinal( &mdctx, md_value, &md_len );
+    EVP_DigestFinal( mdctx, md_value, &md_len );
+    EVP_MD_CTX_free( mdctx );
     base64_e( ( char*)&md_value, md_len, cksum_b64 );
 
     return( size );
