diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-05-29 10:21:21 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2016-05-29 10:21:21 +0000 |
commit | 99b70277b7a71ca729b7723c0be213c9db46702c (patch) | |
tree | 756afa5d954f14d117bad3856a5eb9d5ab1b1a0d /lib/mesa/src/util | |
parent | 3e40341f9dcd7c1bbc9afb8ddb812304820396cf (diff) |
Import Mesa 11.2.2
Diffstat (limited to 'lib/mesa/src/util')
-rw-r--r-- | lib/mesa/src/util/mesa-sha1.c | 281 | ||||
-rw-r--r-- | lib/mesa/src/util/mesa-sha1.h | 35 | ||||
-rw-r--r-- | lib/mesa/src/util/strndup.h | 30 |
3 files changed, 292 insertions, 54 deletions
diff --git a/lib/mesa/src/util/mesa-sha1.c b/lib/mesa/src/util/mesa-sha1.c index fa9284627..faa1c871b 100644 --- a/lib/mesa/src/util/mesa-sha1.c +++ b/lib/mesa/src/util/mesa-sha1.c @@ -24,20 +24,285 @@ * 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) +{ + SHA1_CTX *ctx = malloc(sizeof(*ctx)); + + if (!ctx) + return NULL; + + SHA1Init(ctx); + return (struct mesa_sha1 *) ctx; +} + +int +_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size) +{ + SHA1_CTX *sha1_ctx = (SHA1_CTX *) ctx; + + SHA1Update(sha1_ctx, data, size); + return 1; +} + +int +_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) +{ + SHA1_CTX *sha1_ctx = (SHA1_CTX *) ctx; + + SHA1Final(result, sha1_ctx); + free(sha1_ctx); + 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> + +struct mesa_sha1 * +_mesa_sha1_init(void) +{ + static int init; + gcry_md_hd_t h; + gcry_error_t err; + + if (!init) { + if (!gcry_check_version(NULL)) + return NULL; + gcry_control(GCRYCTL_DISABLE_SECMEM, 0); + gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); + init = 1; + } + + 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]) { - struct mesa_sha1 ctx; + struct mesa_sha1 *ctx; - _mesa_sha1_init(&ctx); - _mesa_sha1_update(&ctx, data, size); - _mesa_sha1_final(&ctx, result); + ctx = _mesa_sha1_init(); + _mesa_sha1_update(ctx, data, size); + _mesa_sha1_final(ctx, result); } -void +char * _mesa_sha1_format(char *buf, const unsigned char *sha1) { static const char hex_digits[] = "0123456789abcdef"; @@ -48,4 +313,8 @@ _mesa_sha1_format(char *buf, const unsigned char *sha1) buf[i + 1] = hex_digits[sha1[i >> 1] & 0x0f]; } buf[i] = '\0'; + + return buf; } + +#endif diff --git a/lib/mesa/src/util/mesa-sha1.h b/lib/mesa/src/util/mesa-sha1.h index bde50ba1e..1599405cd 100644 --- a/lib/mesa/src/util/mesa-sha1.h +++ b/lib/mesa/src/util/mesa-sha1.h @@ -20,38 +20,27 @@ * DEALINGS IN THE SOFTWARE. */ -#ifndef MESA_SHA1_H -#define MESA_SHA1_H - -#include <stdlib.h> -#include "c99_compat.h" -#include "sha1/sha1.h" +#ifndef SHA1_H +#define SHA1_H #ifdef __cplusplus extern "C" { #endif -#define mesa_sha1 _SHA1_CTX +#include <stdlib.h> -static inline void -_mesa_sha1_init(struct mesa_sha1 *ctx) -{ - SHA1Init(ctx); -} +struct mesa_sha1; -static inline void -_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, size_t size) -{ - SHA1Update(ctx, (const unsigned char *)data, size); -} +struct mesa_sha1 * +_mesa_sha1_init(void); -static inline void -_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]) -{ - SHA1Final(result, ctx); -} +int +_mesa_sha1_update(struct mesa_sha1 *ctx, const void *data, int size); -void +int +_mesa_sha1_final(struct mesa_sha1 *ctx, unsigned char result[20]); + +char * _mesa_sha1_format(char *buf, const unsigned char *sha1); void diff --git a/lib/mesa/src/util/strndup.h b/lib/mesa/src/util/strndup.h index dcaa429db..c5ed7a8c8 100644 --- a/lib/mesa/src/util/strndup.h +++ b/lib/mesa/src/util/strndup.h @@ -21,40 +21,20 @@ * IN THE SOFTWARE. */ -#ifndef STRNDUP_H -#define STRNDUP_H - -#if defined(_WIN32) +#pragma once #include <stdlib.h> // size_t -#include <string.h> + +#if defined(_WIN32) #ifdef __cplusplus extern "C" { #endif -static inline char * -strndup(const char *str, size_t max) -{ - size_t n; - char *ptr; - - if (!str) - return NULL; - - n = strnlen(str, max); - ptr = (char *) calloc(n + 1, sizeof(char)); - if (!ptr) - return NULL; - - memcpy(ptr, str, n); - return ptr; -} +char *strndup(const char *str, size_t max); #ifdef __cplusplus } #endif -#endif /* _WIN32 */ - -#endif /* STRNDUP_H */ +#endif |