From d9ef4f90bb61109a48bb66254a784461313ea5ff Mon Sep 17 00:00:00 2001 From: Adrien Destugues Date: Sun, 17 May 2020 18:58:13 +0200 Subject: [PATCH] Remove GPL-licensed implementation of MD5 APE reader was using a GPL licensed version of MD5. A similar implementation in the public domain was available in libnetapi, which I moved to libshared so the APE reader can use it (and made some fixes, missing const mainly). It only needs a small wrapper to use it easily from C++ in a way compatible with the previous implementation. Part of #13814. --- .../private/shared}/md5.h | 8 +- src/add-ons/media/plugins/ape_reader/Jamfile | 2 +- .../plugins/ape_reader/MAClib/APESimple.cpp | 2 +- .../plugins/ape_reader/MAClib/BitArray.cpp | 1 - .../media/plugins/ape_reader/MAClib/Jamfile | 3 +- .../media/plugins/ape_reader/MAClib/MD5.cpp | 265 ------------------ .../media/plugins/ape_reader/MAClib/MD5.h | 59 +--- src/kits/network/libnetapi/Jamfile | 6 - src/kits/shared/Jamfile | 1 + src/kits/{network/libnetapi => shared}/md5.c | 6 +- 10 files changed, 26 insertions(+), 327 deletions(-) rename {src/kits/network/libnetapi => headers/private/shared}/md5.h (89%) delete mode 100644 src/add-ons/media/plugins/ape_reader/MAClib/MD5.cpp rename src/kits/{network/libnetapi => shared}/md5.c (97%) diff --git a/src/kits/network/libnetapi/md5.h b/headers/private/shared/md5.h similarity index 89% rename from src/kits/network/libnetapi/md5.h rename to headers/private/shared/md5.h index f56a48a2a6..23f36521a6 100644 --- a/src/kits/network/libnetapi/md5.h +++ b/headers/private/shared/md5.h @@ -25,6 +25,9 @@ #ifndef _MD5_H #define _MD5_H +#ifdef __cplusplus +extern "C" { +#endif /* Any 32-bit or wider unsigned integer data type will do */ typedef unsigned int MD5_u32plus; @@ -37,8 +40,11 @@ typedef struct { } MD5_CTX; extern void MD5_Init(MD5_CTX *ctx); -extern void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size); +extern void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size); extern void MD5_Final(unsigned char *result, MD5_CTX *ctx); +#ifdef __cplusplus +}; +#endif #endif diff --git a/src/add-ons/media/plugins/ape_reader/Jamfile b/src/add-ons/media/plugins/ape_reader/Jamfile index af9b74cdff..5f988e6f7e 100644 --- a/src/add-ons/media/plugins/ape_reader/Jamfile +++ b/src/add-ons/media/plugins/ape_reader/Jamfile @@ -14,7 +14,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { Addon [ MultiArchDefaultGristFiles ape_reader ] : APEReader.cpp : [ MultiArchDefaultGristFiles libMonkeysAudio.a MAClib.a ] - be media [ TargetLibsupc++ ] + be media shared [ TargetLibsupc++ ] ; } } diff --git a/src/add-ons/media/plugins/ape_reader/MAClib/APESimple.cpp b/src/add-ons/media/plugins/ape_reader/MAClib/APESimple.cpp index 47a324ea60..86c7e9cae3 100644 --- a/src/add-ons/media/plugins/ape_reader/MAClib/APESimple.cpp +++ b/src/add-ons/media/plugins/ape_reader/MAClib/APESimple.cpp @@ -8,8 +8,8 @@ #include IO_HEADER_FILE #include "MACProgressHelper.h" #include "GlobalFunctions.h" -#include "MD5.h" #include "CharacterHelper.h" +#include "MD5.h" #define UNMAC_DECODER_OUTPUT_NONE 0 #define UNMAC_DECODER_OUTPUT_WAV 1 diff --git a/src/add-ons/media/plugins/ape_reader/MAClib/BitArray.cpp b/src/add-ons/media/plugins/ape_reader/MAClib/BitArray.cpp index 23f17b7e63..2a19494fa2 100644 --- a/src/add-ons/media/plugins/ape_reader/MAClib/BitArray.cpp +++ b/src/add-ons/media/plugins/ape_reader/MAClib/BitArray.cpp @@ -3,7 +3,6 @@ Includes ************************************************************************************/ #include "All.h" #include "BitArray.h" -#include "MD5.h" /************************************************************************************ Declares diff --git a/src/add-ons/media/plugins/ape_reader/MAClib/Jamfile b/src/add-ons/media/plugins/ape_reader/MAClib/Jamfile index 6ec058a4a1..879d240354 100644 --- a/src/add-ons/media/plugins/ape_reader/MAClib/Jamfile +++ b/src/add-ons/media/plugins/ape_reader/MAClib/Jamfile @@ -2,6 +2,8 @@ SubDir HAIKU_TOP src add-ons media plugins ape_reader MAClib ; SubDirHdrs [ FDirName $(SUBDIR) ../LibMonkeysAudio ] ; +UsePrivateHeaders shared ; + local architectureObject ; for architectureObject in [ MultiArchSubDirSetup ] { on $(architectureObject) { @@ -21,7 +23,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { GlobalFunctions.cpp MACProgressHelper.cpp MACLib.cpp - MD5.cpp NewPredictor.cpp NNFilter.cpp Prepare.cpp diff --git a/src/add-ons/media/plugins/ape_reader/MAClib/MD5.cpp b/src/add-ons/media/plugins/ape_reader/MAClib/MD5.cpp deleted file mode 100644 index 82bd2a2961..0000000000 --- a/src/add-ons/media/plugins/ape_reader/MAClib/MD5.cpp +++ /dev/null @@ -1,265 +0,0 @@ -/***************************************************************************** -* -* "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm". -* -* 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 -* the Free Software Foundation; either version 2 of the License, or -* (at your option) any later version. -* -* This program is distributed in the hope that it will be useful, -* but WITHOUT ANY WARRANTY; without even the implied warranty of -* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -* GNU General Public License for more details. -* -* You should have received a copy of the GNU General Public License -* along with this program; if not, write to the Free Software -* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -* -*****************************************************************************/ - -#include "All.h" -#include -#include "MD5.h" - - -#if __BYTE_ORDER == __BIG_ENDIAN -/* - * Block copy and convert byte order to little-endian. - * dst must be 32bit aligned. - * Length is the number of 32bit words - */ -static void -CopyToLittleEndian ( uint32_t* dst, - const uint8_t* src, - size_t length ) -{ - for ( ; length--; src += 4, dst++ ) { - *dst = (( (uint32_t) src [3] ) << 24) | - (( (uint32_t) src [2] ) << 16) | - (( (uint32_t) src [1] ) << 8) | - (( (uint32_t) src [0] ) << 0); - - - } -} -#endif - - -/* - Assembler versions of __MD5Transform, MD5Init and MD5Update - currently exist for x86 and little-endian ARM. - For other targets, we need to use the C versions below. -*/ - -//#if !(defined (__i386__) || ((defined (__arm__) && (__BYTE_ORDER == __LITTLE_ENDIAN)))) -#if 1 /* SHINTA */ - -/* - Initialise the MD5 context. -*/ -void -MD5Init ( MD5_CTX* context ) -{ - context -> count [0] = 0; - context -> count [1] = 0; - - context -> state [0] = 0x67452301; /* Load magic constants. */ - context -> state [1] = 0xefcdab89; - context -> state [2] = 0x98badcfe; - context -> state [3] = 0x10325476; -} - -#define ROTATE_LEFT(x, n) ((x << n) | (x >> (32-n))) - -#define F(x, y, z) (z ^ (x & (y ^ z))) -#define G(x, y, z) (y ^ (z & (x ^ y))) -#define H(x, y, z) (x ^ y ^ z) -#define I(x, y, z) (y ^ (x | ~z)) - -#define FF(a, b, c, d, x, s, ac) { (a) += F (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); } -#define GG(a, b, c, d, x, s, ac) { (a) += G (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); } -#define HH(a, b, c, d, x, s, ac) { (a) += H (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); } -#define II(a, b, c, d, x, s, ac) { (a) += I (b, c, d) + (x) + (uint32_t)(ac); (a) = ROTATE_LEFT (a, s); (a) += (b); } - -static void -__MD5Transform ( uint32_t state [4], - const uint8_t* in, - int repeat ) -{ - const uint32_t* x; - uint32_t a = state [0]; - uint32_t b = state [1]; - uint32_t c = state [2]; - uint32_t d = state [3]; - - for ( ; repeat; repeat-- ) { - uint32_t tempBuffer [16]; -#if __BYTE_ORDER == __BIG_ENDIAN - - CopyToLittleEndian (tempBuffer, in, 16); - x = tempBuffer; -#else - if ( (unsigned int)in & 3 ) { - memcpy ( tempBuffer, in, 64 ); - x = tempBuffer; - } - else { - x = (const uint32_t*) in; - } -#endif - - FF (a, b, c, d, x[ 0], 7, 0xd76aa478); /* 1 */ /* Round 1 */ - FF (d, a, b, c, x[ 1], 12, 0xe8c7b756); /* 2 */ - FF (c, d, a, b, x[ 2], 17, 0x242070db); /* 3 */ - FF (b, c, d, a, x[ 3], 22, 0xc1bdceee); /* 4 */ - FF (a, b, c, d, x[ 4], 7, 0xf57c0faf); /* 5 */ - FF (d, a, b, c, x[ 5], 12, 0x4787c62a); /* 6 */ - FF (c, d, a, b, x[ 6], 17, 0xa8304613); /* 7 */ - FF (b, c, d, a, x[ 7], 22, 0xfd469501); /* 8 */ - FF (a, b, c, d, x[ 8], 7, 0x698098d8); /* 9 */ - FF (d, a, b, c, x[ 9], 12, 0x8b44f7af); /* 10 */ - FF (c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */ - FF (b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */ - FF (a, b, c, d, x[12], 7, 0x6b901122); /* 13 */ - FF (d, a, b, c, x[13], 12, 0xfd987193); /* 14 */ - FF (c, d, a, b, x[14], 17, 0xa679438e); /* 15 */ - FF (b, c, d, a, x[15], 22, 0x49b40821); /* 16 */ - - GG (a, b, c, d, x[ 1], 5, 0xf61e2562); /* 17 */ /* Round 2 */ - GG (d, a, b, c, x[ 6], 9, 0xc040b340); /* 18 */ - GG (c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */ - GG (b, c, d, a, x[ 0], 20, 0xe9b6c7aa); /* 20 */ - GG (a, b, c, d, x[ 5], 5, 0xd62f105d); /* 21 */ - GG (d, a, b, c, x[10], 9, 0x02441453); /* 22 */ - GG (c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */ - GG (b, c, d, a, x[ 4], 20, 0xe7d3fbc8); /* 24 */ - GG (a, b, c, d, x[ 9], 5, 0x21e1cde6); /* 25 */ - GG (d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */ - GG (c, d, a, b, x[ 3], 14, 0xf4d50d87); /* 27 */ - GG (b, c, d, a, x[ 8], 20, 0x455a14ed); /* 28 */ - GG (a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */ - GG (d, a, b, c, x[ 2], 9, 0xfcefa3f8); /* 30 */ - GG (c, d, a, b, x[ 7], 14, 0x676f02d9); /* 31 */ - GG (b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */ - - HH (a, b, c, d, x[ 5], 4, 0xfffa3942); /* 33 */ /* Round 3 */ - HH (d, a, b, c, x[ 8], 11, 0x8771f681); /* 34 */ - HH (c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */ - HH (b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */ - HH (a, b, c, d, x[ 1], 4, 0xa4beea44); /* 37 */ - HH (d, a, b, c, x[ 4], 11, 0x4bdecfa9); /* 38 */ - HH (c, d, a, b, x[ 7], 16, 0xf6bb4b60); /* 39 */ - HH (b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */ - HH (a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */ - HH (d, a, b, c, x[ 0], 11, 0xeaa127fa); /* 42 */ - HH (c, d, a, b, x[ 3], 16, 0xd4ef3085); /* 43 */ - HH (b, c, d, a, x[ 6], 23, 0x04881d05); /* 44 */ - HH (a, b, c, d, x[ 9], 4, 0xd9d4d039); /* 45 */ - HH (d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */ - HH (c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */ - HH (b, c, d, a, x[ 2], 23, 0xc4ac5665); /* 48 */ - - II (a, b, c, d, x[ 0], 6, 0xf4292244); /* 49 */ /* Round 4 */ - II (d, a, b, c, x[ 7], 10, 0x432aff97); /* 50 */ - II (c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */ - II (b, c, d, a, x[ 5], 21, 0xfc93a039); /* 52 */ - II (a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */ - II (d, a, b, c, x[ 3], 10, 0x8f0ccc92); /* 54 */ - II (c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */ - II (b, c, d, a, x[ 1], 21, 0x85845dd1); /* 56 */ - II (a, b, c, d, x[ 8], 6, 0x6fa87e4f); /* 57 */ - II (d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */ - II (c, d, a, b, x[ 6], 15, 0xa3014314); /* 59 */ - II (b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */ - II (a, b, c, d, x[ 4], 6, 0xf7537e82); /* 61 */ - II (d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */ - II (c, d, a, b, x[ 2], 15, 0x2ad7d2bb); /* 63 */ - II (b, c, d, a, x[ 9], 21, 0xeb86d391); /* 64 */ - - state [0] = a = a + state [0]; - state [1] = b = b + state [1]; - state [2] = c = c + state [2]; - state [3] = d = d + state [3]; - - in += 64; - } -} - - -/* - MD5 block update operation: - Process another sub-string of the message and update the context. -*/ - -void -MD5Update ( MD5_CTX* context, - const uint8_t* input, - size_t inputBytes ) -{ - int byteIndex; - unsigned int partLen; - int len; - int i; - - /* Compute number of bytes mod 64 */ - byteIndex = (context -> count[0] >> 3) & 0x3F; - - /* Update number of bits: count += 8 * inputBytes */ - if ( (context -> count [0] += inputBytes << 3) < (inputBytes << 3) ) - context -> count [1]++; - context -> count [1] += inputBytes >> (32 - 3); - - partLen = (64 - byteIndex); - - /* Transform as many times as possible. */ - if ( inputBytes >= partLen ) { - memcpy ( context -> buffer + byteIndex, input, partLen ); - __MD5Transform ( context -> state, (const uint8_t*) context -> buffer, 1 ); - len = ( inputBytes - partLen ) >> 6; - __MD5Transform ( context -> state, input + partLen, len ); - i = partLen + (len << 6); - byteIndex = 0; - } - else { - i = 0; - } - - /* Buffer remaining input */ - memcpy ( (context -> buffer) + byteIndex, input + i, inputBytes - i ); -} - -#endif - - -void -MD5Final ( uint8_t digest [16], - MD5_CTX* context ) -{ - static uint8_t finalBlock [64]; - uint32_t bits [2]; - int byteIndex; - int finalBlockLength; - - byteIndex = (context -> count[0] >> 3) & 0x3F; - finalBlockLength = (byteIndex < 56 ? 56 : 120) - byteIndex; - finalBlock[0] = 0x80; - -#if __BYTE_ORDER == __BIG_ENDIAN - CopyToLittleEndian ( bits, (const uint8_t*) context -> count, 2 ); -#else - memcpy ( bits, context->count, 8 ); -#endif - - MD5Update ( context, finalBlock, finalBlockLength ); - MD5Update ( context, (const uint8_t*) bits, 8 ); - -#if __BYTE_ORDER == __BIG_ENDIAN - CopyToLittleEndian ( (uint32_t*) digest, (const uint8_t*) context -> state, 4 ); -#else - memcpy ( digest, context -> state, 16 ); -#endif - - memset ( context, 0, sizeof (*context) ); -} - diff --git a/src/add-ons/media/plugins/ape_reader/MAClib/MD5.h b/src/add-ons/media/plugins/ape_reader/MAClib/MD5.h index 9fa01f30e6..23a01fb442 100644 --- a/src/add-ons/media/plugins/ape_reader/MAClib/MD5.h +++ b/src/add-ons/media/plugins/ape_reader/MAClib/MD5.h @@ -1,79 +1,42 @@ /* - * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved. - * - * License to copy and use this software is granted provided that it is identified - * as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material - * mentioning or referencing this software or this function. + * Copyright (C) 2020 Adrien Destugues * - * License is also granted to make and use derivative works provided that such - * works are identified as "derived from the RSA Data Security, Inc. MD5 Message- - * Digest Algorithm" in all material mentioning or referencing the derived work. - * - * RSA Data Security, Inc. makes no representations concerning either the - * merchantability of this software or the suitability of this software for any - * particular purpose. It is provided "as is" without express or implied warranty - * of any kind. These notices must be retained in any copies of any part of this - * documentation and/or software. + * Distributed under terms of the MIT license. */ -#ifndef MD5SUM_MD5_H -#define MD5SUM_MD5_H +#ifndef MD5_H +#define MD5_H -typedef unsigned int uint32_t; -typedef unsigned char uint8_t; -/* - * Define the MD5 context structure - * Please DO NOT change the order or contents of the structure as various assembler files depend on it !! - */ - -typedef struct { - uint32_t state [ 4]; /* state (ABCD) */ - uint32_t count [ 2]; /* number of bits, modulo 2^64 (least sig word first) */ - uint8_t buffer [64]; /* input buffer for incomplete buffer data */ -} MD5_CTX; +#include "md5.h" -void MD5Init ( MD5_CTX* ctx ); -void MD5Update ( MD5_CTX* ctx, const uint8_t* buf, size_t len ); -void MD5Final ( uint8_t digest [16], MD5_CTX* ctx ); class CMD5Helper { public: - CMD5Helper(BOOL bInitialize = TRUE) + CMD5Helper() { - if (bInitialize) - Initialize(); - } - - BOOL Initialize() - { - memset(&m_MD5Context, 0, sizeof(m_MD5Context)); - MD5Init(&m_MD5Context); + MD5_Init(&m_MD5Context); m_nTotalBytes = 0; - return TRUE; } inline void AddData(const void * pData, int nBytes) { - MD5Update(&m_MD5Context, (const unsigned char *) pData, nBytes); + MD5_Update(&m_MD5Context, (const unsigned char *) pData, nBytes); m_nTotalBytes += nBytes; } - BOOL GetResult(unsigned char cResult[16]) + void GetResult(unsigned char cResult[16]) { - memset(cResult, 0, 16); - MD5Final(cResult, &m_MD5Context); - return TRUE; + MD5_Final(cResult, &m_MD5Context); } protected: MD5_CTX m_MD5Context; - BOOL m_bStopped; int m_nTotalBytes; }; -#endif /* MD5SUM_MD5_H */ +#endif /* !MD5_H */ diff --git a/src/kits/network/libnetapi/Jamfile b/src/kits/network/libnetapi/Jamfile index 75f5d821c1..52d2233c42 100644 --- a/src/kits/network/libnetapi/Jamfile +++ b/src/kits/network/libnetapi/Jamfile @@ -12,7 +12,6 @@ local architectureObject ; for architectureObject in [ MultiArchSubDirSetup ] { on $(architectureObject) { local sslSources ; - local md5Sources ; UsePrivateSystemHeaders ; @@ -20,7 +19,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { SubDirC++Flags -DOPENSSL_ENABLED ; UseBuildFeatureHeaders openssl ; sslSources = SSL.cpp ; - md5Sources = ; Includes [ FGristFiles $(sslSources) SecureSocket.cpp HttpAuthentication.cpp Certificate.cpp ] : [ BuildFeatureAttribute openssl : headers ] ; @@ -28,8 +26,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { # before compiling the files. SetupFeatureObjectsDir ssl ; } else { - # As we don't have md5 from ssl, use our own - md5Sources = md5.c ; SetupFeatureObjectsDir no-ssl ; } @@ -79,8 +75,6 @@ for architectureObject in [ MultiArchSubDirSetup ] { notifications.cpp - $(md5Sources) - NetworkRequest.cpp UrlContext.cpp UrlProtocolAsynchronousListener.cpp diff --git a/src/kits/shared/Jamfile b/src/kits/shared/Jamfile index 5d2f756854..0d9fe844bc 100644 --- a/src/kits/shared/Jamfile +++ b/src/kits/shared/Jamfile @@ -50,6 +50,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { Json.cpp Keymap.cpp LongAndDragTrackingFilter.cpp + md5.c MessageBuilder.cpp NaturalCompare.cpp PromptWindow.cpp diff --git a/src/kits/network/libnetapi/md5.c b/src/kits/shared/md5.c similarity index 97% rename from src/kits/network/libnetapi/md5.c rename to src/kits/shared/md5.c index efdf4cd2a3..d91aed3193 100644 --- a/src/kits/network/libnetapi/md5.c +++ b/src/kits/shared/md5.c @@ -89,9 +89,9 @@ * This processes one or more 64-byte data blocks, but does NOT update * the bit counters. There are no alignment requirements. */ -static void *body(MD5_CTX *ctx, void *data, unsigned long size) +static const void *body(MD5_CTX *ctx, const void *data, unsigned long size) { - unsigned char *ptr; + const unsigned char *ptr; MD5_u32plus a, b, c, d; MD5_u32plus saved_a, saved_b, saved_c, saved_d; @@ -207,7 +207,7 @@ void MD5_Init(MD5_CTX *ctx) ctx->hi = 0; } -void MD5_Update(MD5_CTX *ctx, void *data, unsigned long size) +void MD5_Update(MD5_CTX *ctx, const void *data, unsigned long size) { MD5_u32plus saved_lo; unsigned long used, free;