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