1 /***************************************************************************
2 begin : Wed Mar 16 2005
3 copyright : (C) 2005 by Martin Preuss
4 email : martin@libchipcard.de
5
6 ***************************************************************************
7 * Please see toplevel file COPYING for license details *
8 ***************************************************************************/
9
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13
14
15 #define DISABLE_DEBUGLOG
16
17
18 #include "mdigestgc_p.h"
19 #include <gwenhywfar/misc.h>
20 #include <gwenhywfar/debug.h>
21
22
23
GWEN_INHERIT(GWEN_MDIGEST,GWEN_MDIGEST_GC)24 GWEN_INHERIT(GWEN_MDIGEST, GWEN_MDIGEST_GC)
25
26
27
28
29 int GWEN_MDigest_Gc_Begin(GWEN_MDIGEST *md)
30 {
31 GWEN_MDIGEST_GC *xmd;
32 int err;
33
34 assert(md);
35 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
36 assert(xmd);
37
38 err=gcry_md_open(&xmd->handle, xmd->algo, xmd->flags);
39 if (err) {
40 DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_open(): %d", err);
41 return GWEN_ERROR_GENERIC;
42 }
43
44 xmd->isOpen=1;
45
46 return 0;
47 }
48
49
50
GWEN_MDigest_Gc_End(GWEN_MDIGEST * md)51 int GWEN_MDigest_Gc_End(GWEN_MDIGEST *md)
52 {
53 GWEN_MDIGEST_GC *xmd;
54 uint8_t *p;
55 unsigned int len;
56
57 assert(md);
58 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
59 assert(xmd);
60
61 gcry_md_final(xmd->handle);
62
63 len=gcry_md_get_algo_dlen(xmd->algo);
64 if (len<1) {
65 DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_get_algo_dlen(): %d", len);
66 gcry_md_close(xmd->handle);
67 xmd->isOpen=0;
68 return GWEN_ERROR_GENERIC;
69 }
70
71 p=(uint8_t *)malloc(len);
72 assert(p);
73 memmove(p, gcry_md_read(xmd->handle, xmd->algo), len);
74
75 GWEN_MDigest_SetDigestBuffer(md, p, len);
76
77 gcry_md_close(xmd->handle);
78 xmd->isOpen=0;
79 return 0;
80 }
81
82
83
GWEN_MDigest_Gc_Update(GWEN_MDIGEST * md,const uint8_t * buf,unsigned int l)84 int GWEN_MDigest_Gc_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
85 {
86 GWEN_MDIGEST_GC *xmd;
87
88 assert(md);
89 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
90 assert(xmd);
91
92 if (xmd->isOpen==0) {
93 DBG_INFO(GWEN_LOGDOMAIN, "MDigest not open");
94 return GWEN_ERROR_NOT_OPEN;
95 }
96 gcry_md_write(xmd->handle, buf, l);
97
98 return 0;
99 }
100
101
102
103 GWENHYWFAR_CB
GWEN_Digest_Gc_freeData(GWEN_UNUSED void * bp,void * p)104 void GWEN_Digest_Gc_freeData(GWEN_UNUSED void *bp, void *p)
105 {
106 GWEN_MDIGEST_GC *xmd;
107
108 xmd=(GWEN_MDIGEST_GC *) p;
109 if (xmd->isOpen) {
110 gcry_md_close(xmd->handle);
111 xmd->isOpen=0;
112 }
113 GWEN_FREE_OBJECT(xmd);
114 }
115
116
117
GWEN_MDigest_Gc_new(GWEN_CRYPT_HASHALGOID a)118 GWEN_MDIGEST *GWEN_MDigest_Gc_new(GWEN_CRYPT_HASHALGOID a)
119 {
120 GWEN_MDIGEST *md;
121 GWEN_MDIGEST_GC *xmd;
122
123 GWEN_NEW_OBJECT(GWEN_MDIGEST_GC, xmd)
124 md=GWEN_MDigest_new(a);
125 assert(md);
126 GWEN_INHERIT_SETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md, xmd, GWEN_Digest_Gc_freeData)
127
128 GWEN_MDigest_SetBeginFn(md, GWEN_MDigest_Gc_Begin);
129 GWEN_MDigest_SetEndFn(md, GWEN_MDigest_Gc_End);
130 GWEN_MDigest_SetUpdateFn(md, GWEN_MDigest_Gc_Update);
131
132 return md;
133 }
134
135
136
137
138
139
GWEN_MDigest_Md5_new(void)140 GWEN_MDIGEST *GWEN_MDigest_Md5_new(void)
141 {
142 GWEN_MDIGEST *md;
143 GWEN_MDIGEST_GC *xmd;
144
145 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Md5);
146 assert(md);
147 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
148 assert(xmd);
149
150 xmd->algo=GCRY_MD_MD5;
151 GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
152
153 return md;
154 }
155
156
157
GWEN_MDigest_Rmd160_new(void)158 GWEN_MDIGEST *GWEN_MDigest_Rmd160_new(void)
159 {
160 GWEN_MDIGEST *md;
161 GWEN_MDIGEST_GC *xmd;
162
163 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Rmd160);
164 assert(md);
165 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
166 assert(xmd);
167
168 xmd->algo=GCRY_MD_RMD160;
169 GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
170
171 return md;
172 }
173
174
175
GWEN_MDigest_Sha1_new(void)176 GWEN_MDIGEST *GWEN_MDigest_Sha1_new(void)
177 {
178 GWEN_MDIGEST *md;
179 GWEN_MDIGEST_GC *xmd;
180
181 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha1);
182 assert(md);
183 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
184 assert(xmd);
185
186 xmd->algo=GCRY_MD_SHA1;
187 GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
188
189 return md;
190 }
191
192
193
GWEN_MDigest_Sha256_new(void)194 GWEN_MDIGEST *GWEN_MDigest_Sha256_new(void)
195 {
196 GWEN_MDIGEST *md;
197 GWEN_MDIGEST_GC *xmd;
198
199 md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha256);
200 assert(md);
201 xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
202 assert(xmd);
203
204 xmd->algo=GCRY_MD_SHA256;
205 xmd->flags=GCRY_MD_FLAG_SECURE;
206 GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
207
208 return md;
209 }
210
211
212
213
214
215
216