2 This file is part of GNUnet.
3 Copyright (C) 2012-2013 GNUnet e.V.
5 GNUnet is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published
7 by the Free Software Foundation; either version 3, or (at your
8 option) any later version.
10 GNUnet is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with GNUnet; see the file COPYING. If not, write to the
17 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 Boston, MA 02110-1301, USA.
21 * @file gnunet-credential.c
22 * @brief command line tool to access command line Credential service
23 * @author Adnan Husain
26 #include <gnunet_util_lib.h>
27 #include <gnunet_identity_service.h>
28 #include <gnunet_credential_service.h>
31 * Configuration we are using.
33 static const struct GNUNET_CONFIGURATION_Handle *cfg;
36 * Handle to Credential service.
38 static struct GNUNET_CREDENTIAL_Handle *credential;
41 * Desired timeout for the lookup (default is no timeout).
43 static struct GNUNET_TIME_Relative timeout;
46 * Credential to lookup. (-u option)
48 static char *lookup_credential;
51 * Handle to verify request
53 static struct GNUNET_CREDENTIAL_Request *verify_request;
56 * Lookup an ego with the identity service.
58 static struct GNUNET_IDENTITY_EgoLookup *el;
61 * Handle for identity service.
63 static struct GNUNET_IDENTITY_Handle *identity;
66 * Active operation on identity service.
68 static struct GNUNET_IDENTITY_Operation *id_op;
71 * Task scheduled to handle timeout.
73 static struct GNUNET_SCHEDULER_Task *tt;
76 * Subject pubkey string
78 static char *subject_key;
81 * Subject pubkey string
83 static char *issuer_key;
88 * Identity of the zone to use for the lookup (-z option)
90 static char *zone_ego_name;
94 * Task run on shutdown. Cleans up everything.
99 do_shutdown (void *cls)
103 GNUNET_IDENTITY_ego_lookup_cancel (el);
108 GNUNET_IDENTITY_cancel (id_op);
111 if (NULL != verify_request)
113 GNUNET_CREDENTIAL_verify_cancel (verify_request);
114 verify_request = NULL;
116 if (NULL != identity)
118 GNUNET_IDENTITY_disconnect (identity);
121 if (NULL != credential)
123 GNUNET_CREDENTIAL_disconnect (credential);
128 GNUNET_SCHEDULER_cancel (tt);
135 * Task run on timeout. Triggers shutdown.
140 do_timeout (void *cls)
143 GNUNET_SCHEDULER_shutdown ();
148 * Function called with the result of a Credential lookup.
150 * @param cls the 'const char *' name that was resolved
151 * @param cd_count number of records returned
152 * @param cd array of @a cd_count records with the results
155 handle_verify_result (void *cls,
156 struct GNUNET_CRYPTO_EcdsaPublicKey *issuer,
161 verify_request = NULL;
162 if (GNUNET_NO == status)
163 printf ("Verify failed.\n");
165 printf ("Successful.\n");
168 GNUNET_SCHEDULER_shutdown ();
175 * Perform the actual resolution, with the subject pkey and
176 * the issuer public key
178 * @param pkey public key to use for the zone, can be NULL
179 * @param shorten_key private key used for shortening, can be NULL
182 lookup_credentials (struct GNUNET_IDENTITY_Ego *ego)
185 struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey;
186 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey;
188 if (NULL != subject_key && NULL != issuer_key && NULL != lookup_credential)
191 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_key,
192 strlen (subject_key),
196 _("Subject public key `%s' is not well-formed\n"),
198 GNUNET_SCHEDULER_shutdown ();
203 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
208 _("Authority public key `%s' is not well-formed\n"),
210 GNUNET_SCHEDULER_shutdown ();
214 verify_request = GNUNET_CREDENTIAL_verify(credential,
216 "test", //TODO argument
219 &handle_verify_result,
226 _("Please specify name to lookup, subject key and issuer key!\n"));
227 GNUNET_SCHEDULER_shutdown ();
234 * Method called to with the ego we are to use for the lookup,
235 * when the ego is the one for the default master zone.
237 * @param cls closure (NULL, unused)
238 * @param ego ego handle, NULL if not found
239 * @param ctx context for application to store data for this ego
240 * (during the lifetime of this process, initially NULL)
241 * @param name name assigned by the user for this ego,
242 * NULL if the user just deleted the ego and it
243 * must thus no longer be used
246 identity_master_cb (void *cls,
247 struct GNUNET_IDENTITY_Ego *ego,
256 _("Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-gns-import.sh?\n"));
257 GNUNET_SCHEDULER_shutdown ();
261 lookup_credentials(ego);
268 * Main function that will be run.
271 * @param args remaining command-line arguments
272 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
273 * @param c configuration
279 const struct GNUNET_CONFIGURATION_Handle *c)
283 credential = GNUNET_CREDENTIAL_connect (cfg);
284 identity = GNUNET_IDENTITY_connect (cfg, NULL, NULL);
289 if (NULL == credential)
292 _("Failed to connect to CREDENTIAL\n"));
295 if (NULL == identity)
298 _("Failed to connect to IDENTITY\n"));
301 tt = GNUNET_SCHEDULER_add_delayed (timeout,
303 GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
307 GNUNET_break (NULL == id_op);
308 id_op = GNUNET_IDENTITY_get (identity,
309 "gns-master",//# TODO: Create credential-master
312 GNUNET_assert (NULL != id_op);
321 * The main function for gnunet-gns.
323 * @param argc number of arguments from the command line
324 * @param argv command line arguments
325 * @return 0 ok, 1 on error
328 main (int argc, char *const *argv)
330 static const struct GNUNET_GETOPT_CommandLineOption options[] = {
331 {'u', "lookup", "CREDENTIAL",
332 gettext_noop ("Lookup a record for the given credential"), 1,
333 &GNUNET_GETOPT_set_string, &lookup_credential},
334 /** { 'T', "timeout", "DELAY",
335 gettext_noop ("Specify timeout for the lookup"), 1,
336 &GNUNET_GETOPT_set_relative_time, &timeout },
337 {'t', "type", "TYPE",
338 gettext_noop ("Specify the type of the record to lookup"), 1,
339 &GNUNET_GETOPT_set_string, &lookup_type},**/
340 {'z', "zone", "NAME",
341 gettext_noop ("Specify the name of the ego of the zone to lookup the record in"), 1,
342 &GNUNET_GETOPT_set_string, &zone_ego_name},
343 {'s', "subject", "PKEY",
344 gettext_noop ("Specify the public key of the subject to lookup the credential for"), 1,
345 &GNUNET_GETOPT_set_string, &subject_key},
346 {'i', "issuer", "PKEY",
347 gettext_noop ("Specify the public key of the authority to verify the credential against"), 1,
348 &GNUNET_GETOPT_set_string, &issuer_key},
349 GNUNET_GETOPT_OPTION_END
353 timeout = GNUNET_TIME_UNIT_FOREVER_REL;
354 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
357 GNUNET_log_setup ("gnunet-credential", "WARNING", NULL);
360 GNUNET_PROGRAM_run (argc, argv, "gnunet-credential",
361 _("GNUnet credential resolver tool"),
363 &run, NULL)) ? 0 : 1;
364 GNUNET_free ((void*) argv);
368 /* end of gnunet-credential.c */