gwenhywfar  4.99.8beta
genkey.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Tue May 03 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 #include "globals.h"
15 
16 #include <gwenhywfar/debug.h>
17 #include <gwenhywfar/ct.h>
18 #include <gwenhywfar/ctplugin.h>
19 #include <gwenhywfar/text.h>
20 
21 
22 
23 
24 
25 
26 int genKey(GWEN_DB_NODE *dbArgs, int argc, char **argv) {
27  GWEN_DB_NODE *db;
28  const char *ttype;
29  const char *tname;
30  GWEN_CRYPT_TOKEN *ct;
31  unsigned int keyId;
32  unsigned int keySize;
34  int rv;
35  const char *s;
36  const GWEN_ARGS args[]={
37  {
38  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
39  GWEN_ArgsType_Int, /* type */
40  "keyId", /* name */
41  1, /* minnum */
42  1, /* maxnum */
43  "k", /* short option */
44  "key", /* long option */
45  "Key id", /* short description */
46  "Key id" /* long description */
47  },
48  {
49  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
50  GWEN_ArgsType_Char, /* type */
51  "tokenType", /* name */
52  1, /* minnum */
53  1, /* maxnum */
54  "t", /* short option */
55  "ttype", /* long option */
56  "Specify the crypt token type", /* short description */
57  "Specify the crypt token type" /* long description */
58  },
59  {
60  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
61  GWEN_ArgsType_Char, /* type */
62  "tokenName", /* name */
63  0, /* minnum */
64  1, /* maxnum */
65  "n", /* short option */
66  "tname", /* long option */
67  "Specify the crypt token name", /* short description */
68  "Specify the crypt token name" /* long description */
69  },
70  {
71  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
72  GWEN_ArgsType_Char, /* type */
73  "algo", /* name */
74  0, /* minnum */
75  1, /* maxnum */
76  "a", /* short option */
77  "algo", /* long option */
78  "Specify the algorithm", /* short description */
79  "Specify the algorithm" /* long description */
80  },
81  {
82  GWEN_ARGS_FLAGS_HAS_ARGUMENT, /* flags */
83  GWEN_ArgsType_Int, /* type */
84  "keysize", /* name */
85  0, /* minnum */
86  1, /* maxnum */
87  "s", /* short option */
88  "keysize", /* long option */
89  "Key size in bytes", /* short description */
90  "Key size in bytes" /* long description */
91  },
92  {
93  0, /* flags */
94  GWEN_ArgsType_Int, /* type */
95  "exp65537", /* name */
96  0, /* minnum */
97  1, /* maxnum */
98  "e", /* short option */
99  "exp65537", /* long option */
100  "Use default exponent of 65537", /* short description */
101  "Use default exponent of 65537" /* long description */
102  },
103  {
105  GWEN_ArgsType_Int, /* type */
106  "help", /* name */
107  0, /* minnum */
108  0, /* maxnum */
109  "h", /* short option */
110  "help", /* long option */
111  "Show this help screen", /* short description */
112  "Show this help screen" /* long description */
113  }
114  };
115 
116  db=GWEN_DB_GetGroup(dbArgs, GWEN_DB_FLAGS_DEFAULT, "local");
117  rv=GWEN_Args_Check(argc, argv, 1,
119  args,
120  db);
121  if (rv==GWEN_ARGS_RESULT_ERROR) {
122  fprintf(stderr, "ERROR: Could not parse arguments\n");
123  return 1;
124  }
125  else if (rv==GWEN_ARGS_RESULT_HELP) {
126  GWEN_BUFFER *ubuf;
127 
128  ubuf=GWEN_Buffer_new(0, 1024, 0, 1);
129  if (GWEN_Args_Usage(args, ubuf, GWEN_ArgsOutType_Txt)) {
130  fprintf(stderr, "ERROR: Could not create help string\n");
131  return 1;
132  }
133  fprintf(stderr, "%s\n", GWEN_Buffer_GetStart(ubuf));
134  GWEN_Buffer_free(ubuf);
135  return 0;
136  }
137 
138  keyId=GWEN_DB_GetIntValue(db, "keyId", 0, 0);
139  if (keyId==0) {
140  DBG_ERROR(0, "Key Id must not be zero");
141  return 1;
142  }
143 
144  s=GWEN_DB_GetCharValue(db, "algo", 0, "rsa");
145  if (!s) {
146  DBG_ERROR(0, "Algo id missing");
147  return 1;
148  }
150  if (algoId==GWEN_Crypt_CryptAlgoId_Unknown) {
151  DBG_ERROR(0, "Bad algo id [%s]", s);
152  return 1;
153  }
154 
155  keySize=GWEN_DB_GetIntValue(db, "keySize", 0, 96);
156  if (keySize==0) {
157  DBG_ERROR(0, "Invalid key size %d", keySize);
158  return 1;
159  }
160 
161  ttype=GWEN_DB_GetCharValue(db, "tokenType", 0, 0);
162  assert(ttype);
163 
164  tname=GWEN_DB_GetCharValue(db, "tokenName", 0, 0);
165 
166  /* get crypt token */
167  ct=getCryptToken(ttype, tname);
168  if (ct==0)
169  return 3;
170 
171  if (GWEN_DB_GetIntValue(dbArgs, "forcePin", 0, 0))
173 
174  if (GWEN_DB_GetIntValue(db, "exp65537", 0, 0))
176 
177  /* open crypt token for use */
178  rv=GWEN_Crypt_Token_Open(ct, 1, 0);
179  if (rv) {
180  DBG_ERROR(0, "Could not open token");
181  return 3;
182  }
183  else {
184  GWEN_CRYPT_CRYPTALGO *algo;
185 
187  GWEN_Crypt_CryptAlgo_SetChunkSize(algo, keySize);
188 
189  /* generate key */
190  rv=GWEN_Crypt_Token_GenerateKey(ct, keyId, algo, 0);
191  if (rv) {
193  "Error generating key (%d)", rv);
195  return 3;
196  }
197  }
198 
199  /* close crypt token */
200  rv=GWEN_Crypt_Token_Close(ct, 0, 0);
201  if (rv) {
202  DBG_ERROR(0, "Could not close token");
203  return 3;
204  }
205 
206  fprintf(stderr, "Key %d (%s, %d bytes) successfully generated.\n",
207  keyId, GWEN_Crypt_CryptAlgoId_toString(algoId), keySize);
208 
209  return 0;
210 }
211 
212 
213 
#define GWEN_CRYPT_TOKEN_MODE_FORCE_PIN_ENTRY
Definition: ct.h:59
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
Definition: buffer.c:223
struct GWEN_DB_NODE GWEN_DB_NODE
Definition: db.h:228
GWEN_CRYPT_CRYPTALGOID GWEN_Crypt_CryptAlgoId_fromString(const char *s)
Definition: cryptalgo.c:28
#define GWEN_CRYPT_TOKEN_MODE_EXP_65537
Definition: ct.h:62
GWEN_CRYPT_TOKEN * getCryptToken(const char *ttype, const char *tname)
Definition: gcttool/main.c:69
void GWEN_Crypt_CryptAlgo_free(GWEN_CRYPT_CRYPTALGO *a)
Definition: cryptalgo.c:225
int GWEN_Crypt_Token_Close(GWEN_CRYPT_TOKEN *ct, int abandon, uint32_t gid)
Definition: ct.c:247
void GWEN_Crypt_CryptAlgo_SetChunkSize(GWEN_CRYPT_CRYPTALGO *a, int s)
Definition: cryptalgo.c:311
#define GWEN_LOGDOMAIN
Definition: logger.h:35
#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
#define GWEN_ARGS_RESULT_HELP
Definition: src/base/args.h:58
#define GWEN_ARGS_RESULT_ERROR
Definition: src/base/args.h:57
int GWEN_Crypt_Token_GenerateKey(GWEN_CRYPT_TOKEN *ct, uint32_t keyId, const GWEN_CRYPT_CRYPTALGO *a, uint32_t gid)
Definition: ct.c:485
GWEN_CRYPT_CRYPTALGOID
Definition: cryptalgo.h:50
const char * GWEN_Crypt_CryptAlgoId_toString(GWEN_CRYPT_CRYPTALGOID a)
Definition: cryptalgo.c:52
int GWEN_Args_Usage(const GWEN_ARGS *args, GWEN_BUFFER *ubuf, GWEN_ARGS_OUTTYPE ot)
#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_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
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
struct GWEN_CRYPT_CRYPTALGO GWEN_CRYPT_CRYPTALGO
Definition: cryptalgo.h:20
int genKey(GWEN_DB_NODE *dbArgs, int argc, char **argv)
Definition: genkey.c:26
#define DBG_ERROR(dbg_logger, format, args...)
Definition: debug.h:97
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
int GWEN_DB_GetIntValue(GWEN_DB_NODE *n, const char *path, int idx, int defVal)
Definition: db.c:1048
GWEN_CRYPT_CRYPTALGO * GWEN_Crypt_CryptAlgo_new(GWEN_CRYPT_CRYPTALGOID id, GWEN_CRYPT_CRYPTMODE m)
Definition: cryptalgo.c:109
#define GWEN_ARGS_FLAGS_HAS_ARGUMENT
Definition: src/base/args.h:50
#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