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

guillem pushed a commit to branch main
in repository dpkg.

View the commit online:
https://git.dpkg.org/cgit/dpkg/dpkg.git/commit/?id=2767801430de3c6d4ec7394e286fc261a8180feb

commit 2767801430de3c6d4ec7394e286fc261a8180feb
Author: Guillem Jover <[email protected]>
AuthorDate: Mon Aug 1 05:43:09 2022 +0200

    build: Fully switch to libmd for MD5 implementation
    
    Instead of embedding the MD5 digest implementation into libcompat, and
    potentially requiring keeping adding other digest functions there, fully
    switch to require these functions to be provided either by the system
    libc or by a libmd compatible project, such as
    <https://www.hadrons.org/software/libmd/>.
---
 README                 |   2 +-
 debian/control         |   1 +
 debian/copyright       |  14 ---
 debian/rules           |   1 -
 lib/compat/Makefile.am |   5 -
 lib/compat/md5.c       | 252 -------------------------------------------------
 lib/compat/md5.h       |  36 -------
 m4/dpkg-libs.m4        |  31 +++---
 8 files changed, 14 insertions(+), 328 deletions(-)

diff --git a/README b/README
index 9cff838c9..43ef063a6 100644
--- a/README
+++ b/README
@@ -81,7 +81,7 @@ The minimum software required to configure and build dpkg 
from a tarball is:
 
 To enable optional functionality or programs, this software might be needed:
 
-  libmd (used by libdpkg, currently falling back to embedded code)
+  libmd (used by libdpkg, required if libc is missing digest functions)
   libz (from zlib, used instead of gzip command-line tool)
   liblzma (from xz utils, used instead of xz command-line tool)
   libbz2 (from bzip2, used instead of bzip2 command-line tool)
diff --git a/debian/control b/debian/control
index 348f46c86..3666addda 100644
--- a/debian/control
+++ b/debian/control
@@ -15,6 +15,7 @@ Build-Depends:
  gettext (>= 0.19.7),
 # Needed for --porefs defaults, conditional addenda and mode=eof.
  po4a (>= 0.59),
+ libmd-dev,
  zlib1g-dev,
  libbz2-dev,
  liblzma-dev,
diff --git a/debian/copyright b/debian/copyright
index 358e92a81..ab3ae7462 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -110,20 +110,6 @@ License: public-domain-s-s-d
  Changes by Ben Collins <[email protected]>, added --chuid, --background
  and --make-pidfile options, placed in public domain as well.
 
-Files: lib/compat/md5.*
-Copyright:
- Copyright © 1993 Colin Plumb
-License: public-domain-md5
- This code implements the MD5 message-digest algorithm.
- The algorithm is due to Ron Rivest.  This code was
- written by Colin Plumb in 1993, no copyright is claimed.
- This code is in the public domain; do with it what you wish.
- .
- Equivalent code is available from RSA Data Security, Inc.
- This code has been tested against that, and is equivalent,
- except that you don't need to include two pages of legalese
- with every copy.
-
 License: GPL-2+
  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
diff --git a/debian/rules b/debian/rules
index de1505201..49ecd7f32 100755
--- a/debian/rules
+++ b/debian/rules
@@ -50,7 +50,6 @@ override_dh_auto_configure:
                --sbindir=/sbin \
                --libexecdir=\$${exec_prefix}/lib \
                --with-devlibdir=\$${prefix}/lib/$(DEB_HOST_MULTIARCH) \
-               --without-libmd \
                --with-libz \
                --with-liblzma \
                --with-libbz2 \
diff --git a/lib/compat/Makefile.am b/lib/compat/Makefile.am
index d87d298ab..d7e786967 100644
--- a/lib/compat/Makefile.am
+++ b/lib/compat/Makefile.am
@@ -17,7 +17,6 @@ libcompat_test_la_CPPFLAGS = \
        # EOL
 libcompat_test_la_SOURCES = \
        compat.h \
-       md5.c md5.h \
        strchrnul.c \
        strnlen.c \
        strndup.c \
@@ -40,10 +39,6 @@ libcompat_la_SOURCES = \
        gettext.h \
        # EOL
 
-if !HAVE_LIBMD_MD5
-libcompat_la_SOURCES += md5.c md5.h
-endif
-
 if !HAVE_GETOPT
 libcompat_la_SOURCES += getopt.c getopt.h
 else
diff --git a/lib/compat/md5.c b/lib/compat/md5.c
deleted file mode 100644
index 7da974635..000000000
--- a/lib/compat/md5.c
+++ /dev/null
@@ -1,252 +0,0 @@
-/*     $OpenBSD: md5.c,v 1.7 2004/05/28 15:10:27 millert Exp $ */
-
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- *
- * To compute the message digest of a chunk of bytes, declare an
- * MD5Context structure, pass it to MD5Init, call MD5Update as
- * needed on buffers full of bytes, and then call MD5Final, which
- * will fill a supplied 16-byte array with the digest.
- */
-
-#include <config.h>
-#include <compat.h>
-
-#include <sys/types.h>
-#include <string.h>
-
-#include "md5.h"
-
-#define PUT_64BIT_LE(cp, value) do {                                   \
-       (cp)[7] = (value) >> 56;                                        \
-       (cp)[6] = (value) >> 48;                                        \
-       (cp)[5] = (value) >> 40;                                        \
-       (cp)[4] = (value) >> 32;                                        \
-       (cp)[3] = (value) >> 24;                                        \
-       (cp)[2] = (value) >> 16;                                        \
-       (cp)[1] = (value) >> 8;                                         \
-       (cp)[0] = (value); } while (0)
-
-#define PUT_32BIT_LE(cp, value) do {                                   \
-       (cp)[3] = (value) >> 24;                                        \
-       (cp)[2] = (value) >> 16;                                        \
-       (cp)[1] = (value) >> 8;                                         \
-       (cp)[0] = (value); } while (0)
-
-static uint8_t PADDING[MD5_BLOCK_LENGTH] = {
-       0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/*
- * Start MD5 accumulation.  Set bit count to 0 and buffer to mysterious
- * initialization constants.
- */
-void
-MD5Init(MD5_CTX *ctx)
-{
-       ctx->count = 0;
-       ctx->state[0] = 0x67452301;
-       ctx->state[1] = 0xefcdab89;
-       ctx->state[2] = 0x98badcfe;
-       ctx->state[3] = 0x10325476;
-}
-
-/*
- * Update context to reflect the concatenation of another buffer full
- * of bytes.
- */
-void
-MD5Update(MD5_CTX *ctx, const unsigned char *input, size_t len)
-{
-       size_t have, need;
-
-       /* Check how many bytes we already have and how many more we need. */
-       have = (size_t)((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1));
-       need = MD5_BLOCK_LENGTH - have;
-
-       /* Update bitcount */
-       ctx->count += (uint64_t)len << 3;
-
-       if (len >= need) {
-               if (have != 0) {
-                       memcpy(ctx->buffer + have, input, need);
-                       MD5Transform(ctx->state, ctx->buffer);
-                       input += need;
-                       len -= need;
-                       have = 0;
-               }
-
-               /* Process data in MD5_BLOCK_LENGTH-byte chunks. */
-               while (len >= MD5_BLOCK_LENGTH) {
-                       MD5Transform(ctx->state, input);
-                       input += MD5_BLOCK_LENGTH;
-                       len -= MD5_BLOCK_LENGTH;
-               }
-       }
-
-       /* Handle any remaining bytes of data. */
-       if (len != 0)
-               memcpy(ctx->buffer + have, input, len);
-}
-
-/*
- * Pad pad to 64-byte boundary with the bit pattern
- * 1 0* (64-bit count of bits processed, MSB-first)
- */
-void
-MD5Pad(MD5_CTX *ctx)
-{
-       uint8_t count[8];
-       size_t padlen;
-
-       /* Convert count to 8 bytes in little endian order. */
-       PUT_64BIT_LE(count, ctx->count);
-
-       /* Pad out to 56 mod 64. */
-       padlen = MD5_BLOCK_LENGTH -
-           ((ctx->count >> 3) & (MD5_BLOCK_LENGTH - 1));
-       if (padlen < 1 + 8)
-               padlen += MD5_BLOCK_LENGTH;
-       MD5Update(ctx, PADDING, padlen - 8);            /* padlen - 8 <= 64 */
-       MD5Update(ctx, count, 8);
-}
-
-/*
- * Final wrapup--call MD5Pad, fill in digest and zero out ctx.
- */
-void
-MD5Final(unsigned char digest[MD5_DIGEST_LENGTH], MD5_CTX *ctx)
-{
-       int i;
-
-       MD5Pad(ctx);
-       if (digest != NULL) {
-               for (i = 0; i < 4; i++)
-                       PUT_32BIT_LE(digest + i * 4, ctx->state[i]);
-               memset(ctx, 0, sizeof(*ctx));
-       }
-}
-
-
-/* The four core functions - F1 is optimized somewhat */
-
-/* #define F1(x, y, z) (x & y | ~x & z) */
-#define F1(x, y, z) (z ^ (x & (y ^ z)))
-#define F2(x, y, z) F1(z, x, y)
-#define F3(x, y, z) (x ^ y ^ z)
-#define F4(x, y, z) (y ^ (x | ~z))
-
-/* This is the central step in the MD5 algorithm. */
-#define MD5STEP(f, w, x, y, z, data, s) \
-       ( w += f(x, y, z) + data,  w = w<<s | w>>(32-s),  w += x )
-
-/*
- * The core of the MD5 algorithm, this alters an existing MD5 hash to
- * reflect the addition of 16 longwords of new data.  MD5Update blocks
- * the data and converts bytes into longwords for this routine.
- */
-void
-MD5Transform(uint32_t state[4], const uint8_t block[MD5_BLOCK_LENGTH])
-{
-       uint32_t a, b, c, d, in[MD5_BLOCK_LENGTH / 4];
-
-#ifndef WORDS_BIGENDIAN
-       memcpy(in, block, sizeof(in));
-#else
-       for (a = 0; a < MD5_BLOCK_LENGTH / 4; a++) {
-               in[a] = (uint32_t)(
-                   (uint32_t)(block[a * 4 + 0]) |
-                   (uint32_t)(block[a * 4 + 1]) <<  8 |
-                   (uint32_t)(block[a * 4 + 2]) << 16 |
-                   (uint32_t)(block[a * 4 + 3]) << 24);
-       }
-#endif
-
-       a = state[0];
-       b = state[1];
-       c = state[2];
-       d = state[3];
-
-       MD5STEP(F1, a, b, c, d, in[ 0] + 0xd76aa478,  7);
-       MD5STEP(F1, d, a, b, c, in[ 1] + 0xe8c7b756, 12);
-       MD5STEP(F1, c, d, a, b, in[ 2] + 0x242070db, 17);
-       MD5STEP(F1, b, c, d, a, in[ 3] + 0xc1bdceee, 22);
-       MD5STEP(F1, a, b, c, d, in[ 4] + 0xf57c0faf,  7);
-       MD5STEP(F1, d, a, b, c, in[ 5] + 0x4787c62a, 12);
-       MD5STEP(F1, c, d, a, b, in[ 6] + 0xa8304613, 17);
-       MD5STEP(F1, b, c, d, a, in[ 7] + 0xfd469501, 22);
-       MD5STEP(F1, a, b, c, d, in[ 8] + 0x698098d8,  7);
-       MD5STEP(F1, d, a, b, c, in[ 9] + 0x8b44f7af, 12);
-       MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
-       MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
-       MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122,  7);
-       MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
-       MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
-       MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
-
-       MD5STEP(F2, a, b, c, d, in[ 1] + 0xf61e2562,  5);
-       MD5STEP(F2, d, a, b, c, in[ 6] + 0xc040b340,  9);
-       MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
-       MD5STEP(F2, b, c, d, a, in[ 0] + 0xe9b6c7aa, 20);
-       MD5STEP(F2, a, b, c, d, in[ 5] + 0xd62f105d,  5);
-       MD5STEP(F2, d, a, b, c, in[10] + 0x02441453,  9);
-       MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
-       MD5STEP(F2, b, c, d, a, in[ 4] + 0xe7d3fbc8, 20);
-       MD5STEP(F2, a, b, c, d, in[ 9] + 0x21e1cde6,  5);
-       MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6,  9);
-       MD5STEP(F2, c, d, a, b, in[ 3] + 0xf4d50d87, 14);
-       MD5STEP(F2, b, c, d, a, in[ 8] + 0x455a14ed, 20);
-       MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905,  5);
-       MD5STEP(F2, d, a, b, c, in[ 2] + 0xfcefa3f8,  9);
-       MD5STEP(F2, c, d, a, b, in[ 7] + 0x676f02d9, 14);
-       MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
-
-       MD5STEP(F3, a, b, c, d, in[ 5] + 0xfffa3942,  4);
-       MD5STEP(F3, d, a, b, c, in[ 8] + 0x8771f681, 11);
-       MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
-       MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
-       MD5STEP(F3, a, b, c, d, in[ 1] + 0xa4beea44,  4);
-       MD5STEP(F3, d, a, b, c, in[ 4] + 0x4bdecfa9, 11);
-       MD5STEP(F3, c, d, a, b, in[ 7] + 0xf6bb4b60, 16);
-       MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
-       MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6,  4);
-       MD5STEP(F3, d, a, b, c, in[ 0] + 0xeaa127fa, 11);
-       MD5STEP(F3, c, d, a, b, in[ 3] + 0xd4ef3085, 16);
-       MD5STEP(F3, b, c, d, a, in[ 6] + 0x04881d05, 23);
-       MD5STEP(F3, a, b, c, d, in[ 9] + 0xd9d4d039,  4);
-       MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
-       MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
-       MD5STEP(F3, b, c, d, a, in[2 ] + 0xc4ac5665, 23);
-
-       MD5STEP(F4, a, b, c, d, in[ 0] + 0xf4292244,  6);
-       MD5STEP(F4, d, a, b, c, in[7 ] + 0x432aff97, 10);
-       MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
-       MD5STEP(F4, b, c, d, a, in[5 ] + 0xfc93a039, 21);
-       MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3,  6);
-       MD5STEP(F4, d, a, b, c, in[3 ] + 0x8f0ccc92, 10);
-       MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
-       MD5STEP(F4, b, c, d, a, in[1 ] + 0x85845dd1, 21);
-       MD5STEP(F4, a, b, c, d, in[8 ] + 0x6fa87e4f,  6);
-       MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
-       MD5STEP(F4, c, d, a, b, in[6 ] + 0xa3014314, 15);
-       MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
-       MD5STEP(F4, a, b, c, d, in[4 ] + 0xf7537e82,  6);
-       MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
-       MD5STEP(F4, c, d, a, b, in[2 ] + 0x2ad7d2bb, 15);
-       MD5STEP(F4, b, c, d, a, in[9 ] + 0xeb86d391, 21);
-
-       state[0] += a;
-       state[1] += b;
-       state[2] += c;
-       state[3] += d;
-}
diff --git a/lib/compat/md5.h b/lib/compat/md5.h
deleted file mode 100644
index b5247d527..000000000
--- a/lib/compat/md5.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*     $OpenBSD: md5.h,v 1.15 2004/05/03 17:30:14 millert Exp $        */
-
-/*
- * This code implements the MD5 message-digest algorithm.
- * The algorithm is due to Ron Rivest.  This code was
- * written by Colin Plumb in 1993, no copyright is claimed.
- * This code is in the public domain; do with it what you wish.
- *
- * Equivalent code is available from RSA Data Security, Inc.
- * This code has been tested against that, and is equivalent,
- * except that you don't need to include two pages of legalese
- * with every copy.
- */
-
-#ifndef _MD5_H_
-#define _MD5_H_
-
-#include <stdint.h>
-
-#define        MD5_BLOCK_LENGTH                64
-#define        MD5_DIGEST_LENGTH               16
-#define        MD5_DIGEST_STRING_LENGTH        (MD5_DIGEST_LENGTH * 2 + 1)
-
-typedef struct MD5Context {
-       uint32_t state[4];                      /* state */
-       uint64_t count;                 /* number of bits, mod 2^64 */
-       uint8_t buffer[MD5_BLOCK_LENGTH];       /* input buffer */
-} MD5_CTX;
-
-void    MD5Init(MD5_CTX *);
-void    MD5Update(MD5_CTX *, const uint8_t *, size_t);
-void    MD5Pad(MD5_CTX *);
-void    MD5Final(uint8_t [MD5_DIGEST_LENGTH], MD5_CTX *);
-void    MD5Transform(uint32_t [4], const uint8_t [MD5_BLOCK_LENGTH]);
-
-#endif /* _MD5_H_ */
diff --git a/m4/dpkg-libs.m4 b/m4/dpkg-libs.m4
index 7f227c381..8dd1ebda5 100644
--- a/m4/dpkg-libs.m4
+++ b/m4/dpkg-libs.m4
@@ -8,28 +8,21 @@
 # Check for the message digest library.
 AC_DEFUN([DPKG_LIB_MD], [
   AC_ARG_VAR([MD_LIBS], [linker flags for md library])
-  AC_ARG_WITH([libmd],
-    [AS_HELP_STRING([--with-libmd],
-      [use libmd library for message digest functions])],
-    [], [with_libmd=check])
   have_libmd="no"
-  AS_IF([test "x$with_libmd" != "xno"], [
-    AC_CHECK_HEADERS([md5.h], [
-      dpkg_save_libmd_LIBS=$LIBS
-      AC_SEARCH_LIBS([MD5Init], [md])
-      LIBS=$dpkg_save_libmd_LIBS
-      AS_IF([test "x$ac_cv_search_MD5Init" = "xnone required"], [
-        have_libmd="builtin"
-      ], [test "x$ac_cv_search_MD5Init" != "xno"], [
-        have_libmd="yes"
-        MD_LIBS="$ac_cv_search_MD5Init"
-      ])
-    ])
-    AS_IF([test "x$with_libmd" = "xyes" && test "x$have_libmd" = "xno"], [
-      AC_MSG_FAILURE([md5 digest functions not found])
+  AC_CHECK_HEADERS([md5.h], [
+    dpkg_save_libmd_LIBS=$LIBS
+    AC_SEARCH_LIBS([MD5Init], [md])
+    LIBS=$dpkg_save_libmd_LIBS
+    AS_IF([test "x$ac_cv_search_MD5Init" = "xnone required"], [
+      have_libmd="builtin"
+    ], [test "x$ac_cv_search_MD5Init" != "xno"], [
+      have_libmd="yes"
+      MD_LIBS="$ac_cv_search_MD5Init"
     ])
   ])
-  AM_CONDITIONAL([HAVE_LIBMD_MD5], [test "x$have_libmd" != "xno"])
+  AS_IF([test "x$have_libmd" = "xno"], [
+    AC_MSG_FAILURE([md5 digest functions not found])
+  ])
 ])# DPKG_LIB_MD
 
 # DPKG_WITH_COMPRESS_LIB(NAME, HEADER, FUNC)

-- 
Dpkg.Org's dpkg

Reply via email to