xsha1.c revision 706f2543
1e0963edeSmrg#ifdef HAVE_DIX_CONFIG_H 2e0963edeSmrg#include <dix-config.h> 3e0963edeSmrg#endif 4e0963edeSmrg 5e0963edeSmrg#include "os.h" 6e0963edeSmrg#include "xsha1.h" 7e0963edeSmrg 8e0963edeSmrg#if defined(HAVE_SHA1_IN_LIBMD) /* Use libmd for SHA1 */ \ 9e0963edeSmrg || defined(HAVE_SHA1_IN_LIBC) /* Use libc for SHA1 */ 10e0963edeSmrg 11e0963edeSmrg# include <sha1.h> 12e0963edeSmrg 13e0963edeSmrgvoid *x_sha1_init(void) 14e0963edeSmrg{ 15e0963edeSmrg SHA1_CTX *ctx = malloc(sizeof(*ctx)); 16e0963edeSmrg if (!ctx) 17e0963edeSmrg return NULL; 18e0963edeSmrg SHA1Init(ctx); 19e0963edeSmrg return ctx; 20e0963edeSmrg} 21e0963edeSmrg 22e0963edeSmrgint x_sha1_update(void *ctx, void *data, int size) 23e0963edeSmrg{ 24e0963edeSmrg SHA1_CTX *sha1_ctx = ctx; 25e0963edeSmrg SHA1Update(sha1_ctx, data, size); 26e0963edeSmrg return 1; 27e0963edeSmrg} 28e0963edeSmrg 29e0963edeSmrgint x_sha1_final(void *ctx, unsigned char result[20]) 30e0963edeSmrg{ 31e0963edeSmrg SHA1_CTX *sha1_ctx = ctx; 32e0963edeSmrg SHA1Final(result, sha1_ctx); 33e0963edeSmrg free(sha1_ctx); 34e0963edeSmrg return 1; 35e0963edeSmrg} 36e0963edeSmrg 37e0963edeSmrg#elif defined(HAVE_SHA1_IN_COMMONCRYPTO) /* Use CommonCrypto for SHA1 */ 38e0963edeSmrg 39e0963edeSmrg#include <CommonCrypto/CommonDigest.h> 40e0963edeSmrg 41e0963edeSmrgvoid *x_sha1_init(void) 42e0963edeSmrg{ 43e0963edeSmrg CC_SHA1_CTX *ctx = malloc(sizeof(*ctx)); 44e0963edeSmrg if (!ctx) 45e0963edeSmrg return NULL; 46e0963edeSmrg CC_SHA1_Init(ctx); 47e0963edeSmrg return ctx; 48e0963edeSmrg} 49e0963edeSmrg 50e0963edeSmrgint x_sha1_update(void *ctx, void *data, int size) 51e0963edeSmrg{ 52e0963edeSmrg CC_SHA1_CTX *sha1_ctx = ctx; 53e0963edeSmrg CC_SHA1_Update(sha1_ctx, data, size); 54e0963edeSmrg return 1; 55e0963edeSmrg} 56e0963edeSmrg 57e0963edeSmrgint x_sha1_final(void *ctx, unsigned char result[20]) 58e0963edeSmrg{ 59e0963edeSmrg CC_SHA1_CTX *sha1_ctx = ctx; 60e0963edeSmrg CC_SHA1_Final(result, sha1_ctx); 61e0963edeSmrg free(sha1_ctx); 62e0963edeSmrg return 1; 63e0963edeSmrg} 64e0963edeSmrg 65e0963edeSmrg#elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */ 66e0963edeSmrg 67e0963edeSmrg# include <gcrypt.h> 68e0963edeSmrg 69e0963edeSmrgvoid *x_sha1_init(void) 70e0963edeSmrg{ 71e0963edeSmrg static int init; 72e0963edeSmrg gcry_md_hd_t h; 73e0963edeSmrg gcry_error_t err; 74e0963edeSmrg 75e0963edeSmrg if (!init) { 76e0963edeSmrg if (!gcry_check_version(NULL)) 77e0963edeSmrg return NULL; 78e0963edeSmrg gcry_control(GCRYCTL_DISABLE_SECMEM, 0); 79e0963edeSmrg gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); 80e0963edeSmrg init = 1; 81e0963edeSmrg } 82e0963edeSmrg 83e0963edeSmrg err = gcry_md_open(&h, GCRY_MD_SHA1, 0); 84e0963edeSmrg if (err) 85e0963edeSmrg return NULL; 86e0963edeSmrg return h; 87e0963edeSmrg} 88e0963edeSmrg 89e0963edeSmrgint x_sha1_update(void *ctx, void *data, int size) 90e0963edeSmrg{ 91e0963edeSmrg gcry_md_hd_t h = ctx; 92e0963edeSmrg gcry_md_write(h, data, size); 93e0963edeSmrg return 1; 94e0963edeSmrg} 95e0963edeSmrg 96e0963edeSmrgint x_sha1_final(void *ctx, unsigned char result[20]) 97e0963edeSmrg{ 98e0963edeSmrg gcry_md_hd_t h = ctx; 99e0963edeSmrg memcpy(result, gcry_md_read(h, GCRY_MD_SHA1), 20); 100e0963edeSmrg gcry_md_close(h); 101e0963edeSmrg return 1; 102e0963edeSmrg} 103e0963edeSmrg 104e0963edeSmrg#elif defined(HAVE_SHA1_IN_LIBSHA1) /* Use libsha1 */ 105e0963edeSmrg 106e0963edeSmrg# include <libsha1.h> 107e0963edeSmrg 108e0963edeSmrgvoid *x_sha1_init(void) 109e0963edeSmrg{ 110e0963edeSmrg sha1_ctx *ctx = malloc(sizeof(*ctx)); 111e0963edeSmrg if(!ctx) 112e0963edeSmrg return NULL; 113e0963edeSmrg sha1_begin(ctx); 114e0963edeSmrg return ctx; 115e0963edeSmrg} 116e0963edeSmrg 117e0963edeSmrgint x_sha1_update(void *ctx, void *data, int size) 118e0963edeSmrg{ 119e0963edeSmrg sha1_hash(data, size, ctx); 120e0963edeSmrg return 1; 121e0963edeSmrg} 122e0963edeSmrg 123e0963edeSmrgint x_sha1_final(void *ctx, unsigned char result[20]) 124e0963edeSmrg{ 125e0963edeSmrg sha1_end(result, ctx); 126e0963edeSmrg free(ctx); 127e0963edeSmrg return 1; 128e0963edeSmrg} 129e0963edeSmrg 130e0963edeSmrg#else /* Use OpenSSL's libcrypto */ 131e0963edeSmrg 132e0963edeSmrg# include <stddef.h> /* buggy openssl/sha.h wants size_t */ 133e0963edeSmrg# include <openssl/sha.h> 134e0963edeSmrg 135e0963edeSmrgvoid *x_sha1_init(void) 136e0963edeSmrg{ 137e0963edeSmrg int ret; 138e0963edeSmrg SHA_CTX *ctx = malloc(sizeof(*ctx)); 139e0963edeSmrg if (!ctx) 140e0963edeSmrg return NULL; 141e0963edeSmrg ret = SHA1_Init(ctx); 142e0963edeSmrg if (!ret) { 143e0963edeSmrg free(ctx); 144e0963edeSmrg return NULL; 145e0963edeSmrg } 146e0963edeSmrg return ctx; 147e0963edeSmrg} 148e0963edeSmrg 149e0963edeSmrgint x_sha1_update(void *ctx, void *data, int size) 150e0963edeSmrg{ 151e0963edeSmrg int ret; 152e0963edeSmrg SHA_CTX *sha_ctx = ctx; 153e0963edeSmrg ret = SHA1_Update(sha_ctx, data, size); 154e0963edeSmrg if (!ret) 155e0963edeSmrg free(sha_ctx); 156e0963edeSmrg return ret; 157e0963edeSmrg} 158e0963edeSmrg 159e0963edeSmrgint x_sha1_final(void *ctx, unsigned char result[20]) 160e0963edeSmrg{ 161e0963edeSmrg int ret; 162e0963edeSmrg SHA_CTX *sha_ctx = ctx; 163e0963edeSmrg ret = SHA1_Final(result, sha_ctx); 164e0963edeSmrg free(sha_ctx); 165e0963edeSmrg return ret; 166e0963edeSmrg} 167e0963edeSmrg 168e0963edeSmrg#endif 169e0963edeSmrg