gwenhywfar  4.99.8beta
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 
36 GWEN_INHERIT(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE)
37 
38 
39 
40 
41 
42 int GWEN_Crypt_TokenFile__OpenFile(GWEN_CRYPT_TOKEN *ct, int wr, uint32_t gid) {
43  int fd;
44  GWEN_CRYPT_TOKEN_FILE *lct;
45  GWEN_FSLOCK_RESULT lres;
46  const char *fname;
47 
48  assert(ct);
49  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
50  assert(lct);
51 
53  if (!fname) {
54  DBG_ERROR(GWEN_LOGDOMAIN, "No name of the crypt token set - maybe you need to set the key file as token name? Cannot lock token.");
55  return GWEN_ERROR_IO;
56  }
57 
58  lct->lock=GWEN_FSLock_new(fname,
60  lres=GWEN_FSLock_Lock(lct->lock, 10000, gid);
61  if (lres!=GWEN_FSLock_ResultOk) {
62  GWEN_FSLock_free(lct->lock);
63  lct->lock=0;
64  DBG_ERROR(GWEN_LOGDOMAIN, "Could not lock file");
67  else
68  return GWEN_ERROR_IO;
69  }
70  else {
72  "Keyfile [%s] locked.",
74  }
75 
76  if (wr) {
77  /* write file */
79  O_RDWR|O_CREAT
80 #ifdef OS_WIN32
81  | O_BINARY
82 #endif
83  ,
84  S_IRUSR|S_IWUSR | lct->keyfile_mode);
85  }
86  else {
87  /* Remember the access permissions when opening the file */
88  struct stat statbuffer;
89  if (!stat(GWEN_Crypt_Token_GetTokenName(ct), &statbuffer)) {
90  /* Save the access mode, but masked by the bit masks for
91  user/group/other permissions */
92  lct->keyfile_mode =
93  statbuffer.st_mode & (S_IRWXU
94 #ifndef OS_WIN32
95  | S_IRWXG | S_IRWXO
96 #endif
97  );
98  }
99  else {
101  "stat(%s): %s",
103  strerror(errno));
104 
105  GWEN_FSLock_Unlock(lct->lock);
106  GWEN_FSLock_free(lct->lock);
107  lct->lock=0;
109  "Keyfile [%s] unlocked.",
111  return GWEN_ERROR_IO;
112  }
113 
114  /* and open the file */
115  fd=open(GWEN_Crypt_Token_GetTokenName(ct),
116  O_RDONLY
117 #ifdef OS_WIN32
118  | O_BINARY
119 #endif
120  );
121  }
122 
123  if (fd==-1) {
125  "open(%s): %s",
127  strerror(errno));
128  GWEN_FSLock_Unlock(lct->lock);
129  GWEN_FSLock_free(lct->lock);
130  lct->lock=0;
132  "Keyfile [%s] unlocked.",
134  return GWEN_ERROR_IO;
135  }
136 
137  lct->fd=fd;
138 
139  return 0;
140 }
141 
142 
143 
145  GWEN_CRYPT_TOKEN_FILE *lct;
146  GWEN_FSLOCK_RESULT lres;
147  struct stat st;
148 
149  assert(ct);
150  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
151  assert(lct);
152 
153  if (lct->fd==-1) {
154  DBG_ERROR(GWEN_LOGDOMAIN, "Keyfile \"%s\"not open",
156  return GWEN_ERROR_INTERNAL;
157  }
158 
159  if (close(lct->fd)) {
160  DBG_ERROR(GWEN_LOGDOMAIN, "close(%s): %s",
161  GWEN_Crypt_Token_GetTokenName(ct), strerror(errno));
162  lct->fd=-1;
163  GWEN_FSLock_Unlock(lct->lock);
164  GWEN_FSLock_free(lct->lock);
165  lct->lock=0;
167  "Keyfile [%s] unlocked.",
169  return GWEN_ERROR_IO;
170  }
171  lct->fd=-1;
172 
173  lres=GWEN_FSLock_Unlock(lct->lock);
174  if (lres!=GWEN_FSLock_ResultOk) {
175  DBG_WARN(GWEN_LOGDOMAIN, "Error removing lock from \"%s\": %d",
177  }
178  GWEN_FSLock_free(lct->lock);
179  lct->lock=0;
181  "Keyfile [%s] unlocked.",
183 
184  /* get times */
185  if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
187  "stat(%s): %s",
189  strerror(errno));
190  return GWEN_ERROR_IO;
191  }
192 
193 #ifndef OS_WIN32
194  if (st.st_mode & 0007) {
196  "WARNING: Your keyfile \"%s\" is accessible by every user on your computer!\n"
197  "Nobody but you should have access to the file. You \n"
198  "should probably change this with \"chmod 600 %s\"",
202  "WARNING: Your keyfile is accessible ny every user on your computer!\n"
203  "Nobody but you should have access to the file.");
204  }
205 #endif
206  lct->mtime=st.st_mtime;
207  lct->ctime=st.st_ctime;
208 
209  return 0;
210 }
211 
212 
213 
215  GWEN_CRYPT_TOKEN_FILE *lct;
216 
217  assert(ct);
218  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
219  assert(lct);
220 
221  assert(lct->readFn);
222  if (lseek(lct->fd, 0, SEEK_SET)==-1) {
223  DBG_ERROR(GWEN_LOGDOMAIN, "lseek(%s): %s",
225  strerror(errno));
226  return GWEN_ERROR_IO;
227  }
228  return lct->readFn(ct, lct->fd, gid);
229 }
230 
231 
232 
233 int GWEN_Crypt_TokenFile__Write(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid) {
234  GWEN_CRYPT_TOKEN_FILE *lct;
235 
236  assert(ct);
237  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
238  assert(lct);
239 
240  if (lct->writeFn==0) {
242  "No write function in crypt token type \"%s\"",
245  }
246 
247  if (lseek(lct->fd, 0, SEEK_SET)==-1) {
248  DBG_ERROR(GWEN_LOGDOMAIN, "lseek(%s): %s",
250  strerror(errno));
251  return GWEN_ERROR_IO;
252  }
253  return lct->writeFn(ct, lct->fd, cr, gid);
254 }
255 
256 
257 
259  GWEN_CRYPT_TOKEN_FILE *lct;
260  int rv;
261 
262  assert(ct);
263  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
264  assert(lct);
265 
266  /* clear context list, it will be reloaded */
267  GWEN_Crypt_Token_Context_List_Clear(lct->contextList);
268 
269  /* open file */
270  rv=GWEN_Crypt_TokenFile__OpenFile(ct, 0, gid);
271  if (rv) {
273  "Could not open keyfile for reading (%d)", rv);
274  return rv;
275  }
276 
277  /* read file */
278  rv=GWEN_Crypt_TokenFile__Read(ct, gid);
279  if (rv) {
280  DBG_INFO(GWEN_LOGDOMAIN, "Error reading keyfile");
282  return rv;
283  }
284 
285  /* close file */
287  if (rv) {
288  DBG_INFO(GWEN_LOGDOMAIN, "Could not close keyfile");
289  return rv;
290  }
291 
292  return 0;
293 }
294 
295 
296 
297 int GWEN_Crypt_TokenFile__WriteFile(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid) {
298  GWEN_CRYPT_TOKEN_FILE *lct;
299  int rv;
300 
301  assert(ct);
302  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
303  assert(lct);
304 
305  /* open file */
306  rv=GWEN_Crypt_TokenFile__OpenFile(ct, 1, gid);
307  if (rv) {
309  "Could not open keyfile for writing (%d)", rv);
310  return rv;
311  }
312 
313  /* write file */
314  rv=GWEN_Crypt_TokenFile__Write(ct, cr, gid);
315  if (rv) {
316  DBG_INFO(GWEN_LOGDOMAIN, "Error writing keyfile");
318  return rv;
319  }
320 
321  /* close file */
323  if (rv) {
324  DBG_INFO(GWEN_LOGDOMAIN, "Could not close keyfile");
325  return rv;
326  }
327 
328  return 0;
329 }
330 
331 
332 
334  GWEN_CRYPT_TOKEN_FILE *lct;
335  struct stat st;
336 
337  assert(ct);
338  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
339  assert(lct);
340 
341  if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
343  "stat(%s): %s",
345  strerror(errno));
346  return -1;
347  }
348  if (lct->mtime!=st.st_mtime ||
349  lct->ctime!=st.st_ctime) {
350  int rv;
351 
352  /* file has changed, reload it */
354  "Keyfile changed externally, reloading it");
355  /* read file */
356  rv=GWEN_Crypt_TokenFile__ReadFile(ct, gid);
357  if (rv) {
358  DBG_WARN(GWEN_LOGDOMAIN, "Error reloading keyfile");
359  return rv;
360  }
361  }
362  else {
363  DBG_NOTICE(GWEN_LOGDOMAIN, "Keyfile unchanged, not reloading");
364  }
365  return 0;
366 }
367 
368 
369 
371  GWEN_CRYPT_TOKEN_FILE *lct;
372 
373  assert(ct);
374  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
375  assert(lct);
376 
377  /* make sure the context is a file context */
378  assert(GWEN_CTF_Context_IsOfThisType(ctx));
379  GWEN_Crypt_Token_Context_List_Add(ctx, lct->contextList);
380 }
381 
382 
383 
385  GWEN_CRYPT_TOKEN_FILE *lct;
387 
388  assert(ct);
389  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
390  assert(lct);
391 
392  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
393  while(ctx) {
394  if (idx==0)
395  return ctx;
397  idx--;
398  }
399 
400  return NULL;
401 }
402 
403 
404 
407  GWEN_CRYPT_TOKEN_FILE *lct;
409 
410  assert(ct);
411  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
412  assert(lct);
413 
414  of=lct->readFn;
415  lct->readFn=f;
416 
417  return of;
418 }
419 
420 
421 
424  GWEN_CRYPT_TOKEN_FILE *lct;
426 
427  assert(ct);
428  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
429  assert(lct);
430 
431  of=lct->writeFn;
432  lct->writeFn=f;
433 
434  return of;
435 }
436 
437 
438 
440  GWEN_CRYPT_TOKEN_FILE *lct;
441  struct stat st;
442  int fd;
443  int rv;
444 
445  assert(ct);
446  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
447  assert(lct);
448 
450  DBG_ERROR(GWEN_LOGDOMAIN, "No medium name given");
451  return GWEN_ERROR_INVALID;
452  }
453 
454  if (stat(GWEN_Crypt_Token_GetTokenName(ct), &st)) {
455  if (errno!=ENOENT) {
457  "Error trying to access key file \"%s\": %s",
459  strerror(errno));
460  return GWEN_ERROR_IO;
461  }
462  }
463  else {
465  "Keyfile \"%s\" already exists, will not create it",
467  return GWEN_ERROR_INVALID;
468  }
469 
470 
471  /* create file */
472  fd=open(GWEN_Crypt_Token_GetTokenName(ct),
473  O_RDWR | O_CREAT | O_EXCL
474 #ifdef OS_WIN32
475  | O_BINARY
476 #endif
477  ,
478  S_IRUSR|S_IWUSR);
479 
480 
481  if (fd==-1) {
483  "open(%s): %s",
485  strerror(errno));
486  return GWEN_ERROR_IO;
487  }
488 
489  close(fd);
490 
491  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 1, gid);
492  if (rv) {
493  DBG_INFO(GWEN_LOGDOMAIN, "here");
494  return rv;
495  }
496 
497  return 0;
498 }
499 
500 
501 
503  GWEN_CRYPT_TOKEN_FILE *lct;
504  int rv;
505 
506  assert(ct);
507  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
508  assert(lct);
509 
510  rv=GWEN_Crypt_TokenFile__ReadFile(ct, gid);
511  if (rv) {
512  DBG_INFO(GWEN_LOGDOMAIN, "here");
513  return rv;
514  }
515 
516  return 0;
517 }
518 
519 
520 
521 int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid) {
522  GWEN_CRYPT_TOKEN_FILE *lct;
523  int rv;
524 
525  assert(ct);
526  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
527  assert(lct);
528 
529  if (!abandon)
530  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
531  else
532  rv=0;
533 
534  /* free/reset all data */
535  GWEN_Crypt_Token_Context_List_Clear(lct->contextList);
536  lct->mtime=0;
537  lct->ctime=0;
538 
539  return rv;
540 }
541 
542 
543 
544 
546  uint32_t *pIdList,
547  uint32_t *pCount,
548  uint32_t gid) {
549  GWEN_CRYPT_TOKEN_FILE *lct;
551  int i;
552  int rv;
553 
554  assert(ct);
555  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
556  assert(lct);
557 
558  /* reload if needed */
560  if (rv) {
561  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
562  return rv;
563  }
564 
565  /* count keys */
566  i=0;
567  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
568  while(ctx) {
571  }
572 
573  /* if no buffer given just return number of keys */
574  if (pIdList==NULL) {
575  *pCount=i;
576  return 0;
577  }
578 
579  if (*pCount<i) {
580  DBG_INFO(GWEN_LOGDOMAIN, "Buffer too small");
582  }
583 
584  *pCount=i;
585  i=0;
586  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
587  while(ctx) {
588  int j;
589 
590  for (j=1; j<=GWEN_CRYPT_TOKEN_CONTEXT_KEYS; j++)
591  *(pIdList++)=(i<<16)+j;
592 
594  i++;
595  }
596 
597  return 0;
598 }
599 
600 
601 
604  uint32_t id,
605  uint32_t flags,
606  uint32_t gid) {
607  GWEN_CRYPT_TOKEN_FILE *lct;
610  int i;
611  int rv;
612 
613  assert(ct);
614  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
615  assert(lct);
616 
617  /* reload if needed */
619  if (rv) {
620  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
621  return NULL;
622  }
623 
624  i=id>>16;
625  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
626  while(ctx) {
627  if (i==0)
628  break;
630  i--;
631  }
632 
633  if (ctx==NULL) {
634  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
635  return NULL;
636  }
637 
638  switch(id & 0xffff) {
639  case 1:
641  break;
642  case 2:
644  break;
645  case 3:
647  break;
648  case 4:
650  break;
651  case 5:
653  break;
654  case 6:
656  break;
657  case 7:
659  break;
660  default:
661  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
662  return NULL;
663  }
664 
665  if (ki==NULL) {
666  DBG_INFO(GWEN_LOGDOMAIN, "No key info stored for key %d", id);
667  return NULL;
668  }
669 
670  return ki;
671 }
672 
673 
674 
675 #if 0
676 int GWENHYWFAR_CB
678  uint32_t id,
679  const GWEN_CRYPT_TOKEN_KEYINFO *ki,
680  uint32_t gid) {
681  GWEN_CRYPT_TOKEN_FILE *lct;
683  int i;
684  int rv;
686  GWEN_CRYPT_KEY *key;
687  uint32_t flags;
688 
689  assert(ct);
690  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
691  assert(lct);
692 
694 
695  /* reload if needed */
697  if (rv) {
698  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
699  return rv;
700  }
701 
702  i=id>>16;
703  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
704  while(ctx) {
705  if (i==0)
706  break;
708  i--;
709  }
710 
711  if (ctx==NULL) {
712  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
713  return GWEN_ERROR_NOT_FOUND;
714  }
715 
717  assert(nki);
718  switch(id & 0xffff) {
719  case 1:
722  break;
723  case 2:
726  break;
727  case 3:
730  break;
731  case 4:
734  break;
735  case 5:
738  break;
739  case 6:
742  break;
743  default:
744  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
746  return GWEN_ERROR_NOT_FOUND;
747  }
748 
749  /* replace key if modulus and exponent are given */
750  if ((flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) &&
752  id!=1 && /* don't change local keys */
753  id!=2 &&
754  id!=5) {
755  GWEN_CRYPT_KEY *nkey;
756 
762  assert(nkey);
763 
768 
769  /* replace public key */
770  switch(id & 0xffff) {
771  case 3: /* remote sign key */
773  break;
774  case 4: /* remote crypt key */
776  break;
777  case 6: /* remote auth key */
779  break;
780  default:
782  "Can't set modulus and exponent for private key");
783  GWEN_Crypt_Key_free(nkey);
784  return GWEN_ERROR_INVALID;
785  }
787  I18N("Public key replaced"));
788  }
789  else {
790  if (key) {
791  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER)
793  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION)
795  }
796  }
797 
798  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
799  if (rv) {
800  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
802  I18N("Unable to write key file"));
803  return rv;
804  }
805 
807  I18N("Key file saved"));
808 
809  return 0;
810 }
811 #endif
812 
813 
814 int GWENHYWFAR_CB
816  uint32_t id,
817  const GWEN_CRYPT_TOKEN_KEYINFO *ski,
818  uint32_t gid) {
819  GWEN_CRYPT_TOKEN_FILE *lct;
821  int i;
822  int rv;
824  GWEN_CRYPT_KEY *key;
825  uint32_t flags;
826  uint32_t nflags;
827 
828  assert(ct);
829  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
830  assert(lct);
831 
833 
834  /* reload if needed */
836  if (rv) {
837  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
838  return rv;
839  }
840 
841  i=id>>16;
842  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
843  while(ctx) {
844  if (i==0)
845  break;
847  i--;
848  }
849 
850  if (ctx==NULL) {
851  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
852  return GWEN_ERROR_NOT_FOUND;
853  }
854 
855  switch(id & 0xffff) {
856  case 1:
859  break;
860  case 2:
863  break;
864  case 3:
867  break;
868  case 4:
871  break;
872  case 5:
875  break;
876  case 6:
879  break;
880  case 7:
883  break;
884  default:
885  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
886  return GWEN_ERROR_NOT_FOUND;
887  }
888  assert(ki);
889 
891 
893  /* ignore for now */
894  }
895 
898  nflags|=(flags & GWEN_CRYPT_TOKEN_KEYFLAGS_ACTIONMASK);
899  }
900 
901  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION) {
905  if (key)
907  DBG_INFO(GWEN_LOGDOMAIN, "Setting key version");
908  }
909 
914  DBG_INFO(GWEN_LOGDOMAIN, "Setting signature counter");
915  }
916 
917  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER) {
921  if (key)
923  DBG_INFO(GWEN_LOGDOMAIN, "Setting key number");
924  }
925 
926  /* replace key if modulus and exponent are given */
927  if ((flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS) &&
928  (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT) &&
929  id!=1 && /* don't change local keys */
930  id!=2 &&
931  id!=5 &&
932  id!=7) {
933  GWEN_CRYPT_KEY *nkey;
934 
949  assert(nkey);
950 
951  if (nflags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER)
953  if (nflags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION)
955 
956  /* replace public key */
957  switch(id & 0xffff) {
958  case 3: /* remote sign key */
960  break;
961  case 4: /* remote crypt key */
963  break;
964  case 6: /* remote auth key */
966  break;
967  default:
969  "Can't set modulus and exponent for private key");
970  GWEN_Crypt_Key_free(nkey);
971  return GWEN_ERROR_INVALID;
972  }
974  I18N("Public key replaced"));
975  }
976  else {
977  if (key) {
978  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER)
980  if (flags & GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION)
982  }
983  }
984 
986 
987  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
988  if (rv) {
989  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
991  I18N("Unable to write key file"));
992  return rv;
993  }
994 
996  I18N("Key file saved"));
997 
998  return 0;
999 }
1000 
1001 
1002 
1003 int GWENHYWFAR_CB
1004 GWEN_Crypt_TokenFile__ActivateKey(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid) {
1005  GWEN_CRYPT_TOKEN_FILE *lct;
1007  int rv;
1008  int i;
1009  uint32_t keyNum;
1010  uint8_t kbuf[GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH];
1011  uint32_t klen;
1014  GWEN_CRYPT_KEY *key;
1015 
1016  assert(ct);
1017  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1018  assert(lct);
1019 
1020  /* reload if needed */
1022  if (rv) {
1023  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1024  return rv;
1025  }
1026 
1027  keyNum=id & 0xffff;
1028 
1029  i=id>>16;
1030  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1031  while(ctx) {
1032  if (i==0)
1033  break;
1035  i--;
1036  }
1037 
1038  if (ctx==NULL) {
1039  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
1040  return GWEN_ERROR_NOT_FOUND;
1041  }
1042 
1044  if (key==NULL) {
1045  DBG_ERROR(GWEN_LOGDOMAIN, "No temporary local sign key.");
1046  return GWEN_ERROR_NOT_FOUND;
1047  }
1048  key=GWEN_Crypt_KeyRsa_dup(key);
1049 
1050  /* set key */
1051  if (keyNum==1)
1053  else if (keyNum==6)
1055  else {
1057  I18N("Invalid key id %02x"), id);
1058  GWEN_Crypt_Key_free(key);
1059  return GWEN_ERROR_NO_DATA;
1060  }
1061  if (cki==NULL) {
1063  I18N("No key info found"));
1064  GWEN_Crypt_Key_free(key);
1065  return GWEN_ERROR_NO_DATA;
1066  }
1067 
1068  /* update key info for the key */
1070  assert(ki);
1071 
1072  /* get modulus */
1073  klen=sizeof(kbuf);
1074  rv=GWEN_Crypt_KeyRsa_GetModulus(key, kbuf, &klen);
1075  if (rv) {
1076  DBG_INFO(GWEN_LOGDOMAIN, "No modulus for key");
1078  GWEN_Crypt_Key_free(key);
1079  return rv;
1080  }
1081  GWEN_Crypt_Token_KeyInfo_SetModulus(ki, kbuf, klen);
1082 
1083  /* get exponent */
1084  klen=sizeof(kbuf);
1085  rv=GWEN_Crypt_KeyRsa_GetExponent(key, kbuf, &klen);
1086  if (rv) {
1087  DBG_INFO(GWEN_LOGDOMAIN, "No exponent for key");
1089  GWEN_Crypt_Key_free(key);
1090  return rv;
1091  }
1092  GWEN_Crypt_Token_KeyInfo_SetExponent(ki, kbuf, klen);
1095 
1096  if (keyNum==1) {
1098  DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
1100  }
1103  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
1104  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
1105  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
1106  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
1113  }
1114  else if (keyNum==6) {
1116  DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
1118  }
1121  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
1122  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
1123  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
1124  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
1131  }
1132 
1133  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1134  if (rv) {
1135  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1137  I18N("Unable to write key file"));
1138  return rv;
1139  }
1140 
1142  I18N("Key file saved"));
1143 
1144  return 0;
1145 }
1146 
1147 
1148 
1149 int GWENHYWFAR_CB
1151  uint32_t *pIdList,
1152  uint32_t *pCount,
1153  uint32_t gid) {
1154  GWEN_CRYPT_TOKEN_FILE *lct;
1156  int i;
1157  int rv;
1158 
1159  assert(ct);
1160  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1161  assert(lct);
1162 
1163  /* reload if needed */
1165  if (rv) {
1166  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1167  return rv;
1168  }
1169 
1170  /* count keys */
1171  i=0;
1172  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1173  while(ctx) {
1174  i++;
1176  }
1177 
1178  /* store number of entries */
1179  *pCount=i;
1180 
1181  /* if no buffer given just return number of keys */
1182  if (pIdList==NULL)
1183  return 0;
1184 
1185  if (*pCount<i) {
1186  DBG_INFO(GWEN_LOGDOMAIN, "Buffer too small");
1188  }
1189 
1190  i=1;
1191  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1192  while(ctx) {
1193  *(pIdList++)=i;
1195  i++;
1196  }
1197 
1198  return 0;
1199 }
1200 
1201 
1202 
1205  uint32_t id,
1206  uint32_t gid) {
1207  GWEN_CRYPT_TOKEN_FILE *lct;
1209  int rv;
1210 
1211  assert(ct);
1212  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1213  assert(lct);
1214 
1215  /* reload if needed */
1217  if (rv) {
1218  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1219  return NULL;
1220  }
1221 
1222  if (id==0) {
1223  DBG_INFO(GWEN_LOGDOMAIN, "Invalid context id 0");
1224  return NULL;
1225  }
1226 
1227  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1228  while(ctx) {
1229  if (GWEN_Crypt_Token_Context_GetId(ctx)==id)
1230  break;
1232  }
1233 
1234  if (ctx==NULL) {
1235  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", id);
1236  return NULL;
1237  }
1238 
1239  return ctx;
1240 }
1241 
1242 
1243 
1244 int GWENHYWFAR_CB
1246  uint32_t id,
1247  const GWEN_CRYPT_TOKEN_CONTEXT *nctx,
1248  uint32_t gid) {
1249  GWEN_CRYPT_TOKEN_FILE *lct;
1251  int rv;
1252  const char *s;
1253 
1254  assert(ct);
1255  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1256  assert(lct);
1257 
1258  if (id==0) {
1259  DBG_INFO(GWEN_LOGDOMAIN, "Invalid context id 0");
1260  return GWEN_ERROR_INVALID;
1261  }
1262 
1263  /* reload if needed */
1265  if (rv) {
1266  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1267  return rv;
1268  }
1269 
1270  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1271  while(ctx) {
1272  if (GWEN_Crypt_Token_Context_GetId(ctx)==id)
1273  break;
1275  }
1276 
1277  if (ctx==NULL) {
1278  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", id);
1279  return GWEN_ERROR_NOT_FOUND;
1280  }
1281 
1282  /* copy user data from context */
1296 
1297  return 0;
1298 }
1299 
1300 
1301 
1303  GWEN_CRYPT_TOKEN_FILE *lct;
1305  int i;
1306  int rv;
1307 
1308  assert(ct);
1309  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1310  assert(lct);
1311 
1312  /* reload if needed */
1314  if (rv) {
1315  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1316  return NULL;
1317  }
1318 
1319  i=id>>16;
1320  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1321  while(ctx) {
1322  if (i==0)
1323  break;
1325  i--;
1326  }
1327 
1328  if (ctx==NULL) {
1329  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (context out of range)", id);
1330  return NULL;
1331  }
1332 
1333  switch(id & 0xffff) {
1334  case 1:
1336  case 2:
1338  case 3:
1340  case 4:
1342  case 5:
1344  case 6:
1346  default:
1347  DBG_INFO(GWEN_LOGDOMAIN, "No key by id [%x] known (key id out of range)", id);
1348  return NULL;
1349  }
1350 }
1351 
1352 
1353 
1354 int GWENHYWFAR_CB
1356  uint32_t keyId,
1358  const uint8_t *pInData,
1359  uint32_t inLen,
1360  uint8_t *pSignatureData,
1361  uint32_t *pSignatureLen,
1362  uint32_t *pSeqCounter,
1363  uint32_t gid) {
1364  GWEN_CRYPT_TOKEN_FILE *lct;
1366  GWEN_CRYPT_KEY *k;
1367  int keyNum;
1368  GWEN_BUFFER *srcBuf;
1369  int i;
1370  int rv;
1372 
1373  assert(ct);
1374  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1375  assert(lct);
1376 
1377  DBG_INFO(GWEN_LOGDOMAIN, "Signing with key %d", keyId);
1379 
1380  /* reload if needed */
1382  if (rv) {
1383  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1384  return rv;
1385  }
1386 
1387  /* get context */
1388  i=(keyId>>16);
1389  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1390  if (ctx==NULL) {
1391  DBG_ERROR(GWEN_LOGDOMAIN, "Token has no context");
1392  return GWEN_ERROR_NOT_FOUND;
1393  }
1394  while(ctx) {
1395  if (i==0)
1396  break;
1397  DBG_ERROR(GWEN_LOGDOMAIN, "Checking token %d (i==%d)",
1400  i--;
1401  }
1402 
1403  if (ctx==NULL) {
1404  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1405  return GWEN_ERROR_NOT_FOUND;
1406  }
1407 
1408  /* get key */
1409  keyNum=keyId & 0xffff;
1410  if (keyNum!=1 && keyNum!=5) {
1411  /* neither localSignKey nor localAuthKey */
1412  DBG_INFO(GWEN_LOGDOMAIN, "Bad key for signing (%x)", keyId);
1413  return GWEN_ERROR_INVALID;
1414  }
1415 
1416  k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1417  if (k==NULL) {
1418  DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1419  return GWEN_ERROR_NOT_FOUND;
1420  }
1421 
1422  /* copy to a buffer for padding */
1423  srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1424 
1425  if (aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1426  const GWEN_CRYPT_TOKEN_KEYINFO *ki;
1427  int nbits;
1428  const uint8_t *modPtr;
1429  uint32_t modLen;
1430  GWEN_MDIGEST *md;
1431 
1432  switch(keyId & 0xffff) {
1433  case 1:
1435  break;
1436  case 5:
1438  break;
1439  default:
1440  ki=NULL;
1441  }
1442 
1443  if (ki==NULL) {
1444  DBG_ERROR(GWEN_LOGDOMAIN, "No information for key %d", keyNum);
1445  GWEN_Buffer_free(srcBuf);
1446  return GWEN_ERROR_GENERIC;
1447  }
1448 
1449  /* calculate real number of bits */
1452  nbits=modLen*8;
1453  while(modLen && *modPtr==0) {
1454  nbits-=8;
1455  modLen--;
1456  modPtr++;
1457  }
1458  if (modLen) {
1459  uint8_t b=*modPtr;
1460  int i;
1461  uint8_t mask=0x80;
1462 
1463  for (i=0; i<8; i++) {
1464  if (b & mask)
1465  break;
1466  nbits--;
1467  mask>>=1;
1468  }
1469  }
1470 
1471  if (nbits==0) {
1472  DBG_ERROR(GWEN_LOGDOMAIN, "Empty modulus");
1473  GWEN_Buffer_free(srcBuf);
1474  return GWEN_ERROR_GENERIC;
1475  }
1476 
1478  GWEN_Buffer_AllocRoom(srcBuf, modLen);
1479 
1480  rv=GWEN_Padd_AddPkcs1Pss((uint8_t*) GWEN_Buffer_GetStart(srcBuf),
1482  nbits,
1483  pInData, inLen,
1484  inLen,
1485  md);
1486  GWEN_MDigest_free(md);
1487  if (rv<0) {
1488  DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
1489  GWEN_Buffer_free(srcBuf);
1490  return rv;
1491  }
1492 
1493  GWEN_Buffer_IncrementPos(srcBuf, rv);
1495  }
1496  else {
1497  GWEN_Buffer_AppendBytes(srcBuf, (const char*)pInData, inLen);
1498 
1499  /* padd according to given algo */
1500  rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1501  if (rv) {
1502  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1503  GWEN_Buffer_free(srcBuf);
1504  return rv;
1505  }
1506  }
1507 
1508  /* sign with key */
1509  rv=GWEN_Crypt_Key_Sign(k,
1510  (const uint8_t*)GWEN_Buffer_GetStart(srcBuf),
1511  GWEN_Buffer_GetUsedBytes(srcBuf),
1512  pSignatureData,
1513  pSignatureLen);
1514  GWEN_Buffer_free(srcBuf);
1515  if (rv) {
1516  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1517  return rv;
1518  }
1519 
1520  if (pSeqCounter) {
1522 
1523  /* signature sequence counter is to be incremented */
1524  switch(keyId & 0xffff) {
1525  case 1:
1527  break;
1528  case 5:
1530  break;
1531  default:
1532  ki=NULL;
1533  }
1534  if (ki &&
1536  unsigned int seq;
1537 
1539  *pSeqCounter=seq;
1541 
1542  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1543  if (rv) {
1544  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1545  return rv;
1546  }
1547  }
1548  else {
1549  DBG_WARN(GWEN_LOGDOMAIN, "No sign counter for key %04x", keyId);
1550  *pSeqCounter=0;
1551  }
1552  }
1553 
1554  return 0;
1555 }
1556 
1557 
1558 
1559 int GWENHYWFAR_CB
1561  uint32_t keyId,
1563  const uint8_t *pInData,
1564  uint32_t inLen,
1565  const uint8_t *pSignatureData,
1566  uint32_t signatureLen,
1567  uint32_t seqCounter,
1568  uint32_t gid) {
1569  GWEN_CRYPT_TOKEN_FILE *lct;
1571  GWEN_CRYPT_KEY *k;
1572  int keyNum;
1573  int i;
1574  int rv;
1576 
1577  assert(ct);
1578  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1579  assert(lct);
1580 
1581  DBG_INFO(GWEN_LOGDOMAIN, "Verifying with key %d", keyId);
1582 
1584 
1585  /* reload if needed */
1587  if (rv) {
1588  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1589  return rv;
1590  }
1591 
1592  /* get context */
1593  i=(keyId>>16);
1594  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1595  while(ctx) {
1596  if (i==0)
1597  break;
1599  i--;
1600  }
1601 
1602  if (ctx==NULL) {
1603  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1604  return GWEN_ERROR_NOT_FOUND;
1605  }
1606 
1607  /* get key */
1608  keyNum=keyId & 0xffff;
1609  if (keyNum!=1 && keyNum!=3 && keyNum!=6) {
1610  /* neither remoteSignKey nor remoteAuthKey */
1611  DBG_INFO(GWEN_LOGDOMAIN, "Bad key for verifying (%x)", keyId);
1612  return GWEN_ERROR_INVALID;
1613  }
1614 
1615  k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1616  if (k==NULL) {
1617  DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1618  return GWEN_ERROR_NO_KEY;
1619  }
1620 
1621  if (aid==GWEN_Crypt_PaddAlgoId_Iso9796_2 ||
1622  aid==GWEN_Crypt_PaddAlgoId_Pkcs1_2 ||
1623  aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1624  GWEN_BUFFER *tbuf;
1625  uint32_t l;
1626 
1627  /* these algos add random numbers, we must use encrypt fn here and
1628  * compare the decrypted and unpadded data with the source data */
1629  tbuf=GWEN_Buffer_new(0, signatureLen+16, 0, 0);
1632  pSignatureData, signatureLen,
1633  (uint8_t*)GWEN_Buffer_GetStart(tbuf),
1634  &l);
1635  if (rv<0) {
1636  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1637  GWEN_Buffer_free(tbuf);
1638  return rv;
1639  }
1640  GWEN_Buffer_IncrementPos(tbuf, l);
1642 
1643  if (aid==GWEN_Crypt_PaddAlgoId_Pkcs1_Pss_Sha256) {
1644  const GWEN_CRYPT_TOKEN_KEYINFO *ki;
1645  int nbits;
1646  const uint8_t *modPtr;
1647  uint32_t modLen;
1648  GWEN_MDIGEST *md;
1649 
1650  if (keyNum==3)
1652  else
1654  if (ki==NULL) {
1655  DBG_ERROR(GWEN_LOGDOMAIN, "No information for key %d", keyNum);
1656  GWEN_Buffer_free(tbuf);
1657  return GWEN_ERROR_GENERIC;
1658  }
1659 
1660  /* calculate real number of bits */
1663  nbits=modLen*8;
1664  while(modLen && *modPtr==0) {
1665  nbits-=8;
1666  modLen--;
1667  modPtr++;
1668  }
1669  if (modLen) {
1670  uint8_t b=*modPtr;
1671  int i;
1672  uint8_t mask=0x80;
1673 
1674  for (i=0; i<8; i++) {
1675  if (b & mask)
1676  break;
1677  nbits--;
1678  mask>>=1;
1679  }
1680  }
1681 
1682  if (nbits==0) {
1683  DBG_ERROR(GWEN_LOGDOMAIN, "Empty modulus");
1684  GWEN_Buffer_free(tbuf);
1685  return GWEN_ERROR_GENERIC;
1686  }
1687 
1689  rv=GWEN_Padd_VerifyPkcs1Pss((const uint8_t*) GWEN_Buffer_GetStart(tbuf),
1691  nbits,
1692  pInData, inLen,
1693  inLen,
1694  md);
1695  GWEN_MDigest_free(md);
1696  if (rv<0) {
1697  DBG_ERROR(GWEN_LOGDOMAIN, "here (%d)", rv);
1698  GWEN_Buffer_free(tbuf);
1699  return rv;
1700  }
1701  }
1702  else {
1703  rv=GWEN_Padd_UnapplyPaddAlgo(a, tbuf);
1704  if (rv<0) {
1705  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1706  GWEN_Buffer_free(tbuf);
1707  return rv;
1708  }
1709  l=GWEN_Buffer_GetUsedBytes(tbuf);
1710 
1711  if (l!=inLen) {
1712  DBG_ERROR(GWEN_LOGDOMAIN, "Signature length doesn't match");
1713  GWEN_Buffer_free(tbuf);
1714  return GWEN_ERROR_VERIFY;
1715  }
1716  if (memcmp(pInData, GWEN_Buffer_GetStart(tbuf), l)!=0) {
1717  DBG_ERROR(GWEN_LOGDOMAIN, "Signature doesn't match:");
1718  GWEN_Buffer_free(tbuf);
1719  return GWEN_ERROR_VERIFY;
1720  }
1721  }
1722  GWEN_Buffer_free(tbuf);
1723  }
1724  else {
1725  GWEN_BUFFER *srcBuf;
1726 
1727  /* copy to a buffer for padding */
1728  srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1729  GWEN_Buffer_AppendBytes(srcBuf, (const char*)pInData, inLen);
1730 
1731  /* padd according to given algo */
1732  rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1733  if (rv) {
1734  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1735  GWEN_Buffer_free(srcBuf);
1736  return rv;
1737  }
1738 
1739  /* verify with key */
1740  rv=GWEN_Crypt_Key_Verify(k,
1741  (const uint8_t*)GWEN_Buffer_GetStart(srcBuf),
1742  GWEN_Buffer_GetUsedBytes(srcBuf),
1743  pSignatureData,
1744  signatureLen);
1745  GWEN_Buffer_free(srcBuf);
1746  if (rv) {
1747  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1748  return rv;
1749  }
1750  }
1751 
1752  if (seqCounter) {
1754 
1755  /* signature sequence counter is to be checked */
1756  if (keyNum==3)
1758  else
1760  if (ki &&
1762  unsigned int seq;
1763 
1765 
1766  if (seq>=seqCounter) {
1767  DBG_WARN(GWEN_LOGDOMAIN, "Bad remote sequence counter (possibly replay attack!)");
1768  return GWEN_ERROR_VERIFY;
1769  }
1771 
1772  /* write file */
1773  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
1774  if (rv) {
1775  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
1776  return rv;
1777  }
1778  }
1779  else {
1780  DBG_WARN(GWEN_LOGDOMAIN, "No sign counter for key %04x", keyId);
1781  }
1782 
1783  }
1784 
1785  return 0;
1786 }
1787 
1788 
1789 
1790 int GWENHYWFAR_CB
1792  uint32_t keyId,
1794  const uint8_t *pInData,
1795  uint32_t inLen,
1796  uint8_t *pOutData,
1797  uint32_t *pOutLen,
1798  uint32_t gid) {
1799  GWEN_CRYPT_TOKEN_FILE *lct;
1801  GWEN_CRYPT_KEY *k;
1802  int keyNum;
1803  GWEN_BUFFER *srcBuf;
1804  int i;
1805  int rv;
1806 
1807  assert(ct);
1808  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1809  assert(lct);
1810 
1811  DBG_INFO(GWEN_LOGDOMAIN, "Enciphering with key %d", keyId);
1812 
1813  /* reload if needed */
1815  if (rv) {
1816  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1817  return rv;
1818  }
1819 
1820  /* get context */
1821  i=(keyId>>16);
1822  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1823  while(ctx) {
1824  if (i==0)
1825  break;
1827  i--;
1828  }
1829 
1830  if (ctx==NULL) {
1831  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1832  return GWEN_ERROR_NOT_FOUND;
1833  }
1834 
1835  /* get key */
1836  keyNum=keyId & 0xffff;
1837  if (keyNum!=2 && keyNum!=4) {
1838  /* not remoteCryptKey */
1839  DBG_INFO(GWEN_LOGDOMAIN, "Bad key for encrypting (%x)", keyId);
1840  return GWEN_ERROR_INVALID;
1841  }
1842 
1843  k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1844  if (k==NULL) {
1845  DBG_INFO(GWEN_LOGDOMAIN, "Key %d not found", keyId);
1846  return GWEN_ERROR_NOT_FOUND;
1847  }
1848 
1849  /* copy to a buffer for padding */
1850  srcBuf=GWEN_Buffer_new(0, inLen, 0, 0);
1851  GWEN_Buffer_AppendBytes(srcBuf, (const char*)pInData, inLen);
1852  GWEN_Buffer_Rewind(srcBuf);
1853 
1854  /* padd according to given algo */
1855  rv=GWEN_Padd_ApplyPaddAlgo(a, srcBuf);
1856  if (rv) {
1857  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1858  GWEN_Buffer_free(srcBuf);
1859  return rv;
1860  }
1861 
1862  /* encipher with key */
1864  (const uint8_t*)GWEN_Buffer_GetStart(srcBuf),
1865  GWEN_Buffer_GetUsedBytes(srcBuf),
1866  pOutData,
1867  pOutLen);
1868  GWEN_Buffer_free(srcBuf);
1869  if (rv) {
1870  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1871  return rv;
1872  }
1873 
1874  return 0;
1875 }
1876 
1877 
1878 
1879 int GWENHYWFAR_CB
1881  uint32_t keyId,
1883  const uint8_t *pInData,
1884  uint32_t inLen,
1885  uint8_t *pOutData,
1886  uint32_t *pOutLen,
1887  uint32_t gid) {
1888  GWEN_CRYPT_TOKEN_FILE *lct;
1890  GWEN_CRYPT_KEY *k;
1891  int keyNum;
1892  GWEN_BUFFER *tbuf;
1893  int i;
1894  int rv;
1895  uint32_t l;
1896 
1897  assert(ct);
1898  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1899  assert(lct);
1900 
1901  DBG_INFO(GWEN_LOGDOMAIN, "Deciphering with key %d", keyId);
1902 
1903  /* reload if needed */
1905  if (rv) {
1906  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1907  return rv;
1908  }
1909 
1910  /* get context */
1911  i=(keyId>>16);
1912  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
1913  while(ctx) {
1914  if (i==0)
1915  break;
1917  i--;
1918  }
1919 
1920  if (ctx==NULL) {
1921  DBG_INFO(GWEN_LOGDOMAIN, "No context by id [%x] known", (keyId>>16) & 0xffff);
1922  return GWEN_ERROR_NOT_FOUND;
1923  }
1924 
1925  /* get key */
1926  keyNum=keyId & 0xffff;
1927  if (keyNum!=2 && keyNum!=4) {
1928  /* not localCryptKey */
1929  DBG_INFO(GWEN_LOGDOMAIN, "Bad key for decrypting (%x)", keyId);
1930  return GWEN_ERROR_INVALID;
1931  }
1932 
1933  k=GWEN_Crypt_TokenFile__GetKey(ct, keyId, gid);
1934  if (k==NULL) {
1935  DBG_INFO(GWEN_LOGDOMAIN, "Key not found");
1936  return GWEN_ERROR_NOT_FOUND;
1937  }
1938 
1939  /* decipher with key */
1940  tbuf=GWEN_Buffer_new(0, inLen+16, 0, 1);
1943  pInData, inLen,
1944  (uint8_t*)GWEN_Buffer_GetStart(tbuf), &l);
1945  if (rv<0) {
1946  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1947  GWEN_Buffer_free(tbuf);
1948  return rv;
1949  }
1950  GWEN_Buffer_IncrementPos(tbuf, l);
1952 
1953  /* unpadd according to given algo */
1954  rv=GWEN_Padd_UnapplyPaddAlgo(a, tbuf);
1955  if (rv) {
1956  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1957  GWEN_Buffer_free(tbuf);
1958  return rv;
1959  }
1960 
1961  /* copy resulting data to given buffer */
1962  l=GWEN_Buffer_GetUsedBytes(tbuf);
1963  if (l>*pOutLen) {
1964  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
1965  GWEN_Buffer_free(tbuf);
1967  }
1968  memmove(pOutData, GWEN_Buffer_GetStart(tbuf), l);
1969  *pOutLen=l;
1970  GWEN_Buffer_free(tbuf);
1971 
1972  return 0;
1973 }
1974 
1975 
1976 
1977 int GWENHYWFAR_CB
1979  uint32_t keyId,
1980  const GWEN_CRYPT_CRYPTALGO *a,
1981  uint32_t gid) {
1982  GWEN_CRYPT_TOKEN_FILE *lct;
1983  GWEN_CRYPT_KEY *pubKey;
1984  GWEN_CRYPT_KEY *secKey;
1985  int rv;
1986  uint32_t keyNum;
1988  int i;
1989  uint8_t kbuf[GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH];
1990  uint32_t klen;
1993 
1994  assert(ct);
1995  lct=GWEN_INHERIT_GETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct);
1996  assert(lct);
1997 
1998  /* reload if needed */
2000  if (rv) {
2001  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2002  return rv;
2003  }
2004 
2005  keyNum=keyId & 0xffff;
2006 
2007  /* check key id */
2008  if (keyNum!=1 && keyNum!=2 && keyNum!=5 && keyNum!=7) {
2009  DBG_INFO(GWEN_LOGDOMAIN, "Can only generate local keys.");
2011  I18N("Can only generate local keys."));
2012  return GWEN_ERROR_NOT_SUPPORTED;
2013  }
2014 
2015  /* check for algo */
2016  if (GWEN_Crypt_CryptAlgo_GetId(a)!=GWEN_Crypt_CryptAlgoId_Rsa) {
2017  DBG_INFO(GWEN_LOGDOMAIN, "Only RSA keys supported.");
2019  I18N("Only RSA keys supported."));
2020  return GWEN_ERROR_NOT_SUPPORTED;
2021  }
2022 
2023  /* get context */
2024  i=(keyId>>16);
2025  ctx=GWEN_Crypt_Token_Context_List_First(lct->contextList);
2026  while(ctx) {
2027  if (i==0)
2028  break;
2030  i--;
2031  }
2032 
2033  /* generate key pair */
2034  DBG_INFO(GWEN_LOGDOMAIN, "Creating key pair using %d bytes", GWEN_Crypt_CryptAlgo_GetChunkSize(a));
2038  &pubKey,
2039  &secKey);
2040  if (rv) {
2041  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
2043  I18N("Could not generate key"));
2044  return rv;
2045  }
2046 
2048  I18N("Key generated"));
2049 
2050  /* set key */
2051  if (keyNum==1)
2053  else if (keyNum==2)
2055  else if (keyNum==5)
2057  else if (keyNum==7)
2059  else
2060  cki=NULL;
2061 
2062  if (cki==NULL) {
2064  I18N("No key info found"));
2065  return GWEN_ERROR_NO_DATA;
2066  }
2067 
2068  /* update key info for the key */
2070  assert(ki);
2071 
2072  /* get modulus */
2073  klen=sizeof(kbuf);
2074  rv=GWEN_Crypt_KeyRsa_GetModulus(pubKey, kbuf, &klen);
2075  if (rv) {
2076  DBG_INFO(GWEN_LOGDOMAIN, "No modulus for key");
2078  GWEN_Crypt_Key_free(pubKey);
2079  return rv;
2080  }
2081  GWEN_Crypt_Token_KeyInfo_SetModulus(ki, kbuf, klen);
2082 
2083  /* get exponent */
2084  klen=sizeof(kbuf);
2085  rv=GWEN_Crypt_KeyRsa_GetExponent(pubKey, kbuf, &klen);
2086  if (rv) {
2087  DBG_INFO(GWEN_LOGDOMAIN, "No exponent for key");
2089  GWEN_Crypt_Key_free(pubKey);
2090  return rv;
2091  }
2092  GWEN_Crypt_Token_KeyInfo_SetExponent(ki, kbuf, klen);
2095 
2096  if (keyNum==1) {
2098  DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2100  }
2101  GWEN_CTF_Context_SetLocalSignKey(ctx, secKey);
2103  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
2104  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
2105  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
2106  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
2113  }
2114  else if (keyNum==2) {
2115  GWEN_CTF_Context_SetLocalCryptKey(ctx, secKey);
2117  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
2118  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
2119  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
2120  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
2126  }
2127  else if (keyNum==5) {
2129  DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2131  }
2132  GWEN_CTF_Context_SetLocalAuthKey(ctx, secKey);
2134  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
2135  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
2136  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
2137  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
2144  }
2145  else if (keyNum==7) {
2147  DBG_DEBUG(GWEN_LOGDOMAIN, "Adding mode \"direct sign\" to key");
2149  }
2152  GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS |
2153  GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT |
2154  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER |
2155  GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION |
2162  }
2163 
2164  /* the public key is not used */
2165  GWEN_Crypt_Key_free(pubKey);
2166 
2167  rv=GWEN_Crypt_TokenFile__WriteFile(ct, 0, gid);
2168  if (rv) {
2169  DBG_INFO(GWEN_LOGDOMAIN, "Unable to write file");
2171  I18N("Unable to write key file"));
2172  return rv;
2173  }
2174 
2176  I18N("Key generated and set"));
2177 
2178  return 0;
2179 }
2180 
2181 
2182 
2183 
2184 
2185 
2188  GWEN_CRYPT_TOKEN_FILE *lct;
2189 
2190  lct=(GWEN_CRYPT_TOKEN_FILE*) p;
2191  GWEN_Crypt_Token_Context_List_free(lct->contextList);
2192 
2193  GWEN_FREE_OBJECT(lct);
2194 }
2195 
2196 
2197 
2199  const char *tokenName) {
2200  GWEN_CRYPT_TOKEN *ct;
2201  GWEN_CRYPT_TOKEN_FILE *lct;
2202 
2203  ct=GWEN_Crypt_Token_new(GWEN_Crypt_Token_Device_File, typeName, tokenName);
2204  assert(ct);
2205 
2206  GWEN_NEW_OBJECT(GWEN_CRYPT_TOKEN_FILE, lct);
2207  lct->contextList=GWEN_Crypt_Token_Context_List_new();
2208  GWEN_INHERIT_SETDATA(GWEN_CRYPT_TOKEN, GWEN_CRYPT_TOKEN_FILE, ct, lct,
2225 
2226  return ct;
2227 }
2228 
2229 
2230 
2231 
2232 
int GWEN_Crypt_TokenFile__ReadFile(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition: ctfile.c:258
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:177
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:102
const char * GWEN_Crypt_Token_Context_GetServiceId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:503
int GWEN_Crypt_TokenFile__Read(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition: ctfile.c:214
void GWEN_Crypt_TokenFile_AddContext(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctfile.c:370
void GWEN_Crypt_Token_Context_SetServiceId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:649
void GWEN_CTF_Context_SetLocalSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:114
int GWEN_Gui_ProgressLog(uint32_t id, GWEN_LOGGER_LEVEL level, const char *text)
Definition: gui.c:940
GWENHYWFAR_API void GWEN_FSLock_free(GWEN_FSLOCK *fl)
void GWEN_Crypt_Token_Context_List_Add(GWEN_CRYPT_TOKEN_CONTEXT *element, GWEN_CRYPT_TOKEN_CONTEXT_LIST *list)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
int GWEN_Crypt_CryptAlgo_GetChunkSize(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:302
#define I18N(m)
Definition: error.c:42
GWEN_CRYPT_TOKEN * GWEN_Crypt_TokenFile_new(const char *typeName, const char *tokenName)
Definition: ctfile.c:2198
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:77
void GWEN_MDigest_free(GWEN_MDIGEST *md)
Definition: mdigest.c:53
int GWEN_Buffer_AllocRoom(GWEN_BUFFER *bf, uint32_t size)
Definition: buffer.c:273
uint32_t GWEN_Buffer_GetMaxUnsegmentedWrite(GWEN_BUFFER *bf)
Definition: buffer.c:569
const uint8_t * GWEN_Crypt_Token_KeyInfo_GetModulusData(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition: ct_keyinfo.c:786
void GWEN_Crypt_Token_KeyInfo_free(GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:77
#define GWEN_ERROR_INVALID
Definition: error.h:67
void GWEN_CTF_Context_SetLocalCryptKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:139
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalAuthKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:277
const char * GWEN_Crypt_Token_GetTypeName(const GWEN_CRYPT_TOKEN *ct)
Definition: ct.c:83
uint32_t GWEN_Crypt_Token_GetModes(const GWEN_CRYPT_TOKEN *ct)
Definition: ct.c:170
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
Definition: buffer.c:266
void GWEN_CTF_Context_SetLocalAuthKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:289
#define GWEN_CRYPT_TOKEN_MODE_EXP_65537
Definition: ct.h:62
void GWEN_CTF_Context_SetRemoteSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:189
const char * GWEN_Crypt_Token_Context_GetUserId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:509
GWENHYWFAR_CB void GWEN_Crypt_TokenFile_freeData(GWEN_UNUSED void *bp, void *p)
Definition: ctfile.c:2187
const char * GWEN_Crypt_Token_Context_GetUserName(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:521
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid)
Definition: ctfile.c:521
#define DBG_NOTICE(dbg_logger, format, args...)
Definition: debug.h:140
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASMODULUS
Definition: ct_keyinfo.h:94
void GWEN_Crypt_Key_free(GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:148
int GWEN_Crypt_KeyRsa_GeneratePair(unsigned int nbytes, int use65537e, GWEN_CRYPT_KEY **pPubKey, GWEN_CRYPT_KEY **pSecretKey)
Definition: cryptkeyrsa.c:87
void GWEN_CTF_Context_SetLocalSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:89
GWEN_CRYPT_TOKEN_ACTIVATEKEY_FN GWEN_Crypt_Token_SetActivateKeyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_ACTIVATEKEY_FN f)
Definition: ct.c:753
#define GWEN_FREE_OBJECT(varname)
Definition: memory.h:92
#define NULL
Definition: binreloc.c:290
const char * GWEN_Crypt_Token_Context_GetAddress(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:539
void GWEN_Crypt_Token_Context_SetSystemId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:753
void GWEN_Crypt_Token_KeyInfo_SetModulus(GWEN_CRYPT_TOKEN_KEYINFO *st, const uint8_t *p, uint32_t len)
Definition: ct_keyinfo.c:777
GWEN_CRYPT_KEY * GWEN_Crypt_TokenFile__GetKey(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition: ctfile.c:1302
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_fromModExp(unsigned int nbytes, const uint8_t *pModulus, uint32_t lModulus, const uint8_t *pExponent, uint32_t lExponent)
Definition: cryptkeyrsa.c:818
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalCryptKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:152
int GWEN_Crypt_Token_Context_GetPort(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:545
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetLocalCryptKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:127
void GWEN_CTF_Context_SetRemoteCryptKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:264
GWEN_CRYPT_TOKEN_GETCONTEXT_FN GWEN_Crypt_Token_SetGetContextFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETCONTEXT_FN f)
Definition: ct.c:639
int GWEN_Buffer_AdjustUsedBytes(GWEN_BUFFER *bf)
Definition: buffer.c:513
#define DBG_WARN(dbg_logger, format, args...)
Definition: debug.h:118
const char * GWEN_Crypt_Token_Context_GetSystemId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:551
GWEN_CRYPT_TOKEN_VERIFY_FN GWEN_Crypt_Token_SetVerifyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_VERIFY_FN f)
Definition: ct.c:682
struct GWEN_CRYPT_PADDALGO GWEN_CRYPT_PADDALGO
Definition: paddalgo.h:21
void GWEN_Crypt_Token_Context_SetUserName(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:691
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:284
#define GWEN_LOGDOMAIN
Definition: logger.h:35
int GWEN_Crypt_TokenFile__OpenFile(GWEN_CRYPT_TOKEN *ct, int wr, uint32_t gid)
Definition: ctfile.c:42
int GWEN_Crypt_TokenFile__CloseFile(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition: ctfile.c:144
int GWEN_Crypt_Key_GetKeyNumber(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:178
uint32_t GWEN_Crypt_Token_KeyInfo_GetSignCounter(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:287
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:1355
int GWEN_Padd_UnapplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
Definition: padd.c:835
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_TokenFile_GetContext(GWEN_CRYPT_TOKEN *ct, int idx)
Definition: ctfile.c:384
void GWEN_CTF_Context_SetRemoteCryptKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:239
uint32_t GWEN_Crypt_Token_Context_GetId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:419
void GWEN_CTF_Context_SetRemoteAuthKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:364
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANSIGN
Definition: ct_keyinfo.h:102
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
#define GWEN_ERROR_BUFFER_OVERFLOW
Definition: error.h:79
#define GWEN_ERROR_NO_KEY
Definition: error.h:115
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_Token_Context_List_Next(const GWEN_CRYPT_TOKEN_CONTEXT *element)
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASSIGNCOUNTER
Definition: ct_keyinfo.h:98
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteCryptKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:227
int GWEN_CTF_Context_IsOfThisType(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:44
#define GWEN_ERROR_IO
Definition: error.h:123
#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:1245
int GWEN_Buffer_IncrementPos(GWEN_BUFFER *bf, uint32_t i)
Definition: buffer.c:495
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:1978
void GWEN_Crypt_KeyRsa_AddFlags(GWEN_CRYPT_KEY *k, uint32_t fl)
Definition: cryptkeyrsa.c:982
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_Crypt_Token_KeyInfo_dup(const GWEN_CRYPT_TOKEN_KEYINFO *p_src)
Definition: ct_keyinfo.c:107
uint32_t GWEN_Crypt_Token_KeyInfo_GetModulusLen(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition: ct_keyinfo.c:792
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetTempLocalSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:402
void GWEN_Crypt_Token_Context_List_Clear(GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANDECIPHER
Definition: ct_keyinfo.h:105
GWEN_CRYPT_TOKEN_GETKEYINFO_FN GWEN_Crypt_Token_SetGetKeyInfoFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETKEYINFO_FN f)
Definition: ct.c:595
#define GWEN_NEW_OBJECT(typ, varname)
Definition: memory.h:86
uint32_t GWEN_Crypt_Token_KeyInfo_GetKeyVersion(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:281
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:1791
GWENHYWFAR_API GWEN_FSLOCK * GWEN_FSLock_new(const char *fname, GWEN_FSLOCK_TYPE t)
#define GWENHYWFAR_CB
Definition: gwenhywfarapi.h:89
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:192
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_TokenFile__GetContextIdList(GWEN_CRYPT_TOKEN *ct, uint32_t *pIdList, uint32_t *pCount, uint32_t gid)
Definition: ctfile.c:1150
int GWEN_Gui_ProgressLog2(uint32_t id, GWEN_LOGGER_LEVEL level, const char *fmt,...)
Definition: gui.c:951
GWEN_CRYPT_TOKEN_GENERATEKEY_FN GWEN_Crypt_Token_SetGenerateKeyFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GENERATEKEY_FN f)
Definition: ct.c:725
int GWEN_Crypt_Token_KeyInfo_GetKeySize(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:263
const uint8_t * GWEN_Crypt_Token_KeyInfo_GetExponentData(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition: ct_keyinfo.c:807
void GWEN_Crypt_Token_KeyInfo_SetKeyVersion(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition: ct_keyinfo.c:349
void GWEN_Crypt_Token_Context_List_free(GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
#define GWEN_ERROR_GENERIC
Definition: error.h:62
void GWEN_CTF_Context_SetRemoteSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:214
void GWEN_CTF_Context_SetRemoteAuthKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:339
int GWEN_Padd_ApplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
Definition: padd.c:750
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANVERIFY
Definition: ct_keyinfo.h:103
struct GWEN_MDIGEST GWEN_MDIGEST
Definition: mdigest.h:25
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
GWEN_CRYPT_PADDALGOID GWEN_Crypt_PaddAlgo_GetId(const GWEN_CRYPT_PADDALGO *a)
Definition: paddalgo.c:178
GWEN_CRYPT_TOKEN_FILE_WRITE_FN GWEN_Crypt_TokenFile_SetWriteFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_FILE_WRITE_FN f)
Definition: ctfile.c:422
struct GWEN_CRYPT_KEY GWEN_CRYPT_KEY
Definition: cryptkey.h:26
GWEN_FSLOCK_RESULT
Definition: fslock.h:71
uint32_t GWEN_Crypt_Token_KeyInfo_GetFlags(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:257
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Lock(GWEN_FSLOCK *fl, int timeout, uint32_t gid)
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
int GWEN_Crypt_TokenFile__ReloadIfNeeded(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition: ctfile.c:333
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASEXPONENT
Definition: ct_keyinfo.h:95
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
const char * GWEN_Crypt_Token_Context_GetPeerId(const GWEN_CRYPT_TOKEN_CONTEXT *p_struct)
Definition: ct_context.c:527
const GWEN_CRYPT_TOKEN_KEYINFO *GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetKeyInfo(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t flags, uint32_t gid)
Definition: ctfile.c:603
struct GWEN_CRYPT_TOKEN GWEN_CRYPT_TOKEN
Definition: ct.h:19
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASACTIONFLAGS
Definition: ct_keyinfo.h:96
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteCryptKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:252
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYVERSION
Definition: ct_keyinfo.h:97
struct GWEN_CRYPT_TOKEN_KEYINFO GWEN_CRYPT_TOKEN_KEYINFO
Definition: ct_keyinfo.h:121
void GWEN_CTF_Context_SetTempLocalSignKey(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_KEY *k)
Definition: ctf_context.c:389
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetTempLocalSignKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:377
GWEN_CRYPT_TOKEN_OPEN_FN GWEN_Crypt_Token_SetOpenFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_OPEN_FN f)
Definition: ct.c:536
#define GWEN_CRYPT_KEYRSA_FLAGS_DIRECTSIGN
Definition: cryptkeyrsa.h:22
GWEN_CRYPT_TOKEN_SIGN_FN GWEN_Crypt_Token_SetSignFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SIGN_FN f)
Definition: ct.c:668
struct GWEN_CRYPT_CRYPTALGO GWEN_CRYPT_CRYPTALGO
Definition: cryptalgo.h:20
struct GWEN_CRYPT_TOKEN_CONTEXT GWEN_CRYPT_TOKEN_CONTEXT
Definition: ct_context.h:185
#define GWEN_CRYPT_TOKEN_KEYFLAGS_CANENCIPHER
Definition: ct_keyinfo.h:104
void GWEN_CTF_Context_SetLocalCryptKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:164
int GWEN_Crypt_TokenFile__WriteFile(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid)
Definition: ctfile.c:297
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASKEYNUMBER
Definition: ct_keyinfo.h:99
GWEN_CRYPT_PADDALGOID
Definition: paddalgo.h:58
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
#define GWEN_CRYPT_TOKEN_KEYFLAGS_ACTIONMASK
Definition: ct_keyinfo.h:101
GWEN_CRYPT_TOKEN_CREATE_FN GWEN_Crypt_Token_SetCreateFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CREATE_FN f)
Definition: ct.c:550
void GWEN_Crypt_Token_Context_SetAddress(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:733
GWEN_CRYPT_TOKEN * GWEN_Crypt_Token_new(GWEN_CRYPT_TOKEN_DEVICE dev, const char *typeName, const char *tokenName)
Definition: ct.c:33
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetKeyIdList(GWEN_CRYPT_TOKEN *ct, uint32_t *pIdList, uint32_t *pCount, uint32_t gid)
Definition: ctfile.c:545
#define GWEN_ERROR_NOT_SUPPORTED
Definition: error.h:109
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:256
int GWEN_Padd_AddPkcs1Pss(uint8_t *pDestBuffer, uint32_t lDestBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
Definition: padd.c:481
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgo_GetId(const GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:244
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Open(GWEN_CRYPT_TOKEN *ct, GWEN_UNUSED int admin, uint32_t gid)
Definition: ctfile.c:502
GWEN_CRYPT_TOKEN_GETCONTEXTIDLIST_FN GWEN_Crypt_Token_SetGetContextIdListFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETCONTEXTIDLIST_FN f)
Definition: ct.c:624
const char * GWEN_Crypt_Token_GetTokenName(const GWEN_CRYPT_TOKEN *ct)
Definition: ct.c:92
void GWEN_Crypt_Token_KeyInfo_SetExponent(GWEN_CRYPT_TOKEN_KEYINFO *st, const uint8_t *p, uint32_t len)
Definition: ct_keyinfo.c:798
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:1560
#define GWEN_CRYPT_TOKEN_KEYFLAGS_HASSTATUS
Definition: ct_keyinfo.h:93
#define GWEN_ERROR_NOT_FOUND
Definition: error.h:89
GWEN_CRYPT_TOKEN_CONTEXT * GWEN_Crypt_Token_Context_List_First(const GWEN_CRYPT_TOKEN_CONTEXT_LIST *l)
void GWEN_Crypt_Token_Context_SetUserId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:663
GWEN_CRYPT_TOKEN_DECIPHER_FN GWEN_Crypt_Token_SetDecipherFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_DECIPHER_FN f)
Definition: ct.c:710
int GWENHYWFAR_CB GWEN_Crypt_TokenFile__ActivateKey(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition: ctfile.c:1004
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteAuthKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:352
void GWEN_CTF_Context_SetTempLocalSignKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:414
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetRemoteSignKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:202
int GWEN_Crypt_Key_GetKeyVersion(const GWEN_CRYPT_KEY *k)
Definition: cryptkey.c:192
GWENHYWFAR_API GWEN_MDIGEST * GWEN_MDigest_Sha256_new(void)
Definition: mdigestgc.c:186
void GWEN_Crypt_Key_SetKeyVersion(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:199
void GWEN_Crypt_Token_KeyInfo_SetFlags(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition: ct_keyinfo.c:313
int GWENHYWFAR_CB GWEN_Crypt_TokenFile_Create(GWEN_CRYPT_TOKEN *ct, uint32_t gid)
Definition: ctfile.c:439
GWEN_CRYPT_KEY * GWEN_CTF_Context_GetRemoteAuthKey(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:327
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:604
GWEN_CRYPT_TOKEN_ENCIPHER_FN GWEN_Crypt_Token_SetEncipherFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_ENCIPHER_FN f)
Definition: ct.c:696
uint32_t GWEN_Crypt_Token_KeyInfo_GetExponentLen(const GWEN_CRYPT_TOKEN_KEYINFO *st)
Definition: ct_keyinfo.c:813
void GWEN_Crypt_Token_KeyInfo_SetKeyNumber(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition: ct_keyinfo.c:343
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:298
void GWEN_Crypt_Token_KeyInfo_SetSignCounter(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition: ct_keyinfo.c:355
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition: buffer.c:348
#define GWEN_ERROR_VERIFY
Definition: error.h:104
GWEN_CRYPT_TOKEN_SETKEYINFO_FN GWEN_Crypt_Token_SetSetKeyInfoFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SETKEYINFO_FN f)
Definition: ct.c:609
GWEN_CRYPT_TOKEN_CLOSE_FN GWEN_Crypt_Token_SetCloseFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_CLOSE_FN f)
Definition: ct.c:565
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
Definition: buffer.c:693
#define GWEN_INHERIT(bt, t)
Definition: inherit.h:264
int GWEN_Crypt_TokenFile__Write(GWEN_CRYPT_TOKEN *ct, int cr, uint32_t gid)
Definition: ctfile.c:233
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:1880
void GWEN_Crypt_Token_KeyInfo_SetKeySize(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, int p_src)
Definition: ct_keyinfo.c:331
#define GWEN_ERROR_INTERNAL
Definition: error.h:125
#define GWEN_ERROR_USER_ABORTED
Definition: error.h:65
GWENHYWFAR_API GWEN_FSLOCK_RESULT GWEN_FSLock_Unlock(GWEN_FSLOCK *fl)
#define GWEN_ERROR_NO_DATA
Definition: error.h:94
GWEN_CRYPT_TOKEN_GETKEYIDLIST_FN GWEN_Crypt_Token_SetGetKeyIdListFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_GETKEYIDLIST_FN f)
Definition: ct.c:580
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:270
GWEN_CRYPT_TOKEN_CONTEXT_LIST * GWEN_Crypt_Token_Context_List_new()
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:815
#define GWEN_INHERIT_SETDATA(bt, t, element, data, fn)
Definition: inherit.h:292
GWEN_CRYPT_KEY * GWEN_Crypt_KeyRsa_dup(const GWEN_CRYPT_KEY *k)
Definition: cryptkeyrsa.c:927
#define GWEN_CRYPT_KEYRSA_MAX_KEYLENGTH
Definition: cryptkeyrsa.h:25
void GWEN_Crypt_Token_Context_SetPeerId(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, const char *p_src)
Definition: ct_context.c:705
int GWEN_Crypt_KeyRsa_GetExponent(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
Definition: cryptkeyrsa.c:774
GWEN_CRYPT_TOKEN_KEYINFO * GWEN_CTF_Context_GetLocalAuthKeyInfo(const GWEN_CRYPT_TOKEN_CONTEXT *ctx)
Definition: ctf_context.c:302
void GWEN_Crypt_Key_SetKeyNumber(GWEN_CRYPT_KEY *k, int i)
Definition: cryptkey.c:185
const GWEN_CRYPT_TOKEN_CONTEXT *GWENHYWFAR_CB GWEN_Crypt_TokenFile__GetContext(GWEN_CRYPT_TOKEN *ct, uint32_t id, uint32_t gid)
Definition: ctfile.c:1204
uint32_t GWEN_Crypt_Token_KeyInfo_GetKeyNumber(const GWEN_CRYPT_TOKEN_KEYINFO *p_struct)
Definition: ct_keyinfo.c:275
GWEN_CRYPT_TOKEN_FILE_READ_FN GWEN_Crypt_TokenFile_SetReadFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_FILE_READ_FN f)
Definition: ctfile.c:405
void GWEN_Crypt_Token_KeyInfo_AddFlags(GWEN_CRYPT_TOKEN_KEYINFO *p_struct, uint32_t p_src)
Definition: ct_keyinfo.c:319
GWEN_CRYPT_TOKEN_SETCONTEXT_FN GWEN_Crypt_Token_SetSetContextFn(GWEN_CRYPT_TOKEN *ct, GWEN_CRYPT_TOKEN_SETCONTEXT_FN f)
Definition: ct.c:654
#define GWEN_UNUSED
int GWEN_Crypt_KeyRsa_GetModulus(const GWEN_CRYPT_KEY *k, uint8_t *buffer, uint32_t *pBufLen)
Definition: cryptkeyrsa.c:752
#define GWEN_INHERIT_GETDATA(bt, t, element)
Definition: inherit.h:271
void GWEN_CTF_Context_SetLocalAuthKeyInfo(GWEN_CRYPT_TOKEN_CONTEXT *ctx, GWEN_CRYPT_TOKEN_KEYINFO *ki)
Definition: ctf_context.c:314
void GWEN_Crypt_Token_Context_SetPort(GWEN_CRYPT_TOKEN_CONTEXT *p_struct, int p_src)
Definition: ct_context.c:747
#define GWEN_CRYPT_TOKEN_MODE_DIRECT_SIGN
Definition: ct.h:63