gwenhywfar 5.12.0
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
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{
66
68 k->refCount=1;
71
72 k->cryptAlgoId=cryptAlgoId;
73 k->keySize=keySize;
74
75 return k;
76}
77
78
79
81{
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)
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;
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
#define NULL
Definition binreloc.c:300
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition cryptalgo.c:53
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgoId_fromString(const char *s)
Definition cryptalgo.c:28
GWEN_CRYPT_CRYPTALGOID
Definition cryptalgo.h:52
GWEN_CRYPT_KEY * GWEN_Crypt_Key_new(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize)
Definition cryptkey.c:63
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
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition cryptkey.c:154
void GWEN_Crypt_Key_SetKeyVersion(GWEN_CRYPT_KEY *k, int i)
Definition cryptkey.c:211
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_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:203
GWEN_CRYPT_KEY * GWEN_Crypt_Key_fromDb(GWEN_DB_NODE *db)
Definition cryptkey.c:80
void GWEN_Crypt_Key_SetKeyNumber(GWEN_CRYPT_KEY *k, int i)
Definition cryptkey.c:195
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:171
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:179
GWEN_CRYPT_KEY * GWEN_Crypt_Key_dup(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:137
int GWEN_Crypt3_ModuleInit(void)
Definition cryptkey.c:34
GWEN_CRYPT_KEY_SIGN_FN GWEN_Crypt_Key_SetSignFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_SIGN_FN f)
Definition cryptkey.c:219
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:187
GWEN_CRYPT_KEY_VERIFY_FN GWEN_Crypt_Key_SetVerifyFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_VERIFY_FN f)
Definition cryptkey.c:232
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_Crypt_Key_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition cryptkey.c:117
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
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
int GWEN_Crypt3_ModuleFini(void)
Definition cryptkey.c:54
GWEN_CRYPT_KEY_DECIPHER_FN GWEN_Crypt_Key_SetDecipherFn(GWEN_CRYPT_KEY *k, GWEN_CRYPT_KEY_DECIPHER_FN f)
Definition cryptkey.c:259
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition cryptkey.h:26
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_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_SIGN_FN)(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen)
Definition cryptkey_be.h:21
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
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition db.c:971
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition db.c:1202
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition db.c:997
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition db.c:1163
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition db.h:228
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define GWEN_ERROR_NOT_IMPLEMENTED
Definition error.h:108
#define GWEN_ERROR_GENERIC
Definition error.h:62
#define GWEN_INHERIT_FUNCTIONS(t)
Definition inherit.h:163
#define GWEN_INHERIT_INIT(t, element)
Definition inherit.h:223
#define GWEN_INHERIT_FINI(t, element)
Definition inherit.h:238
#define GWEN_LIST_FINI(t, element)
Definition list1.h:475
#define GWEN_LIST_FUNCTIONS(t, pr)
Definition list1.h:367
#define GWEN_LIST_INIT(t, element)
Definition list1.h:466
#define GWEN_LIST2_FUNCTIONS(t, pr)
Definition list2.h:99
#define GWEN_LOGDOMAIN
Definition logger.h:35
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55