aboutsummaryrefslogtreecommitdiffstats
path: root/src/util/mesa-sha1.c
diff options
context:
space:
mode:
authorEmil Velikov <[email protected]>2017-01-13 16:51:31 +0000
committerEmil Velikov <[email protected]>2017-01-18 19:07:23 +0000
commitd1efa09d342bff3e5def2978a0bef748d74f9c82 (patch)
tree079bd4ddeb05e068080337102c0b0ae13c1b101f /src/util/mesa-sha1.c
parent5b4a5312078436479b6d6d3d8c6b6e7c0e10bbe1 (diff)
util: import sha1 implementation from OpenBSD17.0-branchpoint
At the moment we support 5+ different implementations each with varying amount of bugs - from thread safely problems [1], to outright broken implementation(s) [2] In order to accommodate these we have 150+ lines of configure script and extra two configure toggles. Whist an actual implementation being ~200loc and our current compat wrapping ~250. Let's not forget that different people use different code paths, thus effectively makes it harder to test and debug since the default implementation is automatically detected. To minimise all these lovely experiences, import the "100% Public Domain" OpenBSD sha1 implementation. Clearly document any changes needed to get building correctly, since many/most of those can be upstreamed making future syncs easier. As an added bonus this will avoid all the 'fun' experiences trying to integrate it with the Android and SCons builds. v2: Manually expand __BEGIN_DECLS/__END_DECLS and document (Tapani). Furthermore it seems that some games (or surrounding runtime) static link against OpenSSL resulting in conflicts. For more information see the discussion thread [3] Bugzilla [1]: https://bugs.freedesktop.org/show_bug.cgi?id=94904 Bugzilla [2]: https://bugs.freedesktop.org/show_bug.cgi?id=97967 [3] https://lists.freedesktop.org/archives/mesa-dev/2017-January/140748.html Cc: Mark Janes <[email protected]> Cc: Vinson Lee <[email protected]> Cc: Tapani Pälli <[email protected]> Cc: Jonathan Gray <[email protected]> Tested-by: Jonathan Gray <[email protected]> Signed-off-by: Emil Velikov <[email protected]> Acked-by: Tapani Pälli <[email protected]> (v1) Acked-by: Jason Ekstrand <[email protected]> (v1)
Diffstat (limited to 'src/util/mesa-sha1.c')
-rw-r--r--src/util/mesa-sha1.c242
1 files changed, 1 insertions, 241 deletions
diff --git a/src/util/mesa-sha1.c b/src/util/mesa-sha1.c
index b6a192f4dab..e8f1bad22f0 100644
--- a/src/util/mesa-sha1.c
+++ b/src/util/mesa-sha1.c
@@ -24,15 +24,9 @@
* DEALINGS IN THE SOFTWARE.
*/
+#include "sha1/sha1.h"
#include "mesa-sha1.h"
-#ifdef HAVE_SHA1
-
-#if defined(HAVE_SHA1_IN_LIBMD) /* Use libmd for SHA1 */ \
- || defined(HAVE_SHA1_IN_LIBC) /* Use libc for SHA1 */
-
-#include <sha1.h>
-
struct mesa_sha1 *
_mesa_sha1_init(void)
{
@@ -64,238 +58,6 @@ _mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
return 1;
}
-#elif defined(HAVE_SHA1_IN_COMMONCRYPTO) /* Use CommonCrypto for SHA1 */
-
-#include <CommonCrypto/CommonDigest.h>
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- CC_SHA1_CTX *ctx = malloc(sizeof(*ctx));
-
- if (!ctx)
- return NULL;
-
- CC_SHA1_Init(ctx);
- return (struct mesa_sha1 *) ctx;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx;
-
- CC_SHA1_Update(sha1_ctx, data, size);
- return 1;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- CC_SHA1_CTX *sha1_ctx = (CC_SHA1_CTX *) ctx;
-
- CC_SHA1_Final(result, sha1_ctx);
- free(sha1_ctx);
- return 1;
-}
-
-#elif defined(HAVE_SHA1_IN_CRYPTOAPI) /* Use CryptoAPI for SHA1 */
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <wincrypt.h>
-
-static HCRYPTPROV hProv;
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- HCRYPTHASH *ctx = malloc(sizeof(*ctx));
-
- if (!ctx)
- return NULL;
-
- CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
- CryptCreateHash(hProv, CALG_SHA1, 0, 0, ctx);
- return (struct mesa_sha1 *) ctx;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- HCRYPTHASH *hHash = (HCRYPTHASH *) ctx;
-
- CryptHashData(*hHash, data, size, 0);
- return 1;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- HCRYPTHASH *hHash = (HCRYPTHASH *) ctx;
- DWORD len = 20;
-
- CryptGetHashParam(*hHash, HP_HASHVAL, result, &len, 0);
- CryptDestroyHash(*hHash);
- CryptReleaseContext(hProv, 0);
- free(ctx);
- return 1;
-}
-
-#elif defined(HAVE_SHA1_IN_LIBNETTLE) /* Use libnettle for SHA1 */
-
-#include <nettle/sha.h>
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- struct sha1_ctx *ctx = malloc(sizeof(*ctx));
-
- if (!ctx)
- return NULL;
- sha1_init(ctx);
- return (struct mesa_sha1 *) ctx;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- sha1_update((struct sha1_ctx *) ctx, size, data);
- return 1;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- sha1_digest((struct sha1_ctx *) ctx, 20, result);
- free(ctx);
- return 1;
-}
-
-#elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */
-
-#include <gcrypt.h>
-#include "c11/threads.h"
-
-static void _mesa_libgcrypt_init(void)
-{
- if (!gcry_check_version(NULL))
- return;
-
- gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
- gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
-}
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- static once_flag flag = ONCE_FLAG_INIT;
- gcry_md_hd_t h;
- gcry_error_t err;
-
- call_once(&flag, _mesa_libgcrypt_init);
-
- err = gcry_md_open(&h, GCRY_MD_SHA1, 0);
- if (err)
- return NULL;
- return (struct mesa_sha1 *) h;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- gcry_md_hd_t h = (gcry_md_hd_t) ctx;
-
- gcry_md_write(h, data, size);
- return 1;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- gcry_md_hd_t h = (gcry_md_hd_t) ctx;
-
- memcpy(result, gcry_md_read(h, GCRY_MD_SHA1), 20);
- gcry_md_close(h);
- return 1;
-}
-
-#elif defined(HAVE_SHA1_IN_LIBSHA1) /* Use libsha1 */
-
-#include <libsha1.h>
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- sha1_ctx *ctx = malloc(sizeof(*ctx));
-
- if (!ctx)
- return NULL;
- sha1_begin(ctx);
- return (struct mesa_sha1 *) ctx;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- sha1_hash(data, size, (sha1_ctx *) ctx);
- return 1;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- sha1_end(result, (sha1_ctx *) ctx);
- free(ctx);
- return 1;
-}
-
-#else /* Use OpenSSL's libcrypto */
-
-#include <stddef.h> /* buggy openssl/sha.h wants size_t */
-#include <openssl/sha.h>
-
-struct mesa_sha1 *
-_mesa_sha1_init(void)
-{
- int ret;
- SHA_CTX *ctx = malloc(sizeof(*ctx));
-
- if (!ctx)
- return NULL;
- ret = SHA1_Init(ctx);
- if (!ret) {
- free(ctx);
- return NULL;
- }
- return (struct mesa_sha1 *) ctx;
-}
-
-int
-_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size)
-{
- int ret;
- SHA_CTX *sha_ctx = (SHA_CTX *) ctx;
-
- ret = SHA1_Update(sha_ctx, data, size);
- if (!ret)
- free(sha_ctx);
- return ret;
-}
-
-int
-_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20])
-{
- int ret;
- SHA_CTX *sha_ctx = (SHA_CTX *) ctx;
-
- ret = SHA1_Final(result, (SHA_CTX *) sha_ctx);
- free(sha_ctx);
- return ret;
-}
-
-#endif
-
void
_mesa_sha1_compute(const void *data, size_t size, unsigned char result[20])
{
@@ -320,5 +82,3 @@ _mesa_sha1_format(char *buf, const unsigned char *sha1)
return buf;
}
-
-#endif