gwenhywfar  5.10.1
cryptkeysym.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 #define DISABLE_DEBUGLOG
15 
16 
17 #include "cryptkeysym_p.h"
18 #include <gwenhywfar/misc.h>
19 #include <gwenhywfar/debug.h>
20 #include <gwenhywfar/cryptdefs.h>
21 #include <gwenhywfar/text.h>
22 
23 
24 
25 GWEN_INHERIT(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM)
26 
27 
28 
29 
30 
31 
33  const uint8_t *pInData,
34  uint32_t inLen,
35  uint8_t *pOutData,
36  uint32_t *pOutLen)
37 {
38  GWEN_CRYPT_KEY_SYM *xk;
39  gcry_error_t err;
40 
41  assert(k);
42  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
43  assert(xk);
44 
45  err=gcry_cipher_encrypt(xk->algoHandle, pOutData, inLen, pInData, inLen);
46  if (err) {
47  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_encrypt(): %s", gcry_strerror(err));
48  return GWEN_ERROR_GENERIC;
49  }
50  *pOutLen=inLen;
51 
52  return 0;
53 }
54 
55 
56 
58  const uint8_t *pInData,
59  uint32_t inLen,
60  uint8_t *pOutData,
61  uint32_t *pOutLen)
62 {
63  GWEN_CRYPT_KEY_SYM *xk;
64  gcry_error_t err;
65 
66  assert(k);
67  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
68  assert(xk);
69 
70  err=gcry_cipher_decrypt(xk->algoHandle, pOutData, inLen, pInData, inLen);
71  if (err) {
72  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_decrypt(): %s", gcry_strerror(err));
73  return GWEN_ERROR_GENERIC;
74  }
75  *pOutLen=inLen;
76 
77  return 0;
78 }
79 
80 
81 
83 {
84  GWEN_CRYPT_KEY_SYM *xk;
85 
86  xk=(GWEN_CRYPT_KEY_SYM *) p;
87  if (xk->keyData && xk->keyLen) {
88  memset(xk->keyData, 0, xk->keyLen);
89  free(xk->keyData);
90  }
91  xk->keyData=NULL;
92  xk->keyLen=0;
93  if (xk->algoValid)
94  gcry_cipher_close(xk->algoHandle);
95  GWEN_FREE_OBJECT(xk);
96 }
97 
98 
99 
101 {
102  GWEN_CRYPT_KEY *nk;
103  GWEN_CRYPT_KEY_SYM *xk;
104 
105  assert(k);
106  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
107  assert(xk);
108 
111  xk->mode,
112  xk->algo,
113  GCRY_CIPHER_SECURE,
114  xk->keyData,
115  xk->keyLen);
116  return nk;
117 }
118 
119 
120 
122 {
123  switch (mode) {
125  return GCRY_CIPHER_MODE_NONE;
127  return GCRY_CIPHER_MODE_NONE;
129  return GCRY_CIPHER_MODE_ECB;
131  return GCRY_CIPHER_MODE_CFB;
133  return GCRY_CIPHER_MODE_CBC;
134  }
135 
136  return GCRY_CIPHER_MODE_NONE;
137 }
138 
139 
140 
143  int algo,
144  unsigned int flags,
145  int quality)
146 {
147  GWEN_CRYPT_KEY *k;
148  GWEN_CRYPT_KEY_SYM *xk;
149  int kbytes;
150  uint8_t *keyData;
151  gcry_error_t err;
152  enum gcry_random_level q;
153 
154  k=GWEN_Crypt_Key_new(cryptAlgoId, keySize);
155  assert(k);
156  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_SYM, xk);
160 
161  switch (quality) {
162  case 0:
163  q=GCRY_WEAK_RANDOM;
164  break;
165  case 1:
166  q=GCRY_STRONG_RANDOM;
167  break;
168  case 2:
169  default:
170  q=GCRY_VERY_STRONG_RANDOM;
171  break;
172  }
173 
174  /* open algo */
175  err=gcry_cipher_open(&xk->algoHandle, algo, GWEN_Crypt_KeySym__MyMode2GMode(mode), flags);
176  if (err) {
177  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_open(): %s", gcry_strerror(err));
179  return NULL;
180  }
181  xk->algoValid=1;
182  xk->mode=mode;
183 
184  while (1) {
185  kbytes=keySize;
186  keyData=gcry_random_bytes(kbytes, q);
187 
188  /* store key data */
189  xk->keyData=keyData;
190  xk->keyLen=kbytes;
191 
192  /* set key in algo */
193  err=gcry_cipher_setkey(xk->algoHandle, xk->keyData, xk->keyLen);
194  if (err) {
195  if ((err & GPG_ERR_CODE_MASK)==GPG_ERR_WEAK_KEY) {
196  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): weak key, will try again");
197  }
198  else {
199  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): %d [%s]", err, gcry_strerror(err));
201  return NULL;
202  }
203  }
204  else
205  break;
206 
207  /* try it again */
208  memset(xk->keyData, 0, xk->keyLen);
209  free(xk->keyData);
210  xk->keyData=NULL;
211  xk->keyLen=0;
212  }
213 
214  return k;
215 }
216 
217 
218 
221  int algo,
222  unsigned int flags,
223  const uint8_t *kd, uint32_t kl)
224 {
225  GWEN_CRYPT_KEY *k;
226  GWEN_CRYPT_KEY_SYM *xk;
227  gcry_error_t err;
228 
229 #if 0
230  if (kl!=gcry_cipher_get_algo_keylen(algo)) {
231  DBG_ERROR(GWEN_LOGDOMAIN, "Invalid key length (is %d, should be %d)",
232  (int)kl, (int)gcry_cipher_get_algo_keylen(algo));
233  return NULL;
234  }
235 #endif
236 
237  k=GWEN_Crypt_Key_new(cryptAlgoId, keySize);
238  assert(k);
239  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_SYM, xk);
243 
244  /* open algo */
245  err=gcry_cipher_open(&xk->algoHandle, algo, GWEN_Crypt_KeySym__MyMode2GMode(mode), flags);
246  if (err) {
247  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_open(): %s", gcry_strerror(err));
249  return NULL;
250  }
251  xk->algoValid=1;
252  xk->mode=mode;
253  xk->algo=algo;
254 
255  /* read key data */
256  if (kd==NULL || kl==0) {
257  DBG_INFO(GWEN_LOGDOMAIN, "No key data");
259  return NULL;
260  }
261 
262  /* store key data */
263  xk->keyData=(uint8_t *) malloc(kl);
264  assert(xk->keyData);
265  memmove(xk->keyData, kd, kl);
266  xk->keyLen=kl;
267 
268  /* set key in algo */
269  err=gcry_cipher_setkey(xk->algoHandle, xk->keyData, xk->keyLen);
270  if (err) {
271  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): %s", gcry_strerror(err));
273  return NULL;
274  }
275 
276  return k;
277 }
278 
279 
280 
283  int algo,
284  unsigned int flags,
285  const char *gname,
286  GWEN_DB_NODE *db)
287 {
288  gcry_error_t err;
289  GWEN_CRYPT_KEY *k;
290  GWEN_CRYPT_KEY_SYM *xk;
291  //unsigned int nbits;
292  GWEN_DB_NODE *dbR;
293  unsigned int len;
294  const char *p;
295 
297  if (dbR==NULL) {
298  DBG_ERROR(GWEN_LOGDOMAIN, "DB does not contain an %s key (no %s group)",
299  gname, gname);
300  return NULL;
301  }
302 
303  k=GWEN_Crypt_Key_fromDb(db);
304  if (k==NULL) {
305  DBG_INFO(GWEN_LOGDOMAIN, "here");
306  return NULL;
307  }
308  if (GWEN_Crypt_Key_GetCryptAlgoId(k)!=cryptAlgoId) {
309  DBG_ERROR(GWEN_LOGDOMAIN, "DB does not contain an RSA key");
311  return NULL;
312  }
313  //nbits=GWEN_Crypt_Key_GetKeySize(k)*8;
314 
315  /* extend key */
316  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_SYM, xk);
320 
321  /* open algo */
322  err=gcry_cipher_open(&xk->algoHandle, algo, GWEN_Crypt_KeySym__MyMode2GMode(mode), flags);
323  if (err) {
324  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_open(): %s", gcry_strerror(err));
326  return NULL;
327  }
328  xk->algoValid=1;
329  xk->mode=mode;
330  xk->algo=algo;
331 
332  /* read key data */
333  p=GWEN_DB_GetBinValue(dbR, "keyData", 0, NULL, 0, &len);
334  if (p==NULL || len==0) {
335  DBG_INFO(GWEN_LOGDOMAIN, "No key data");
337  return NULL;
338  }
339 
340  /* store key data */
341  xk->keyData=(uint8_t *) malloc(len);
342  assert(xk->keyData);
343  memmove(xk->keyData, p, len);
344  xk->keyLen=len;
345 
346  /* set key in algo */
347  err=gcry_cipher_setkey(xk->algoHandle, xk->keyData, xk->keyLen);
348  if (err) {
349  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): %s", gcry_strerror(err));
351  return NULL;
352  }
353 
354  return k;
355 }
356 
357 
358 
359 int GWEN_Crypt_KeySym__toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db, const char *gname)
360 {
361  GWEN_CRYPT_KEY_SYM *xk;
362  GWEN_DB_NODE *dbR;
363  int rv;
364 
365  assert(k);
366  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
367  assert(xk);
368 
369  /* let key module wirte basic key info */
370  rv=GWEN_Crypt_Key_toDb(k, db);
371  if (rv)
372  return rv;
373 
374  /* write sym stuff into our own group */
376  assert(dbR);
377 
379  "keyData", xk->keyData, xk->keyLen);
380 
381  return 0;
382 }
383 
384 
385 
387 {
388  gcry_error_t err;
389  GWEN_CRYPT_KEY *k;
390  GWEN_CRYPT_KEY_SYM *xk;
391  //unsigned int nbits;
392  GWEN_DB_NODE *dbR;
393  unsigned int len;
394  const char *gname;
395  const char *p;
396 
397  k=GWEN_Crypt_Key_fromDb(db);
398  if (k==NULL) {
399  DBG_INFO(GWEN_LOGDOMAIN, "here");
400  return NULL;
401  }
402 
404 
406  if (dbR==NULL) {
407  DBG_ERROR(GWEN_LOGDOMAIN, "DB does not contain an %s key (no %s group)",
408  gname, gname);
410  return NULL;
411  }
412 
413  //nbits=GWEN_Crypt_Key_GetKeySize(k)*8;
414 
415  /* extend key */
416  GWEN_NEW_OBJECT(GWEN_CRYPT_KEY_SYM, xk);
420 
421  /* open algo */
422  err=gcry_cipher_open(&xk->algoHandle,
425  GCRY_CIPHER_SECURE);
426  if (err) {
427  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_open(): %s", gcry_strerror(err));
429  return NULL;
430  }
431  xk->algoValid=1;
432  xk->mode=mode;
433  xk->algo=GWEN_Crypt_Key_GetCryptAlgoId(k);
434 
435  /* read key data */
436  p=GWEN_DB_GetBinValue(dbR, "keyData", 0, NULL, 0, &len);
437  if (p==NULL || len==0) {
438  DBG_INFO(GWEN_LOGDOMAIN, "No key data");
440  return NULL;
441  }
442 
443  /* store key data */
444  xk->keyData=(uint8_t *) malloc(len);
445  assert(xk->keyData);
446  memmove(xk->keyData, p, len);
447  xk->keyLen=len;
448 
449  /* set key in algo */
450  err=gcry_cipher_setkey(xk->algoHandle, xk->keyData, xk->keyLen);
451  if (err) {
452  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): %s", gcry_strerror(err));
454  return NULL;
455  }
456 
457  return k;
458 }
459 
460 
461 
463 {
464  GWEN_CRYPT_KEY_SYM *xk;
465  GWEN_DB_NODE *dbR;
466  int rv;
467  const char *gname;
468 
469  assert(k);
470  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
471  assert(xk);
472 
473  /* let key module wirte basic key info */
474  rv=GWEN_Crypt_Key_toDb(k, db);
475  if (rv)
476  return rv;
477 
479 
480  /* write sym stuff into our own group */
482  assert(dbR);
483 
485  "keyData", xk->keyData, xk->keyLen);
486 
487  return 0;
488 }
489 
490 
491 
492 int GWEN_Crypt_KeySym_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
493 {
494  GWEN_CRYPT_KEY_SYM *xk;
495  gcry_error_t err;
496 
497  if (!kd || !kl) {
498  DBG_ERROR(GWEN_LOGDOMAIN, "Empty keydata not allowed");
499  return GWEN_ERROR_INVALID;
500  }
501 
502  assert(k);
503  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
504  assert(xk);
505 
506  if (xk->keyData && xk->keyLen) {
507  memset(xk->keyData, 0, xk->keyLen);
508  free(xk->keyData);
509  }
510 
511  /* store key data */
512  xk->keyData=(uint8_t *)malloc(kl);
513  assert(xk->keyData);
514  memmove(xk->keyData, kd, kl);
515  xk->keyLen=kl;
516 
517  /* set key in algo */
518  err=gcry_cipher_setkey(xk->algoHandle, xk->keyData, xk->keyLen);
519  if (err) {
520  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setkey(): %s", gcry_strerror(err));
522  return GWEN_ERROR_GENERIC;
523  }
524 
525  return 0;
526 }
527 
528 
529 
531 {
532  GWEN_CRYPT_KEY_SYM *xk;
533 
534  assert(k);
535  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
536  assert(xk);
537 
538  return xk->keyData;
539 }
540 
541 
542 
544 {
545  GWEN_CRYPT_KEY_SYM *xk;
546 
547  assert(k);
548  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
549  assert(xk);
550 
551  return xk->keyLen;
552 }
553 
554 
555 
556 
558  int keySize,
559  int quality)
560 {
561  uint8_t kd[16];
562  GWEN_CRYPT_KEY *k;
563 
564  GWEN_Crypt_Random(quality, kd, 16);
565  k=GWEN_Crypt_KeyDes3K_fromData(mode, keySize, kd, 16);
566  memset(kd, 0, 16);
567 
568  return k;
569 }
570 
571 
572 
574  const uint8_t *kd, uint32_t kl)
575 {
576  if (kl==16) {
577  uint8_t new_kd[24];
578  GWEN_CRYPT_KEY *k;
579 
580  /* 3key DES with only two keys, copy key1 as key3 */
581  memmove(new_kd, kd, 16);
582  memmove(new_kd+16, new_kd, 8);
583  k=GWEN_Crypt_KeySym_fromData(GWEN_Crypt_CryptAlgoId_Des3K, 24,
584  mode, GCRY_CIPHER_3DES, GCRY_CIPHER_SECURE, new_kd, 24);
585  memset(new_kd, 0, 24);
586  return k;
587  }
588  else
589  return GWEN_Crypt_KeySym_fromData(GWEN_Crypt_CryptAlgoId_Des3K, keySize,
590  mode, GCRY_CIPHER_3DES, GCRY_CIPHER_SECURE, kd, kl);
591 }
592 
593 
594 
596  GWEN_DB_NODE *db)
597 {
598  return GWEN_Crypt_KeySym__fromDb(GWEN_Crypt_CryptAlgoId_Des3K, mode,
599  GCRY_CIPHER_3DES, GCRY_CIPHER_SECURE, "des3k", db);
600 }
601 
602 
603 
605 {
606  return GWEN_Crypt_KeySym__toDb(k, db, "des3k");
607 }
608 
609 
610 
611 int GWEN_Crypt_KeyDes3K_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
612 {
613  if (kl==16) {
614  uint8_t new_kd[24];
615  int rv;
616 
617  /* 3key DES with only two keys, copy key1 as key3 */
618  memmove(new_kd, kd, 16);
619  memmove(new_kd+16, new_kd, 8);
620  rv=GWEN_Crypt_KeySym_SetKeyData(k, new_kd, 24);
621  memset(new_kd, 0, 24);
622  return rv;
623  }
624  else
625  return GWEN_Crypt_KeySym_SetKeyData(k, kd, kl);
626 }
627 
628 
629 
631 {
633 }
634 
635 
636 
638 {
640 }
641 
642 
643 
645  const uint8_t *kd,
646  uint32_t kl)
647 {
648  GWEN_CRYPT_KEY_SYM *xk;
649  gcry_error_t err;
650 
651  assert(k);
652  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
653  assert(xk);
654 
655  if (kd==NULL || kl==0) {
656  const uint8_t iv[]= {
657  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
658  };
659  err=gcry_cipher_setiv(xk->algoHandle, iv, sizeof(iv));
660  }
661  else
662  err=gcry_cipher_setiv(xk->algoHandle, kd, kl);
663  if (err) {
664  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setiv(): %s", gcry_strerror(err));
665  return GWEN_ERROR_GENERIC;
666  }
667 
668  return 0;
669 }
670 
671 
672 
673 
674 
675 
676 
678  int keySize,
679  int quality)
680 {
681  return GWEN_Crypt_KeySym_Generate(GWEN_Crypt_CryptAlgoId_BlowFish, keySize, mode,
682  GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_SECURE, quality);
683 }
684 
685 
686 
688  const uint8_t *kd, uint32_t kl)
689 {
690  return GWEN_Crypt_KeySym_fromData(GWEN_Crypt_CryptAlgoId_BlowFish, keySize, mode,
691  GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_SECURE,
692  kd, kl);
693 }
694 
695 
696 
698  GWEN_DB_NODE *db)
699 {
700  return GWEN_Crypt_KeySym__fromDb(GWEN_Crypt_CryptAlgoId_BlowFish, mode,
701  GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_SECURE, "blowFish", db);
702 }
703 
704 
705 
707 {
708  return GWEN_Crypt_KeySym__toDb(k, db, "blowFish");
709 }
710 
711 
712 
713 int GWEN_Crypt_KeyBlowFish_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
714 {
715  return GWEN_Crypt_KeySym_SetKeyData(k, kd, kl);
716 }
717 
718 
719 
721 {
723 }
724 
725 
726 
728 {
730 }
731 
732 
733 
734 
736  int keySize,
737  int quality)
738 {
739  return GWEN_Crypt_KeySym_Generate(GWEN_Crypt_CryptAlgoId_Aes128, keySize, mode,
740  GCRY_CIPHER_AES128, GCRY_CIPHER_SECURE, quality);
741 }
742 
743 
744 
746  const uint8_t *kd, uint32_t kl)
747 {
748  return GWEN_Crypt_KeySym_fromData(GWEN_Crypt_CryptAlgoId_Aes128, keySize, mode,
749  GCRY_CIPHER_AES128, GCRY_CIPHER_SECURE,
750  kd, kl);
751 }
752 
753 
754 
756  GWEN_DB_NODE *db)
757 {
758  return GWEN_Crypt_KeySym__fromDb(GWEN_Crypt_CryptAlgoId_Aes128, mode,
759  GCRY_CIPHER_AES128, GCRY_CIPHER_SECURE, "aes128", db);
760 }
761 
762 
763 
765 {
766  return GWEN_Crypt_KeySym__toDb(k, db, "aes128");
767 }
768 
769 
770 
771 int GWEN_Crypt_KeyAes128_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
772 {
773  return GWEN_Crypt_KeySym_SetKeyData(k, kd, kl);
774 }
775 
776 
777 
779 {
781 }
782 
783 
784 
786 {
788 }
789 
790 
791 
793  const uint8_t *kd,
794  uint32_t kl)
795 {
796  GWEN_CRYPT_KEY_SYM *xk;
797  gcry_error_t err;
798 
799  assert(k);
800  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
801  assert(xk);
802 
803  if (kd==NULL || kl==0) {
804  const uint8_t iv[]= {
805  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
806  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
807  };
808  err=gcry_cipher_setiv(xk->algoHandle, iv, sizeof(iv));
809  }
810  else
811  err=gcry_cipher_setiv(xk->algoHandle, kd, kl);
812  if (err) {
813  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setiv(): %s", gcry_strerror(err));
814  return GWEN_ERROR_GENERIC;
815  }
816 
817  return 0;
818 }
819 
820 
821 
823  int keySize,
824  int quality)
825 {
826  return GWEN_Crypt_KeySym_Generate(GWEN_Crypt_CryptAlgoId_Aes256, keySize, mode,
827  GCRY_CIPHER_AES256, GCRY_CIPHER_SECURE, quality);
828 }
829 
830 
831 
833  const uint8_t *kd, uint32_t kl)
834 {
835  return GWEN_Crypt_KeySym_fromData(GWEN_Crypt_CryptAlgoId_Aes256, keySize, mode,
836  GCRY_CIPHER_AES256, GCRY_CIPHER_SECURE,
837  kd, kl);
838 }
839 
840 
841 
843  GWEN_DB_NODE *db)
844 {
845  return GWEN_Crypt_KeySym__fromDb(GWEN_Crypt_CryptAlgoId_Aes256, mode,
846  GCRY_CIPHER_AES256, GCRY_CIPHER_SECURE, "aes256", db);
847 }
848 
849 
850 
852 {
853  return GWEN_Crypt_KeySym__toDb(k, db, "aes256");
854 }
855 
856 
857 
858 int GWEN_Crypt_KeyAes256_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
859 {
860  return GWEN_Crypt_KeySym_SetKeyData(k, kd, kl);
861 }
862 
863 
864 
866 {
868 }
869 
870 
871 
873 {
875 }
876 
878  const uint8_t *kd,
879  uint32_t kl)
880 {
881  GWEN_CRYPT_KEY_SYM *xk;
882  gcry_error_t err;
883 
884  assert(k);
885  xk=GWEN_INHERIT_GETDATA(GWEN_CRYPT_KEY, GWEN_CRYPT_KEY_SYM, k);
886  assert(xk);
887 
888  if (kd==NULL || kl==0) {
889  const uint8_t iv[]= {
890  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
891  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
892  };
893  err=gcry_cipher_setiv(xk->algoHandle, iv, sizeof(iv));
894  }
895  else
896  err=gcry_cipher_setiv(xk->algoHandle, kd, kl);
897  if (err) {
898  DBG_INFO(GWEN_LOGDOMAIN, "gcry_cipher_setiv(): %s", gcry_strerror(err));
899  return GWEN_ERROR_GENERIC;
900  }
901 
902  return 0;
903 }
904 
905 
906 
907 
908 
GWENHYWFAR_CB int GWEN_Crypt_KeySym_Encipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkeysym.c:32
#define GWEN_DB_FLAGS_OVERWRITE_VARS
Definition: db.h:121
GWEN_CRYPT_KEY * GWEN_Crypt_KeySym_Generate(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize, GWEN_CRYPT_CRYPTMODE mode, int algo, unsigned int flags, int quality)
Definition: cryptkeysym.c:141
GWENHYWFAR_CB void GWEN_Crypt_KeySym_freeData(GWEN_UNUSED void *bp, void *p)
Definition: cryptkeysym.c:82
int GWEN_Crypt_KeyAes128_SetIV(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:792
int GWEN_Crypt_KeySym_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:492
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
#define GWEN_ERROR_INVALID
Definition: error.h:67
int GWEN_Crypt_Key_GetKeySize(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:179
int GWEN_Crypt_KeyAes256_SetIV(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:877
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:154
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes256_fromDb(GWEN_CRYPT_CRYPTMODE mode, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:842
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:61
#define NULL
Definition: binreloc.c:300
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes256_fromData(GWEN_CRYPT_CRYPTMODE mode, int keySize, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:832
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes128_fromData(GWEN_CRYPT_CRYPTMODE mode, int keySize, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:745
GWEN_CRYPT_KEY * GWEN_Crypt_KeyDes3K_Generate(GWEN_CRYPT_CRYPTMODE mode, int keySize, int quality)
Definition: cryptkeysym.c:557
GWEN_CRYPT_KEY * GWEN_Crypt_KeySym_fromDb(GWEN_CRYPT_CRYPTMODE mode, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:386
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes256_Generate(GWEN_CRYPT_CRYPTMODE mode, int keySize, int quality)
Definition: cryptkeysym.c:822
GWEN_CRYPT_KEY * GWEN_Crypt_KeyDes3K_fromData(GWEN_CRYPT_CRYPTMODE mode, int keySize, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:573
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_Key_GetCryptAlgoId(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:171
GWEN_CRYPT_KEY * GWEN_Crypt_KeySym__fromDb(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, GWEN_CRYPT_CRYPTMODE mode, int algo, unsigned int flags, const char *gname, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:281
enum gcry_cipher_modes GWEN_Crypt_KeySym__MyMode2GMode(GWEN_CRYPT_CRYPTMODE mode)
Definition: cryptkeysym.c:121
int GWEN_Crypt_KeyAes256_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:858
int GWEN_Crypt_KeyAes128_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:771
uint32_t GWEN_Crypt_KeyDes3K_GetKeyDataLen(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:637
int GWEN_Crypt_Key_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkey.c:117
int GWEN_DB_SetBinValue(GWEN_DB_NODE *n, uint32_t flags, const char *path, const void *val, unsigned int valSize)
Definition: db.c:1269
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:55
GWEN_CRYPT_KEY * GWEN_Crypt_KeyBlowFish_Generate(GWEN_CRYPT_CRYPTMODE mode, int keySize, int quality)
Definition: cryptkeysym.c:677
GWEN_CRYPT_CRYPTALGOID
Definition: cryptalgo.h:52
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes128_fromDb(GWEN_CRYPT_CRYPTMODE mode, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:755
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:53
#define GWEN_DB_FLAGS_OVERWRITE_GROUPS
Definition: db.h:123
int GWEN_Crypt_KeyDes3K_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:604
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:1237
#define GWEN_ERROR_GENERIC
Definition: error.h:62
int GWEN_Crypt_KeySym_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:462
uint32_t GWEN_Crypt_KeyBlowFish_GetKeyDataLen(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:727
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
uint8_t * GWEN_Crypt_KeyBlowFish_GetKeyDataPtr(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:720
GWEN_CRYPT_KEY * GWEN_Crypt_KeySym_dup(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:100
uint8_t * GWEN_Crypt_KeyAes256_GetKeyDataPtr(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:865
int GWEN_Crypt_KeyAes128_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:764
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1381
GWENHYWFAR_CB int GWEN_Crypt_KeySym_Decipher(GWEN_CRYPT_KEY *k, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen)
Definition: cryptkeysym.c:57
int GWEN_Crypt_KeyDes3K_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:611
GWEN_CRYPT_KEY * GWEN_Crypt_KeySym_fromData(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize, GWEN_CRYPT_CRYPTMODE mode, int algo, unsigned int flags, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:219
void GWEN_Crypt_Random(int quality, uint8_t *buffer, uint32_t len)
Definition: cryptdefs.c:551
GWEN_CRYPT_KEY * GWEN_Crypt_KeyAes128_Generate(GWEN_CRYPT_CRYPTMODE mode, int keySize, int quality)
Definition: cryptkeysym.c:735
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_KeyAes256_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:851
uint8_t * GWEN_Crypt_KeyAes128_GetKeyDataPtr(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:778
uint32_t GWEN_Crypt_KeyAes256_GetKeyDataLen(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:872
int GWEN_Crypt_KeyBlowFish_SetKeyData(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:713
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
GWEN_CRYPT_KEY * GWEN_Crypt_KeyBlowFish_fromData(GWEN_CRYPT_CRYPTMODE mode, int keySize, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:687
GWEN_CRYPT_KEY * GWEN_Crypt_KeyDes3K_fromDb(GWEN_CRYPT_CRYPTMODE mode, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:595
int GWEN_Crypt_KeyBlowFish_toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:706
GWEN_CRYPT_KEY * GWEN_Crypt_KeyBlowFish_fromDb(GWEN_CRYPT_CRYPTMODE mode, GWEN_DB_NODE *db)
Definition: cryptkeysym.c:697
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
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_KeyDes3K_SetIV(GWEN_CRYPT_KEY *k, const uint8_t *kd, uint32_t kl)
Definition: cryptkeysym.c:644
GWEN_CRYPT_KEY * GWEN_Crypt_Key_new(GWEN_CRYPT_CRYPTALGOID cryptAlgoId, int keySize)
Definition: cryptkey.c:63
uint32_t GWEN_Crypt_KeyAes128_GetKeyDataLen(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:785
uint8_t * GWEN_Crypt_KeyDes3K_GetKeyDataPtr(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:630
uint32_t GWEN_Crypt_KeySym_GetKeyDataLen(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:543
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
uint8_t * GWEN_Crypt_KeySym_GetKeyDataPtr(const GWEN_CRYPT_KEY *k)
Definition: cryptkeysym.c:530
#define GWEN_PATH_FLAGS_NAMEMUSTEXIST
Definition: path.h:84
GWEN_CRYPT_KEY * GWEN_Crypt_Key_fromDb(GWEN_DB_NODE *db)
Definition: cryptkey.c:80
#define GWEN_UNUSED
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
int GWEN_Crypt_KeySym__toDb(const GWEN_CRYPT_KEY *k, GWEN_DB_NODE *db, const char *gname)
Definition: cryptkeysym.c:359
GWEN_CRYPT_CRYPTMODE
Definition: cryptalgo.h:55