gwenhywfar  4.3.3
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