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_VerifyRequest *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 static int credential_flags;
93 * Identity of the zone to use for the lookup (-z option)
95 static char *zone_ego_name;
99 * Task run on shutdown. Cleans up everything.
104 do_shutdown (void *cls)
108 GNUNET_IDENTITY_ego_lookup_cancel (el);
113 GNUNET_IDENTITY_cancel (id_op);
116 if (NULL != verify_request)
118 GNUNET_CREDENTIAL_verify_cancel (verify_request);
119 verify_request = NULL;
121 if (NULL != identity)
123 GNUNET_IDENTITY_disconnect (identity);
126 if (NULL != credential)
128 GNUNET_CREDENTIAL_disconnect (credential);
133 GNUNET_SCHEDULER_cancel (tt);
140 * Task run on timeout. Triggers shutdown.
145 do_timeout (void *cls)
148 GNUNET_SCHEDULER_shutdown ();
153 * Function called with the result of a Credential lookup.
155 * @param cls the 'const char *' name that was resolved
156 * @param cd_count number of records returned
157 * @param cd array of @a cd_count records with the results
160 handle_verify_result (void *cls,
161 struct GNUNET_IDENTITY_Ego *issuer,
163 const struct GNUNET_CREDENTIAL_RecordData *data)
167 verify_request = NULL;
169 printf ("No results.\n");
175 GNUNET_SCHEDULER_shutdown ();
182 * Perform the actual resolution, with the subject pkey and
183 * the issuer public key
185 * @param pkey public key to use for the zone, can be NULL
186 * @param shorten_key private key used for shortening, can be NULL
189 lookup_credentials (struct GNUNET_IDENTITY_Ego *ego)
192 struct GNUNET_CRYPTO_EcdsaPublicKey subject_pkey;
193 struct GNUNET_CRYPTO_EcdsaPublicKey issuer_pkey;
195 if (NULL != subject_key && NULL != issuer_key && NULL != lookup_credential)
198 GNUNET_CRYPTO_ecdsa_public_key_from_string (subject_key,
199 strlen (subject_key),
203 _("Subject public key `%s' is not well-formed\n"),
205 GNUNET_SCHEDULER_shutdown ();
210 GNUNET_CRYPTO_ecdsa_public_key_from_string (issuer_key,
215 _("Authority public key `%s' is not well-formed\n"),
217 GNUNET_SCHEDULER_shutdown ();
221 verify_request = GNUNET_CREDENTIAL_verify(credential,
227 &handle_verify_result,
234 _("Please specify name to lookup, subject key and issuer key!\n"));
235 GNUNET_SCHEDULER_shutdown ();
242 * Method called to with the ego we are to use for the lookup,
243 * when the ego is the one for the default master zone.
245 * @param cls closure (NULL, unused)
246 * @param ego ego handle, NULL if not found
247 * @param ctx context for application to store data for this ego
248 * (during the lifetime of this process, initially NULL)
249 * @param name name assigned by the user for this ego,
250 * NULL if the user just deleted the ego and it
251 * must thus no longer be used
254 identity_master_cb (void *cls,
255 struct GNUNET_IDENTITY_Ego *ego,
264 _("Ego for `gns-master' not found, cannot perform lookup. Did you run gnunet-gns-import.sh?\n"));
265 GNUNET_SCHEDULER_shutdown ();
269 lookup_credentials(ego);
276 * Main function that will be run.
279 * @param args remaining command-line arguments
280 * @param cfgfile name of the configuration file used (for saving, can be NULL!)
281 * @param c configuration
287 const struct GNUNET_CONFIGURATION_Handle *c)
291 credential = GNUNET_CREDENTIAL_connect (cfg);
292 identity = GNUNET_IDENTITY_connect (cfg, NULL, NULL);
297 if (NULL == credential)
300 _("Failed to connect to CREDENTIAL\n"));
303 if (NULL == identity)
306 _("Failed to connect to IDENTITY\n"));
309 tt = GNUNET_SCHEDULER_add_delayed (timeout,
311 GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL);
315 GNUNET_break (NULL == id_op);
316 id_op = GNUNET_IDENTITY_get (identity,
317 "gns-master",//# TODO: Create credential-master
320 GNUNET_assert (NULL != id_op);
329 * The main function for gnunet-gns.
331 * @param argc number of arguments from the command line
332 * @param argv command line arguments
333 * @return 0 ok, 1 on error
336 main (int argc, char *const *argv)
338 static const struct GNUNET_GETOPT_CommandLineOption options[] = {
339 {'u', "lookup", "CREDENTIAL",
340 gettext_noop ("Lookup a record for the given credential"), 1,
341 &GNUNET_GETOPT_set_string, &lookup_credential},
342 /** { 'T', "timeout", "DELAY",
343 gettext_noop ("Specify timeout for the lookup"), 1,
344 &GNUNET_GETOPT_set_relative_time, &timeout },
345 {'t', "type", "TYPE",
346 gettext_noop ("Specify the type of the record to lookup"), 1,
347 &GNUNET_GETOPT_set_string, &lookup_type},**/
348 {'z', "zone", "NAME",
349 gettext_noop ("Specify the name of the ego of the zone to lookup the record in"), 1,
350 &GNUNET_GETOPT_set_string, &zone_ego_name},
351 {'s', "subject", "PKEY",
352 gettext_noop ("Specify the public key of the subject to lookup the credential for"), 1,
353 &GNUNET_GETOPT_set_string, &subject_key},
354 {'i', "issuer", "PKEY",
355 gettext_noop ("Specify the public key of the authority to verify the credential against"), 1,
356 &GNUNET_GETOPT_set_string, &issuer_key},
357 GNUNET_GETOPT_OPTION_END
361 timeout = GNUNET_TIME_UNIT_FOREVER_REL;
362 if (GNUNET_OK != GNUNET_STRINGS_get_utf8_args (argc, argv, &argc, &argv))
365 GNUNET_log_setup ("gnunet-credential", "WARNING", NULL);
368 GNUNET_PROGRAM_run (argc, argv, "gnunet-credential",
369 _("GNUnet credential resolver tool"),
371 &run, NULL)) ? 0 : 1;
372 GNUNET_free ((void*) argv);
376 /* end of gnunet-credential.c */