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