- fixes
[oweals/gnunet.git] / src / secretsharing / secretsharing.h
1 /*
2      This file is part of GNUnet.
3      (C) 2013 Christian Grothoff (and other contributing authors)
4
5      GNUnet is free software; you can redistribute it and/or modify
6      it under the terms of the GNU General Public License as published
7      by the Free Software Foundation; either version 3, or (at your
8      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      General Public License for more details.
14
15      You should have received a copy of the GNU General Public License
16      along with GNUnet; see the file COPYING.  If not, write to the
17      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18      Boston, MA 02111-1307, USA.
19 */
20
21 /**
22  * @author Florian Dold
23  * @file secretsharing/secretsharing.h
24  * @brief messages used for the secretsharing api
25  */
26 #ifndef SECRETSHARING_H
27 #define SECRETSHARING_H
28
29 #include "platform.h"
30 #include "gnunet_util_lib.h"
31 #include "gnunet_time_lib.h"
32 #include "gnunet_common.h"
33 #include "gnunet_secretsharing_service.h"
34
35
36 GNUNET_NETWORK_STRUCT_BEGIN
37
38 struct GNUNET_SECRETSHARING_FieldElement
39 {
40   /**
41    * Value of an element in <elgamal_g>.
42    */
43   unsigned char bits[GNUNET_SECRETSHARING_KEY_BITS / 8];
44 };
45
46
47 struct GNUNET_SECRETSHARING_CreateMessage
48 {
49   /**
50    * Type: GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_GENERATE
51    */
52   struct GNUNET_MessageHeader header;
53
54   /**
55    * Session ID, will be used for consensus.
56    */
57   struct GNUNET_HashCode session_id GNUNET_PACKED;
58
59   /**
60    * Deadline for the establishment of the crypto system.
61    */
62   struct GNUNET_TIME_AbsoluteNBO deadline;
63
64   /**
65    * Mininum number of cooperating peers to decrypt a
66    * value.
67    */
68   uint16_t threshold GNUNET_PACKED;
69
70   /**
71    * Number of peers at the end of this message.
72    */
73   uint16_t num_peers GNUNET_PACKED;
74
75   /* struct GNUNET_PeerIdentity[num_peers]; */
76 };
77
78
79
80 struct GNUNET_SECRETSHARING_ShareHeaderNBO
81 {
82   /**
83    * Threshold for the key this share belongs to.
84    */
85   uint16_t threshold;
86
87   /**
88    * Peers that have the share.
89    */
90   uint16_t num_peers;
91
92   /**
93    * Index of our peer in the list.
94    */
95   uint16_t my_peer;
96
97   /**
98    * Public key. Must correspond to the product of
99    * the homomorphic share commitments.
100    */
101   struct GNUNET_SECRETSHARING_PublicKey public_key;
102
103   /**
104    * Share of 'my_peer'
105    */
106   struct GNUNET_SECRETSHARING_FieldElement my_share;
107 };
108
109
110 struct GNUNET_SECRETSHARING_SecretReadyMessage
111 {
112   /**
113    * Type: GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_SECRET_READY
114    */
115   struct GNUNET_MessageHeader header;
116
117   /* rest: the serialized share */
118
119 };
120
121
122 struct GNUNET_SECRETSHARING_DecryptRequestMessage
123 {
124   /**
125    * Type: GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_DECRYPT_REQUEST
126    */
127   struct GNUNET_MessageHeader header;
128
129   /**
130    * Until when should the decryption be finished?
131    */
132   struct GNUNET_TIME_AbsoluteNBO deadline;
133
134   /**
135    * Ciphertext we want to decrypt.
136    */
137   struct GNUNET_SECRETSHARING_Ciphertext ciphertext;
138
139   /* the share with payload */
140 };
141
142
143 struct GNUNET_SECRETSHARING_DecryptResponseMessage
144 {
145   /**
146    * Type: GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_DECRYPT_DONE
147    */
148   struct GNUNET_MessageHeader header;
149
150   /**
151    * Zero if decryption failed, non-zero if decryption succeeded.
152    * If the decryption failed, plaintext is also zero.
153    */
154   uint32_t success;
155
156   /**
157    * Decrypted plaintext.
158    */
159   struct GNUNET_SECRETSHARING_FieldElement plaintext;
160 };
161
162
163 GNUNET_NETWORK_STRUCT_END
164
165
166 /**
167  * A share, with all values in in host byte order.
168  */
169 struct GNUNET_SECRETSHARING_Share
170 {
171   /**
172    * Threshold for the key this share belongs to.
173    */
174   uint16_t threshold;
175
176   /**
177    * Peers that have the share.
178    */
179   uint16_t num_peers;
180
181   /**
182    * Index of our peer in the list.
183    */
184   uint16_t my_peer;
185
186   /**
187    * Public key. Must correspond to the product of
188    * the homomorphic share commitments.
189    */
190   struct GNUNET_SECRETSHARING_PublicKey public_key;
191
192   /**
193    * Share of 'my_peer'
194    */
195   struct GNUNET_SECRETSHARING_FieldElement my_share;
196
197   /**
198    * Peer identities (includes 'my_peer') 
199    */
200   struct GNUNET_PeerIdentity *peers;
201
202   /*
203    * Homomorphic commitments to each peer's share (includes 'my_peer') 
204    */
205   struct GNUNET_SECRETSHARING_FieldElement *hom_share_commitments;
206
207   /*
208    * Original indices of peers from the DKG round.
209    */
210   uint16_t *original_indices;
211 };
212
213
214 #endif