gwenhywfar  4.99.8beta
cryptalgo.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Wed Mar 16 2005
3  copyright : (C) 2005-2010 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 "cryptalgo_p.h"
19 #include <gwenhywfar/misc.h>
20 #include <gwenhywfar/debug.h>
21 
22 
23 
24 GWEN_LIST2_FUNCTIONS(GWEN_CRYPT_CRYPTALGO, GWEN_Crypt_CryptAlgo)
25 
26 
27 
29  assert(s);
30  if (strcasecmp(s, "none")==0)
31  return GWEN_Crypt_CryptAlgoId_None;
32  else if (strcasecmp(s, "rsa")==0)
33  return GWEN_Crypt_CryptAlgoId_Rsa;
34  else if (strcasecmp(s, "dsa")==0)
35  return GWEN_Crypt_CryptAlgoId_Dsa;
36  else if (strcasecmp(s, "des")==0)
37  return GWEN_Crypt_CryptAlgoId_Des;
38  else if (strcasecmp(s, "des_3k")==0 ||
39  strcasecmp(s, "des3k")==0)
40  return GWEN_Crypt_CryptAlgoId_Des3K;
41  else if (strcasecmp(s, "blowfish")==0)
42  return GWEN_Crypt_CryptAlgoId_BlowFish;
43  else if (strcasecmp(s, "aes128")==0)
44  return GWEN_Crypt_CryptAlgoId_Aes128;
45  else if (strcasecmp(s, "any")==0)
46  return GWEN_Crypt_CryptAlgoId_Any;
47  return GWEN_Crypt_CryptAlgoId_Unknown;
48 }
49 
50 
51 
53  switch(a) {
54  case GWEN_Crypt_CryptAlgoId_None:
55  return "none";
56  case GWEN_Crypt_CryptAlgoId_Rsa:
57  return "rsa";
58  case GWEN_Crypt_CryptAlgoId_Dsa:
59  return "dsa";
60  case GWEN_Crypt_CryptAlgoId_Des:
61  return "des";
62  case GWEN_Crypt_CryptAlgoId_Des3K:
63  return "des_3k";
64  case GWEN_Crypt_CryptAlgoId_BlowFish:
65  return "blowfish";
66  case GWEN_Crypt_CryptAlgoId_Aes128:
67  return "aes128";
68  case GWEN_Crypt_CryptAlgoId_Any:
69  return "any";
70  default:
71  return "unknown";
72  }
73 }
74 
75 
76 
78  assert(s);
79  if (strcasecmp(s, "none")==0)
81  else if (strcasecmp(s, "ecb")==0)
83  else if (strcasecmp(s, "cfb")==0)
85  else if (strcasecmp(s, "cbc")==0)
88 }
89 
90 
91 
93  switch(m) {
95  return "none";
97  return "ecb";
99  return "cfb";
101  return "cbc";
102  default:
103  return "unknown";
104  }
105 }
106 
107 
108 
112 
114  a->refCount=1;
115 
116  a->id=id;
117  a->mode=m;
118 
119  return a;
120 }
121 
122 
123 
125  assert(a);
126  assert(a->refCount);
127  a->refCount++;
128 }
129 
130 
131 
133  const char *s;
134 
135  assert(db);
136  s=GWEN_DB_GetCharValue(db, "id", 0, NULL);
137  if (s) {
141  const void *p;
142  unsigned int len;
143 
145  if (id==GWEN_Crypt_CryptAlgoId_Unknown) {
146  DBG_INFO(GWEN_LOGDOMAIN, "Unknown cryptalgo id [%s]", s);
147  return NULL;
148  }
149 
150  s=GWEN_DB_GetCharValue(db, "mode", 0, NULL);
151  if (s)
153  else {
154  DBG_INFO(GWEN_LOGDOMAIN, "Missing crypt mode");
155  return NULL;
156  }
157 
158  a=GWEN_Crypt_CryptAlgo_new(id, m);
159  assert(a);
160  p=GWEN_DB_GetBinValue(db, "initVector", 0, NULL, 0, &len);
161  if (p && len)
163 
164  a->chunkSize=GWEN_DB_GetIntValue(db, "chunkSize", 0, 0);
165  a->keySizeInBits=GWEN_DB_GetIntValue(db, "keySizeInBits", 0, 0);
166 
167  return a;
168  }
169  else {
170  DBG_INFO(GWEN_LOGDOMAIN, "Missing cryptalgo id");
171  return NULL;
172  }
173 }
174 
175 
176 
178  assert(a);
179  assert(a->refCount);
180 
182  "id",
185  "mode",
187  if (a->pInitVector && a->lInitVector)
189  "initVector",
190  a->pInitVector, a->lInitVector);
192  "chunkSize",
193  a->chunkSize);
195  "keySizeInBits",
196  a->keySizeInBits);
197 
198  return 0;
199 }
200 
201 
202 
205 
206  assert(na);
207  a=GWEN_Crypt_CryptAlgo_new(na->id, na->mode);
208  if (na->pInitVector && na->lInitVector) {
209  a->pInitVector=(uint8_t*) malloc(na->lInitVector);
210  if (a->pInitVector==NULL) {
212  return NULL;
213  }
214  else
215  memmove(a->pInitVector, na->pInitVector, na->lInitVector);
216  a->lInitVector=na->lInitVector;
217  }
218  a->chunkSize=na->chunkSize;
219  a->keySizeInBits=na->keySizeInBits;
220  return a;
221 }
222 
223 
224 
226  if (a) {
227  assert(a->refCount);
228  if (a->refCount==1) {
229  if (a->pInitVector) {
230  free(a->pInitVector);
231  a->pInitVector=NULL;
232  }
233  a->refCount--;
234  GWEN_FREE_OBJECT(a);
235  }
236  else {
237  a->refCount--;
238  }
239  }
240 }
241 
242 
243 
245  assert(a);
246  assert(a->refCount);
247  return a->id;
248 }
249 
250 
251 
253  assert(a);
254  assert(a->refCount);
255  return a->mode;
256 }
257 
258 
259 
261  assert(a);
262  assert(a->refCount);
263  return a->pInitVector;
264 }
265 
266 
267 
269  assert(a);
270  assert(a->refCount);
271  return a->lInitVector;
272 }
273 
274 
275 
277  const uint8_t *pv,
278  uint32_t lv) {
279  uint8_t *nv=NULL;
280 
281  assert(a);
282  assert(a->refCount);
283 
284  if (pv && lv) {
285  nv=(uint8_t*) malloc(lv);
286  if (nv==NULL)
287  return GWEN_ERROR_MEMORY_FULL;
288  memmove(nv, pv, lv);
289  }
290 
291  if (a->pInitVector && a->lInitVector)
292  free(a->pInitVector);
293 
294  a->pInitVector=nv;
295  a->lInitVector=(nv!=NULL)?lv:0;
296 
297  return 0;
298 }
299 
300 
301 
303  assert(a);
304  assert(a->refCount);
305 
306  return a->chunkSize;
307 }
308 
309 
310 
312  assert(a);
313  assert(a->refCount);
314 
315  a->chunkSize=s;
316 }
317 
318 
319 
321  assert(a);
322  assert(a->refCount);
323 
324  return a->keySizeInBits;
325 }
326 
327 
328 
330  assert(a);
331  assert(a->refCount);
332 
333  a->keySizeInBits=s;
334 }
335 
336 
337 
338 
339 
340 
341 
int GWEN_Crypt_CryptAlgo_GetChunkSize(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:302
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgoId_fromString(const char *s)
Definition: cryptalgo.c:28
const char * GWEN_Crypt_CryptMode_toString(GWEN_CRYPT_CRYPTMODE m)
Definition: cryptalgo.c:92
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
void GWEN_Crypt_CryptAlgo_free(GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:225
#define NULL
Definition: binreloc.c:290
GWEN_CRYPT_CRYPTALGO * GWEN_Crypt_CryptAlgo_dup(const GWEN_CRYPT_CRYPTALGO *na)
Definition: cryptalgo.c:203
void GWEN_Crypt_CryptAlgo_SetKeySizeInBits(GWEN_CRYPT_CRYPTALGO *a, int s)
Definition: cryptalgo.c:329
void GWEN_Crypt_CryptAlgo_SetChunkSize(GWEN_CRYPT_CRYPTALGO *a, int s)
Definition: cryptalgo.c:311
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int GWEN_Crypt_CryptAlgo_SetInitVector(GWEN_CRYPT_CRYPTALGO *a, const uint8_t *pv, uint32_t lv)
Definition: cryptalgo.c:276
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1151
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
GWEN_CRYPT_CRYPTALGOID
Definition: cryptalgo.h:50
int GWEN_Crypt_CryptAlgo_toDb(const GWEN_CRYPT_CRYPTALGO *a, GWEN_DB_NODE *db)
Definition: cryptalgo.c:177
GWEN_CRYPT_CRYPTALGO * GWEN_Crypt_CryptAlgo_fromDb(GWEN_DB_NODE *db)
Definition: cryptalgo.c:132
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:52
const void * GWEN_DB_GetBinValue(GWEN_DB_NODE *n, const char *path, int idx, const void *defVal, unsigned int defValSize, unsigned int *returnValueSize)
Definition: db.c:1120
uint32_t GWEN_Crypt_CryptAlgo_GetInitVectorLen(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:268
int GWEN_Crypt_CryptAlgo_GetKeySizeInBits(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:320
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
GWEN_CRYPT_CRYPTMODE GWEN_Crypt_CryptMode_fromString(const char *s)
Definition: cryptalgo.c:77
GWEN_LIST2_FUNCTIONS(TYPEMAKER2_TYPE, Typemaker2_Type)
struct GWEN_CRYPT_CRYPTALGO GWEN_CRYPT_CRYPTALGO
Definition: cryptalgo.h:20
void GWEN_Crypt_CryptAlgo_Attach(GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:124
int GWEN_DB_SetCharValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const char *val)
Definition: db.c:922
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgo_GetId(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:244
uint8_t * GWEN_Crypt_CryptAlgo_GetInitVectorPtr(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:260
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
GWEN_CRYPT_CRYPTMODE GWEN_Crypt_CryptAlgo_GetMode(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:252
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1048
int GWEN_DB_SetIntValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, int val)
Definition: db.c:1086
GWEN_CRYPT_CRYPTALGO * GWEN_Crypt_CryptAlgo_new(GWEN_CRYPT_CRYPTALGOID id, GWEN_CRYPT_CRYPTMODE m)
Definition: cryptalgo.c:109
#define GWEN_ERROR_MEMORY_FULL
Definition: error.h:77
GWEN_CRYPT_CRYPTMODE
Definition: cryptalgo.h:53