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