summaryrefslogtreecommitdiff
path: root/src/nse/nse.h
blob: 59dd6bc1b559f7f17787fffa75c3014484d63be8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/*
     This file is part of GNUnet.
     (C) 2001-2011 Christian Grothoff (and other contributing authors)

     GNUnet is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published
     by the Free Software Foundation; either version 2, or (at your
     option) any later version.

     GNUnet is distributed in the hope that it will be useful, but
     WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     General Public License for more details.

     You should have received a copy of the GNU General Public License
     along with GNUnet; see the file COPYING.  If not, write to the
     Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     Boston, MA 02111-1307, USA.
*/

/**
 * @author Nathan Evans
 * @file nse/nse.h
 *
 * @brief Common type definitions for the network size estimation
 *        service and API.
 */
#ifndef NSE_H
#define NSE_H

#include "gnunet_common.h"

#define DEBUG_NSE GNUNET_YES


/**
 * Network size estimate sent from the service
 * to clients.  Contains the current size estimate
 * (or 0 if none has been calculated) and the
 * standard deviation of known estimates.
 *
 */
struct GNUNET_NSE_ClientMessage
{
  /**
   * Type:  GNUNET_MESSAGE_TYPE_NSE_UPDATE
   */
  struct GNUNET_MessageHeader header;

  /*
   * The current estimated network size.
   */
  double size_estimate;

  /**
   * The standard deviation (rounded down
   * to the nearest integer) of size
   * estimations.
   */
  double std_deviation;
};

/**
 * Network size estimate reply; sent when "this"
 * peer's timer has run out before receiving a
 * valid reply from another peer.
 *
 * FIXME: Is this the right way to do this?
 * I think we need to include both the public
 * key and the timestamp signed by the private
 * key.  This way a recipient
 * can verify that the peer at least generated
 * the public/private key pair, and that the
 * timestamp matches what the current peer
 * believes it should be.  The receiving peer
 * would then check whether the XOR of the peer
 * identity and the timestamp is within a
 * reasonable range of the current time
 * (+/- N seconds).  If a closer message which
 * also verifies hasn't been received (or this
 * message is a duplicate), the peer
 * calculates the size estimate and forwards
 * the request to all other peers.
 *
 * Hmm... Is it enought to *just* send the peer
 * identity?  Obviously this is smaller, but it
 * doesn't allow us to verify that the
 * public/private key pair were generated, right?
 */
struct GNUNET_NSE_FloodMessage
{
  /**
   * Type: GNUNET_MESSAGE_TYPE_NSE_P2P_FLOOD
   */
  struct GNUNET_MessageHeader header;

  /**
   * Magic header code(?)
   */
  uint16_t enc_type;

  /**
   * Number of matching bits between the hash
   * of timestamp and the initiator's public
   * key.
   */
  uint16_t distance;

  /**
   * The current timestamp value (which all
   * peers should agree on).
   */
  struct GNUNET_TIME_AbsoluteNBO timestamp;

  /**
   * Public key of the originator.
   */
  struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded pkey;

  /**
   * FIXME: use, document.
   */
  uint32_t proof_of_work;

  /**
   * FIXME: use, document.
   */
  struct GNUNET_CRYPTO_RsaSignature signature;
};

#endif