GNUnet  0.16.x
revocation_api.c
Go to the documentation of this file.
1 /*
2  This file is part of GNUnet
3  Copyright (C) 2013, 2016 GNUnet e.V.
4 
5  GNUnet is free software: you can redistribute it and/or modify it
6  under the terms of the GNU Affero General Public License as published
7  by the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
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  Affero General Public License for more details.
14 
15  You should have received a copy of the GNU Affero General Public License
16  along with this program. If not, see <http://www.gnu.org/licenses/>.
17 
18  SPDX-License-Identifier: AGPL3.0-or-later
19  */
25 #include "platform.h"
27 #include "gnunet_signatures.h"
28 #include "gnunet_protocols.h"
29 #include "revocation.h"
30 #include <inttypes.h>
31 
36 {
41 
46 
50  void *func_cls;
51 };
52 
53 
58 struct BestPow
59 {
63  uint64_t pow;
64 
68  unsigned int bits;
69 };
70 
71 
77 {
81  struct BestPow best[POW_COUNT];
82 
87 
91  uint64_t current_pow;
92 
97  unsigned int epochs;
98 
102  unsigned int difficulty;
103 
104 };
105 
106 static struct GNUNET_CRYPTO_PowSalt salt = { "GnsRevocationPow" };
107 
117 static void
119  enum GNUNET_MQ_Error error)
120 {
121  struct GNUNET_REVOCATION_Query *q = cls;
122 
124  "Revocation query MQ error\n");
125  q->func (q->func_cls,
126  GNUNET_SYSERR);
128 }
129 
130 
137 static void
139  const struct QueryResponseMessage *qrm)
140 {
141  struct GNUNET_REVOCATION_Query *q = cls;
142 
144  "Revocation query result: %d\n",
145  (uint32_t) ntohl (qrm->is_valid));
146  q->func (q->func_cls,
147  ntohl (qrm->is_valid));
149 }
150 
151 
163  const struct GNUNET_IDENTITY_PublicKey *key,
165  void *func_cls)
166 {
167  struct GNUNET_REVOCATION_Query *q
170  GNUNET_MQ_hd_fixed_size (revocation_query_response,
172  struct QueryResponseMessage,
173  q),
175  };
176  struct QueryMessage *qm;
177  struct GNUNET_MQ_Envelope *env;
178 
180  "revocation",
181  handlers,
183  q);
184  if (NULL == q->mq)
185  {
186  GNUNET_free (q);
187  return NULL;
188  }
189  q->func = func;
190  q->func_cls = func_cls;
191  env = GNUNET_MQ_msg (qm,
193  qm->reserved = htonl (0);
194  qm->key = *key;
195  GNUNET_MQ_send (q->mq,
196  env);
197  return q;
198 }
199 
200 
206 void
208 {
209  if (NULL != q->mq)
210  {
212  q->mq = NULL;
213  }
214  GNUNET_free (q);
215 }
216 
217 
222 {
227 
232 
236  void *func_cls;
237 };
238 
239 
249 static void
251  enum GNUNET_MQ_Error error)
252 {
253  struct GNUNET_REVOCATION_Handle *h = cls;
254 
256  "Revocation MQ error\n");
257  h->func (h->func_cls,
258  GNUNET_SYSERR);
260 }
261 
262 
269 static void
271  const struct RevocationResponseMessage *rrm)
272 {
273  struct GNUNET_REVOCATION_Handle *h = cls;
274 
276  "Revocation transmission result: %d\n",
277  (uint32_t) ntohl (rrm->is_valid));
278  h->func (h->func_cls,
279  ntohl (rrm->is_valid));
281 }
282 
283 
302  const struct GNUNET_REVOCATION_PowP *pow,
304  void *func_cls)
305 {
309  GNUNET_MQ_hd_fixed_size (revocation_response,
312  h),
314  };
315  unsigned long long matching_bits;
317  struct RevokeMessage *rm;
318  struct GNUNET_MQ_Envelope *env;
319 
320  if ((GNUNET_OK !=
322  "REVOCATION",
323  "WORKBITS",
324  &matching_bits)))
325  {
326  GNUNET_break (0);
327  GNUNET_free (h);
328  return NULL;
329  }
330  if ((GNUNET_OK !=
332  "REVOCATION",
333  "EPOCH_DURATION",
334  &epoch_duration)))
335  {
336  GNUNET_break (0);
337  GNUNET_free (h);
338  return NULL;
339  }
341  (unsigned int) matching_bits,
343  {
344  GNUNET_break (0);
345  GNUNET_free (h);
346  return NULL;
347  }
348 
349 
351  "revocation",
352  handlers,
354  h);
355  if (NULL == h->mq)
356  {
357  GNUNET_free (h);
358  return NULL;
359  }
360  h->func = func;
361  h->func_cls = func_cls;
362  size_t extra_len = GNUNET_REVOCATION_proof_get_size (pow);
363  env = GNUNET_MQ_msg_extra (rm,
364  extra_len,
366  rm->pow_size = htonl (extra_len);
367  memcpy (&rm[1], pow, extra_len);
368  GNUNET_MQ_send (h->mq,
369  env);
370  return h;
371 }
372 
373 
379 void
381 {
382  if (NULL != h->mq)
383  {
385  h->mq = NULL;
386  }
387  GNUNET_free (h);
388 }
389 
390 
397 static unsigned int
399 {
400  double sum = 0.0;
401  for (unsigned int j = 0; j<POW_COUNT; j++)
402  sum += ph->best[j].bits;
403  double avg = sum / POW_COUNT;
404  return avg;
405 }
406 
409 {
411  const struct GNUNET_IDENTITY_PublicKey *pk;
412  size_t ksize;
413 
414  pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
416  spurp = GNUNET_malloc (sizeof (*spurp) + ksize);
417  spurp->timestamp = pow->timestamp;
419  spurp->purpose.size = htonl (sizeof(*spurp) + ksize);
421  (char*) &spurp[1],
422  ksize);
423  return spurp;
424 }
425 
428  const struct GNUNET_IDENTITY_PublicKey *key)
429 {
431  unsigned char *sig;
432  size_t ksize;
433 
435  spurp = REV_create_signature_message (pow);
436  sig = ((unsigned char*) &pow[1] + ksize);
437  if (GNUNET_OK !=
439  &spurp->purpose,
440  sig,
441  key))
442  {
443  return GNUNET_SYSERR;
444  }
445  return GNUNET_OK;
446 }
447 
448 
450 check_signature (const struct GNUNET_REVOCATION_PowP *pow)
451 {
452  const struct GNUNET_IDENTITY_PublicKey *pk;
453 
454  pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
455  return check_signature_identity (pow, pk);
456 }
457 
458 
469  unsigned int difficulty,
471 {
472  char buf[sizeof(struct GNUNET_IDENTITY_PublicKey)
473  + sizeof (struct GNUNET_TIME_AbsoluteNBO)
474  + sizeof (uint64_t)] GNUNET_ALIGN;
475  struct GNUNET_HashCode result;
476  struct GNUNET_TIME_Absolute ts;
477  struct GNUNET_TIME_Absolute exp;
478  struct GNUNET_TIME_Relative ttl;
479  struct GNUNET_TIME_Relative buffer;
480  unsigned int score = 0;
481  unsigned int tmp_score = 0;
482  unsigned int epochs;
483  uint64_t pow_val;
484  ssize_t pklen;
485  const struct GNUNET_IDENTITY_PublicKey *pk;
486 
487  pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
488 
492  if (GNUNET_OK != check_signature (pow))
493  {
495  "Proof of work signature invalid!\n");
496  return GNUNET_SYSERR;
497  }
498 
502  for (unsigned int i = 0; i < POW_COUNT - 1; i++)
503  {
504  if (GNUNET_ntohll (pow->pow[i]) >= GNUNET_ntohll (pow->pow[i + 1]))
505  return GNUNET_NO;
506  }
507  GNUNET_memcpy (&buf[sizeof(uint64_t)],
508  &pow->timestamp,
509  sizeof (uint64_t));
511  if (0 > pklen)
512  {
513  GNUNET_break (0);
514  return GNUNET_NO;
515  }
516  GNUNET_memcpy (&buf[sizeof(uint64_t) * 2],
517  pk,
518  pklen);
519  for (unsigned int i = 0; i < POW_COUNT; i++)
520  {
521  pow_val = GNUNET_ntohll (pow->pow[i]);
522  GNUNET_memcpy (buf, &pow->pow[i], sizeof(uint64_t));
524  buf,
525  sizeof(buf),
526  &result);
529  "Score %u with %" PRIu64 " (#%u)\n",
530  tmp_score, pow_val, i);
531 
532  score += tmp_score;
533 
534  }
535  score = score / POW_COUNT;
536  if (score < difficulty)
537  return GNUNET_NO;
538  epochs = score - difficulty;
539 
545  epochs);
550  10);
551  exp = GNUNET_TIME_absolute_add (ts, ttl);
552  exp = GNUNET_TIME_absolute_add (exp,
553  buffer);
554 
555  if (0 != GNUNET_TIME_absolute_get_remaining (ts).rel_value_us)
556  return GNUNET_NO; /* Not yet valid. */
557  /* Revert to actual start time */
558  ts = GNUNET_TIME_absolute_add (ts,
559  buffer);
560 
561  if (0 == GNUNET_TIME_absolute_get_remaining (exp).rel_value_us)
562  return GNUNET_NO; /* expired */
563  return GNUNET_YES;
564 }
565 
566 
569  struct GNUNET_REVOCATION_PowP *pow)
570 {
573  const struct GNUNET_IDENTITY_PublicKey *pk;
574  size_t ksize;
575  char *sig;
576 
583  pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
587  sig = ((char*) &pow[1]) + ksize;
589  &rp->purpose,
590  (void*) sig);
591  if (result == GNUNET_SYSERR)
592  return GNUNET_NO;
593  else
594  return result;
595 }
596 
597 
600  struct GNUNET_REVOCATION_PowP *pow)
601 {
603 
604  pk = (struct GNUNET_IDENTITY_PublicKey *) &pow[1];
606  return sign_pow_identity (key, pow);
607 }
608 
609 
616 void
618  struct GNUNET_REVOCATION_PowP *pow)
619 {
620  GNUNET_assert (GNUNET_OK == sign_pow (key, pow));
621 }
622 
623 
635  int epochs,
636  unsigned int difficulty)
637 {
639  struct GNUNET_TIME_Relative ttl;
640 
641 
643  pc->pow = pow;
645  epochs);
646  pc->pow->ttl = GNUNET_TIME_relative_hton (ttl);
648  UINT64_MAX);
649  pc->difficulty = difficulty;
650  pc->epochs = epochs;
651  return pc;
652 }
653 
654 
662 static int
663 cmp_pow_value (const void *a, const void *b)
664 {
665  return (GNUNET_ntohll (*(uint64_t*) a) - GNUNET_ntohll (*(uint64_t*) b));
666 }
667 
668 
681 {
682  char buf[sizeof(struct GNUNET_IDENTITY_PublicKey)
683  + sizeof (uint64_t)
684  + sizeof (uint64_t)] GNUNET_ALIGN;
685  struct GNUNET_HashCode result;
686  const struct GNUNET_IDENTITY_PublicKey *pk;
687  unsigned int zeros;
688  int ret;
689  uint64_t pow_nbo;
690  ssize_t ksize;
691 
692  pc->current_pow++;
693  pk = (const struct GNUNET_IDENTITY_PublicKey *) &(pc->pow[1]);
694 
698  for (unsigned int i = 0; i < POW_COUNT; i++)
699  if (pc->current_pow == pc->best[i].pow)
700  return GNUNET_NO;
701  pow_nbo = GNUNET_htonll (pc->current_pow);
702  GNUNET_memcpy (buf, &pow_nbo, sizeof(uint64_t));
703  GNUNET_memcpy (&buf[sizeof(uint64_t)],
704  &pc->pow->timestamp,
705  sizeof (uint64_t));
707  GNUNET_assert (0 < ksize);
708  GNUNET_memcpy (&buf[sizeof(uint64_t) * 2],
709  pk,
710  ksize);
712  buf,
713  sizeof(buf),
714  &result);
716  for (unsigned int i = 0; i < POW_COUNT; i++)
717  {
718  if (pc->best[i].bits < zeros)
719  {
720  pc->best[i].bits = zeros;
721  pc->best[i].pow = pc->current_pow;
722  pc->pow->pow[i] = pow_nbo;
724  "New best score %u with %" PRIu64 " (#%u)\n",
725  zeros, pc->current_pow, i);
726 
727  break;
728  }
729  }
730  ret = calculate_score (pc) >= pc->difficulty + pc->epochs ? GNUNET_YES :
731  GNUNET_NO;
732  if (GNUNET_YES == ret)
733  {
734  /* Sort POWs) */
735  qsort (pc->pow->pow, POW_COUNT, sizeof (uint64_t), &cmp_pow_value);
736  }
737  return ret;
738 }
739 
740 
748 void
750 {
751  GNUNET_free (pc);
752 }
753 
754 
755 size_t
757 {
758  size_t size;
759  size_t ksize;
760  const struct GNUNET_IDENTITY_PublicKey *pk;
761 
762  size = sizeof (struct GNUNET_REVOCATION_PowP);
763  pk = (const struct GNUNET_IDENTITY_PublicKey *) &pow[1];
765  size += ksize;
767  return size;
768 }
769 
770 
771 /* end of revocation_api.c */
struct GNUNET_MQ_Envelope * env
Definition: 005.c:1
static const struct GNUNET_CONFIGURATION_Handle * cfg
Configuration we are using.
Definition: gnunet-abd.c:36
static int ret
Return value of the commandline.
Definition: gnunet-abd.c:81
static struct GNUNET_ARM_Handle * h
Connection with ARM.
Definition: gnunet-arm.c:99
static struct GNUNET_ATS_PerformanceHandle * ph
ATS performance handle used.
Definition: gnunet-ats.c:116
static struct GNUNET_CADET_MessageHandler handlers[]
Handlers, for diverse services.
struct GNUNET_HashCode key
The key used in the DHT.
struct GNUNET_IDENTITY_PrivateKey pk
Private key from command line option, or NULL.
static struct GNUNET_FS_PublishContext * pc
Handle to FS-publishing operation.
static char * rp
Relying party.
static int result
Global testing status.
static struct GNUNET_REVOCATION_Query * q
Handle for revocation query.
static struct GNUNET_TIME_Relative epoch_duration
Epoch length.
static unsigned long long matching_bits
Number of matching bits required for revocation.
static unsigned int epochs
-e option.
static char buf[2048]
#define GNUNET_log(kind,...)
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:53
uint64_t GNUNET_htonll(uint64_t n)
Convert unsigned 64-bit integer to network byte order.
Definition: common_endian.c:36
#define GNUNET_ALIGN
gcc-ism to force alignment; we use this to align char-arrays that may then be cast to 'struct's.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
GNUNET_GenericReturnValue
Named constants for return values.
Definition: gnunet_common.h:92
@ GNUNET_OK
Definition: gnunet_common.h:95
@ GNUNET_YES
Definition: gnunet_common.h:97
@ GNUNET_NO
Definition: gnunet_common.h:94
@ GNUNET_SYSERR
Definition: gnunet_common.h:93
unsigned int GNUNET_CRYPTO_hash_count_leading_zeros(const struct GNUNET_HashCode *h)
Count the number of leading 0 bits in h.
Definition: crypto_hash.c:176
void GNUNET_CRYPTO_pow_hash(const struct GNUNET_CRYPTO_PowSalt *salt, const void *buf, size_t buf_len, struct GNUNET_HashCode *result)
Calculate the 'proof-of-work' hash (an expensive hash).
Definition: crypto_pow.c:41
#define GNUNET_SIGNATURE_PURPOSE_REVOCATION
Signature for confirming a key revocation.
struct GNUNET_MQ_Handle * GNUNET_CLIENT_connect(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *service_name, const struct GNUNET_MQ_MessageHandler *handlers, GNUNET_MQ_ErrorHandler error_handler, void *error_handler_cls)
Create a message queue to connect to a GNUnet service.
Definition: client.c:1066
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_number(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, unsigned long long *number)
Get a configuration value that should be a number.
enum GNUNET_GenericReturnValue GNUNET_CONFIGURATION_get_value_time(const struct GNUNET_CONFIGURATION_Handle *cfg, const char *section, const char *option, struct GNUNET_TIME_Relative *time)
Get a configuration value that should be a relative time.
uint64_t GNUNET_CRYPTO_random_u64(enum GNUNET_CRYPTO_Quality mode, uint64_t max)
Random on unsigned 64-bit values.
@ GNUNET_CRYPTO_QUALITY_WEAK
No good quality of the operation is needed (i.e., random numbers can be pseudo-random).
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_key_get_public(const struct GNUNET_IDENTITY_PrivateKey *privkey, struct GNUNET_IDENTITY_PublicKey *key)
Retrieves the public key representation of a private key.
Definition: identity_api.c:175
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_sign_raw_(const struct GNUNET_IDENTITY_PrivateKey *priv, const struct GNUNET_CRYPTO_EccSignaturePurpose *purpose, unsigned char *sig)
Sign a given block.
enum GNUNET_GenericReturnValue GNUNET_IDENTITY_signature_verify_raw_(uint32_t purpose, const struct GNUNET_CRYPTO_EccSignaturePurpose *validate, const unsigned char *sig, const struct GNUNET_IDENTITY_PublicKey *pub)
Verify a given signature.
ssize_t GNUNET_IDENTITY_signature_get_raw_length_by_type(uint32_t type)
Get the compacted length of a signature by type.
ssize_t GNUNET_IDENTITY_write_key_to_buffer(const struct GNUNET_IDENTITY_PublicKey *key, void *buffer, size_t len)
Writes a GNUNET_IDENTITY_PublicKey to a compact buffer.
ssize_t GNUNET_IDENTITY_key_get_length(const struct GNUNET_IDENTITY_PublicKey *key)
Get the compacted length of a GNUNET_IDENTITY_PublicKey.
Definition: identity_api.c:991
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ GNUNET_ERROR_TYPE_WARNING
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
@ GNUNET_ERROR_TYPE_INFO
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_malloc(size)
Wrapper around malloc.
#define GNUNET_free(ptr)
Wrapper around free.
GNUNET_MQ_Error
Error codes for the queue.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:302
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
Definition: gnunet_mq_lib.h:52
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:67
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
void GNUNET_MQ_destroy(struct GNUNET_MQ_Handle *mq)
Destroy the message queue.
Definition: mq.c:685
#define GNUNET_MESSAGE_TYPE_REVOCATION_QUERY
Client to service: was this key revoked?
#define GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE
Client to service OR peer-to-peer: revoke this key!
#define GNUNET_MESSAGE_TYPE_REVOCATION_REVOKE_RESPONSE
Service to client: revocation confirmed.
#define GNUNET_MESSAGE_TYPE_REVOCATION_QUERY_RESPONSE
Service to client: answer if key was revoked!
void GNUNET_REVOCATION_pow_stop(struct GNUNET_REVOCATION_PowCalculationHandle *pc)
Stop a PoW calculation.
size_t GNUNET_REVOCATION_proof_get_size(const struct GNUNET_REVOCATION_PowP *pow)
struct GNUNET_REVOCATION_Query * GNUNET_REVOCATION_query(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_IDENTITY_PublicKey *key, GNUNET_REVOCATION_Callback func, void *func_cls)
Check if a key was revoked.
void GNUNET_REVOCATION_pow_init(const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_REVOCATION_PowP *pow)
Initializes a fresh PoW computation.
void GNUNET_REVOCATION_query_cancel(struct GNUNET_REVOCATION_Query *q)
Cancel key revocation check.
enum GNUNET_GenericReturnValue GNUNET_REVOCATION_pow_round(struct GNUNET_REVOCATION_PowCalculationHandle *pc)
Calculate a key revocation valid for broadcasting for a number of epochs.
void GNUNET_REVOCATION_revoke_cancel(struct GNUNET_REVOCATION_Handle *h)
Cancel key revocation.
#define POW_COUNT
The proof-of-work narrowing factor.
enum GNUNET_GenericReturnValue GNUNET_REVOCATION_check_pow(const struct GNUNET_REVOCATION_PowP *pow, unsigned int difficulty, struct GNUNET_TIME_Relative epoch_duration)
Check if the given proof-of-work is valid.
struct GNUNET_REVOCATION_PowCalculationHandle * GNUNET_REVOCATION_pow_start(struct GNUNET_REVOCATION_PowP *pow, int epochs, unsigned int difficulty)
Starts a proof-of-work calculation given the pow object as well as target epochs and difficulty.
struct GNUNET_REVOCATION_Handle * GNUNET_REVOCATION_revoke(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_REVOCATION_PowP *pow, GNUNET_REVOCATION_Callback func, void *func_cls)
Perform key revocation.
void(* GNUNET_REVOCATION_Callback)(void *cls, enum GNUNET_GenericReturnValue is_valid)
Callback to call with the result of a key revocation query.
struct GNUNET_TIME_Relative GNUNET_TIME_absolute_get_remaining(struct GNUNET_TIME_Absolute future)
Given a timestamp in the future, how much time remains until then?
Definition: time.c:404
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_get(void)
Get the current time.
Definition: time.c:110
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_ntoh(struct GNUNET_TIME_AbsoluteNBO a)
Convert absolute time from network byte order.
Definition: time.c:736
#define GNUNET_TIME_UNIT_WEEKS
One week.
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_subtract(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Relative duration)
Subtract a given relative duration from the given start time.
Definition: time.c:468
struct GNUNET_TIME_Relative GNUNET_TIME_relative_multiply(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Multiply relative time by a given factor.
Definition: time.c:483
struct GNUNET_TIME_RelativeNBO GNUNET_TIME_relative_hton(struct GNUNET_TIME_Relative a)
Convert relative time to network byte order.
Definition: time.c:617
struct GNUNET_TIME_Absolute GNUNET_TIME_absolute_add(struct GNUNET_TIME_Absolute start, struct GNUNET_TIME_Relative duration)
Add a given relative duration to the given start time.
Definition: time.c:449
struct GNUNET_TIME_Relative GNUNET_TIME_relative_divide(struct GNUNET_TIME_Relative rel, unsigned long long factor)
Divide relative time by a given factor.
Definition: time.c:549
struct GNUNET_TIME_AbsoluteNBO GNUNET_TIME_absolute_hton(struct GNUNET_TIME_Absolute a)
Convert absolute time to network byte order.
Definition: time.c:637
#define GNUNET_TIME_UNIT_YEARS
One year (365 days).
static unsigned int size
Size of the "table".
Definition: peer.c:67
messages for key revocation
static void query_mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
static void revocation_mq_error_handler(void *cls, enum GNUNET_MQ_Error error)
Generic error handler, called with the appropriate error code and the same closure specified at the c...
static void handle_revocation_query_response(void *cls, const struct QueryResponseMessage *qrm)
Handle response to our revocation query.
static unsigned int calculate_score(const struct GNUNET_REVOCATION_PowCalculationHandle *ph)
Calculate the average zeros in the pows.
enum GNUNET_GenericReturnValue check_signature_identity(const struct GNUNET_REVOCATION_PowP *pow, const struct GNUNET_IDENTITY_PublicKey *key)
enum GNUNET_GenericReturnValue sign_pow_identity(const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_REVOCATION_PowP *pow)
static int cmp_pow_value(const void *a, const void *b)
Comparison function for quicksort.
static struct GNUNET_CRYPTO_PowSalt salt
enum GNUNET_GenericReturnValue check_signature(const struct GNUNET_REVOCATION_PowP *pow)
static void handle_revocation_response(void *cls, const struct RevocationResponseMessage *rrm)
Handle response to our revocation query.
enum GNUNET_GenericReturnValue sign_pow(const struct GNUNET_IDENTITY_PrivateKey *key, struct GNUNET_REVOCATION_PowP *pow)
struct GNUNET_REVOCATION_SignaturePurposePS * REV_create_signature_message(const struct GNUNET_REVOCATION_PowP *pow)
Create the revocation metadata to sign for a revocation message.
Helper struct that holds a found pow nonce and the corresponding number of leading zeros.
unsigned int bits
Corresponding zero bits in hash.
uint64_t pow
PoW nonce.
struct GNUNET_MQ_Handle * mq
Our connection to the ARM service.
Definition: arm_api.c:107
uint32_t size
How many bytes does this signature sign? (including this purpose header); in network byte order (!...
uint32_t purpose
What does this signature vouch for? This must contain a GNUNET_SIGNATURE_PURPOSE_XXX constant (from g...
Value for a salt for GNUNET_CRYPTO_pow_hash().
A 512-bit hashcode.
A private key for an identity as per LSD0001.
uint32_t type
Type of public key.
An identity key as per LSD0001.
Handle to a message queue.
Definition: mq.c:86
Message handler for a specific message type.
Handle for the key revocation operation.
struct GNUNET_MQ_Handle * mq
Message queue to the service.
GNUNET_REVOCATION_Callback func
Function to call once we are done.
void * func_cls
Closure for func.
The handle to a PoW calculation.
unsigned int epochs
Epochs how long the PoW should be valid.
struct BestPow best[POW_COUNT]
Current set of found PoWs.
uint64_t current_pow
The current nonce to try.
unsigned int difficulty
The difficulty (leading zeros) to achieve.
struct GNUNET_REVOCATION_PowP * pow
The final PoW result data structure.
Struct for a proof of work as part of the revocation.
struct GNUNET_TIME_AbsoluteNBO timestamp
The timestamp of the revocation.
Handle for the key revocation query.
void * func_cls
Closure for func.
struct GNUNET_MQ_Handle * mq
Message queue to the service.
GNUNET_REVOCATION_Callback func
Function to call with the result.
The signature object we use for the PoW.
struct GNUNET_CRYPTO_EccSignaturePurpose purpose
The signature purpose.
struct GNUNET_TIME_AbsoluteNBO timestamp
The timestamp of the revocation.
Time for absolute time used by GNUnet, in microseconds and in network byte order.
Time for absolute times used by GNUnet, in microseconds.
Time for relative time used by GNUnet, in microseconds.
Query key revocation status.
Definition: revocation.h:38
struct GNUNET_IDENTITY_PublicKey key
Key to check.
Definition: revocation.h:52
uint32_t reserved
For alignment.
Definition: revocation.h:47
Key revocation response.
Definition: revocation.h:60
uint32_t is_valid
GNUNET_NO if revoked, GNUNET_YES if valid.
Definition: revocation.h:69
Key revocation response.
Definition: revocation.h:100
uint32_t is_valid
GNUNET_NO if revocation failed for internal reasons (e.g.
Definition: revocation.h:110
Revoke key.
Definition: revocation.h:81
uint32_t pow_size
Length of PoW with signature.
Definition: revocation.h:90