Line data Source code
1 : /*
2 : This file is part of TALER
3 : Copyright (C) 2014-2023 Taler Systems SA
4 :
5 : TALER is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU General Public License as
7 : published by the Free Software Foundation; either version 3, or
8 : (at your option) any later version.
9 :
10 : TALER 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
13 : GNU General Public License for more details.
14 :
15 : You should have received a copy of the GNU General Public
16 : License along with TALER; see the file COPYING. If not, see
17 : <http://www.gnu.org/licenses/>
18 : */
19 : /**
20 : * @file testing/testing_api_cmd_revoke_sign_key.c
21 : * @brief Implement the revoke test command.
22 : * @author Christian Grothoff
23 : */
24 : #include "taler/taler_json_lib.h"
25 : #include <gnunet/gnunet_curl_lib.h>
26 : #include "taler/taler_testing_lib.h"
27 :
28 :
29 : /**
30 : * State for a "revoke" CMD.
31 : */
32 : struct RevokeState
33 : {
34 : /**
35 : * Expected HTTP status code.
36 : */
37 : unsigned int expected_response_code;
38 :
39 : /**
40 : * Command that offers a signination to revoke.
41 : */
42 : const char *coin_reference;
43 :
44 : /**
45 : * The interpreter state.
46 : */
47 : struct TALER_TESTING_Interpreter *is;
48 :
49 : /**
50 : * Handle for the operation.
51 : */
52 : struct TALER_EXCHANGE_PostManagementSignkeysRevokeHandle *kh;
53 :
54 : /**
55 : * Should we use a bogus signature?
56 : */
57 : bool bad_sig;
58 :
59 : };
60 :
61 :
62 : /**
63 : * Function called with information about the post revocation operation result.
64 : *
65 : * @param cls closure with a `struct RevokeState *`
66 : * @param rsr response data
67 : */
68 : static void
69 0 : success_cb (
70 : void *cls,
71 : const struct TALER_EXCHANGE_PostManagementSignkeysRevokeResponse *rsr)
72 : {
73 0 : struct RevokeState *rs = cls;
74 0 : const struct TALER_EXCHANGE_HttpResponse *hr = &rsr->hr;
75 :
76 0 : rs->kh = NULL;
77 0 : if (rs->expected_response_code != hr->http_status)
78 : {
79 0 : TALER_TESTING_unexpected_status (rs->is,
80 : hr->http_status,
81 : rs->expected_response_code);
82 0 : return;
83 : }
84 0 : TALER_TESTING_interpreter_next (rs->is);
85 : }
86 :
87 :
88 : /**
89 : * Cleanup the state.
90 : *
91 : * @param cls closure, must be a `struct RevokeState`.
92 : * @param cmd the command which is being cleaned up.
93 : */
94 : static void
95 0 : revoke_cleanup (void *cls,
96 : const struct TALER_TESTING_Command *cmd)
97 : {
98 0 : struct RevokeState *rs = cls;
99 :
100 0 : if (NULL != rs->kh)
101 : {
102 0 : TALER_EXCHANGE_post_management_signkeys_revoke_cancel (rs->kh);
103 0 : rs->kh = NULL;
104 : }
105 0 : GNUNET_free (rs);
106 0 : }
107 :
108 :
109 : /**
110 : * Offer internal data from a "revoke" CMD to other CMDs.
111 : *
112 : * @param cls closure
113 : * @param[out] ret result (could be anything)
114 : * @param trait name of the trait
115 : * @param index index number of the object to offer.
116 : * @return #GNUNET_OK on success
117 : */
118 : static int
119 0 : revoke_traits (void *cls,
120 : const void **ret,
121 : const char *trait,
122 : unsigned int index)
123 : {
124 0 : struct RevokeState *rs = cls;
125 : struct TALER_TESTING_Trait traits[] = {
126 0 : TALER_TESTING_trait_end ()
127 : };
128 :
129 : (void) rs;
130 0 : return TALER_TESTING_get_trait (traits,
131 : ret,
132 : trait,
133 : index);
134 : }
135 :
136 :
137 : /**
138 : * Run the "revoke" command for a signing key.
139 : *
140 : * @param cls closure.
141 : * @param cmd the command to execute.
142 : * @param is the interpreter state.
143 : */
144 : static void
145 0 : revoke_run (void *cls,
146 : const struct TALER_TESTING_Command *cmd,
147 : struct TALER_TESTING_Interpreter *is)
148 : {
149 0 : struct RevokeState *rs = cls;
150 : const struct TALER_TESTING_Command *coin_cmd;
151 : const struct TALER_ExchangePublicKeyP *exchange_pub;
152 : struct TALER_MasterSignatureP master_sig;
153 : const char *exchange_url;
154 :
155 : {
156 : const struct TALER_TESTING_Command *exchange_cmd;
157 :
158 0 : exchange_cmd = TALER_TESTING_interpreter_get_command (is,
159 : "exchange");
160 0 : if (NULL == exchange_cmd)
161 : {
162 0 : GNUNET_break (0);
163 0 : TALER_TESTING_interpreter_fail (is);
164 0 : return;
165 : }
166 0 : GNUNET_assert (GNUNET_OK ==
167 : TALER_TESTING_get_trait_exchange_url (exchange_cmd,
168 : &exchange_url));
169 : }
170 0 : rs->is = is;
171 : /* Get sign pub from trait */
172 0 : coin_cmd = TALER_TESTING_interpreter_lookup_command (is,
173 : rs->coin_reference);
174 :
175 0 : if (NULL == coin_cmd)
176 : {
177 0 : GNUNET_break (0);
178 0 : TALER_TESTING_interpreter_fail (is);
179 0 : return;
180 : }
181 0 : GNUNET_assert (GNUNET_OK ==
182 : TALER_TESTING_get_trait_exchange_pub (coin_cmd,
183 : 0,
184 : &exchange_pub));
185 0 : GNUNET_log (GNUNET_ERROR_TYPE_INFO,
186 : "Trying to revoke sign '%s..'\n",
187 : TALER_B2S (exchange_pub));
188 0 : if (rs->bad_sig)
189 : {
190 0 : memset (&master_sig,
191 : 42,
192 : sizeof (master_sig));
193 : }
194 : else
195 : {
196 : const struct TALER_TESTING_Command *exchange_cmd;
197 : const struct TALER_MasterPrivateKeyP *master_priv;
198 :
199 0 : exchange_cmd = TALER_TESTING_interpreter_get_command (is,
200 : "exchange");
201 0 : if (NULL == exchange_cmd)
202 : {
203 0 : GNUNET_break (0);
204 0 : TALER_TESTING_interpreter_fail (is);
205 0 : return;
206 : }
207 0 : GNUNET_assert (GNUNET_OK ==
208 : TALER_TESTING_get_trait_master_priv (exchange_cmd,
209 : &master_priv));
210 0 : TALER_exchange_offline_signkey_revoke_sign (exchange_pub,
211 : master_priv,
212 : &master_sig);
213 : }
214 0 : rs->kh = TALER_EXCHANGE_post_management_signkeys_revoke_create (
215 : TALER_TESTING_interpreter_get_context (is),
216 : exchange_url,
217 : exchange_pub,
218 : &master_sig);
219 0 : if (NULL == rs->kh)
220 : {
221 0 : GNUNET_break (0);
222 0 : TALER_TESTING_interpreter_fail (is);
223 0 : return;
224 : }
225 0 : TALER_EXCHANGE_post_management_signkeys_revoke_start (rs->kh, &success_cb, rs)
226 : ;
227 : }
228 :
229 :
230 : struct TALER_TESTING_Command
231 0 : TALER_TESTING_cmd_revoke_sign_key (
232 : const char *label,
233 : unsigned int expected_response_code,
234 : bool bad_sig,
235 : const char *sign_ref)
236 : {
237 : struct RevokeState *rs;
238 :
239 0 : rs = GNUNET_new (struct RevokeState);
240 0 : rs->expected_response_code = expected_response_code;
241 0 : rs->coin_reference = sign_ref;
242 0 : rs->bad_sig = bad_sig;
243 : {
244 0 : struct TALER_TESTING_Command cmd = {
245 : .cls = rs,
246 : .label = label,
247 : .run = &revoke_run,
248 : .cleanup = &revoke_cleanup,
249 : .traits = &revoke_traits
250 : };
251 :
252 0 : return cmd;
253 : }
254 : }
|