diff options
author | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2020-04-21 11:52:12 +0200 |
---|---|---|
committer | Schanzenbach, Martin <mschanzenbach@posteo.de> | 2020-04-21 11:52:12 +0200 |
commit | 19b772329cb8968e5e96e33d5238f172f5553dc4 (patch) | |
tree | efc2631a96f2e903fb4469d894cfa10d89dc49bd /src/revocation | |
parent | d4fd97e693e462f3bd16425f4e803fe5a99b9d62 (diff) | |
download | gnunet-19b772329cb8968e5e96e33d5238f172f5553dc4.tar.gz gnunet-19b772329cb8968e5e96e33d5238f172f5553dc4.zip |
new pass API
Diffstat (limited to 'src/revocation')
-rw-r--r-- | src/revocation/gnunet-revocation.c | 92 | ||||
-rw-r--r-- | src/revocation/gnunet-service-revocation.c | 9 | ||||
-rw-r--r-- | src/revocation/revocation_api.c | 84 | ||||
-rw-r--r-- | src/revocation/test_revocation.c | 17 |
4 files changed, 85 insertions, 117 deletions
diff --git a/src/revocation/gnunet-revocation.c b/src/revocation/gnunet-revocation.c index d290d34c7..2230114ae 100644 --- a/src/revocation/gnunet-revocation.c +++ b/src/revocation/gnunet-revocation.c | |||
@@ -93,6 +93,10 @@ static struct GNUNET_TIME_Relative epoch_length; | |||
93 | */ | 93 | */ |
94 | static struct GNUNET_SCHEDULER_Task *pow_task; | 94 | static struct GNUNET_SCHEDULER_Task *pow_task; |
95 | 95 | ||
96 | /** | ||
97 | * Proof-of-work object | ||
98 | */ | ||
99 | static struct GNUNET_REVOCATION_Pow proof_of_work; | ||
96 | 100 | ||
97 | /** | 101 | /** |
98 | * Function run if the user aborts with CTRL-C. | 102 | * Function run if the user aborts with CTRL-C. |
@@ -198,40 +202,13 @@ print_revocation_result (void *cls, int is_valid) | |||
198 | 202 | ||
199 | 203 | ||
200 | /** | 204 | /** |
201 | * Data needed to perform a revocation. | ||
202 | */ | ||
203 | struct RevocationData | ||
204 | { | ||
205 | /** | ||
206 | * Public key. | ||
207 | */ | ||
208 | struct GNUNET_CRYPTO_EcdsaPublicKey key; | ||
209 | |||
210 | /** | ||
211 | * Revocation signature data. | ||
212 | */ | ||
213 | struct GNUNET_CRYPTO_EcdsaSignature sig; | ||
214 | |||
215 | /** | ||
216 | * Time of revocation | ||
217 | */ | ||
218 | struct GNUNET_TIME_AbsoluteNBO ts; | ||
219 | |||
220 | /** | ||
221 | * Proof of work (in NBO). | ||
222 | */ | ||
223 | uint64_t pow GNUNET_PACKED; | ||
224 | }; | ||
225 | |||
226 | |||
227 | /** | ||
228 | * Perform the revocation. | 205 | * Perform the revocation. |
229 | */ | 206 | */ |
230 | static void | 207 | static void |
231 | perform_revocation (const struct GNUNET_REVOCATION_Pow *pow) | 208 | perform_revocation () |
232 | { | 209 | { |
233 | h = GNUNET_REVOCATION_revoke (cfg, | 210 | h = GNUNET_REVOCATION_revoke (cfg, |
234 | pow, | 211 | &proof_of_work, |
235 | &print_revocation_result, | 212 | &print_revocation_result, |
236 | NULL); | 213 | NULL); |
237 | } | 214 | } |
@@ -244,12 +221,12 @@ perform_revocation (const struct GNUNET_REVOCATION_Pow *pow) | |||
244 | * @param rd data to sync | 221 | * @param rd data to sync |
245 | */ | 222 | */ |
246 | static void | 223 | static void |
247 | sync_pow (const struct GNUNET_REVOCATION_Pow *pow) | 224 | sync_pow () |
248 | { | 225 | { |
249 | if ((NULL != filename) && | 226 | if ((NULL != filename) && |
250 | (sizeof(struct GNUNET_REVOCATION_Pow) != | 227 | (sizeof(struct GNUNET_REVOCATION_Pow) != |
251 | GNUNET_DISK_fn_write (filename, | 228 | GNUNET_DISK_fn_write (filename, |
252 | pow, | 229 | &proof_of_work, |
253 | sizeof(struct GNUNET_REVOCATION_Pow), | 230 | sizeof(struct GNUNET_REVOCATION_Pow), |
254 | GNUNET_DISK_PERM_USER_READ | 231 | GNUNET_DISK_PERM_USER_READ |
255 | | GNUNET_DISK_PERM_USER_WRITE))) | 232 | | GNUNET_DISK_PERM_USER_WRITE))) |
@@ -267,7 +244,7 @@ calculate_pow_shutdown (void *cls) | |||
267 | { | 244 | { |
268 | struct GNUNET_REVOCATION_PowCalculationHandle *ph = cls; | 245 | struct GNUNET_REVOCATION_PowCalculationHandle *ph = cls; |
269 | fprintf (stderr, "%s", _ ("Cancelling calculation.\n")); | 246 | fprintf (stderr, "%s", _ ("Cancelling calculation.\n")); |
270 | sync_pow (GNUNET_REVOCATION_pow_get (ph)); | 247 | sync_pow (); |
271 | if (NULL != pow_task) | 248 | if (NULL != pow_task) |
272 | { | 249 | { |
273 | GNUNET_SCHEDULER_cancel (pow_task); | 250 | GNUNET_SCHEDULER_cancel (pow_task); |
@@ -290,22 +267,21 @@ calculate_pow (void *cls) | |||
290 | /* store temporary results */ | 267 | /* store temporary results */ |
291 | pow_task = NULL; | 268 | pow_task = NULL; |
292 | if (0 == (pow_passes % 128)) | 269 | if (0 == (pow_passes % 128)) |
293 | sync_pow (GNUNET_REVOCATION_pow_get(ph)); | 270 | sync_pow (); |
294 | /* actually do POW calculation */ | 271 | /* actually do POW calculation */ |
295 | if (GNUNET_OK == GNUNET_REVOCATION_pow_round (ph)) | 272 | if (GNUNET_OK == GNUNET_REVOCATION_pow_round (ph)) |
296 | { | 273 | { |
297 | const struct GNUNET_REVOCATION_Pow *pow = GNUNET_REVOCATION_pow_get (ph); | ||
298 | if ((NULL != filename) && | 274 | if ((NULL != filename) && |
299 | (sizeof(struct GNUNET_REVOCATION_Pow) != | 275 | (sizeof(struct GNUNET_REVOCATION_Pow) != |
300 | GNUNET_DISK_fn_write (filename, | 276 | GNUNET_DISK_fn_write (filename, |
301 | pow, | 277 | &proof_of_work, |
302 | sizeof(struct GNUNET_REVOCATION_Pow), | 278 | sizeof(struct GNUNET_REVOCATION_Pow), |
303 | GNUNET_DISK_PERM_USER_READ | 279 | GNUNET_DISK_PERM_USER_READ |
304 | | GNUNET_DISK_PERM_USER_WRITE))) | 280 | | GNUNET_DISK_PERM_USER_WRITE))) |
305 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "write", filename); | 281 | GNUNET_log_strerror_file (GNUNET_ERROR_TYPE_ERROR, "write", filename); |
306 | if (perform) | 282 | if (perform) |
307 | { | 283 | { |
308 | perform_revocation (pow); | 284 | perform_revocation (); |
309 | } | 285 | } |
310 | else | 286 | else |
311 | { | 287 | { |
@@ -343,7 +319,6 @@ calculate_pow (void *cls) | |||
343 | static void | 319 | static void |
344 | ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | 320 | ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego) |
345 | { | 321 | { |
346 | struct GNUNET_REVOCATION_Pow *pow; | ||
347 | struct GNUNET_CRYPTO_EcdsaPublicKey key; | 322 | struct GNUNET_CRYPTO_EcdsaPublicKey key; |
348 | const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey; | 323 | const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey; |
349 | struct GNUNET_REVOCATION_PowCalculationHandle *ph = NULL; | 324 | struct GNUNET_REVOCATION_PowCalculationHandle *ph = NULL; |
@@ -357,32 +332,29 @@ ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | |||
357 | } | 332 | } |
358 | GNUNET_IDENTITY_ego_get_public_key (ego, &key); | 333 | GNUNET_IDENTITY_ego_get_public_key (ego, &key); |
359 | privkey = GNUNET_IDENTITY_ego_get_private_key (ego); | 334 | privkey = GNUNET_IDENTITY_ego_get_private_key (ego); |
360 | pow = GNUNET_new (struct GNUNET_REVOCATION_Pow); | 335 | memset(&proof_of_work, 0, sizeof (proof_of_work)); |
361 | if ((NULL != filename) && (GNUNET_YES == GNUNET_DISK_file_test (filename)) && | 336 | if ((NULL != filename) && (GNUNET_YES == GNUNET_DISK_file_test (filename)) && |
362 | (sizeof(struct GNUNET_REVOCATION_Pow) == | 337 | (sizeof(proof_of_work) == |
363 | GNUNET_DISK_fn_read (filename, pow, sizeof(struct | 338 | GNUNET_DISK_fn_read (filename, &proof_of_work, sizeof(proof_of_work)))) |
364 | GNUNET_REVOCATION_Pow)))) | ||
365 | { | 339 | { |
366 | if (0 != GNUNET_memcmp (&pow->key, &key)) | 340 | if (0 != GNUNET_memcmp (&proof_of_work.key, &key)) |
367 | { | 341 | { |
368 | fprintf (stderr, | 342 | fprintf (stderr, |
369 | _ ("Error: revocation certificate in `%s' is not for `%s'\n"), | 343 | _ ("Error: revocation certificate in `%s' is not for `%s'\n"), |
370 | filename, | 344 | filename, |
371 | revoke_ego); | 345 | revoke_ego); |
372 | GNUNET_free (pow); | ||
373 | return; | 346 | return; |
374 | } | 347 | } |
375 | if (GNUNET_YES == | 348 | if (GNUNET_YES == |
376 | GNUNET_REVOCATION_check_pow (pow, | 349 | GNUNET_REVOCATION_check_pow (&proof_of_work, |
377 | (unsigned int) matching_bits, | 350 | (unsigned int) matching_bits, |
378 | epoch_length)) | 351 | epoch_length)) |
379 | { | 352 | { |
380 | fprintf (stderr, "%s", _ ("Revocation certificate ready\n")); | 353 | fprintf (stderr, "%s", _ ("Revocation certificate ready\n")); |
381 | if (perform) | 354 | if (perform) |
382 | perform_revocation (pow); | 355 | perform_revocation (); |
383 | else | 356 | else |
384 | GNUNET_SCHEDULER_shutdown (); | 357 | GNUNET_SCHEDULER_shutdown (); |
385 | GNUNET_free (pow); | ||
386 | return; | 358 | return; |
387 | } | 359 | } |
388 | /** | 360 | /** |
@@ -391,18 +363,21 @@ ego_callback (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | |||
391 | fprintf (stderr, | 363 | fprintf (stderr, |
392 | "%s", | 364 | "%s", |
393 | _("Continuing calculation where left off...\n")); | 365 | _("Continuing calculation where left off...\n")); |
394 | ph = GNUNET_REVOCATION_pow_init2 (pow, | 366 | ph = GNUNET_REVOCATION_pow_start (&proof_of_work, |
395 | 1, /* Epochs */ | 367 | 1, /* Epochs */ |
396 | matching_bits); | 368 | matching_bits); |
397 | GNUNET_free (pow); | ||
398 | } | 369 | } |
399 | fprintf (stderr, | 370 | fprintf (stderr, |
400 | "%s", | 371 | "%s", |
401 | _ ("Revocation certificate not ready, calculating proof of work\n")); | 372 | _ ("Revocation certificate not ready, calculating proof of work\n")); |
402 | if (NULL == ph) | 373 | if (NULL == ph) |
403 | ph = GNUNET_REVOCATION_pow_init (privkey, | 374 | { |
404 | 1, /* Epochs */ | 375 | GNUNET_REVOCATION_pow_init (privkey, |
405 | matching_bits); | 376 | &proof_of_work); |
377 | ph = GNUNET_REVOCATION_pow_start (&proof_of_work, | ||
378 | 1, /* Epochs */ | ||
379 | matching_bits); | ||
380 | } | ||
406 | pow_task = GNUNET_SCHEDULER_add_now (&calculate_pow, ph); | 381 | pow_task = GNUNET_SCHEDULER_add_now (&calculate_pow, ph); |
407 | GNUNET_SCHEDULER_add_shutdown (&calculate_pow_shutdown, ph); | 382 | GNUNET_SCHEDULER_add_shutdown (&calculate_pow_shutdown, ph); |
408 | } | 383 | } |
@@ -423,7 +398,6 @@ run (void *cls, | |||
423 | const struct GNUNET_CONFIGURATION_Handle *c) | 398 | const struct GNUNET_CONFIGURATION_Handle *c) |
424 | { | 399 | { |
425 | struct GNUNET_CRYPTO_EcdsaPublicKey pk; | 400 | struct GNUNET_CRYPTO_EcdsaPublicKey pk; |
426 | struct GNUNET_REVOCATION_Pow pow; | ||
427 | 401 | ||
428 | cfg = c; | 402 | cfg = c; |
429 | if (NULL != test_ego) | 403 | if (NULL != test_ego) |
@@ -483,7 +457,9 @@ run (void *cls, | |||
483 | } | 457 | } |
484 | if ((NULL != filename) && (perform)) | 458 | if ((NULL != filename) && (perform)) |
485 | { | 459 | { |
486 | if (sizeof(pow) != GNUNET_DISK_fn_read (filename, &pow, sizeof(pow))) | 460 | if (sizeof(proof_of_work) != GNUNET_DISK_fn_read (filename, |
461 | &proof_of_work, | ||
462 | sizeof(proof_of_work))) | ||
487 | { | 463 | { |
488 | fprintf (stderr, | 464 | fprintf (stderr, |
489 | _ ("Failed to read revocation certificate from `%s'\n"), | 465 | _ ("Failed to read revocation certificate from `%s'\n"), |
@@ -492,20 +468,20 @@ run (void *cls, | |||
492 | } | 468 | } |
493 | GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); | 469 | GNUNET_SCHEDULER_add_shutdown (&do_shutdown, NULL); |
494 | if (GNUNET_YES != | 470 | if (GNUNET_YES != |
495 | GNUNET_REVOCATION_check_pow (&pow, | 471 | GNUNET_REVOCATION_check_pow (&proof_of_work, |
496 | (unsigned int) matching_bits, | 472 | (unsigned int) matching_bits, |
497 | epoch_length)) | 473 | epoch_length)) |
498 | { | 474 | { |
499 | struct GNUNET_REVOCATION_PowCalculationHandle *ph; | 475 | struct GNUNET_REVOCATION_PowCalculationHandle *ph; |
500 | ph = GNUNET_REVOCATION_pow_init2 (&pow, | 476 | ph = GNUNET_REVOCATION_pow_start (&proof_of_work, |
501 | 1, /* Epochs */ | 477 | 1, /* Epochs */ |
502 | matching_bits); | 478 | matching_bits); |
503 | 479 | ||
504 | pow_task = GNUNET_SCHEDULER_add_now (&calculate_pow, ph); | 480 | pow_task = GNUNET_SCHEDULER_add_now (&calculate_pow, ph); |
505 | GNUNET_SCHEDULER_add_shutdown (&calculate_pow_shutdown, ph); | 481 | GNUNET_SCHEDULER_add_shutdown (&calculate_pow_shutdown, ph); |
506 | return; | 482 | return; |
507 | } | 483 | } |
508 | perform_revocation (&pow); | 484 | perform_revocation (); |
509 | return; | 485 | return; |
510 | } | 486 | } |
511 | fprintf (stderr, "%s", _ ("No action specified. Nothing to do.\n")); | 487 | fprintf (stderr, "%s", _ ("No action specified. Nothing to do.\n")); |
diff --git a/src/revocation/gnunet-service-revocation.c b/src/revocation/gnunet-service-revocation.c index bd35b1055..a9fbd57a7 100644 --- a/src/revocation/gnunet-service-revocation.c +++ b/src/revocation/gnunet-service-revocation.c | |||
@@ -181,15 +181,6 @@ verify_revoke_message (const struct RevokeMessage *rm) | |||
181 | GNUNET_break_op (0); | 181 | GNUNET_break_op (0); |
182 | return GNUNET_NO; | 182 | return GNUNET_NO; |
183 | } | 183 | } |
184 | if (GNUNET_OK != | ||
185 | GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_REVOCATION, | ||
186 | &rm->proof_of_work.purpose, | ||
187 | &rm->proof_of_work.signature, | ||
188 | &rm->proof_of_work.key)) | ||
189 | { | ||
190 | GNUNET_break_op (0); | ||
191 | return GNUNET_NO; | ||
192 | } | ||
193 | return GNUNET_YES; | 184 | return GNUNET_YES; |
194 | } | 185 | } |
195 | 186 | ||
diff --git a/src/revocation/revocation_api.c b/src/revocation/revocation_api.c index 291c58dd8..7bf7799de 100644 --- a/src/revocation/revocation_api.c +++ b/src/revocation/revocation_api.c | |||
@@ -83,7 +83,7 @@ struct GNUNET_REVOCATION_PowCalculationHandle | |||
83 | /** | 83 | /** |
84 | * The final PoW result data structure. | 84 | * The final PoW result data structure. |
85 | */ | 85 | */ |
86 | struct GNUNET_REVOCATION_Pow pow; | 86 | struct GNUNET_REVOCATION_Pow *pow; |
87 | 87 | ||
88 | /** | 88 | /** |
89 | * The current nonce to try | 89 | * The current nonce to try |
@@ -421,23 +421,22 @@ calculate_score (const struct GNUNET_REVOCATION_PowCalculationHandle *ph) | |||
421 | 421 | ||
422 | 422 | ||
423 | /** | 423 | /** |
424 | * Check if the given proof-of-work value | 424 | * Check if the given proof-of-work is valid. |
425 | * would be acceptable for revoking the given key. | ||
426 | * | 425 | * |
427 | * @param key key to check for | 426 | * @param pow proof of work |
428 | * @param ts revocation timestamp | ||
429 | * @param pow proof of work value | ||
430 | * @param matching_bits how many bits must match (configuration) | 427 | * @param matching_bits how many bits must match (configuration) |
431 | * @return GNUNET_YES if the @a pow is acceptable, GNUNET_NO if not | 428 | * @param epoch_duration length of single epoch in configuration |
429 | * @return #GNUNET_YES if the @a pow is acceptable, #GNUNET_NO if not | ||
432 | */ | 430 | */ |
433 | int | 431 | enum GNUNET_GenericReturnValue |
434 | GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow, | 432 | GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow, |
435 | unsigned int difficulty, | 433 | unsigned int difficulty, |
436 | struct GNUNET_TIME_Relative epoch_length) | 434 | struct GNUNET_TIME_Relative epoch_length) |
437 | { | 435 | { |
438 | char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) | 436 | char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) |
439 | + sizeof (uint64_t) | 437 | + sizeof (struct GNUNET_TIME_AbsoluteNBO) |
440 | + sizeof (uint64_t)] GNUNET_ALIGN; | 438 | + sizeof (uint64_t)] GNUNET_ALIGN; |
439 | struct GNUNET_REVOCATION_SignaturePurpose spurp; | ||
441 | struct GNUNET_HashCode result; | 440 | struct GNUNET_HashCode result; |
442 | struct GNUNET_TIME_Absolute ts; | 441 | struct GNUNET_TIME_Absolute ts; |
443 | struct GNUNET_TIME_Absolute exp; | 442 | struct GNUNET_TIME_Absolute exp; |
@@ -451,9 +450,15 @@ GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow, | |||
451 | /** | 450 | /** |
452 | * Check if signature valid | 451 | * Check if signature valid |
453 | */ | 452 | */ |
453 | spurp.key = pow->key; | ||
454 | spurp.timestamp = pow->timestamp; | ||
455 | spurp.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION); | ||
456 | spurp.purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) | ||
457 | + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) | ||
458 | + sizeof (struct GNUNET_TIME_AbsoluteNBO)); | ||
454 | if (GNUNET_OK != | 459 | if (GNUNET_OK != |
455 | GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_REVOCATION, | 460 | GNUNET_CRYPTO_ecdsa_verify_ (GNUNET_SIGNATURE_PURPOSE_REVOCATION, |
456 | &pow->purpose, | 461 | &spurp.purpose, |
457 | &pow->signature, | 462 | &pow->signature, |
458 | &pow->key)) | 463 | &pow->key)) |
459 | { | 464 | { |
@@ -527,20 +532,17 @@ GNUNET_REVOCATION_check_pow (const struct GNUNET_REVOCATION_Pow *pow, | |||
527 | 532 | ||
528 | 533 | ||
529 | /** | 534 | /** |
530 | * Initializes a fresh PoW computation | 535 | * Initializes a fresh PoW computation. |
531 | * | 536 | * |
532 | * @param key the key to calculate the PoW for. | 537 | * @param key the key to calculate the PoW for. |
533 | * @param epochs the number of epochs for which the PoW must be valid. | 538 | * @param[out] pow starting point for PoW calculation (not yet valid) |
534 | * @param difficulty the base difficulty of the PoW | ||
535 | * @return a handle for use in PoW rounds | ||
536 | */ | 539 | */ |
537 | struct GNUNET_REVOCATION_PowCalculationHandle* | 540 | void |
538 | GNUNET_REVOCATION_pow_init (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key, | 541 | GNUNET_REVOCATION_pow_init (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key, |
539 | int epochs, | 542 | struct GNUNET_REVOCATION_Pow *pow) |
540 | unsigned int difficulty) | ||
541 | { | 543 | { |
542 | struct GNUNET_REVOCATION_PowCalculationHandle *pc; | ||
543 | struct GNUNET_TIME_Absolute ts = GNUNET_TIME_absolute_get (); | 544 | struct GNUNET_TIME_Absolute ts = GNUNET_TIME_absolute_get (); |
545 | struct GNUNET_REVOCATION_SignaturePurpose rp; | ||
544 | 546 | ||
545 | /** | 547 | /** |
546 | * Predate the validity period to prevent rejections due to | 548 | * Predate the validity period to prevent rejections due to |
@@ -549,42 +551,39 @@ GNUNET_REVOCATION_pow_init (const struct GNUNET_CRYPTO_EcdsaPrivateKey *key, | |||
549 | ts = GNUNET_TIME_absolute_subtract (ts, | 551 | ts = GNUNET_TIME_absolute_subtract (ts, |
550 | GNUNET_TIME_UNIT_WEEKS); | 552 | GNUNET_TIME_UNIT_WEEKS); |
551 | 553 | ||
552 | pc = GNUNET_new (struct GNUNET_REVOCATION_PowCalculationHandle); | 554 | pow->timestamp = GNUNET_TIME_absolute_hton (ts); |
553 | pc->pow.timestamp = GNUNET_TIME_absolute_hton (ts); | 555 | rp.timestamp = pow->timestamp; |
554 | pc->pow.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION); | 556 | rp.purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_REVOCATION); |
555 | pc->pow.purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) | 557 | rp.purpose.size = htonl (sizeof(struct GNUNET_CRYPTO_EccSignaturePurpose) |
556 | + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)); | 558 | + sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) |
557 | GNUNET_CRYPTO_ecdsa_key_get_public (key, &pc->pow.key); | 559 | + sizeof (struct GNUNET_TIME_AbsoluteNBO)); |
560 | GNUNET_CRYPTO_ecdsa_key_get_public (key, &pow->key); | ||
561 | rp.key = pow->key; | ||
558 | GNUNET_assert (GNUNET_OK == | 562 | GNUNET_assert (GNUNET_OK == |
559 | GNUNET_CRYPTO_ecdsa_sign_ (key, | 563 | GNUNET_CRYPTO_ecdsa_sign_ (key, |
560 | &pc->pow.purpose, | 564 | &rp.purpose, |
561 | &pc->pow.signature)); | 565 | &pow->signature)); |
562 | pc->current_pow = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, | ||
563 | UINT64_MAX); | ||
564 | pc->difficulty = difficulty; | ||
565 | pc->epochs = epochs; | ||
566 | return pc; | ||
567 | } | 566 | } |
568 | 567 | ||
569 | 568 | ||
570 | /** | 569 | /** |
571 | * Initializes PoW computation based on an existing PoW. | 570 | * Starts a proof-of-work calculation given the pow object as well as |
571 | * target epochs and difficulty. | ||
572 | * | 572 | * |
573 | * @param pow the PoW to continue the calculations from. | 573 | * @param pow the PoW to based calculations on. |
574 | * @param epochs the number of epochs for which the PoW must be valid. | 574 | * @param epochs the number of epochs for which the PoW must be valid. |
575 | * @param difficulty the base difficulty of the PoW | 575 | * @param difficulty the base difficulty of the PoW. |
576 | * @return a handle for use in PoW rounds | 576 | * @return a handle for use in PoW rounds |
577 | */ | 577 | */ |
578 | struct GNUNET_REVOCATION_PowCalculationHandle* | 578 | struct GNUNET_REVOCATION_PowCalculationHandle* |
579 | GNUNET_REVOCATION_pow_init2 (const struct GNUNET_REVOCATION_Pow *pow, | 579 | GNUNET_REVOCATION_pow_start (struct GNUNET_REVOCATION_Pow *pow, |
580 | int epochs, | 580 | int epochs, |
581 | unsigned int difficulty) | 581 | unsigned int difficulty) |
582 | { | 582 | { |
583 | struct GNUNET_REVOCATION_PowCalculationHandle *pc; | 583 | struct GNUNET_REVOCATION_PowCalculationHandle *pc; |
584 | 584 | ||
585 | pc = GNUNET_new (struct GNUNET_REVOCATION_PowCalculationHandle); | 585 | pc = GNUNET_new (struct GNUNET_REVOCATION_PowCalculationHandle); |
586 | pc->pow.key = pow->key; | 586 | pc->pow = pow; |
587 | pc->pow.timestamp = pow->timestamp; | ||
588 | pc->current_pow = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, | 587 | pc->current_pow = GNUNET_CRYPTO_random_u64 (GNUNET_CRYPTO_QUALITY_WEAK, |
589 | UINT64_MAX); | 588 | UINT64_MAX); |
590 | pc->difficulty = difficulty; | 589 | pc->difficulty = difficulty; |
@@ -593,7 +592,6 @@ GNUNET_REVOCATION_pow_init2 (const struct GNUNET_REVOCATION_Pow *pow, | |||
593 | } | 592 | } |
594 | 593 | ||
595 | 594 | ||
596 | |||
597 | /** | 595 | /** |
598 | * Calculate a key revocation valid for broadcasting for a number | 596 | * Calculate a key revocation valid for broadcasting for a number |
599 | * of epochs. | 597 | * of epochs. |
@@ -604,7 +602,7 @@ GNUNET_REVOCATION_pow_init2 (const struct GNUNET_REVOCATION_Pow *pow, | |||
604 | * @param difficulty current base difficulty to achieve | 602 | * @param difficulty current base difficulty to achieve |
605 | * @return #GNUNET_YES if the @a pow is acceptable, #GNUNET_NO if not | 603 | * @return #GNUNET_YES if the @a pow is acceptable, #GNUNET_NO if not |
606 | */ | 604 | */ |
607 | int | 605 | enum GNUNET_GenericReturnValue |
608 | GNUNET_REVOCATION_pow_round (struct GNUNET_REVOCATION_PowCalculationHandle *pc) | 606 | GNUNET_REVOCATION_pow_round (struct GNUNET_REVOCATION_PowCalculationHandle *pc) |
609 | { | 607 | { |
610 | char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) | 608 | char buf[sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey) |
@@ -624,10 +622,10 @@ GNUNET_REVOCATION_pow_round (struct GNUNET_REVOCATION_PowCalculationHandle *pc) | |||
624 | 622 | ||
625 | GNUNET_memcpy (buf, &pc->current_pow, sizeof(uint64_t)); | 623 | GNUNET_memcpy (buf, &pc->current_pow, sizeof(uint64_t)); |
626 | GNUNET_memcpy (&buf[sizeof(uint64_t)], | 624 | GNUNET_memcpy (&buf[sizeof(uint64_t)], |
627 | &pc->pow.timestamp, | 625 | &pc->pow->timestamp, |
628 | sizeof (uint64_t)); | 626 | sizeof (uint64_t)); |
629 | GNUNET_memcpy (&buf[sizeof(uint64_t) * 2], | 627 | GNUNET_memcpy (&buf[sizeof(uint64_t) * 2], |
630 | &pc->pow.key, | 628 | &pc->pow->key, |
631 | sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)); | 629 | sizeof(struct GNUNET_CRYPTO_EcdsaPublicKey)); |
632 | GNUNET_CRYPTO_pow_hash ("gnunet-revocation-proof-of-work", | 630 | GNUNET_CRYPTO_pow_hash ("gnunet-revocation-proof-of-work", |
633 | buf, | 631 | buf, |
@@ -640,7 +638,7 @@ GNUNET_REVOCATION_pow_round (struct GNUNET_REVOCATION_PowCalculationHandle *pc) | |||
640 | { | 638 | { |
641 | pc->best[i].bits = zeros; | 639 | pc->best[i].bits = zeros; |
642 | pc->best[i].pow = pc->current_pow; | 640 | pc->best[i].pow = pc->current_pow; |
643 | pc->pow.pow[i] = GNUNET_htonll (pc->current_pow); | 641 | pc->pow->pow[i] = GNUNET_htonll (pc->current_pow); |
644 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, | 642 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, |
645 | "New best score %u with %" PRIu64 " (#%u)\n", | 643 | "New best score %u with %" PRIu64 " (#%u)\n", |
646 | zeros, pc->current_pow, i); | 644 | zeros, pc->current_pow, i); |
@@ -662,7 +660,7 @@ const struct GNUNET_REVOCATION_Pow* | |||
662 | GNUNET_REVOCATION_pow_get (const struct | 660 | GNUNET_REVOCATION_pow_get (const struct |
663 | GNUNET_REVOCATION_PowCalculationHandle *pc) | 661 | GNUNET_REVOCATION_PowCalculationHandle *pc) |
664 | { | 662 | { |
665 | return &pc->pow; | 663 | return pc->pow; |
666 | } | 664 | } |
667 | 665 | ||
668 | 666 | ||
diff --git a/src/revocation/test_revocation.c b/src/revocation/test_revocation.c index 07f5e6e61..84f90fe54 100644 --- a/src/revocation/test_revocation.c +++ b/src/revocation/test_revocation.c | |||
@@ -131,7 +131,7 @@ check_revocation (void *cls) | |||
131 | 131 | ||
132 | 132 | ||
133 | static void | 133 | static void |
134 | revocation_cb (void *cls, int is_valid) | 134 | revocation_cb (void *cls, enum GNUNET_GenericReturnValue is_valid) |
135 | { | 135 | { |
136 | testpeers[1].revok_handle = NULL; | 136 | testpeers[1].revok_handle = NULL; |
137 | if (GNUNET_NO == is_valid) | 137 | if (GNUNET_NO == is_valid) |
@@ -147,6 +147,8 @@ ego_cb (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | |||
147 | { | 147 | { |
148 | static int completed = 0; | 148 | static int completed = 0; |
149 | const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey; | 149 | const struct GNUNET_CRYPTO_EcdsaPrivateKey *privkey; |
150 | struct GNUNET_REVOCATION_Pow proof_of_work; | ||
151 | |||
150 | 152 | ||
151 | if ((NULL != ego) && (cls == &testpeers[0])) | 153 | if ((NULL != ego) && (cls == &testpeers[0])) |
152 | { | 154 | { |
@@ -162,9 +164,12 @@ ego_cb (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | |||
162 | GNUNET_IDENTITY_ego_get_public_key (ego, &testpeers[1].pubkey); | 164 | GNUNET_IDENTITY_ego_get_public_key (ego, &testpeers[1].pubkey); |
163 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Calculating proof of work...\n"); | 165 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Calculating proof of work...\n"); |
164 | privkey = GNUNET_IDENTITY_ego_get_private_key (ego); | 166 | privkey = GNUNET_IDENTITY_ego_get_private_key (ego); |
165 | testpeers[1].pow = GNUNET_REVOCATION_pow_init (privkey, | 167 | memset (&proof_of_work, 0, sizeof (proof_of_work)); |
166 | 1, | 168 | GNUNET_REVOCATION_pow_init (privkey, |
167 | 5); | 169 | &proof_of_work); |
170 | testpeers[1].pow = GNUNET_REVOCATION_pow_start (&proof_of_work, | ||
171 | 1, | ||
172 | 5); | ||
168 | int res = | 173 | int res = |
169 | GNUNET_REVOCATION_pow_round (testpeers[1].pow); | 174 | GNUNET_REVOCATION_pow_round (testpeers[1].pow); |
170 | while (GNUNET_OK != res) | 175 | while (GNUNET_OK != res) |
@@ -177,11 +182,9 @@ ego_cb (void *cls, const struct GNUNET_IDENTITY_Ego *ego) | |||
177 | } | 182 | } |
178 | if (2 == completed) | 183 | if (2 == completed) |
179 | { | 184 | { |
180 | const struct GNUNET_REVOCATION_Pow *pow; | ||
181 | pow = GNUNET_REVOCATION_pow_get (testpeers[1].pow); | ||
182 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Egos retrieved\n"); | 185 | GNUNET_log (GNUNET_ERROR_TYPE_INFO, "Egos retrieved\n"); |
183 | testpeers[1].revok_handle = GNUNET_REVOCATION_revoke (testpeers[1].cfg, | 186 | testpeers[1].revok_handle = GNUNET_REVOCATION_revoke (testpeers[1].cfg, |
184 | pow, | 187 | &proof_of_work, |
185 | &revocation_cb, | 188 | &revocation_cb, |
186 | NULL); | 189 | NULL); |
187 | GNUNET_REVOCATION_pow_cleanup (testpeers[1].pow); | 190 | GNUNET_REVOCATION_pow_cleanup (testpeers[1].pow); |