gwenhywfar  4.99.8beta
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 
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
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:171
GWEN_CRYPT_KEY_VERIFY_FN GWEN_Crypt_Key_SetVerifyFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_VERIFY_FN f)
Definition: cryptkey.c:218
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:148
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
int GWEN_Crypt3_ModuleFini(void)
Definition: cryptkey.c:53
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:284
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:164
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_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:178
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:113
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
GWEN_CRYPT_CRYPTALGOID
Definition: cryptalgo.h:50
GWEN_CRYPT_KEY_SIGN_FN GWEN_Crypt_Key_SetSignFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_SIGN_FN f)
Definition: cryptkey.c:206
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:52
#define GWEN_ERROR_GENERIC
Definition: error.h:62
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
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
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
#define GWEN_INHERIT_INIT(t, element)
Definition: inherit.h:223
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
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
GWEN_CRYPT_KEY_DECIPHER_FN GWEN_Crypt_Key_SetDecipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_DECIPHER_FN f)
Definition: cryptkey.c:243
#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:256
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
int GWEN_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:192
void GWEN_Crypt_Key_SetKeyVersion(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:199
#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:298
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1048
GWEN_CRYPT_KEY * GWEN_Crypt_Key_dup(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:132
GWEN_CRYPT_KEY_ENCIPHER_FN GWEN_Crypt_Key_SetEncipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_ENCIPHER_FN f)
Definition: cryptkey.c:230
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1086
#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:61
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:270
void GWEN_Crypt_Key_SetKeyNumber(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:185
#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:77
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition: error.h:108