From 96075faf88bf65ed7b94985f98228a2d0974a437 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Sun, 2 Feb 2014 09:21:31 +0000 Subject: [PATCH] Namespace clementine's 3rdparty implementation of sha2 to prevent its symbols conflicting with the system's openssl symbols with the same names. This was causing SSL connections to fail in weird ways on Debian. Fixes #4130. --- 3rdparty/sha2/CMakeLists.txt | 2 +- 3rdparty/sha2/{sha2.c => sha2.cpp} | 3 + 3rdparty/sha2/sha2.h | 121 ++++------------------------- src/core/utilities.cpp | 14 ++-- 4 files changed, 26 insertions(+), 114 deletions(-) rename 3rdparty/sha2/{sha2.c => sha2.cpp} (99%) diff --git a/3rdparty/sha2/CMakeLists.txt b/3rdparty/sha2/CMakeLists.txt index 9befb1ecd..3a5da0a2f 100644 --- a/3rdparty/sha2/CMakeLists.txt +++ b/3rdparty/sha2/CMakeLists.txt @@ -1,3 +1,3 @@ cmake_minimum_required(VERSION 2.6) -add_library(sha2 STATIC sha2.c) +add_library(sha2 STATIC sha2.cpp) diff --git a/3rdparty/sha2/sha2.c b/3rdparty/sha2/sha2.cpp similarity index 99% rename from 3rdparty/sha2/sha2.c rename to 3rdparty/sha2/sha2.cpp index 7ad5ea666..36be426a9 100644 --- a/3rdparty/sha2/sha2.c +++ b/3rdparty/sha2/sha2.cpp @@ -92,6 +92,8 @@ #error Define BYTE_ORDER to be equal to either LITTLE_ENDIAN or BIG_ENDIAN #endif +namespace clementine_sha2 { + /* * Define the followingsha2_* types to types of the correct length on * the native archtecture. Most BSD systems and Linux define u_intXX_t @@ -1066,3 +1068,4 @@ char* SHA384_Data(const sha2_byte* data, size_t len, char digest[SHA384_DIGEST_S return SHA384_End(&context, digest); } +} // namespace clementine_sha2 diff --git a/3rdparty/sha2/sha2.h b/3rdparty/sha2/sha2.h index e8413e549..6f2335511 100644 --- a/3rdparty/sha2/sha2.h +++ b/3rdparty/sha2/sha2.h @@ -32,13 +32,8 @@ * $Id: sha2.h,v 1.1 2001/11/08 00:02:01 adg Exp adg $ */ -#ifndef __SHA2_H__ -#define __SHA2_H__ - -#ifdef __cplusplus -extern "C" { -#endif - +#ifndef __CLEMENTINE_SHA2_H__ +#define __CLEMENTINE_SHA2_H__ /* * Import u_intXX_t size_t type definitions from system headers. You @@ -47,23 +42,18 @@ extern "C" { */ #include -#ifdef SHA2_USE_INTTYPES_H - -#include - -#endif /* SHA2_USE_INTTYPES_H */ - +namespace clementine_sha2 { /*** SHA-256/384/512 Various Length Definitions ***********************/ -#define SHA256_BLOCK_LENGTH 64 -#define SHA256_DIGEST_LENGTH 32 -#define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) -#define SHA384_BLOCK_LENGTH 128 -#define SHA384_DIGEST_LENGTH 48 -#define SHA384_DIGEST_STRING_LENGTH (SHA384_DIGEST_LENGTH * 2 + 1) -#define SHA512_BLOCK_LENGTH 128 -#define SHA512_DIGEST_LENGTH 64 -#define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1) +static const int SHA256_BLOCK_LENGTH = 64; +static const int SHA256_DIGEST_LENGTH = 32; +static const int SHA256_DIGEST_STRING_LENGTH = (SHA256_DIGEST_LENGTH * 2 + 1); +static const int SHA384_BLOCK_LENGTH = 128; +static const int SHA384_DIGEST_LENGTH = 48; +static const int SHA384_DIGEST_STRING_LENGTH = (SHA384_DIGEST_LENGTH * 2 + 1); +static const int SHA512_BLOCK_LENGTH = 128; +static const int SHA512_DIGEST_LENGTH = 64; +static const int SHA512_DIGEST_STRING_LENGTH = (SHA512_DIGEST_LENGTH * 2 + 1); /*** SHA-256/384/512 Context Structures *******************************/ @@ -76,36 +66,6 @@ typedef unsigned char u_int8_t; /* 1-byte (8-bits) */ typedef unsigned int u_int32_t; /* 4-bytes (32-bits) */ typedef unsigned long long u_int64_t; /* 8-bytes (64-bits) */ #endif -/* - * Most BSD systems already define u_intXX_t types, as does Linux. - * Some systems, however, like Compaq's Tru64 Unix instead can use - * uintXX_t types defined by very recent ANSI C standards and included - * in the file: - * - * #include - * - * If you choose to use then please define: - * - * #define SHA2_USE_INTTYPES_H - * - * Or on the command line during compile: - * - * cc -DSHA2_USE_INTTYPES_H ... - */ -#ifdef SHA2_USE_INTTYPES_H - -typedef struct _SHA256_CTX { - uint32_t state[8]; - uint64_t bitcount; - uint8_t buffer[SHA256_BLOCK_LENGTH]; -} SHA256_CTX; -typedef struct _SHA512_CTX { - uint64_t state[8]; - uint64_t bitcount[2]; - uint8_t buffer[SHA512_BLOCK_LENGTH]; -} SHA512_CTX; - -#else /* SHA2_USE_INTTYPES_H */ typedef struct _SHA256_CTX { u_int32_t state[8]; @@ -118,35 +78,9 @@ typedef struct _SHA512_CTX { u_int8_t buffer[SHA512_BLOCK_LENGTH]; } SHA512_CTX; -#endif /* SHA2_USE_INTTYPES_H */ - typedef SHA512_CTX SHA384_CTX; -/*** SHA-256/384/512 Function Prototypes ******************************/ -#ifndef NOPROTO -#ifdef SHA2_USE_INTTYPES_H - -void SHA256_Init(SHA256_CTX *); -void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t); -void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); -char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); -char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); - -void SHA384_Init(SHA384_CTX*); -void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t); -void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*); -char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]); -char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]); - -void SHA512_Init(SHA512_CTX*); -void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t); -void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); -char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); -char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); - -#else /* SHA2_USE_INTTYPES_H */ - void SHA256_Init(SHA256_CTX *); void SHA256_Update(SHA256_CTX*, const u_int8_t*, size_t); void SHA256_Final(u_int8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*); @@ -165,33 +99,6 @@ void SHA512_Final(u_int8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*); char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]); char* SHA512_Data(const u_int8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]); -#endif /* SHA2_USE_INTTYPES_H */ - -#else /* NOPROTO */ - -void SHA256_Init(); -void SHA256_Update(); -void SHA256_Final(); -char* SHA256_End(); -char* SHA256_Data(); - -void SHA384_Init(); -void SHA384_Update(); -void SHA384_Final(); -char* SHA384_End(); -char* SHA384_Data(); - -void SHA512_Init(); -void SHA512_Update(); -void SHA512_Final(); -char* SHA512_End(); -char* SHA512_Data(); - -#endif /* NOPROTO */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __SHA2_H__ */ +} // namespace clementine_sha2 +#endif /* __CLEMENTINE_SHA2_H__ */ diff --git a/src/core/utilities.cpp b/src/core/utilities.cpp index 4c89139bb..0f7dc6373 100644 --- a/src/core/utilities.cpp +++ b/src/core/utilities.cpp @@ -445,13 +445,15 @@ QByteArray HmacSha1(const QByteArray& key, const QByteArray& data) { } QByteArray Sha256(const QByteArray& data) { - SHA256_CTX context; - SHA256_Init(&context); - SHA256_Update(&context, reinterpret_cast(data.constData()), - data.length()); + clementine_sha2::SHA256_CTX context; + clementine_sha2::SHA256_Init(&context); + clementine_sha2::SHA256_Update( + &context, reinterpret_cast(data.constData()), + data.length()); - QByteArray ret(SHA256_DIGEST_LENGTH, '\0'); - SHA256_Final(reinterpret_cast(ret.data()), &context); + QByteArray ret(clementine_sha2::SHA256_DIGEST_LENGTH, '\0'); + clementine_sha2::SHA256_Final( + reinterpret_cast(ret.data()), &context); return ret; }