xsha1.c revision 6747b715
16747b715Smrg#ifdef HAVE_DIX_CONFIG_H 26747b715Smrg#include <dix-config.h> 36747b715Smrg#endif 46747b715Smrg 56747b715Smrg#include "os.h" 66747b715Smrg#include "xsha1.h" 76747b715Smrg 86747b715Smrg#if defined(HAVE_SHA1_IN_LIBMD) /* Use libmd for SHA1 */ \ 96747b715Smrg || defined(HAVE_SHA1_IN_LIBC) /* Use libc for SHA1 */ 106747b715Smrg 116747b715Smrg# include <sha1.h> 126747b715Smrg 136747b715Smrgvoid *x_sha1_init(void) 146747b715Smrg{ 156747b715Smrg SHA1_CTX *ctx = malloc(sizeof(*ctx)); 166747b715Smrg if (!ctx) 176747b715Smrg return NULL; 186747b715Smrg SHA1Init(ctx); 196747b715Smrg return ctx; 206747b715Smrg} 216747b715Smrg 226747b715Smrgint x_sha1_update(void *ctx, void *data, int size) 236747b715Smrg{ 246747b715Smrg SHA1_CTX *sha1_ctx = ctx; 256747b715Smrg SHA1Update(sha1_ctx, data, size); 266747b715Smrg return 1; 276747b715Smrg} 286747b715Smrg 296747b715Smrgint x_sha1_final(void *ctx, unsigned char result[20]) 306747b715Smrg{ 316747b715Smrg SHA1_CTX *sha1_ctx = ctx; 326747b715Smrg SHA1Final(result, sha1_ctx); 336747b715Smrg free(sha1_ctx); 346747b715Smrg return 1; 356747b715Smrg} 366747b715Smrg 376747b715Smrg#elif defined(HAVE_SHA1_IN_COMMONCRYPTO) /* Use CommonCrypto for SHA1 */ 386747b715Smrg 396747b715Smrg#include <CommonCrypto/CommonDigest.h> 406747b715Smrg 416747b715Smrgvoid *x_sha1_init(void) 426747b715Smrg{ 436747b715Smrg CC_SHA1_CTX *ctx = malloc(sizeof(*ctx)); 446747b715Smrg if (!ctx) 456747b715Smrg return NULL; 466747b715Smrg CC_SHA1_Init(ctx); 476747b715Smrg return ctx; 486747b715Smrg} 496747b715Smrg 506747b715Smrgint x_sha1_update(void *ctx, void *data, int size) 516747b715Smrg{ 526747b715Smrg CC_SHA1_CTX *sha1_ctx = ctx; 536747b715Smrg CC_SHA1_Update(sha1_ctx, data, size); 546747b715Smrg return 1; 556747b715Smrg} 566747b715Smrg 576747b715Smrgint x_sha1_final(void *ctx, unsigned char result[20]) 586747b715Smrg{ 596747b715Smrg CC_SHA1_CTX *sha1_ctx = ctx; 606747b715Smrg CC_SHA1_Final(result, sha1_ctx); 616747b715Smrg free(sha1_ctx); 626747b715Smrg return 1; 636747b715Smrg} 646747b715Smrg 656747b715Smrg#elif defined(HAVE_SHA1_IN_LIBGCRYPT) /* Use libgcrypt for SHA1 */ 666747b715Smrg 676747b715Smrg# include <gcrypt.h> 686747b715Smrg 696747b715Smrgvoid *x_sha1_init(void) 706747b715Smrg{ 716747b715Smrg static int init; 726747b715Smrg gcry_md_hd_t h; 736747b715Smrg gcry_error_t err; 746747b715Smrg 756747b715Smrg if (!init) { 766747b715Smrg if (!gcry_check_version(NULL)) 776747b715Smrg return NULL; 786747b715Smrg gcry_control(GCRYCTL_DISABLE_SECMEM, 0); 796747b715Smrg gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0); 806747b715Smrg init = 1; 816747b715Smrg } 826747b715Smrg 836747b715Smrg err = gcry_md_open(&h, GCRY_MD_SHA1, 0); 846747b715Smrg if (err) 856747b715Smrg return NULL; 866747b715Smrg return h; 876747b715Smrg} 886747b715Smrg 896747b715Smrgint x_sha1_update(void *ctx, void *data, int size) 906747b715Smrg{ 916747b715Smrg gcry_md_hd_t h = ctx; 926747b715Smrg gcry_md_write(h, data, size); 936747b715Smrg return 1; 946747b715Smrg} 956747b715Smrg 966747b715Smrgint x_sha1_final(void *ctx, unsigned char result[20]) 976747b715Smrg{ 986747b715Smrg gcry_md_hd_t h = ctx; 996747b715Smrg memcpy(result, gcry_md_read(h, GCRY_MD_SHA1), 20); 1006747b715Smrg gcry_md_close(h); 1016747b715Smrg return 1; 1026747b715Smrg} 1036747b715Smrg 1046747b715Smrg#elif defined(HAVE_SHA1_IN_LIBSHA1) /* Use libsha1 */ 1056747b715Smrg 1066747b715Smrg# include <libsha1.h> 1076747b715Smrg 1086747b715Smrgvoid *x_sha1_init(void) 1096747b715Smrg{ 1106747b715Smrg sha1_ctx *ctx = malloc(sizeof(*ctx)); 1116747b715Smrg if(!ctx) 1126747b715Smrg return NULL; 1136747b715Smrg sha1_begin(ctx); 1146747b715Smrg return ctx; 1156747b715Smrg} 1166747b715Smrg 1176747b715Smrgint x_sha1_update(void *ctx, void *data, int size) 1186747b715Smrg{ 1196747b715Smrg sha1_hash(data, size, ctx); 1206747b715Smrg return 1; 1216747b715Smrg} 1226747b715Smrg 1236747b715Smrgint x_sha1_final(void *ctx, unsigned char result[20]) 1246747b715Smrg{ 1256747b715Smrg sha1_end(result, ctx); 1266747b715Smrg free(ctx); 1276747b715Smrg return 1; 1286747b715Smrg} 1296747b715Smrg 1306747b715Smrg#else /* Use OpenSSL's libcrypto */ 1316747b715Smrg 1326747b715Smrg# include <stddef.h> /* buggy openssl/sha.h wants size_t */ 1336747b715Smrg# include <openssl/sha.h> 1346747b715Smrg 1356747b715Smrgvoid *x_sha1_init(void) 1366747b715Smrg{ 1376747b715Smrg int ret; 1386747b715Smrg SHA_CTX *ctx = malloc(sizeof(*ctx)); 1396747b715Smrg if (!ctx) 1406747b715Smrg return NULL; 1416747b715Smrg ret = SHA1_Init(ctx); 1426747b715Smrg if (!ret) { 1436747b715Smrg free(ctx); 1446747b715Smrg return NULL; 1456747b715Smrg } 1466747b715Smrg return ctx; 1476747b715Smrg} 1486747b715Smrg 1496747b715Smrgint x_sha1_update(void *ctx, void *data, int size) 1506747b715Smrg{ 1516747b715Smrg int ret; 1526747b715Smrg SHA_CTX *sha_ctx = ctx; 1536747b715Smrg ret = SHA1_Update(sha_ctx, data, size); 1546747b715Smrg if (!ret) 1556747b715Smrg free(sha_ctx); 1566747b715Smrg return ret; 1576747b715Smrg} 1586747b715Smrg 1596747b715Smrgint x_sha1_final(void *ctx, unsigned char result[20]) 1606747b715Smrg{ 1616747b715Smrg int ret; 1626747b715Smrg SHA_CTX *sha_ctx = ctx; 1636747b715Smrg ret = SHA1_Final(result, sha_ctx); 1646747b715Smrg free(sha_ctx); 1656747b715Smrg return ret; 1666747b715Smrg} 1676747b715Smrg 1686747b715Smrg#endif 169