gwenhywfar  4.6.0beta
mdigestgc.c
Go to the documentation of this file.
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 
24 GWEN_INHERIT(GWEN_MDIGEST, GWEN_MDIGEST_GC)
25 
26 
27 
28 
30  GWEN_MDIGEST_GC *xmd;
31  int err;
32 
33  assert(md);
34  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
35  assert(xmd);
36 
37  err=gcry_md_open(&xmd->handle, xmd->algo, xmd->flags);
38  if (err) {
39  DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_open(): %d", err);
40  return GWEN_ERROR_GENERIC;
41  }
42 
43  xmd->isOpen=1;
44 
45  return 0;
46 }
47 
48 
49 
51  GWEN_MDIGEST_GC *xmd;
52  uint8_t *p;
53  unsigned int len;
54 
55  assert(md);
56  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
57  assert(xmd);
58 
59  gcry_md_final(xmd->handle);
60 
61  len=gcry_md_get_algo_dlen(xmd->algo);
62  if (len<1) {
63  DBG_INFO(GWEN_LOGDOMAIN, "gcry_md_get_algo_dlen(): %d", len);
64  gcry_md_close(xmd->handle);
65  xmd->isOpen=0;
66  return GWEN_ERROR_GENERIC;
67  }
68 
69  p=(uint8_t*)malloc(len);
70  assert(p);
71  memmove(p, gcry_md_read(xmd->handle, xmd->algo), len);
72 
73  GWEN_MDigest_SetDigestBuffer(md, p, len);
74 
75  gcry_md_close(xmd->handle);
76  xmd->isOpen=0;
77  return 0;
78 }
79 
80 
81 
82 int GWEN_MDigest_Gc_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l) {
83  GWEN_MDIGEST_GC *xmd;
84 
85  assert(md);
86  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
87  assert(xmd);
88 
89  if (xmd->isOpen==0) {
90  DBG_INFO(GWEN_LOGDOMAIN, "MDigest not open");
91  return GWEN_ERROR_NOT_OPEN;
92  }
93  gcry_md_write(xmd->handle, buf, l);
94 
95  return 0;
96 }
97 
98 
99 
101 void GWEN_Digest_Gc_freeData(GWEN_UNUSED void *bp, void *p) {
102  GWEN_MDIGEST_GC *xmd;
103 
104  xmd=(GWEN_MDIGEST_GC*) p;
105  if (xmd->isOpen) {
106  gcry_md_close(xmd->handle);
107  xmd->isOpen=0;
108  }
109  GWEN_FREE_OBJECT(xmd);
110 }
111 
112 
113 
115  GWEN_MDIGEST *md;
116  GWEN_MDIGEST_GC *xmd;
117 
118  GWEN_NEW_OBJECT(GWEN_MDIGEST_GC, xmd)
119  md=GWEN_MDigest_new(a);
120  assert(md);
121  GWEN_INHERIT_SETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md, xmd, GWEN_Digest_Gc_freeData)
122 
126 
127  return md;
128 }
129 
130 
131 
132 
133 
134 
136  GWEN_MDIGEST *md;
137  GWEN_MDIGEST_GC *xmd;
138 
139  md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Md5);
140  assert(md);
141  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
142  assert(xmd);
143 
144  xmd->algo=GCRY_MD_MD5;
145  GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
146 
147  return md;
148 }
149 
150 
151 
153  GWEN_MDIGEST *md;
154  GWEN_MDIGEST_GC *xmd;
155 
156  md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Rmd160);
157  assert(md);
158  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
159  assert(xmd);
160 
161  xmd->algo=GCRY_MD_RMD160;
162  GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
163 
164  return md;
165 }
166 
167 
168 
170  GWEN_MDIGEST *md;
171  GWEN_MDIGEST_GC *xmd;
172 
173  md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha1);
174  assert(md);
175  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
176  assert(xmd);
177 
178  xmd->algo=GCRY_MD_SHA1;
179  GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
180 
181  return md;
182 }
183 
184 
185 
187  GWEN_MDIGEST *md;
188  GWEN_MDIGEST_GC *xmd;
189 
190  md=GWEN_MDigest_Gc_new(GWEN_Crypt_HashAlgoId_Sha256);
191  assert(md);
192  xmd=GWEN_INHERIT_GETDATA(GWEN_MDIGEST, GWEN_MDIGEST_GC, md);
193  assert(xmd);
194 
195  xmd->algo=GCRY_MD_SHA256;
196  xmd->flags=GCRY_MD_FLAG_SECURE;
197  GWEN_MDigest_SetDigestLen(md, gcry_md_get_algo_dlen(xmd->algo));
198 
199  return md;
200 }
201 
202 
203 
204 
205 
206