-doxygen
[oweals/gnunet.git] / src / identity-provider / gnunet-identity-token.c
1 #include "platform.h"
2 #include "gnunet_util_lib.h"
3 #include <jansson.h>
4 #include "gnunet_signatures.h"
5
6 /**
7  * The token
8  */
9 static char* token;
10
11 /**
12  * Weather to print the token
13  */
14 static int print_token;
15
16 static void
17 run (void *cls,
18      char *const *args,
19      const char *cfgfile,
20      const struct GNUNET_CONFIGURATION_Handle *c)
21 {
22   char* payload;
23   char* header;
24   //Get token parts
25   char* header_b64 = strtok (token, ".");
26   char* payload_b64 = strtok(NULL, ".");
27   char* signature_b32 = strtok(NULL, ".");
28   const char* keystring;
29   char* data;
30   json_t *payload_json;
31   json_t *keystring_json;
32   json_error_t error;
33   struct GNUNET_CRYPTO_EcdsaPublicKey key;
34   struct GNUNET_CRYPTO_EccSignaturePurpose *purpose;
35   struct GNUNET_CRYPTO_EcdsaSignature sig;
36   
37   GNUNET_assert (NULL != header_b64);
38   GNUNET_assert (NULL != payload_b64);
39   GNUNET_assert (NULL != signature_b32);
40   
41   //Decode payload
42   GNUNET_STRINGS_base64_decode (payload_b64,
43                                 strlen (payload_b64),
44                                 &payload);
45   //Decode header
46   GNUNET_STRINGS_base64_decode (header_b64,
47                                 strlen (header_b64),
48                                 &header);
49   if (NULL == token)
50     return;
51   
52
53   GNUNET_asprintf(&data,
54                   "%s,%s",
55                   header_b64,
56                   payload_b64);
57   char *val = GNUNET_malloc (sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
58   purpose = (struct GNUNET_CRYPTO_EccSignaturePurpose*)val;
59   purpose->size = htonl(sizeof (struct GNUNET_CRYPTO_EccSignaturePurpose) + strlen (data));
60   purpose->purpose = htonl(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN);
61   GNUNET_memcpy (&purpose[1], data, strlen(data));
62   GNUNET_free (data);
63   GNUNET_free (header_b64);
64   GNUNET_free (header_b64);
65
66   if (print_token)
67     printf ("Token:\nHeader:\t\t%s\nPayload:\t%s\n", header, payload);
68   GNUNET_free (header);
69   GNUNET_free (payload);
70   
71   payload_json = json_loads (payload, 0, &error);
72   if ((NULL == payload_json) || !json_is_object (payload_json))
73   {
74     GNUNET_free (val);
75     return;
76   }
77   keystring_json =  json_object_get (payload_json, "iss");
78   if (!json_is_string (keystring_json))
79   {
80     GNUNET_free (val);
81     return;
82   }
83   keystring = json_string_value (keystring_json);
84   if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_public_key_from_string (keystring,
85                                                                strlen (keystring),
86                                                                &key))
87   {
88     GNUNET_free (val);
89     return;
90   }
91   GNUNET_STRINGS_string_to_data (signature_b32,
92                                 strlen (signature_b32),
93                                 &sig,
94                                 sizeof (struct GNUNET_CRYPTO_EcdsaSignature));
95   
96   if (print_token) 
97     printf ("Signature:\t%s\n", keystring);
98   
99   if (GNUNET_OK != GNUNET_CRYPTO_ecdsa_verify(GNUNET_SIGNATURE_PURPOSE_GNUID_TOKEN,
100                                               purpose,
101                                               &sig,
102                                               &key))
103     printf("Signature not OK!\n");
104   else
105     printf("Signature OK!\n");
106   GNUNET_free (val);
107   return;
108 }
109 int
110 main(int argc, char *const argv[])
111 {
112   static const struct GNUNET_GETOPT_CommandLineOption options[] = {
113     {'t', "token", NULL,
114       gettext_noop ("GNUid token"), 1,
115       &GNUNET_GETOPT_set_string, &token},
116     {'p', "print", NULL,
117       gettext_noop ("Print token contents"), 0,
118       &GNUNET_GETOPT_set_one, &print_token},
119
120     GNUNET_GETOPT_OPTION_END
121   };
122   return GNUNET_PROGRAM_run (argc, argv, "ct",
123                              "ct", options,
124                              &run, NULL);
125 }
126
127