gwenhywfar  5.10.1
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 {
36  gcry_control(GCRYCTL_DISABLE_SECMEM, 0);
37  if (!gcry_check_version(NEED_LIBGCRYPT_VERSION)) {
38  const char *gcrypt_version = gcry_check_version(0);
39  DBG_ERROR(GWEN_LOGDOMAIN, "Libgcrypt version mismatch: "
40  "Gwen needs GCrypt >= %s, but is running with GCrypt %s",
41  NEED_LIBGCRYPT_VERSION, gcrypt_version);
42  return GWEN_ERROR_GENERIC;
43  }
44  /*gcry_control(GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);*/
45 
46  gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);
47  gcry_control(GCRYCTL_ENABLE_QUICK_RANDOM, 0);
48 
49  return 0;
50 }
51 
52 
53 
55 {
56  return 0;
57 }
58 
59 
60 
61 
62 
64 {
65  GWEN_CRYPT_KEY *k;
66 
68  k->refCount=1;
71 
72  k->cryptAlgoId=cryptAlgoId;
73  k->keySize=keySize;
74 
75  return k;
76 }
77 
78 
79 
81 {
82  GWEN_CRYPT_KEY *k;
83  GWEN_CRYPT_CRYPTALGOID cryptAlgoId;
84  int keySize;
85  const char *s;
86 
87  s=GWEN_DB_GetCharValue(db, "cryptAlgoId", 0, NULL);
88  if (s)
89  cryptAlgoId=GWEN_Crypt_CryptAlgoId_fromString(s);
90  else
91  cryptAlgoId=GWEN_Crypt_CryptAlgoId_Unknown;
92 
93  if (cryptAlgoId==GWEN_Crypt_CryptAlgoId_Unknown) {
94  DBG_ERROR(GWEN_LOGDOMAIN, "Unknown crypt algo id [%s]",
95  s?s:"---");
96  return NULL;
97  }
98 
99  keySize=GWEN_DB_GetIntValue(db, "keySize", 0, -1);
100  if (keySize==-1) {
101  DBG_ERROR(GWEN_LOGDOMAIN, "Missing keysize");
102  return NULL;
103  }
104 
105  k=GWEN_Crypt_Key_new(cryptAlgoId, keySize);
106  if (k==NULL)
107  return NULL;
108 
109  k->keyNumber=GWEN_DB_GetIntValue(db, "keyNumber", 0, 0);
110  k->keyVersion=GWEN_DB_GetIntValue(db, "keyVersion", 0, 0);
111 
112  return k;
113 }
114 
115 
116 
118 {
119  assert(k);
120  assert(db);
121 
123  "cryptAlgoId",
124  GWEN_Crypt_CryptAlgoId_toString(k->cryptAlgoId));
126  "keySize", k->keySize);
128  "keyNumber", k->keyNumber);
130  "keyVersion", k->keyVersion);
131 
132  return 0;
133 }
134 
135 
136 
138 {
139  GWEN_CRYPT_KEY *nk;
140 
141  assert(k);
142  nk=GWEN_Crypt_Key_new(k->cryptAlgoId, k->keySize);
143  if (nk==NULL)
144  return NULL;
145 
146  nk->keyNumber=k->keyNumber;
147  nk->keyVersion=k->keyVersion;
148 
149  return nk;
150 }
151 
152 
153 
155 {
156  if (k) {
157  assert(k->refCount);
158  if (k->refCount==1) {
161  k->refCount=0;
162  GWEN_FREE_OBJECT(k);
163  }
164  else
165  k->refCount--;
166  }
167 }
168 
169 
170 
172 {
173  assert(k);
174  return k->cryptAlgoId;
175 }
176 
177 
178 
180 {
181  assert(k);
182  return k->keySize;
183 }
184 
185 
186 
188 {
189  assert(k);
190  return k->keyNumber;
191 }
192 
193 
194 
196 {
197  assert(k);
198  k->keyNumber=i;
199 }
200 
201 
202 
204 {
205  assert(k);
206  return k->keyVersion;
207 }
208 
209 
210 
212 {
213  assert(k);
214  k->keyVersion=i;
215 }
216 
217 
218 
220 {
222 
223  assert(k);
224  of=k->signFn;
225  k->signFn=f;
226 
227  return of;
228 }
229 
230 
231 
233 {
235 
236  assert(k);
237  of=k->verifyFn;
238  k->verifyFn=f;
239 
240  return of;
241 }
242 
243 
244 
247 {
249 
250  assert(k);
251  of=k->encipherFn;
252  k->encipherFn=f;
253 
254  return of;
255 }
256 
257 
258 
261 {
263 
264  assert(k);
265  of=k->decipherFn;
266  k->decipherFn=f;
267 
268  return of;
269 }
270 
271 
272 
274  const uint8_t *pInData,
275  uint32_t inLen,
276  uint8_t *pSignatureData,
277  uint32_t *pSignatureLen)
278 {
279  assert(k);
280  if (k->signFn)
281  return k->signFn(k, pInData, inLen, pSignatureData, pSignatureLen);
282  else
284 }
285 
286 
287 
289  const uint8_t *pInData,
290  uint32_t inLen,
291  const uint8_t *pSignatureData,
292  uint32_t signatureLen)
293 {
294  assert(k);
295  if (k->verifyFn)
296  return k->verifyFn(k, pInData, inLen, pSignatureData, signatureLen);
297  else
299 }
300 
301 
302 
304  const uint8_t *pInData,
305  uint32_t inLen,
306  uint8_t *pOutData,
307  uint32_t *pOutLen)
308 {
309  assert(k);
310  if (k->encipherFn)
311  return k->encipherFn(k, pInData, inLen, pOutData, pOutLen);
312  else
314 }
315 
316 
317 
319  const uint8_t *pInData,
320  uint32_t inLen,
321  uint8_t *pOutData,
322  uint32_t *pOutLen)
323 {
324  assert(k);
325  if (k->decipherFn)
326  return k->decipherFn(k, pInData, inLen, pOutData, pOutLen);
327  else
329 }
330 
331 
332 
333 
334 
335 
336 
337 
GWENHYWFAR_CB int(* GWEN_CRYPT_KEY_SIGN_FN)(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
Definition: cryptkey_be.h:21
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition: list2.h:99
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_INHERIT_FINI(t, element)
Definition: inherit.h:238
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgoId_fromString(const char *s)
Definition: cryptalgo.c:28
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:179
GWEN_CRYPT_KEY_VERIFY_FN GWEN_Crypt_Key_SetVerifyFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_VERIFY_FN f)
Definition: cryptkey.c:232
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:154
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
int GWEN_Crypt3_ModuleFini(void)
Definition: cryptkey.c:54
int GWEN_Crypt_Key_Encipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkey.c:303
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:171
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:187
GWENHYWFAR_CB int(* GWEN_CRYPT_KEY_VERIFY_FN)(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, const uint8_t *pSignatureData, uint32_t signatureLen)
Definition: cryptkey_be.h:26
GWENHYWFAR_CB int(* GWEN_CRYPT_KEY_ENCIPHER_FN)(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkey_be.h:31
int GWEN_Crypt3_ModuleInit(void)
Definition: cryptkey.c:34
int GWEN_Crypt_Key_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkey.c:117
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
GWEN_CRYPT_CRYPTALGOID
Definition: cryptalgo.h:52
GWEN_CRYPT_KEY_SIGN_FN GWEN_Crypt_Key_SetSignFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_SIGN_FN f)
Definition: cryptkey.c:219
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:53
#define GWEN_ERROR_GENERIC
Definition: error.h:62
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:971
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
GWEN_CRYPT_KEY_DECIPHER_FN GWEN_Crypt_Key_SetDecipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_DECIPHER_FN f)
Definition: cryptkey.c:259
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
int GWEN_Crypt_Key_Sign(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
Definition: cryptkey.c:273
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:997
int GWEN_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:203
void GWEN_Crypt_Key_SetKeyVersion(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:211
#define GWEN_LIST_INIT(t, element)
Definition: list1.h:465
int GWEN_Crypt_Key_Decipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkey.c:318
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1163
GWEN_CRYPT_KEY * GWEN_Crypt_Key_dup(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:137
GWEN_CRYPT_KEY_ENCIPHER_FN GWEN_Crypt_Key_SetEncipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_ENCIPHER_FN f)
Definition: cryptkey.c:245
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1202
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition: list1.h:366
GWEN_CRYPT_KEY * GWEN_Crypt_Key_new(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize)
Definition: cryptkey.c:63
int GWEN_Crypt_Key_Verify(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, const uint8_t *pSignatureData, uint32_t signatureLen)
Definition: cryptkey.c:288
GWENHYWFAR_CB int(* GWEN_CRYPT_KEY_DECIPHER_FN)(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkey_be.h:36
void GWEN_Crypt_Key_SetKeyNumber(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:195
#define GWEN_LIST_FINI(t, element)
Definition: list1.h:474
#define GWEN_INHERIT_FUNCTIONS(t)
Definition: inherit.h:163
GWEN_CRYPT_KEY * GWEN_Crypt_Key_fromDb(GWEN_DB_NODE *db)
Definition: cryptkey.c:80
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108