gwenhywfar  4.99.8beta
tools/gcttool/cttest.c
Go to the documentation of this file.
1 /***************************************************************************
2  $RCSfile$
3  -------------------
4  cvs : $Id: main.c 1107 2007-01-07 21:17:05Z martin $
5  begin : Tue May 03 2005
6  copyright : (C) 2005 by Martin Preuss
7  email : martin@libchipcard.de
8 
9  ***************************************************************************
10  * Please see toplevel file COPYING for license details *
11  ***************************************************************************/
12 
13 #ifdef HAVE_CONFIG_H
14 # include <config.h>
15 #endif
16 
17 #include <gwenhywfar/debug.h>
18 #include <gwenhywfar/pathmanager.h>
19 #include <gwenhywfar/cgui.h>
20 
21 #include <gwenhywfar/gwenhywfar.h>
22 #include <gwenhywfar/args.h>
23 #include <gwenhywfar/logger.h>
24 #include <gwenhywfar/db.h>
25 #include <gwenhywfar/misc.h>
26 #include <gwenhywfar/misc2.h>
27 #include <gwenhywfar/inherit.h>
28 #include <gwenhywfar/ct.h>
29 #include <gwenhywfar/ctplugin.h>
30 #include <gwenhywfar/text.h>
31 #include <gwenhywfar/mdigest.h>
32 
33 #include "src/base/i18n_l.h"
34 
35 #ifdef OS_WIN32
36 # define DIRSEP "\\"
37 #else
38 # define DIRSEP "/"
39 #endif
40 
41 #ifdef HAVE_I18N
42 # include <libintl.h>
43 # include <locale.h>
44 #endif
45 
46 
47 #define GCT_LOGDOMAIN "GCT"
48 
49 //#define DEBUG_GCT_TOOL
50 
51 
52 
53 int signWithNew(GWEN_DB_NODE *dbArgs, int argc, char **argv) {
54  GWEN_DB_NODE *db;
55  const char *ttype;
56  const char *tname;
58  GWEN_PLUGIN *pl;
59  GWEN_CRYPT_TOKEN *ct;
60  unsigned int cid;
61  int rv;
62  const GWEN_ARGS args[]={
63  {
64  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
65  GWEN_ArgsType_Int, /* type */
66  "contextId", /* name */
67  0, /* minnum */
68  1, /* maxnum */
69  "i", /* short option */
70  "id", /* long option */
71  "Context id (0 for any)", /* short description */
72  "Context id (0 for any)" /* long description */
73  },
74  {
75  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
76  GWEN_ArgsType_Char, /* type */
77  "tokenType", /* name */
78  1, /* minnum */
79  1, /* maxnum */
80  "t", /* short option */
81  "ttype", /* long option */
82  "Specify the crypt token type", /* short description */
83  "Specify the crypt token type" /* long description */
84  },
85  {
86  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
87  GWEN_ArgsType_Char, /* type */
88  "tokenName", /* name */
89  0, /* minnum */
90  1, /* maxnum */
91  "n", /* short option */
92  "tname", /* long option */
93  "Specify the crypt token name", /* short description */
94  "Specify the crypt token name" /* long description */
95  },
96  {
98  GWEN_ArgsType_Int, /* type */
99  "help", /* name */
100  0, /* minnum */
101  0, /* maxnum */
102  "h", /* short option */
103  "help", /* long option */
104  "Show this help screen", /* short description */
105  "Show this help screen" /* long description */
106  }
107  };
108 
109  db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local");
110  rv=GWEN_Args_Check(argc, argv, 1,
112  args,
113  db);
114  if (rv==GWEN_ARGS_RESULT_ERROR) {
115  fprintf(stderr, "ERROR: Could not parse arguments\n");
116  return 1;
117  }
118  else if (rv==GWEN_ARGS_RESULT_HELP) {
119  GWEN_BUFFER *ubuf;
120 
121  ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
122  if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
123  fprintf(stderr, "ERROR: Could not create help string\n");
124  return 1;
125  }
126  fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
127  GWEN_Buffer_free(ubuf);
128  return 0;
129  }
130 
131  cid=GWEN_DB_GetIntValue(db, "contextId", 0, 0);
132 
133  ttype=GWEN_DB_GetCharValue(db, "tokenType", 0, 0);
134  assert(ttype);
135 
136  tname=GWEN_DB_GetCharValue(db, "tokenName", 0, 0);
137 
138  /* get crypt token */
140  if (pm==0) {
141  DBG_ERROR(0, "Plugin manager not found");
142  return 3;
143  }
144 
145  pl=GWEN_PluginManager_GetPlugin(pm, ttype);
146  if (pl==0) {
147  DBG_ERROR(0, "Plugin not found");
148  return 3;
149  }
150  DBG_INFO(0, "Plugin found");
151 
153  if (ct==0) {
154  DBG_ERROR(0, "Could not create crypt token");
155  return 3;
156  }
157 
158  if (GWEN_DB_GetIntValue(dbArgs, "forcePin", 0, 0))
160 
161  /* open crypt token for use */
162  rv=GWEN_Crypt_Token_Open(ct, 0, 0);
163  if (rv) {
164  DBG_ERROR(0, "Could not open token");
165  return 3;
166  }
167  else {
168  uint8_t clearText[20]={
169  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
170  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
171  0x11, 0x12, 0x13, 0x14
172  };
173  uint8_t signature[256];
174  uint32_t signLen;
175  GWEN_CRYPT_PADDALGO *algo;
176 
177  algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_Iso9796_1A4);
178  signLen=sizeof(signature);
179  rv=GWEN_Crypt_Token_Sign(ct,
180  0x81, /* local sign key */
181  algo,
182  clearText,
183  20,
184  signature,
185  &signLen,
186  NULL,
187  0);
188  if (rv) {
189  DBG_ERROR(0, "Could not sign data (%d)", rv);
190  return 3;
191  }
192 
193  fprintf(stderr, "Signature is:\n");
194  GWEN_Text_DumpString((const char*) signature, signLen, 2);
195 
196  rv=GWEN_Crypt_Token_Verify(ct, 0x81,
197  algo,
198  clearText,
199  20,
200  signature,
201  signLen,
202  0,
203  0);
204  if (rv) {
205  DBG_ERROR(0, "Could not verify data (%d)", rv);
206  return 3;
207  }
208  fprintf(stderr, "Signature is ok.\n");
209 
210  }
211 
212  /* close crypt token */
213  rv=GWEN_Crypt_Token_Close(ct, 0, 0);
214  if (rv) {
215  DBG_ERROR(0, "Could not close token");
216  return 3;
217  }
218 
219  return 0;
220 }
221 
222 
223 
224 int cryptWithNew(GWEN_DB_NODE *dbArgs, int argc, char **argv) {
225  GWEN_DB_NODE *db;
226  const char *ttype;
227  const char *tname;
229  GWEN_PLUGIN *pl;
230  GWEN_CRYPT_TOKEN *ct;
231  unsigned int cid;
232  int rv;
233  const GWEN_ARGS args[]={
234  {
235  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
236  GWEN_ArgsType_Int, /* type */
237  "contextId", /* name */
238  0, /* minnum */
239  1, /* maxnum */
240  "i", /* short option */
241  "id", /* long option */
242  "Context id (0 for any)", /* short description */
243  "Context id (0 for any)" /* long description */
244  },
245  {
246  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
247  GWEN_ArgsType_Char, /* type */
248  "tokenType", /* name */
249  1, /* minnum */
250  1, /* maxnum */
251  "t", /* short option */
252  "ttype", /* long option */
253  "Specify the crypt token type", /* short description */
254  "Specify the crypt token type" /* long description */
255  },
256  {
257  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
258  GWEN_ArgsType_Char, /* type */
259  "tokenName", /* name */
260  0, /* minnum */
261  1, /* maxnum */
262  "n", /* short option */
263  "tname", /* long option */
264  "Specify the crypt token name", /* short description */
265  "Specify the crypt token name" /* long description */
266  },
267  {
269  GWEN_ArgsType_Int, /* type */
270  "help", /* name */
271  0, /* minnum */
272  0, /* maxnum */
273  "h", /* short option */
274  "help", /* long option */
275  "Show this help screen", /* short description */
276  "Show this help screen" /* long description */
277  }
278  };
279 
280  db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local");
281  rv=GWEN_Args_Check(argc, argv, 1,
283  args,
284  db);
285  if (rv==GWEN_ARGS_RESULT_ERROR) {
286  fprintf(stderr, "ERROR: Could not parse arguments\n");
287  return 1;
288  }
289  else if (rv==GWEN_ARGS_RESULT_HELP) {
290  GWEN_BUFFER *ubuf;
291 
292  ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
293  if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
294  fprintf(stderr, "ERROR: Could not create help string\n");
295  return 1;
296  }
297  fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
298  GWEN_Buffer_free(ubuf);
299  return 0;
300  }
301 
302  cid=GWEN_DB_GetIntValue(db, "contextId", 0, 0);
303 
304  ttype=GWEN_DB_GetCharValue(db, "tokenType", 0, 0);
305  assert(ttype);
306 
307  tname=GWEN_DB_GetCharValue(db, "tokenName", 0, 0);
308 
309  /* get crypt token */
311  if (pm==0) {
312  DBG_ERROR(0, "Plugin manager not found");
313  return 3;
314  }
315 
316  pl=GWEN_PluginManager_GetPlugin(pm, ttype);
317  if (pl==0) {
318  DBG_ERROR(0, "Plugin not found");
319  return 3;
320  }
321  DBG_INFO(0, "Plugin found");
322 
324  if (ct==0) {
325  DBG_ERROR(0, "Could not create crypt token");
326  return 3;
327  }
328 
329  if (GWEN_DB_GetIntValue(dbArgs, "forcePin", 0, 0))
331 
332  /* open crypt token for use */
333  rv=GWEN_Crypt_Token_Open(ct, 0, 0);
334  if (rv) {
335  DBG_ERROR(0, "Could not open token");
336  return 3;
337  }
338  else {
339  uint8_t clearText[16]={
340  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
341  0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10
342  };
343  uint8_t encrypted[128];
344  uint32_t elen;
345  uint8_t decrypted[128];
346  uint32_t dlen;
347  GWEN_CRYPT_PADDALGO *algo;
348 
349  algo=GWEN_Crypt_PaddAlgo_new(GWEN_Crypt_PaddAlgoId_LeftZero);
350  elen=sizeof(encrypted);
352  0x86,
353  algo,
354  clearText,
355  16,
356  encrypted,
357  &elen,
358  0);
359  if (rv) {
360  DBG_ERROR(0, "Could not encipher data (%d)", rv);
361  return 3;
362  }
363 
364  fprintf(stderr, "Encrypted data is:\n");
365  GWEN_Text_DumpString((const char*) encrypted, elen, 2);
366 
367  dlen=sizeof(decrypted);
369  0x86,
370  algo,
371  encrypted,
372  elen,
373  decrypted,
374  &dlen,
375  0);
376  if (rv) {
377  DBG_ERROR(0, "Could not decipher data (%d)", rv);
378  return 3;
379  }
380 
381  if (memcmp(clearText, decrypted, dlen)) {
382  DBG_ERROR(0, "Deciphered data does not equal clear text(%d)", rv);
383  return 3;
384  }
385  fprintf(stderr, "Deciphered data is ok.\n");
386 
387  }
388 
389  /* close crypt token */
390  rv=GWEN_Crypt_Token_Close(ct, 0, 0);
391  if (rv) {
392  DBG_ERROR(0, "Could not close token");
393  return 3;
394  }
395 
396  return 0;
397 }
398 
399 
400 
401 
402 
403 
404 
405 
406 int main(int argc, char **argv) {
407  GWEN_DB_NODE *db;
408  const char *cmd;
409  int rv;
410  int err;
411  GWEN_GUI *gui;
412  const char *localedir;
413  GWEN_STRINGLIST *slist;
414  const GWEN_ARGS args[]={
415  {
416  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
417  GWEN_ArgsType_Char, /* type */
418  "cfgfile", /* name */
419  0, /* minnum */
420  1, /* maxnum */
421  "C", /* short option */
422  "cfgfile", /* long option */
423  "Specify the configuration file", /* short description */
424  "Specify the configuration file" /* long description */
425  },
426  {
427  0, /* flags */
428  GWEN_ArgsType_Int, /* type */
429  "forcePin", /* name */
430  0, /* minnum */
431  1, /* maxnum */
432  0, /* short option */
433  "forcepin", /* long option */
434  "force pin entry", /* short description */
435  "force pin entry even if the error counter is not zero"
436  },
437  {
439  GWEN_ArgsType_Int, /* type */
440  "help", /* name */
441  0, /* minnum */
442  0, /* maxnum */
443  "h", /* short option */
444  "help", /* long option */
445  "Show this help screen", /* short description */
446  "Show this help screen" /* long description */
447  }
448  };
449 
450  err=GWEN_Init();
451  if (err) {
452  fprintf(stderr, "Could not initialize Gwenhywfar.\n");
453  return 2;
454  }
455 
456  gui=GWEN_Gui_CGui_new();
457  GWEN_Gui_SetGui(gui);
458 
459  slist =
461 
462  assert(GWEN_StringList_Count(slist) > 0);
463  localedir = GWEN_StringList_FirstString(slist);
464 #ifdef HAVE_I18N
465  setlocale(LC_ALL,"");
466  if (bindtextdomain(PACKAGE, localedir)==0)
467  fprintf(stderr, "Error binding locale\n");
468 #endif
469  GWEN_StringList_free(slist);
470 
471  GWEN_Logger_Open(GCT_LOGDOMAIN, "gct-tool", 0,
474 
475 #ifdef DEBUG_GCT_TOOL
479 #else
483 #endif
484 
485 #ifdef GCT_IS_EXPERIMENTAL
486  fprintf(stderr, "\n");
487  fprintf(stderr, "\n");
488  fprintf(stderr, "=================== WARNING ===================\n");
489  fprintf(stderr, "This tool is still EXPERIMENTAL !!!\n");
490  fprintf(stderr, "Please DON'T USE it with your daily key files !\n");
491  fprintf(stderr, "===============================================\n");
492  fprintf(stderr, "\n");
493  fprintf(stderr, "\n");
494 #endif
495 
496  db=GWEN_DB_Group_new("arguments");
497  rv=GWEN_Args_Check(argc, argv, 1,
500  args,
501  db);
502  if (rv==GWEN_ARGS_RESULT_ERROR) {
503  fprintf(stderr, "ERROR: Could not parse arguments main\n");
504  return -1;
505  }
506  else if (rv==GWEN_ARGS_RESULT_HELP) {
507  GWEN_BUFFER *ubuf;
508 
509  ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
511  I18N("Usage: "));
512  GWEN_Buffer_AppendString(ubuf, argv[0]);
514  I18N(" [GLOBAL OPTIONS] COMMAND "
515  "[LOCAL OPTIONS]\n"));
517  I18N("\nGlobal Options:\n"));
518  if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
519  fprintf(stderr, "ERROR: Could not create help string\n");
520  return 1;
521  }
523  I18N("\nCommands:\n\n"));
525  I18N(" create:\n"
526  " This command creates a crypt token"
527  "\n\n"));
529  I18N(" showuser:\n"
530  " Display user data stored on the "
531  "token\n\n"));
532 
533  fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
534  GWEN_Buffer_free(ubuf);
535  return 0;
536  }
537  if (rv) {
538  argc-=rv-1;
539  argv+=rv-1;
540  }
541 
542  cmd=GWEN_DB_GetCharValue(db, "params", 0, 0);
543  if (!cmd) {
544  fprintf(stderr, "ERROR: Command needed.\n");
545  return 1;
546  }
547 
548  if (strcasecmp(cmd, "sign")==0) {
549  rv=signWithNew(db, argc, argv);
550  }
551  else if (strcasecmp(cmd, "crypt")==0) {
552  rv=cryptWithNew(db, argc, argv);
553  }
554  else {
555  fprintf(stderr, "ERROR: Unknown command \"%s\".\n", cmd);
556  rv=1;
557  }
558 
559  err=GWEN_Fini();
560  if (err) {
561  fprintf(stderr,
562  "WARNING: Could not deinitialize Gwenhywfar.\n");
563  }
564 
565  return rv;
566 }
567 
568 
569 
570 
571 
572 
573 
574 
575 
#define GWEN_CRYPT_TOKEN_MODE_FORCE_PIN_ENTRY
Definition: ct.h:59
struct GWEN_PLUGIN_MANAGER GWEN_PLUGIN_MANAGER
Definition: plugin.h:40
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
#define I18N(m)
Definition: error.c:42
#define GCT_LOGDOMAIN
int main(int argc, char **argv)
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
struct GWEN_PLUGIN GWEN_PLUGIN
Definition: plugin.h:39
void GWEN_Logger_SetLevel(const char *logDomain, GWEN_LOGGER_LEVEL l)
Definition: logger.c:604
void GWEN_Text_DumpString(const char *s, unsigned int l, unsigned int insert)
Definition: text.c:1235
int GWEN_Crypt_Token_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: ct.c:392
GWEN_CRYPT_PADDALGO * GWEN_Crypt_PaddAlgo_new(GWEN_CRYPT_PADDALGOID id)
Definition: paddalgo.c:88
#define NULL
Definition: binreloc.c:290
int GWEN_Crypt_Token_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: ct.c:440
int GWEN_Crypt_Token_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid)
Definition: ct.c:247
int GWEN_Crypt_Token_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: ct.c:416
struct GWEN_CRYPT_PADDALGO GWEN_CRYPT_PADDALGO
Definition: paddalgo.h:21
GWEN_PLUGIN * GWEN_PluginManager_GetPlugin(GWEN_PLUGIN_MANAGER *pm, const char *s)
Definition: plugin.c:501
#define GWEN_LOGDOMAIN
Definition: logger.h:35
GWEN_CRYPT_TOKEN * GWEN_Crypt_Token_Plugin_CreateToken(GWEN_PLUGIN *pl, const char *name)
Definition: ctplugin.c:138
#define GWEN_ARGS_FLAGS_HELP
Definition: src/base/args.h:52
GWEN_BUFFER * GWEN_Buffer_new(char *buffer, uint32_t size, uint32_t used, int take)
Definition: buffer.c:38
GWEN_PLUGIN_MANAGER * GWEN_PluginManager_FindPluginManager(const char *s)
Definition: plugin.c:519
#define GWEN_ARGS_RESULT_HELP
Definition: src/base/args.h:58
#define GWEN_ARGS_RESULT_ERROR
Definition: src/base/args.h:57
void GWEN_StringList_free(GWEN_STRINGLIST *sl)
Definition: stringlist.c:57
#define GWEN_ARGS_MODE_STOP_AT_FREEPARAM
Definition: src/base/args.h:55
int cryptWithNew(GWEN_DB_NODE *dbArgs, int argc, char **argv)
int GWEN_Args_Usage(const GWEN_ARGS *args, GWEN_BUFFER *ubuf, GWEN_ARGS_OUTTYPE ot)
struct GWEN_STRINGLISTSTRUCT GWEN_STRINGLIST
Definition: stringlist.h:54
#define GWEN_ARGS_MODE_ALLOW_FREEPARAM
Definition: src/base/args.h:54
const char * GWEN_DB_GetCharValue(GWEN_DB_NODE *n, const char *path, int idx, const char *defVal)
Definition: db.c:897
GWEN_STRINGLIST * GWEN_PathManager_GetPaths(const char *destLib, const char *pathName)
Definition: pathmanager.c:483
GWEN_DB_NODE * GWEN_DB_GetGroup(GWEN_DB_NODE *n, uint32_t flags, const char *path)
Definition: db.c:1260
void GWEN_Buffer_free(GWEN_BUFFER *bf)
Definition: buffer.c:83
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:41
int GWEN_Fini(void)
Definition: gwenhywfar.c:301
struct GWEN_CRYPT_TOKEN GWEN_CRYPT_TOKEN
Definition: ct.h:19
#define GWEN_ARGS_FLAGS_LAST
Definition: src/base/args.h:51
int GWEN_Crypt_Token_Open(GWEN_CRYPT_TOKEN *ct, int admin, uint32_t gid)
Definition: ct.c:206
int GWEN_Logger_Open(const char *logDomain, const char *ident, const char *file, GWEN_LOGGER_LOGTYPE logtype, GWEN_LOGGER_FACILITY facility)
Definition: logger.c:212
unsigned int GWEN_StringList_Count(const GWEN_STRINGLIST *sl)
Definition: stringlist.c:382
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
const char * GWEN_StringList_FirstString(const GWEN_STRINGLIST *l)
Definition: stringlist.c:525
int GWEN_Args_Check(int argc, char **argv, int startAt, uint32_t mode, const GWEN_ARGS *args, GWEN_DB_NODE *db)
Definition: src/base/args.c:45
#define GWEN_PM_LOCALEDIR
Definition: gwenhywfar.h:49
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:164
#define GWEN_PM_LIBNAME
Definition: gwenhywfar.h:42
int GWEN_Crypt_Token_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: ct.c:462
struct GWEN_GUI GWEN_GUI
Definition: gui.h:176
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1048
GWEN_DB_NODE * GWEN_DB_Group_new(const char *name)
Definition: db.c:131
void GWEN_Gui_SetGui(GWEN_GUI *gui)
Definition: gui.c:152
int GWEN_Init(void)
Definition: gwenhywfar.c:92
GWEN_GUI * GWEN_Gui_CGui_new(void)
Definition: cgui.c:74
#define GWEN_ARGS_FLAGS_HAS_ARGUMENT
Definition: src/base/args.h:50
int signWithNew(GWEN_DB_NODE *dbArgs, int argc, char **argv)
int GWEN_Buffer_AppendString(GWEN_BUFFER *bf, const char *buffer)
Definition: buffer.c:1014
#define GWEN_DB_FLAGS_DEFAULT
Definition: db.h:168
void GWEN_Crypt_Token_AddModes(GWEN_CRYPT_TOKEN *ct, uint32_t f)
Definition: ct.c:188