gwenhywfar 5.14.1
ctfile.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#define DISABLE_DEBUGLOG
15
16
17#include "ctfile_p.h"
18#include "i18n_l.h"
19#include <gwenhywfar/ctf_context_be.h>
20#include <gwenhywfar/misc.h>
21#include <gwenhywfar/debug.h>
22#include <gwenhywfar/padd.h>
23#include <gwenhywfar/cryptkeyrsa.h>
24#include <gwenhywfar/text.h>
25
26#include <sys/types.h>
27#include <sys/stat.h>
28#include <fcntl.h>
29#include <string.h>
30#include <errno.h>
31#include <stdlib.h>
32#include <unistd.h>
33
34
35
36GWEN_INHERIT(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE)
37
38
39
40
41
43{
44 int fd;
45 GWEN_CRYPT_TOKEN_FILE *lct;
47 const char *fname;
48
49 assert(ct);
50 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
51 assert(lct);
52
54 if (!fname) {
56 "No name of the crypt token set - maybe you need to set the key file as token name? Cannot lock token.");
57 return GWEN_ERROR_IO;
58 }
59
60 lct->lock=GWEN_FSLock_new(fname,
62 lres=GWEN_FSLock_Lock(lct->lock, 10000, gid);
63 if (lres!=GWEN_FSLock_ResultOk) {
64 GWEN_FSLock_free(lct->lock);
65 lct->lock=0;
66 DBG_ERROR(GWEN_LOGDOMAIN, "Could not lock file");
69 else
70 return GWEN_ERROR_IO;
71 }
72 else {
74 "Keyfile [%s] locked.",
76 }
77
78 if (wr) {
79 /* write file */
81 O_RDWR|O_CREAT
82#ifdef OS_WIN32
83 | O_BINARY
84#endif
85 ,
86 S_IRUSR|S_IWUSR | lct->keyfile_mode);
87 }
88 else {
89 /* Remember the access permissions when opening the file */
90 struct stat statbuffer;
91 if (!stat(GWEN_Crypt_Token_GetTokenName(ct), &statbuffer)) {
92 /* Save the access mode, but masked by the bit masks for
93 user/group/other permissions */
94 lct->keyfile_mode =
95 statbuffer.st_mode & (S_IRWXU
96#ifndef OS_WIN32
97 | S_IRWXG | S_IRWXO
98#endif
99 );
100 }
101 else {
103 "stat(%s): %s",
105 strerror(errno));
106
107 GWEN_FSLock_Unlock(lct->lock);
108 GWEN_FSLock_free(lct->lock);
109 lct->lock=0;
111 "Keyfile [%s] unlocked.",
113 return GWEN_ERROR_IO;
114 }
115
116 /* and open the file */
118 O_RDONLY
119#ifdef OS_WIN32
120 | O_BINARY
121#endif
122 );
123 }
124
125 if (fd==-1) {
127 "open(%s): %s",
129 strerror(errno));
130 GWEN_FSLock_Unlock(lct->lock);
131 GWEN_FSLock_free(lct->lock);
132 lct->lock=0;
134 "Keyfile [%s] unlocked.",
136 return GWEN_ERROR_IO;
137 }
138
139 lct->fd=fd;
140
141 return 0;
142}
143
144
145
147{
148 GWEN_CRYPT_TOKEN_FILE *lct;
150 struct stat st;
151
152 assert(ct);
153 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
154 assert(lct);
155
156 if (lct->fd==-1) {
157 DBG_ERROR(GWEN_LOGDOMAIN, "Keyfile \"%s\"not open",
159 return GWEN_ERROR_INTERNAL;
160 }
161
162 if (close(lct->fd)) {
163 DBG_ERROR(GWEN_LOGDOMAIN, "close(%s): %s",
164 GWEN_Crypt_Token_GetTokenName(ct), strerror(errno));
165 lct->fd=-1;
166 GWEN_FSLock_Unlock(lct->lock);
167 GWEN_FSLock_free(lct->lock);
168 lct->lock=0;
170 "Keyfile [%s] unlocked.",
172 return GWEN_ERROR_IO;
173 }
174 lct->fd=-1;
175
176 lres=GWEN_FSLock_Unlock(lct->lock);
177 if (lres!=GWEN_FSLock_ResultOk) {
178 DBG_WARN(GWEN_LOGDOMAIN, "Error removing lock from \"%s\": %d",
180 }
181 GWEN_FSLock_free(lct->lock);
182 lct->lock=0;
184 "Keyfile [%s] unlocked.",
186
187 /* get times */
188 if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
190 "stat(%s): %s",
192 strerror(errno));
193 return GWEN_ERROR_IO;
194 }
195
196#ifndef OS_WIN32
197 if (st.st_mode & 0007) {
199 "WARNING: Your keyfile \"%s\" is accessible by every user on your computer!\n"
200 "Nobody but you should have access to the file. You \n"
201 "should probably change this with \"chmod 600 %s\"",
205 "WARNING: Your keyfile is accessible ny every user on your computer!\n"
206 "Nobody but you should have access to the file.");
207 }
208#endif
209 lct->mtime=st.st_mtime;
210 lct->ctime=st.st_ctime;
211
212 return 0;
213}
214
215
216
218{
219 GWEN_CRYPT_TOKEN_FILE *lct;
220
221 assert(ct);
222 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
223 assert(lct);
224
225 assert(lct->readFn);
226 if (lseek(lct->fd, 0, SEEK_SET)==-1) {
227 DBG_ERROR(GWEN_LOGDOMAIN, "lseek(%s): %s",
229 strerror(errno));
230 return GWEN_ERROR_IO;
231 }
232 return lct->readFn(ct, lct->fd, gid);
233}
234
235
236
237int GWEN_Crypt_TokenFile__Write(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid)
238{
239 GWEN_CRYPT_TOKEN_FILE *lct;
240
241 assert(ct);
242 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
243 assert(lct);
244
245 if (lct->writeFn==0) {
247 "No write function in crypt token type \"%s\"",
250 }
251
252 if (lseek(lct->fd, 0, SEEK_SET)==-1) {
253 DBG_ERROR(GWEN_LOGDOMAIN, "lseek(%s): %s",
255 strerror(errno));
256 return GWEN_ERROR_IO;
257 }
258 return lct->writeFn(ct, lct->fd, cr, gid);
259}
260
261
262
264{
265 GWEN_CRYPT_TOKEN_FILE *lct;
266 int rv;
267
268 assert(ct);
269 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
270 assert(lct);
271
272 /* clear context list, it will be reloaded */
273 GWEN_Crypt_Token_Context_List_Clear(lct->contextList);
274
275 /* open file */
276 rv=GWEN_Crypt_TokenFile__OpenFile(ct, 0, gid);
277 if (rv) {
279 "Could not open keyfile for reading (%d)", rv);
280 return rv;
281 }
282
283 /* read file */
284 rv=GWEN_Crypt_TokenFile__Read(ct, gid);
285 if (rv) {
286 DBG_INFO(GWEN_LOGDOMAIN, "Error reading keyfile");
288 return rv;
289 }
290
291 /* close file */
293 if (rv) {
294 DBG_INFO(GWEN_LOGDOMAIN, "Could not close keyfile");
295 return rv;
296 }
297
298 return 0;
299}
300
301
302
304{
305 GWEN_CRYPT_TOKEN_FILE *lct;
306 int rv;
307
308 assert(ct);
309 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
310 assert(lct);
311
312 /* open file */
313 rv=GWEN_Crypt_TokenFile__OpenFile(ct, 1, gid);
314 if (rv) {
316 "Could not open keyfile for writing (%d)", rv);
317 return rv;
318 }
319
320 /* write file */
321 rv=GWEN_Crypt_TokenFile__Write(ct, cr, gid);
322 if (rv) {
323 DBG_INFO(GWEN_LOGDOMAIN, "Error writing keyfile");
325 return rv;
326 }
327
328 /* close file */
330 if (rv) {
331 DBG_INFO(GWEN_LOGDOMAIN, "Could not close keyfile");
332 return rv;
333 }
334
335 return 0;
336}
337
338
339
341{
342 GWEN_CRYPT_TOKEN_FILE *lct;
343 struct stat st;
344
345 assert(ct);
346 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
347 assert(lct);
348
349 if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
351 "stat(%s): %s",
353 strerror(errno));
354 return -1;
355 }
356 if (lct->mtime!=st.st_mtime ||
357 lct->ctime!=st.st_ctime) {
358 int rv;
359
360 /* file has changed, reload it */
362 "Keyfile changed externally, reloading it");
363 /* read file */
365 if (rv) {
366 DBG_WARN(GWEN_LOGDOMAIN, "Error reloading keyfile");
367 return rv;
368 }
369 }
370 else {
371 DBG_NOTICE(GWEN_LOGDOMAIN, "Keyfile unchanged, not reloading");
372 }
373 return 0;
374}
375
376
377
379{
380 GWEN_CRYPT_TOKEN_FILE *lct;
381
382 assert(ct);
383 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
384 assert(lct);
385
386 /* make sure the context is a file context */
388 GWEN_Crypt_Token_Context_List_Add(ctx, lct->contextList);
389}
390
391
392
394{
395 GWEN_CRYPT_TOKEN_FILE *lct;
397
398 assert(ct);
399 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
400 assert(lct);
401
402 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
403 while (ctx) {
404 if (idx==0)
405 return ctx;
407 idx--;
408 }
409
410 return NULL;
411}
412
413
414
417{
418 GWEN_CRYPT_TOKEN_FILE *lct;
420
421 assert(ct);
422 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
423 assert(lct);
424
425 of=lct->readFn;
426 lct->readFn=f;
427
428 return of;
429}
430
431
432
435{
436 GWEN_CRYPT_TOKEN_FILE *lct;
438
439 assert(ct);
440 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
441 assert(lct);
442
443 of=lct->writeFn;
444 lct->writeFn=f;
445
446 return of;
447}
448
449
450
452{
453 GWEN_CRYPT_TOKEN_FILE *lct;
454 struct stat st;
455 int fd;
456 int rv;
457
458 assert(ct);
459 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
460 assert(lct);
461
463 DBG_ERROR(GWEN_LOGDOMAIN, "No medium name given");
464 return GWEN_ERROR_INVALID;
465 }
466
467 if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
468 if (errno!=ENOENT) {
470 "Error trying to access key file \"%s\": %s",
472 strerror(errno));
473 return GWEN_ERROR_IO;
474 }
475 }
476 else {
478 "Keyfile \"%s\" already exists, will not create it",
480 return GWEN_ERROR_INVALID;
481 }
482
483
484 /* create file */
486 O_RDWR | O_CREAT | O_EXCL
487#ifdef OS_WIN32
488 | O_BINARY
489#endif
490 ,
491 S_IRUSR|S_IWUSR);
492
493
494 if (fd==-1) {
496 "open(%s): %s",
498 strerror(errno));
499 return GWEN_ERROR_IO;
500 }
501
502 close(fd);
503
504 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 1, gid);
505 if (rv) {
506 DBG_INFO(GWEN_LOGDOMAIN, "here");
507 return rv;
508 }
509
510 return 0;
511}
512
513
514
516{
517 GWEN_CRYPT_TOKEN_FILE *lct;
518 int rv;
519
520 assert(ct);
521 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
522 assert(lct);
523
525 if (rv) {
526 DBG_INFO(GWEN_LOGDOMAIN, "here");
527 return rv;
528 }
529
530 return 0;
531}
532
533
534
536{
537 GWEN_CRYPT_TOKEN_FILE *lct;
538 int rv;
539
540 assert(ct);
541 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
542 assert(lct);
543
544 if (!abandon)
545 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
546 else
547 rv=0;
548
549 /* free/reset all data */
550 GWEN_Crypt_Token_Context_List_Clear(lct->contextList);
551 lct->mtime=0;
552 lct->ctime=0;
553
554 return rv;
555}
556
557
558
559
561 uint32_t *pIdList,
562 uint32_t *pCount,
563 uint32_t gid)
564{
565 GWEN_CRYPT_TOKEN_FILE *lct;
567 int i;
568 int rv;
569
570 assert(ct);
571 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
572 assert(lct);
573
574 /* reload if needed */
576 if (rv) {
577 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
578 return rv;
579 }
580
581 /* count keys */
582 i=0;
583 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
584 while (ctx) {
587 }
588
589 /* if no buffer given just return number of keys */
590 if (pIdList==NULL) {
591 *pCount=i;
592 return 0;
593 }
594
595 if (*pCount<i) {
596 DBG_INFO(GWEN_LOGDOMAIN, "Buffer too small");
598 }
599
600 *pCount=i;
601 i=0;
602 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
603 while (ctx) {
604 int j;
605
606 for (j=1; j<=GWEN_CRYPT_TOKEN_CONTEXT_KEYS; j++)
607 *(pIdList++)=(i<<16)+j;
608
610 i++;
611 }
612
613 return 0;
614}
615
616
617
619 uint32_t id,
620 GWEN_UNUSED uint32_t flags,
621 uint32_t gid)
622{
623 GWEN_CRYPT_TOKEN_FILE *lct;
626 int i;
627 int rv;
628
629 assert(ct);
630 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
631 assert(lct);
632
633 /* reload if needed */
635 if (rv) {
636 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
637 return NULL;
638 }
639
640 i=id>>16;
641 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
642 while (ctx) {
643 if (i==0)
644 break;
646 i--;
647 }
648
649 if (ctx==NULL) {
650 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
651 return NULL;
652 }
653
654 switch (id & 0xffff) {
655 case 1:
657 break;
658 case 2:
660 break;
661 case 3:
663 break;
664 case 4:
666 break;
667 case 5:
669 break;
670 case 6:
672 break;
673 case 7:
675 break;
676 default:
677 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
678 return NULL;
679 }
680
681 if (ki==NULL) {
682 DBG_INFO(GWEN_LOGDOMAIN, "No key info stored for key %d", id);
683 return NULL;
684 }
685
686 return ki;
687}
688
689
690
691#if 0
693 uint32_t id,
694 const GWEN_CRYPT_TOKEN_KEYINFO *ki,
695 uint32_t gid)
696{
697 GWEN_CRYPT_TOKEN_FILE *lct;
699 int i;
700 int rv;
702 GWEN_CRYPT_KEY *key;
703 uint32_t flags;
704
705 assert(ct);
706 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
707 assert(lct);
708
710
711 /* reload if needed */
713 if (rv) {
714 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
715 return rv;
716 }
717
718 i=id>>16;
719 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
720 while (ctx) {
721 if (i==0)
722 break;
724 i--;
725 }
726
727 if (ctx==NULL) {
728 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
730 }
731
733 assert(nki);
734 switch (id & 0xffff) {
735 case 1:
738 break;
739 case 2:
742 break;
743 case 3:
746 break;
747 case 4:
750 break;
751 case 5:
754 break;
755 case 6:
758 break;
759 default:
760 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
763 }
764
765 /* replace key if modulus and exponent are given */
768 id!=1 && /* don't change local keys */
769 id!=2 &&
770 id!=5) {
771 GWEN_CRYPT_KEY *nkey;
772
778 assert(nkey);
779
784
785 /* replace public key */
786 switch (id & 0xffff) {
787 case 3: /* remote sign key */
789 break;
790 case 4: /* remote crypt key */
792 break;
793 case 6: /* remote auth key */
795 break;
796 default:
798 "Can't set modulus and exponent for private key");
800 return GWEN_ERROR_INVALID;
801 }
803 I18N("Public key replaced"));
804 }
805 else {
806 if (key) {
811 }
812 }
813
814 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
815 if (rv) {
816 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
818 I18N("Unable to write key file"));
819 return rv;
820 }
821
823 I18N("Key file saved"));
824
825 return 0;
826}
827#endif
828
829
831 uint32_t id,
832 const GWEN_CRYPT_TOKEN_KEYINFO *ski,
833 uint32_t gid)
834{
835 GWEN_CRYPT_TOKEN_FILE *lct;
837 int i;
838 int rv;
840 GWEN_CRYPT_KEY *key;
841 uint32_t flags;
842 uint32_t nflags;
843
844 assert(ct);
845 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
846 assert(lct);
847
849
850 /* reload if needed */
852 if (rv) {
853 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
854 return rv;
855 }
856
857 i=id>>16;
858 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
859 while (ctx) {
860 if (i==0)
861 break;
863 i--;
864 }
865
866 if (ctx==NULL) {
867 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
869 }
870
871 switch (id & 0xffff) {
872 case 1:
875 break;
876 case 2:
879 break;
880 case 3:
883 break;
884 case 4:
887 break;
888 case 5:
891 break;
892 case 6:
895 break;
896 case 7:
899 break;
900 default:
901 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
903 }
904 assert(ki);
905
907
909 /* ignore for now */
910 }
911
914 nflags|=(flags & GWEN_CRYPT_TOKEN_KEYFLAGS_ACTIONMASK);
915 }
916
921 if (key)
923 DBG_INFO(GWEN_LOGDOMAIN, "Setting key version");
924 }
925
930 DBG_INFO(GWEN_LOGDOMAIN, "Setting signature counter");
931 }
932
937 if (key)
939 DBG_INFO(GWEN_LOGDOMAIN, "Setting key number");
940 }
941
942 /* replace key if modulus and exponent are given */
945 id!=1 && /* don't change local keys */
946 id!=2 &&
947 id!=5 &&
948 id!=7) {
949 GWEN_CRYPT_KEY *nkey;
950
965 assert(nkey);
966
971
972 /* replace public key */
973 switch (id & 0xffff) {
974 case 3: /* remote sign key */
976 break;
977 case 4: /* remote crypt key */
979 break;
980 case 6: /* remote auth key */
982 break;
983 default:
985 "Can't set modulus and exponent for private key");
987 return GWEN_ERROR_INVALID;
988 }
990 I18N("Public key replaced"));
991 }
992 else {
993 if (key) {
998 }
999 }
1000
1002
1003 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1004 if (rv) {
1005 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1007 I18N("Unable to write key file"));
1008 return rv;
1009 }
1010
1012 I18N("Key file saved"));
1013
1014 return 0;
1015}
1016
1017
1018
1020{
1021 GWEN_CRYPT_TOKEN_FILE *lct;
1023 int rv;
1024 int i;
1025 uint32_t keyNum;
1026 uint8_t kbuf[GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH];
1027 uint32_t klen;
1030 GWEN_CRYPT_KEY *key;
1031
1032 assert(ct);
1033 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1034 assert(lct);
1035
1036 /* reload if needed */
1038 if (rv) {
1039 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1040 return rv;
1041 }
1042
1043 keyNum=id & 0xffff;
1044
1045 i=id>>16;
1046 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1047 while (ctx) {
1048 if (i==0)
1049 break;
1051 i--;
1052 }
1053
1054 if (ctx==NULL) {
1055 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
1056 return GWEN_ERROR_NOT_FOUND;
1057 }
1058
1060 if (key==NULL) {
1061 DBG_ERROR(GWEN_LOGDOMAIN, "No temporary local sign key.");
1062 return GWEN_ERROR_NOT_FOUND;
1063 }
1064 key=GWEN_Crypt_KeyRsa_dup(key);
1065
1066 /* set key */
1067 if (keyNum==1)
1069 else if (keyNum==6)
1071 else {
1073 I18N("Invalid key id %02x"), id);
1075 return GWEN_ERROR_NO_DATA;
1076 }
1077 if (cki==NULL) {
1079 I18N("No key info found"));
1081 return GWEN_ERROR_NO_DATA;
1082 }
1083
1084 /* update key info for the key */
1086 assert(ki);
1087
1088 /* get modulus */
1089 klen=sizeof(kbuf);
1090 rv=GWEN_Crypt_KeyRsa_GetModulus(key, kbuf, &klen);
1091 if (rv) {
1092 DBG_INFO(GWEN_LOGDOMAIN, "No modulus for key");
1095 return rv;
1096 }
1098
1099 /* get exponent */
1100 klen=sizeof(kbuf);
1101 rv=GWEN_Crypt_KeyRsa_GetExponent(key, kbuf, &klen);
1102 if (rv) {
1103 DBG_INFO(GWEN_LOGDOMAIN, "No exponent for key");
1106 return rv;
1107 }
1111
1112 if (keyNum==1) {
1114 DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
1116 }
1129 }
1130 else if (keyNum==6) {
1132 DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
1134 }
1147 }
1148
1149 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1150 if (rv) {
1151 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1153 I18N("Unable to write key file"));
1154 return rv;
1155 }
1156
1158 I18N("Key file saved"));
1159
1160 return 0;
1161}
1162
1163
1164
1166 uint32_t *pIdList,
1167 uint32_t *pCount,
1168 uint32_t gid)
1169{
1170 GWEN_CRYPT_TOKEN_FILE *lct;
1172 int i;
1173 int rv;
1174
1175 assert(ct);
1176 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1177 assert(lct);
1178
1179 /* reload if needed */
1181 if (rv) {
1182 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1183 return rv;
1184 }
1185
1186 /* count keys */
1187 i=0;
1188 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1189 while (ctx) {
1190 i++;
1192 }
1193
1194 /* store number of entries */
1195 *pCount=i;
1196
1197 /* if no buffer given just return number of keys */
1198 if (pIdList==NULL)
1199 return 0;
1200
1201 if (*pCount<i) {
1202 DBG_INFO(GWEN_LOGDOMAIN, "Buffer too small");
1204 }
1205
1206 i=1;
1207 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1208 while (ctx) {
1209 *(pIdList++)=i;
1211 i++;
1212 }
1213
1214 return 0;
1215}
1216
1217
1218
1220 uint32_t id,
1221 uint32_t gid)
1222{
1223 GWEN_CRYPT_TOKEN_FILE *lct;
1225 int rv;
1226
1227 assert(ct);
1228 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1229 assert(lct);
1230
1231 /* reload if needed */
1233 if (rv) {
1234 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1235 return NULL;
1236 }
1237
1238 if (id==0) {
1239 DBG_INFO(GWEN_LOGDOMAIN, "Invalid context id 0");
1240 return NULL;
1241 }
1242
1243 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1244 while (ctx) {
1245 if (GWEN_Crypt_Token_Context_GetId(ctx)==id)
1246 break;
1248 }
1249
1250 if (ctx==NULL) {
1251 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", id);
1252 return NULL;
1253 }
1254
1255 return ctx;
1256}
1257
1258
1259
1261 uint32_t id,
1262 const GWEN_CRYPT_TOKEN_CONTEXT *nctx,
1263 uint32_t gid)
1264{
1265 GWEN_CRYPT_TOKEN_FILE *lct;
1267 int rv;
1268 const char *s;
1269
1270 assert(ct);
1271 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1272 assert(lct);
1273
1274 if (id==0) {
1275 DBG_INFO(GWEN_LOGDOMAIN, "Invalid context id 0");
1276 return GWEN_ERROR_INVALID;
1277 }
1278
1279 /* reload if needed */
1281 if (rv) {
1282 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1283 return rv;
1284 }
1285
1286 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1287 while (ctx) {
1288 if (GWEN_Crypt_Token_Context_GetId(ctx)==id)
1289 break;
1291 }
1292
1293 if (ctx==NULL) {
1294 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", id);
1295 return GWEN_ERROR_NOT_FOUND;
1296 }
1297
1298 /* copy user data from context */
1312
1313 return 0;
1314}
1315
1316
1317
1319{
1320 GWEN_CRYPT_TOKEN_FILE *lct;
1322 int i;
1323 int rv;
1324
1325 assert(ct);
1326 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1327 assert(lct);
1328
1329 /* reload if needed */
1331 if (rv) {
1332 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1333 return NULL;
1334 }
1335
1336 i=id>>16;
1337 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1338 while (ctx) {
1339 if (i==0)
1340 break;
1342 i--;
1343 }
1344
1345 if (ctx==NULL) {
1346 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
1347 return NULL;
1348 }
1349
1350 switch (id & 0xffff) {
1351 case 1:
1353 case 2:
1355 case 3:
1357 case 4:
1359 case 5:
1361 case 6:
1363 default:
1364 DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
1365 return NULL;
1366 }
1367}
1368
1369
1370
1372 uint32_t keyId,
1374 const uint8_t *pInData,
1375 uint32_t inLen,
1376 uint8_t *pSignatureData,
1377 uint32_t *pSignatureLen,
1378 uint32_t *pSeqCounter,
1379 uint32_t gid)
1380{
1381 GWEN_CRYPT_TOKEN_FILE *lct;
1383 GWEN_CRYPT_KEY *k;
1384 int keyNum;
1385 GWEN_BUFFER *srcBuf;
1386 int i;
1387 int rv;
1389
1390 assert(ct);
1391 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1392 assert(lct);
1393
1394 DBG_INFO(GWEN_LOGDOMAIN, "Signing with key %d", keyId);
1396
1397 /* reload if needed */
1399 if (rv) {
1400 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1401 return rv;
1402 }
1403
1404 /* get context */
1405 i=(keyId>>16);
1406 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1407 if (ctx==NULL) {
1408 DBG_ERROR(GWEN_LOGDOMAIN, "Token has no context");
1409 return GWEN_ERROR_NOT_FOUND;
1410 }
1411 while (ctx) {
1412 if (i==0)
1413 break;
1414 DBG_ERROR(GWEN_LOGDOMAIN, "Checking token %d (i==%d)",
1417 i--;
1418 }
1419
1420 if (ctx==NULL) {
1421 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1422 return GWEN_ERROR_NOT_FOUND;
1423 }
1424
1425 /* get key */
1426 keyNum=keyId & 0xffff;
1427 if (keyNum!=1 && keyNum!=5) {
1428 /* neither localSignKey nor localAuthKey */
1429 DBG_INFO(GWEN_LOGDOMAIN, "Bad key for signing (%x)", keyId);
1430 return GWEN_ERROR_INVALID;
1431 }
1432
1433 k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1434 if (k==NULL) {
1435 DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1436 return GWEN_ERROR_NOT_FOUND;
1437 }
1438
1439 /* copy to a buffer for padding */
1440 srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1441
1442 if (aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1443 const GWEN_CRYPT_TOKEN_KEYINFO *ki;
1444 int nbits;
1445 const uint8_t *modPtr;
1446 uint32_t modLen;
1447 GWEN_MDIGEST *md;
1448
1449 switch (keyId & 0xffff) {
1450 case 1:
1452 break;
1453 case 5:
1455 break;
1456 default:
1457 ki=NULL;
1458 }
1459
1460 if (ki==NULL) {
1461 DBG_ERROR(GWEN_LOGDOMAIN, "No information for key %d", keyNum);
1462 GWEN_Buffer_free(srcBuf);
1463 return GWEN_ERROR_GENERIC;
1464 }
1465
1466 /* calculate real number of bits */
1469 nbits=modLen*8;
1470 while (modLen && *modPtr==0) {
1471 nbits-=8;
1472 modLen--;
1473 modPtr++;
1474 }
1475 if (modLen) {
1476 uint8_t b=*modPtr;
1477 int i;
1478 uint8_t mask=0x80;
1479
1480 for (i=0; i<8; i++) {
1481 if (b & mask)
1482 break;
1483 nbits--;
1484 mask>>=1;
1485 }
1486 }
1487
1488 if (nbits==0) {
1489 DBG_ERROR(GWEN_LOGDOMAIN, "Empty modulus");
1490 GWEN_Buffer_free(srcBuf);
1491 return GWEN_ERROR_GENERIC;
1492 }
1493
1495 GWEN_Buffer_AllocRoom(srcBuf, modLen);
1496
1497 rv=GWEN_Padd_AddPkcs1Pss((uint8_t *) GWEN_Buffer_GetStart(srcBuf),
1499 nbits,
1500 pInData, inLen,
1501 inLen,
1502 md);
1504 if (rv<0) {
1505 DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
1506 GWEN_Buffer_free(srcBuf);
1507 return rv;
1508 }
1509
1510 GWEN_Buffer_IncrementPos(srcBuf, rv);
1512 }
1513 else {
1514 GWEN_Buffer_AppendBytes(srcBuf, (const char *)pInData, inLen);
1515
1516 /* padd according to given algo */
1517 rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1518 if (rv) {
1519 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1520 GWEN_Buffer_free(srcBuf);
1521 return rv;
1522 }
1523 }
1524
1525 /* sign with key */
1527 (const uint8_t *)GWEN_Buffer_GetStart(srcBuf),
1529 pSignatureData,
1530 pSignatureLen);
1531 GWEN_Buffer_free(srcBuf);
1532 if (rv) {
1533 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1534 return rv;
1535 }
1536
1537 if (pSeqCounter) {
1539
1540 /* signature sequence counter is to be incremented */
1541 switch (keyId & 0xffff) {
1542 case 1:
1544 break;
1545 case 5:
1547 break;
1548 default:
1549 ki=NULL;
1550 }
1551 if (ki &&
1553 unsigned int seq;
1554
1556 *pSeqCounter=seq;
1558
1559 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1560 if (rv) {
1561 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1562 return rv;
1563 }
1564 }
1565 else {
1566 DBG_WARN(GWEN_LOGDOMAIN, "No sign counter for key %04x", keyId);
1567 *pSeqCounter=0;
1568 }
1569 }
1570
1571 return 0;
1572}
1573
1574
1575
1577 uint32_t keyId,
1579 const uint8_t *pInData,
1580 uint32_t inLen,
1581 const uint8_t *pSignatureData,
1582 uint32_t signatureLen,
1583 uint32_t seqCounter,
1584 uint32_t gid)
1585{
1586 GWEN_CRYPT_TOKEN_FILE *lct;
1588 GWEN_CRYPT_KEY *k;
1589 int keyNum;
1590 int i;
1591 int rv;
1593
1594 assert(ct);
1595 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1596 assert(lct);
1597
1598 DBG_INFO(GWEN_LOGDOMAIN, "Verifying with key %d", keyId);
1599
1601
1602 /* reload if needed */
1604 if (rv) {
1605 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1606 return rv;
1607 }
1608
1609 /* get context */
1610 i=(keyId>>16);
1611 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1612 while (ctx) {
1613 if (i==0)
1614 break;
1616 i--;
1617 }
1618
1619 if (ctx==NULL) {
1620 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1621 return GWEN_ERROR_NOT_FOUND;
1622 }
1623
1624 /* get key */
1625 keyNum=keyId & 0xffff;
1626 if (keyNum!=1 && keyNum!=3 && keyNum!=6) {
1627 /* neither remoteSignKey nor remoteAuthKey */
1628 DBG_INFO(GWEN_LOGDOMAIN, "Bad key for verifying (%x)", keyId);
1629 return GWEN_ERROR_INVALID;
1630 }
1631
1632 k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1633 if (k==NULL) {
1634 DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1635 return GWEN_ERROR_NO_KEY;
1636 }
1637
1638 if (aid==GWEN_Crypt_PaddAlgoId_Iso9796_2 ||
1639 aid==GWEN_Crypt_PaddAlgoId_Pkcs1_2 ||
1640 aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1641 GWEN_BUFFER *tbuf;
1642 uint32_t l;
1643
1644 /* these algos add random numbers, we must use encrypt fn here and
1645 * compare the decrypted and unpadded data with the source data */
1646 tbuf=GWEN_Buffer_new(0, signatureLen+16, 0, 0);
1649 pSignatureData, signatureLen,
1650 (uint8_t *)GWEN_Buffer_GetStart(tbuf),
1651 &l);
1652 if (rv<0) {
1653 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1654 GWEN_Buffer_free(tbuf);
1655 return rv;
1656 }
1657 GWEN_Buffer_IncrementPos(tbuf, l);
1659
1660 if (aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1661 const GWEN_CRYPT_TOKEN_KEYINFO *ki;
1662 int nbits;
1663 const uint8_t *modPtr;
1664 uint32_t modLen;
1665 GWEN_MDIGEST *md;
1666
1667 if (keyNum==3)
1669 else
1671 if (ki==NULL) {
1672 DBG_ERROR(GWEN_LOGDOMAIN, "No information for key %d", keyNum);
1673 GWEN_Buffer_free(tbuf);
1674 return GWEN_ERROR_GENERIC;
1675 }
1676
1677 /* calculate real number of bits */
1680 nbits=modLen*8;
1681 while (modLen && *modPtr==0) {
1682 nbits-=8;
1683 modLen--;
1684 modPtr++;
1685 }
1686 if (modLen) {
1687 uint8_t b=*modPtr;
1688 int i;
1689 uint8_t mask=0x80;
1690
1691 for (i=0; i<8; i++) {
1692 if (b & mask)
1693 break;
1694 nbits--;
1695 mask>>=1;
1696 }
1697 }
1698
1699 if (nbits==0) {
1700 DBG_ERROR(GWEN_LOGDOMAIN, "Empty modulus");
1701 GWEN_Buffer_free(tbuf);
1702 return GWEN_ERROR_GENERIC;
1703 }
1704
1706 rv=GWEN_Padd_VerifyPkcs1Pss((const uint8_t *) GWEN_Buffer_GetStart(tbuf),
1708 nbits,
1709 pInData, inLen,
1710 inLen,
1711 md);
1713 if (rv<0) {
1714 DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
1715 GWEN_Buffer_free(tbuf);
1716 return rv;
1717 }
1718 }
1719 else {
1720 rv=GWEN_Padd_UnapplyPaddAlgo(a, tbuf);
1721 if (rv<0) {
1722 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1723 GWEN_Buffer_free(tbuf);
1724 return rv;
1725 }
1727
1728 if (l!=inLen) {
1729 DBG_ERROR(GWEN_LOGDOMAIN, "Signature length doesn't match");
1730 GWEN_Buffer_free(tbuf);
1731 return GWEN_ERROR_VERIFY;
1732 }
1733 if (memcmp(pInData, GWEN_Buffer_GetStart(tbuf), l)!=0) {
1734 DBG_ERROR(GWEN_LOGDOMAIN, "Signature doesn't match:");
1735 GWEN_Buffer_free(tbuf);
1736 return GWEN_ERROR_VERIFY;
1737 }
1738 }
1739 GWEN_Buffer_free(tbuf);
1740 }
1741 else {
1742 GWEN_BUFFER *srcBuf;
1743
1744 /* copy to a buffer for padding */
1745 srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1746 GWEN_Buffer_AppendBytes(srcBuf, (const char *)pInData, inLen);
1747
1748 /* padd according to given algo */
1749 rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1750 if (rv) {
1751 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1752 GWEN_Buffer_free(srcBuf);
1753 return rv;
1754 }
1755
1756 /* verify with key */
1758 (const uint8_t *)GWEN_Buffer_GetStart(srcBuf),
1760 pSignatureData,
1761 signatureLen);
1762 GWEN_Buffer_free(srcBuf);
1763 if (rv) {
1764 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1765 return rv;
1766 }
1767 }
1768
1769 if (seqCounter) {
1771
1772 /* signature sequence counter is to be checked */
1773 if (keyNum==3)
1775 else
1777 if (ki &&
1779 unsigned int seq;
1780
1782
1783 if (seq>=seqCounter) {
1784 DBG_WARN(GWEN_LOGDOMAIN, "Bad remote sequence counter (possibly replay attack!)");
1785 return GWEN_ERROR_VERIFY;
1786 }
1788
1789 /* write file */
1790 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1791 if (rv) {
1792 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1793 return rv;
1794 }
1795 }
1796 else {
1797 DBG_WARN(GWEN_LOGDOMAIN, "No sign counter for key %04x", keyId);
1798 }
1799
1800 }
1801
1802 return 0;
1803}
1804
1805
1806
1808 uint32_t keyId,
1810 const uint8_t *pInData,
1811 uint32_t inLen,
1812 uint8_t *pOutData,
1813 uint32_t *pOutLen,
1814 uint32_t gid)
1815{
1816 GWEN_CRYPT_TOKEN_FILE *lct;
1818 GWEN_CRYPT_KEY *k;
1819 int keyNum;
1820 GWEN_BUFFER *srcBuf;
1821 int i;
1822 int rv;
1823
1824 assert(ct);
1825 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1826 assert(lct);
1827
1828 DBG_INFO(GWEN_LOGDOMAIN, "Enciphering with key %d", keyId);
1829
1830 /* reload if needed */
1832 if (rv) {
1833 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1834 return rv;
1835 }
1836
1837 /* get context */
1838 i=(keyId>>16);
1839 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1840 while (ctx) {
1841 if (i==0)
1842 break;
1844 i--;
1845 }
1846
1847 if (ctx==NULL) {
1848 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1849 return GWEN_ERROR_NOT_FOUND;
1850 }
1851
1852 /* get key */
1853 keyNum=keyId & 0xffff;
1854 if (keyNum!=2 && keyNum!=4) {
1855 /* not remoteCryptKey */
1856 DBG_INFO(GWEN_LOGDOMAIN, "Bad key for encrypting (%x)", keyId);
1857 return GWEN_ERROR_INVALID;
1858 }
1859
1860 k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1861 if (k==NULL) {
1862 DBG_INFO(GWEN_LOGDOMAIN, "Key %d not found", keyId);
1863 return GWEN_ERROR_NOT_FOUND;
1864 }
1865
1866 /* copy to a buffer for padding */
1867 srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1868 GWEN_Buffer_AppendBytes(srcBuf, (const char *)pInData, inLen);
1869 GWEN_Buffer_Rewind(srcBuf);
1870
1871 /* padd according to given algo */
1872 rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1873 if (rv) {
1874 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1875 GWEN_Buffer_free(srcBuf);
1876 return rv;
1877 }
1878
1879 /* encipher with key */
1881 (const uint8_t *)GWEN_Buffer_GetStart(srcBuf),
1883 pOutData,
1884 pOutLen);
1885 GWEN_Buffer_free(srcBuf);
1886 if (rv) {
1887 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1888 return rv;
1889 }
1890
1891 return 0;
1892}
1893
1894
1895
1897 uint32_t keyId,
1899 const uint8_t *pInData,
1900 uint32_t inLen,
1901 uint8_t *pOutData,
1902 uint32_t *pOutLen,
1903 uint32_t gid)
1904{
1905 GWEN_CRYPT_TOKEN_FILE *lct;
1907 GWEN_CRYPT_KEY *k;
1908 int keyNum;
1909 GWEN_BUFFER *tbuf;
1910 int i;
1911 int rv;
1912 uint32_t l;
1913
1914 assert(ct);
1915 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1916 assert(lct);
1917
1918 DBG_INFO(GWEN_LOGDOMAIN, "Deciphering with key %d", keyId);
1919
1920 /* reload if needed */
1922 if (rv) {
1923 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1924 return rv;
1925 }
1926
1927 /* get context */
1928 i=(keyId>>16);
1929 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1930 while (ctx) {
1931 if (i==0)
1932 break;
1934 i--;
1935 }
1936
1937 if (ctx==NULL) {
1938 DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1939 return GWEN_ERROR_NOT_FOUND;
1940 }
1941
1942 /* get key */
1943 keyNum=keyId & 0xffff;
1944 if (keyNum!=2 && keyNum!=4) {
1945 /* not localCryptKey */
1946 DBG_INFO(GWEN_LOGDOMAIN, "Bad key for decrypting (%x)", keyId);
1947 return GWEN_ERROR_INVALID;
1948 }
1949
1950 k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1951 if (k==NULL) {
1952 DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1953 return GWEN_ERROR_NOT_FOUND;
1954 }
1955
1956 /* decipher with key */
1957 tbuf=GWEN_Buffer_new(0, inLen+16, 0, 1);
1960 pInData, inLen,
1961 (uint8_t *)GWEN_Buffer_GetStart(tbuf), &l);
1962 if (rv<0) {
1963 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1964 GWEN_Buffer_free(tbuf);
1965 return rv;
1966 }
1967 GWEN_Buffer_IncrementPos(tbuf, l);
1969
1970 /* unpadd according to given algo */
1971 rv=GWEN_Padd_UnapplyPaddAlgo(a, tbuf);
1972 if (rv) {
1973 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1974 GWEN_Buffer_free(tbuf);
1975 return rv;
1976 }
1977
1978 /* copy resulting data to given buffer */
1980 if (l>*pOutLen) {
1981 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1982 GWEN_Buffer_free(tbuf);
1984 }
1985 memmove(pOutData, GWEN_Buffer_GetStart(tbuf), l);
1986 *pOutLen=l;
1987 GWEN_Buffer_free(tbuf);
1988
1989 return 0;
1990}
1991
1992
1993
1995 uint32_t keyId,
1996 const GWEN_CRYPT_CRYPTALGO *a,
1997 uint32_t gid)
1998{
1999 GWEN_CRYPT_TOKEN_FILE *lct;
2000 GWEN_CRYPT_KEY *pubKey;
2001 GWEN_CRYPT_KEY *secKey;
2002 int rv;
2003 uint32_t keyNum;
2005 int i;
2006 uint8_t kbuf[GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH];
2007 uint32_t klen;
2010
2011 assert(ct);
2012 lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
2013 assert(lct);
2014
2015 /* reload if needed */
2017 if (rv) {
2018 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2019 return rv;
2020 }
2021
2022 keyNum=keyId & 0xffff;
2023
2024 /* check key id */
2025 if (keyNum!=1 && keyNum!=2 && keyNum!=5 && keyNum!=7) {
2026 DBG_INFO(GWEN_LOGDOMAIN, "Can only generate local keys.");
2028 I18N("Can only generate local keys."));
2030 }
2031
2032 /* check for algo */
2033 if (GWEN_Crypt_CryptAlgo_GetId(a)!=GWEN_Crypt_CryptAlgoId_Rsa) {
2034 DBG_INFO(GWEN_LOGDOMAIN, "Only RSA keys supported.");
2036 I18N("Only RSA keys supported."));
2038 }
2039
2040 /* get context */
2041 i=(keyId>>16);
2042 ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
2043 while (ctx) {
2044 if (i==0)
2045 break;
2047 i--;
2048 }
2049
2050 /* generate key pair */
2051 DBG_INFO(GWEN_LOGDOMAIN, "Creating key pair using %d bytes", GWEN_Crypt_CryptAlgo_GetChunkSize(a));
2055 &pubKey,
2056 &secKey);
2057 if (rv) {
2058 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2060 I18N("Could not generate key"));
2061 return rv;
2062 }
2063
2065 I18N("Key generated"));
2066
2067 /* set key */
2068 if (keyNum==1)
2070 else if (keyNum==2)
2072 else if (keyNum==5)
2074 else if (keyNum==7)
2076 else
2077 cki=NULL;
2078
2079 if (cki==NULL) {
2081 I18N("No key info found"));
2082 return GWEN_ERROR_NO_DATA;
2083 }
2084
2085 /* update key info for the key */
2087 assert(ki);
2088
2089 /* get modulus */
2090 klen=sizeof(kbuf);
2091 rv=GWEN_Crypt_KeyRsa_GetModulus(pubKey, kbuf, &klen);
2092 if (rv) {
2093 DBG_INFO(GWEN_LOGDOMAIN, "No modulus for key");
2095 GWEN_Crypt_Key_free(pubKey);
2096 return rv;
2097 }
2099
2100 /* get exponent */
2101 klen=sizeof(kbuf);
2102 rv=GWEN_Crypt_KeyRsa_GetExponent(pubKey, kbuf, &klen);
2103 if (rv) {
2104 DBG_INFO(GWEN_LOGDOMAIN, "No exponent for key");
2106 GWEN_Crypt_Key_free(pubKey);
2107 return rv;
2108 }
2112
2113 if (keyNum==1) {
2115 DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2117 }
2130 }
2131 else if (keyNum==2) {
2143 }
2144 else if (keyNum==5) {
2146 DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2148 }
2161 }
2162 else if (keyNum==7) {
2164 DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2166 }
2179 }
2180
2181 /* the public key is not used */
2182 GWEN_Crypt_Key_free(pubKey);
2183
2184 rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
2185 if (rv) {
2186 DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
2188 I18N("Unable to write key file"));
2189 return rv;
2190 }
2191
2193 I18N("Key generated and set"));
2194
2195 return 0;
2196}
2197
2198
2199
2200
2201
2202
2205{
2206 GWEN_CRYPT_TOKEN_FILE *lct;
2207
2208 lct=(GWEN_CRYPT_TOKEN_FILE *) p;
2209 GWEN_Crypt_Token_Context_List_free(lct->contextList);
2210
2211 GWEN_FREE_OBJECT(lct);
2212}
2213
2214
2215
2217 const char *tokenName)
2218{
2219 GWEN_CRYPT_TOKEN *ct;
2220 GWEN_CRYPT_TOKEN_FILE *lct;
2221
2222 ct=GWEN_Crypt_Token_new(GWEN_Crypt_Token_Device_File, typeName, tokenName);
2223 assert(ct);
2224
2225 GWEN_NEW_OBJECT(GWEN_CRYPT_TOKEN_FILE, lct);
2226 lct->contextList=GWEN_Crypt_Token_Context_List_new();
2227 GWEN_INHERIT_SETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct, lct,
2244
2245 return ct;
2246}
2247
2248
2249
2250
2251
#define NULL
Definition binreloc.c:300
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition buffer.c:42
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
Definition buffer.c:451
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
Definition buffer.c:527
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
Definition buffer.c:468
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
Definition buffer.c:663
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition buffer.c:360
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition buffer.c:89
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition buffer.c:277
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition buffer.c:235
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
Definition buffer.c:285
int GWEN_Crypt_CryptAlgo_GetChunkSize(const GWEN_CRYPT_CRYPTALGO *a)
Definition cryptalgo.c:317
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgo_GetId(const GWEN_CRYPT_CRYPTALGO *a)
Definition cryptalgo.c:254
struct GWEN_CRYPT_CRYPTALGO GWEN_CRYPT_CRYPTALGO
Definition cryptalgo.h:20
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
void GWEN_Crypt_Key_SetKeyNumber(GWEN_CRYPT_KEY *k, int i)
Definition cryptkey.c:195
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition cryptkey.c:187
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
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition cryptkey.h:26
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_dup(const GWEN_CRYPT_KEY *k)
int GWEN_Crypt_KeyRsa_GeneratePair(unsigned int nbytes, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent)
int GWEN_Crypt_KeyRsa_GetExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
void GWEN_Crypt_KeyRsa_AddFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
int GWEN_Crypt_KeyRsa_GetModulus(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
#define GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH
Definition cryptkeyrsa.h:25
#define GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN
Definition cryptkeyrsa.h:22
const char * GWEN_Crypt_Token_GetTypeName(const GWEN_CRYPT_TOKEN *ct)
Definition ct.c:86
const char * GWEN_Crypt_Token_GetTokenName(const GWEN_CRYPT_TOKEN *ct)
Definition ct.c:96
GWEN_CRYPT_TOKEN_VERIFY_FN GWEN_Crypt_Token_SetVerifyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_VERIFY_FN f)
Definition ct.c:720
GWEN_CRYPT_TOKEN_SETCONTEXT_FN GWEN_Crypt_Token_SetSetContextFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SETCONTEXT_FN f)
Definition ct.c:690
GWEN_CRYPT_TOKEN_CREATE_FN GWEN_Crypt_Token_SetCreateFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CREATE_FN f)
Definition ct.c:584
GWEN_CRYPT_TOKEN_SETKEYINFO_FN GWEN_Crypt_Token_SetSetKeyInfoFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SETKEYINFO_FN f)
Definition ct.c:645
GWEN_CRYPT_TOKEN_GETKEYIDLIST_FN GWEN_Crypt_Token_SetGetKeyIdListFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETKEYIDLIST_FN f)
Definition ct.c:615
uint32_t GWEN_Crypt_Token_GetModes(const GWEN_CRYPT_TOKEN *ct)
Definition ct.c:182
GWEN_CRYPT_TOKEN_DECIPHER_FN GWEN_Crypt_Token_SetDecipherFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_DECIPHER_FN f)
Definition ct.c:750
GWEN_CRYPT_TOKEN_GETCONTEXT_FN GWEN_Crypt_Token_SetGetContextFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETCONTEXT_FN f)
Definition ct.c:675
GWEN_CRYPT_TOKEN_GENERATEKEY_FN GWEN_Crypt_Token_SetGenerateKeyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GENERATEKEY_FN f)
Definition ct.c:765
GWEN_CRYPT_TOKEN_ACTIVATEKEY_FN GWEN_Crypt_Token_SetActivateKeyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_ACTIVATEKEY_FN f)
Definition ct.c:795
GWEN_CRYPT_TOKEN_ENCIPHER_FN GWEN_Crypt_Token_SetEncipherFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_ENCIPHER_FN f)
Definition ct.c:735
GWEN_CRYPT_TOKEN * GWEN_Crypt_Token_new(GWEN_CRYPT_TOKEN_DEVICE dev, const char *typeName, const char *tokenName)
Definition ct.c:33
GWEN_CRYPT_TOKEN_CLOSE_FN GWEN_Crypt_Token_SetCloseFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CLOSE_FN f)
Definition ct.c:600
GWEN_CRYPT_TOKEN_OPEN_FN GWEN_Crypt_Token_SetOpenFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_OPEN_FN f)
Definition ct.c:569
GWEN_CRYPT_TOKEN_GETCONTEXTIDLIST_FN GWEN_Crypt_Token_SetGetContextIdListFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETCONTEXTIDLIST_FN f)
Definition ct.c:660
GWEN_CRYPT_TOKEN_SIGN_FN GWEN_Crypt_Token_SetSignFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SIGN_FN f)
Definition ct.c:705
GWEN_CRYPT_TOKEN_GETKEYINFO_FN GWEN_Crypt_Token_SetGetKeyInfoFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETKEYINFO_FN f)
Definition ct.c:630
struct GWEN_CRYPT_TOKEN GWEN_CRYPT_TOKEN
Definition ct.h:19
@ GWEN_Crypt_Token_Device_File
Definition ct.h:38
#define GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN
Definition ct.h:63
#define GWEN_CRYPT_TOKEN_MODE_EXP_65537
Definition ct.h:62
const char * GWEN_Crypt_Token_Context_GetServiceId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:599
const char * GWEN_Crypt_Token_Context_GetUserId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:605
void GWEN_Crypt_Token_Context_SetUserId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:782
const char * GWEN_Crypt_Token_Context_GetSystemId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:647
int GWEN_Crypt_Token_Context_GetPort(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:641
void GWEN_Crypt_Token_Context_SetSystemId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:878
void GWEN_Crypt_Token_Context_SetUserName(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:812
const char * GWEN_Crypt_Token_Context_GetAddress(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:635
void GWEN_Crypt_Token_Context_SetPort(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, int p_src)
Definition ct_context.c:872
void GWEN_Crypt_Token_Context_SetAddress(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:857
void GWEN_Crypt_Token_Context_SetServiceId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:767
const char * GWEN_Crypt_Token_Context_GetUserName(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:617
uint32_t GWEN_Crypt_Token_Context_GetId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:485
void GWEN_Crypt_Token_Context_SetPeerId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition ct_context.c:827
const char * GWEN_Crypt_Token_Context_GetPeerId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition ct_context.c:623
struct GWEN_CRYPT_TOKEN_CONTEXT GWEN_CRYPT_TOKEN_CONTEXT
Definition ct_context.h:221
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_Crypt_Token_KeyInfo_dup(const GWEN_CRYPT_TOKEN_KEYINFO *p_src)
Definition ct_keyinfo.c:109
void GWEN_Crypt_Token_KeyInfo_free(GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:78
uint32_t GWEN_Crypt_Token_KeyInfo_GetSignCounter(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:296
void GWEN_Crypt_Token_KeyInfo_SetKeySize(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, int p_src)
Definition ct_keyinfo.c:347
uint32_t GWEN_Crypt_Token_KeyInfo_GetFlags(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:266
void GWEN_Crypt_Token_KeyInfo_SetFlags(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition ct_keyinfo.c:329
uint32_t GWEN_Crypt_Token_KeyInfo_GetModulusLen(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition ct_keyinfo.c:851
uint32_t GWEN_Crypt_Token_KeyInfo_GetKeyNumber(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:284
void GWEN_Crypt_Token_KeyInfo_SetKeyVersion(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition ct_keyinfo.c:365
void GWEN_Crypt_Token_KeyInfo_SetSignCounter(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition ct_keyinfo.c:371
void GWEN_Crypt_Token_KeyInfo_SetExponent(GWEN_CRYPT_TOKEN_KEYINFO *st, const uint8_t *p, uint32_t len)
Definition ct_keyinfo.c:859
const uint8_t * GWEN_Crypt_Token_KeyInfo_GetExponentData(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition ct_keyinfo.c:871
int GWEN_Crypt_Token_KeyInfo_GetKeySize(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:272
void GWEN_Crypt_Token_KeyInfo_SetModulus(GWEN_CRYPT_TOKEN_KEYINFO *st, const uint8_t *p, uint32_t len)
Definition ct_keyinfo.c:831
void GWEN_Crypt_Token_KeyInfo_SetKeyNumber(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition ct_keyinfo.c:359
void GWEN_Crypt_Token_KeyInfo_AddFlags(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition ct_keyinfo.c:335
uint32_t GWEN_Crypt_Token_KeyInfo_GetKeyVersion(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition ct_keyinfo.c:290
const uint8_t * GWEN_Crypt_Token_KeyInfo_GetModulusData(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition ct_keyinfo.c:843
uint32_t GWEN_Crypt_Token_KeyInfo_GetExponentLen(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition ct_keyinfo.c:879
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT
Definition ct_keyinfo.h:101
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANSIGN
Definition ct_keyinfo.h:108
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS
Definition ct_keyinfo.h:100
#define GWEN_CRYPT_TOKEN_KEYFLAGS_ACTIONMASK
Definition ct_keyinfo.h:107
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASACTIONFLAGS
Definition ct_keyinfo.h:102
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER
Definition ct_keyinfo.h:105
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASSTATUS
Definition ct_keyinfo.h:99
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANDECIPHER
Definition ct_keyinfo.h:111
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANENCIPHER
Definition ct_keyinfo.h:110
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION
Definition ct_keyinfo.h:103
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANVERIFY
Definition ct_keyinfo.h:109
struct GWEN_CRYPT_TOKEN_KEYINFO GWEN_CRYPT_TOKEN_KEYINFO
Definition ct_keyinfo.h:127
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASSIGNCOUNTER
Definition ct_keyinfo.h:104
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteCryptKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
void GWEN_CTF_Context_SetRemoteSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetTempLocalSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalCryptKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteAuthKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
void GWEN_CTF_Context_SetLocalCryptKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
void GWEN_CTF_Context_SetTempLocalSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
void GWEN_CTF_Context_SetLocalSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetRemoteSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetRemoteCryptKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetRemoteAuthKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetTempLocalSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteAuthKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalCryptKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalAuthKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteCryptKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalAuthKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
void GWEN_CTF_Context_SetLocalAuthKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetLocalCryptKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetRemoteCryptKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition ctf_context.c:80
void GWEN_CTF_Context_SetLocalSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition ctf_context.c:93
int GWEN_CTF_Context_IsOfThisType(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition ctf_context.c:45
void GWEN_CTF_Context_SetLocalAuthKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
void GWEN_CTF_Context_SetTempLocalSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
void GWEN_CTF_Context_SetRemoteAuthKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
#define GWEN_CRYPT_TOKEN_CONTEXT_KEYS
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__SetContext(GWEN_CRYPT_TOKEN *ct, uint32_t id, const GWEN_CRYPT_TOKEN_CONTEXT *nctx, uint32_t gid)
Definition ctfile.c:1260
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetContextIdList(GWEN_CRYPT_TOKEN *ct, uint32_t *pIdList, uint32_t *pCount, uint32_t gid)
Definition ctfile.c:1165
const GWEN_CRYPT_TOKEN_KEYINFO *GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetKeyInfo(GWEN_CRYPT_TOKEN *ct, uint32_t id, GWEN_UNUSED uint32_t flags, uint32_t gid)
Definition ctfile.c:618
GWENHYWFAR_CB void GWEN_Crypt_TokenFile_freeData(GWEN_UNUSED void *bp, void *p)
Definition ctfile.c:2204
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__ActivateKey(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition ctfile.c:1019
GWEN_CRYPT_TOKEN_FILE_READ_FN GWEN_Crypt_TokenFile_SetReadFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_FILE_READ_FN f)
Definition ctfile.c:415
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Open(GWEN_CRYPT_TOKEN *ct, GWEN_UNUSED int admin, uint32_t gid)
Definition ctfile.c:515
int GWEN_Crypt_TokenFile__Write(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid)
Definition ctfile.c:237
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__Sign(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, GWEN_CRYPT_PADDALGO *a, const uint8_t *pInData, uint32_t inLen, uint8_t *pSignatureData, uint32_t *pSignatureLen, uint32_t *pSeqCounter, uint32_t gid)
Definition ctfile.c:1371
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__Encipher(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, GWEN_CRYPT_PADDALGO *a, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen, uint32_t gid)
Definition ctfile.c:1807
int GWEN_Crypt_TokenFile__Read(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition ctfile.c:217
GWEN_CRYPT_TOKEN * GWEN_Crypt_TokenFile_new(const char *typeName, const char *tokenName)
Definition ctfile.c:2216
GWEN_CRYPT_KEY * GWEN_Crypt_TokenFile__GetKey(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition ctfile.c:1318
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__SetKeyInfo(GWEN_CRYPT_TOKEN *ct, uint32_t id, const GWEN_CRYPT_TOKEN_KEYINFO *ski, uint32_t gid)
Definition ctfile.c:830
int GWEN_Crypt_TokenFile__CloseFile(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition ctfile.c:146
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__Decipher(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, GWEN_CRYPT_PADDALGO *a, const uint8_t *pInData, uint32_t inLen, uint8_t *pOutData, uint32_t *pOutLen, uint32_t gid)
Definition ctfile.c:1896
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Create(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition ctfile.c:451
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetKeyIdList(GWEN_CRYPT_TOKEN *ct, uint32_t *pIdList, uint32_t *pCount, uint32_t gid)
Definition ctfile.c:560
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid)
Definition ctfile.c:535
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__Verify(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, GWEN_CRYPT_PADDALGO *a, const uint8_t *pInData, uint32_t inLen, const uint8_t *pSignatureData, uint32_t signatureLen, uint32_t seqCounter, uint32_t gid)
Definition ctfile.c:1576
int GWEN_Crypt_TokenFile__ReadFile(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition ctfile.c:263
int GWEN_Crypt_TokenFile__OpenFile(GWEN_CRYPT_TOKEN *ct, int wr, uint32_t gid)
Definition ctfile.c:42
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_TokenFile_GetContext(GWEN_CRYPT_TOKEN *ct, int idx)
Definition ctfile.c:393
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__GenerateKey(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, const GWEN_CRYPT_CRYPTALGO *a, uint32_t gid)
Definition ctfile.c:1994
const GWEN_CRYPT_TOKEN_CONTEXT *GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetContext(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition ctfile.c:1219
int GWEN_Crypt_TokenFile__WriteFile(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid)
Definition ctfile.c:303
void GWEN_Crypt_TokenFile_AddContext(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition ctfile.c:378
GWEN_CRYPT_TOKEN_FILE_WRITE_FN GWEN_Crypt_TokenFile_SetWriteFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_FILE_WRITE_FN f)
Definition ctfile.c:433
int GWEN_Crypt_TokenFile__ReloadIfNeeded(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition ctfile.c:340
int GWENHYWFAR_CB(* GWEN_CRYPT_TOKEN_FILE_READ_FN)(GWEN_CRYPT_TOKEN *ct, int fd, uint32_t gid)
Definition ctfile_be.h:21
int GWENHYWFAR_CB(* GWEN_CRYPT_TOKEN_FILE_WRITE_FN)(GWEN_CRYPT_TOKEN *ct, int fd, int cre, uint32_t gid)
Definition ctfile_be.h:24
#define DBG_INFO(dbg_logger, format,...)
Definition debug.h:181
#define DBG_NOTICE(dbg_logger, format,...)
Definition debug.h:152
#define DBG_ERROR(dbg_logger, format,...)
Definition debug.h:97
#define DBG_WARN(dbg_logger, format,...)
Definition debug.h:125
#define DBG_DEBUG(dbg_logger, format,...)
Definition debug.h:214
#define I18N(m)
Definition error.c:42
#define GWEN_ERROR_INTERNAL
Definition error.h:125
#define GWEN_ERROR_NO_KEY
Definition error.h:115
#define GWEN_ERROR_VERIFY
Definition error.h:104
#define GWEN_ERROR_INVALID
Definition error.h:67
#define GWEN_ERROR_IO
Definition error.h:123
#define GWEN_ERROR_BUFFER_OVERFLOW
Definition error.h:79
#define GWEN_ERROR_GENERIC
Definition error.h:62
#define GWEN_ERROR_USER_ABORTED
Definition error.h:65
#define GWEN_ERROR_NOT_FOUND
Definition error.h:89
#define GWEN_ERROR_NOT_SUPPORTED
Definition error.h:109
#define GWEN_ERROR_NO_DATA
Definition error.h:94
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
GWEN_FSLOCK_RESULT
Definition fslock.h:71
@ GWEN_FSLock_ResultOk
Definition fslock.h:72
@ GWEN_FSLock_ResultUserAbort
Definition fslock.h:77
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
@ GWEN_FSLock_TypeFile
Definition fslock.h:66
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition buffer.h:38
GWENHYWFAR_API int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
GWENHYWFAR_API int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text,...)
#define GWEN_UNUSED
#define GWENHYWFAR_CB
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition inherit.h:300
#define GWEN_INHERIT(bt, t)
Definition inherit.h:264
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition inherit.h:279
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_Token_Context_List_Next(const GWEN_CRYPT_TOKEN_CONTEXT *element)
GWEN_CRYPT_TOKEN_CONTEXT_LIST * GWEN_Crypt_Token_Context_List_new()
void GWEN_Crypt_Token_Context_List_free(GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
void GWEN_Crypt_Token_Context_List_Clear(GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
void GWEN_Crypt_Token_Context_List_Add(GWEN_CRYPT_TOKEN_CONTEXT *element, GWEN_CRYPT_TOKEN_CONTEXT_LIST *list)
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_Token_Context_List_First(const GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
#define GWEN_LOGDOMAIN
Definition logger.h:32
@ GWEN_LoggerLevel_Warning
Definition logger.h:66
@ GWEN_LoggerLevel_Notice
Definition logger.h:67
@ GWEN_LoggerLevel_Error
Definition logger.h:65
void GWEN_MDigest_free(GWEN_MDIGEST *md)
Definition mdigest.c:54
struct GWEN_MDIGEST GWEN_MDIGEST
Definition mdigest.h:25
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Sha256_new(void)
Definition mdigestgc.c:194
#define GWEN_FREE_OBJECT(varname)
Definition memory.h:61
#define GWEN_NEW_OBJECT(typ, varname)
Definition memory.h:55
int GWEN_Padd_VerifyPkcs1Pss(const uint8_t *pSrcBuffer, uint32_t lSrcBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
Definition padd.c:619
int GWEN_Padd_UnapplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
Definition padd.c:852
int GWEN_Padd_AddPkcs1Pss(uint8_t *pDestBuffer, GWEN_UNUSED uint32_t lDestBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
Definition padd.c:495
int GWEN_Padd_ApplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
Definition padd.c:766
GWEN_CRYPT_PADDALGOID GWEN_Crypt_PaddAlgo_GetId(const GWEN_CRYPT_PADDALGO *a)
Definition paddalgo.c:186
struct GWEN_CRYPT_PADDALGO GWEN_CRYPT_PADDALGO
Definition paddalgo.h:21
GWEN_CRYPT_PADDALGOID
Definition paddalgo.h:60