gwenhywfar  4.3.3
cryptkey.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 "cryptkey_p.h"
19 #include <gwenhywfar/misc.h>
20 #include <gwenhywfar/debug.h>
21 
22 #include <gcrypt.h>
23 
24 
25 
26 
28 GWEN_LIST_FUNCTIONS(GWEN_CRYPT_KEY, GWEN_Crypt_Key)
29 GWEN_LIST2_FUNCTIONS(GWEN_CRYPT_KEY, GWEN_Crypt_Key)
30 
31 
32 
33 
35  gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
36  if (!gcry_check_version (NEED_LIBGCRYPT_VERSION)) {
37  const char *gcrypt_version = gcry_check_version(0);
38  DBG_ERROR(GWEN_LOGDOMAIN, "Libgcrypt version mismatch: "
39  "Gwen needs GCrypt >= %s, but is running with GCrypt %s",
40  NEED_LIBGCRYPT_VERSION, gcrypt_version);
41  return GWEN_ERROR_GENERIC;
42  }
43  /*gcry_control(GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);*/
44 
45  gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
46  gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
47 
48  return 0;
49 }
50 
51 
52 
54  return 0;
55 }
56 
57 
58 
59 
60 
62  GWEN_CRYPT_KEY *k;
63 
65  k->refCount=1;
68 
69  k->cryptAlgoId=cryptAlgoId;
70  k->keySize=keySize;
71 
72  return k;
73 }
74 
75 
76 
78  GWEN_CRYPT_KEY *k;
79  GWEN_CRYPT_CRYPTALGOID cryptAlgoId;
80  int keySize;
81  const char *s;
82 
83  s=GWEN_DB_GetCharValue(db, "cryptAlgoId", 0, NULL);
84  if (s)
85  cryptAlgoId=GWEN_Crypt_CryptAlgoId_fromString(s);
86  else
87  cryptAlgoId=GWEN_Crypt_CryptAlgoId_Unknown;
88 
89  if (cryptAlgoId==GWEN_Crypt_CryptAlgoId_Unknown) {
90  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown crypt algo id [%s]",
91  s?s:"---");
92  return NULL;
93  }
94 
95  keySize=GWEN_DB_GetIntValue(db, "keySize", 0, -1);
96  if (keySize==-1) {
97  DBG_ERROR(GWEN_LOGDOMAIN, "Missing keysize");
98  return NULL;
99  }
100 
101  k=GWEN_Crypt_Key_new(cryptAlgoId, keySize);
102  if (k==NULL)
103  return NULL;
104 
105  k->keyNumber=GWEN_DB_GetIntValue(db, "keyNumber", 0, 0);
106  k->keyVersion=GWEN_DB_GetIntValue(db, "keyVersion", 0, 0);
107 
108  return k;
109 }
110 
111 
112 
114  assert(k);
115  assert(db);
116 
118  "cryptAlgoId",
119  GWEN_Crypt_CryptAlgoId_toString(k->cryptAlgoId));
121  "keySize", k->keySize);
123  "keyNumber", k->keyNumber);
125  "keyVersion", k->keyVersion);
126 
127  return 0;
128 }
129 
130 
131 
133  GWEN_CRYPT_KEY *nk;
134 
135  assert(k);
136  nk=GWEN_Crypt_Key_new(k->cryptAlgoId, k->keySize);
137  if (nk==NULL)
138  return NULL;
139 
140  nk->keyNumber=k->keyNumber;
141  nk->keyVersion=k->keyVersion;
142 
143  return nk;
144 }
145 
146 
147 
149  if (k) {
150  assert(k->refCount);
151  if (k->refCount==1) {
154  k->refCount=0;
155  GWEN_FREE_OBJECT(k);
156  }
157  else
158  k->refCount--;
159  }
160 }
161 
162 
163 
165  assert(k);
166  return k->cryptAlgoId;
167 }
168 
169 
170 
172  assert(k);
173  return k->keySize;
174 }
175 
176 
177 
179  assert(k);
180  return k->keyNumber;
181 }
182 
183 
184 
186  assert(k);
187  k->keyNumber=i;
188 }
189 
190 
191 
193  assert(k);
194  return k->keyVersion;
195 }
196 
197 
198 
200  assert(k);
201  k->keyVersion=i;
202 }
203 
204 
205 
208 
209  assert(k);
210  of=k->signFn;
211  k->signFn=f;
212 
213  return of;
214 }
215 
216 
217 
220 
221  assert(k);
222  of=k->verifyFn;
223  k->verifyFn=f;
224 
225  return of;
226 }
227 
228 
229 
233 
234  assert(k);
235  of=k->encipherFn;
236  k->encipherFn=f;
237 
238  return of;
239 }
240 
241 
242 
246 
247  assert(k);
248  of=k->decipherFn;
249  k->decipherFn=f;
250 
251  return of;
252 }
253 
254 
255 
257  const uint8_t *pInData,
258  uint32_t inLen,
259  uint8_t *pSignatureData,
260  uint32_t *pSignatureLen) {
261  assert(k);
262  if (k->signFn)
263  return k->signFn(k, pInData, inLen, pSignatureData, pSignatureLen);
264  else
266 }
267 
268 
269 
271  const uint8_t *pInData,
272  uint32_t inLen,
273  const uint8_t *pSignatureData,
274  uint32_t signatureLen) {
275  assert(k);
276  if (k->verifyFn)
277  return k->verifyFn(k, pInData, inLen, pSignatureData, signatureLen);
278  else
280 }
281 
282 
283 
285  const uint8_t *pInData,
286  uint32_t inLen,
287  uint8_t *pOutData,
288  uint32_t *pOutLen) {
289  assert(k);
290  if (k->encipherFn)
291  return k->encipherFn(k, pInData, inLen, pOutData, pOutLen);
292  else
294 }
295 
296 
297 
299  const uint8_t *pInData,
300  uint32_t inLen,
301  uint8_t *pOutData,
302  uint32_t *pOutLen) {
303  assert(k);
304  if (k->decipherFn)
305  return k->decipherFn(k, pInData, inLen, pOutData, pOutLen);
306  else
308 }
309 
310 
311 
312 
313 
314 
315 
316