clarifications
[oweals/gnunet.git] / src / include / gnunet_secretsharing_service.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  * @file include/gnunet_secretsharing_service.h
23  * @brief verified additive secret sharing and cooperative decryption
24  * @author Florian Dold
25  */
26
27 #ifndef GNUNET_SECRETSHARING_SERVICE_H
28 #define GNUNET_SECRETSHARING_SERVICE_H
29
30 #ifdef __cplusplus
31 extern "C"
32 {
33 #if 0                           /* keep Emacsens' auto-indent happy */
34 }
35 #endif
36 #endif
37
38 #include "platform.h"
39 #include "gnunet_common.h"
40 #include "gnunet_time_lib.h"
41 #include "gnunet_configuration_lib.h"
42 #include <gcrypt.h>
43
44
45 /**
46  * Session that will eventually establish a shared secred between
47  * the involved peers and allow encryption and cooperative decryption.
48  */
49 struct GNUNET_SECRETSHARING_Session;
50
51
52 /**
53  * Handle to cancel a cooperative decryption operation.
54  */
55 struct GNUNET_SECRETSHARING_DecryptionHandle;
56
57
58 /**
59  * Parameters of the crypto system.
60  */
61 struct GNUNET_SECRETSHARING_Parameters
62 {
63   /**
64    * Threshold, that is, minimum number of peers that
65    * must cooperate to decrypt a value.
66    */
67   unsigned int k;
68   /**
69    * Prime with p = 2q+1.
70    */
71   gcry_mpi_t p;
72   /**
73    * Prime.
74    */
75   gcry_mpi_t q;
76   /**
77    * Generator of G_q.
78    */
79   gcry_mpi_t g;
80 };
81
82
83 /**
84  * Encrypted field element.
85  */
86 struct GNUNET_SECRETSHARING_Ciphertext 
87 {
88   /**
89    * First component.
90    */
91   gcry_mpi_t c1;
92   /**
93    * Second component.
94    */
95   gcry_mpi_t c2;
96 };
97
98
99 /**
100  * Called once the secret has been established with all peers, or the deadline is due.
101  *
102  * Note that the number of peers can be smaller that 'k' (this threshold parameter), which
103  * makes the threshold crypto system useledd.  However, in this case one can still determine which peers
104  * were able to participate in the secret sharing successfully.
105  *
106  * @param cls closure
107  * @param public_key public key of the session
108  * @param num_ready_peers number of peers in @ready_peers
109  * @parem ready_peers peers that successfuly participated in establishing
110  *                    the shared secret
111  */
112 typedef void (*GNUNET_SECRETSHARING_SecretReadyCallback) (void *cls,
113                                                           gcry_mpi_t public_key,
114                                                           unsigned int num_ready_peers,
115                                                           const struct GNUNET_PeerIdentity *ready_peers);
116
117
118 /**
119  * Create a session that will eventually establish a shared secret
120  * with the other peers.
121  *
122  * @param cfg configuration to use
123  * @param num_peers number of peers in @peers
124  * @param session_id unique session id
125  * @param deadline point in time where the session must be established; taken as hint
126  *                 by underlying consensus sessions
127  * @param cb called when the secret has been established
128  * @param cls closure for cb
129  */
130 struct GNUNET_SECRETSHARING_Session *
131 GNUNET_SECRETSHARING_create_session (const struct GNUNET_CONFIGURATION_Handle *cfg,
132                                      unsigned int num_peers,
133                                      const struct GNUNET_PeerIdentity *peers,
134                                      const struct GNUNET_HashCode *session_id,
135                                      struct GNUNET_TIME_Absolute deadline,
136                                      struct GNUNET_SECRETSHARING_Parameters *parameters,
137                                      GNUNET_SECRETSHARING_SecretReadyCallback *cb,
138                                      void *cls);
139
140
141 /**
142  * Destroy a secret sharing session.
143  *
144  * @param session session to destroy
145  */
146 void
147 GNUNET_SECRETSHARING_destroy_session (struct GNUNET_SECRETSHARING_Session *session);
148
149
150 /**
151  * Encrypt a value.  This operation is executed locally, no communication is
152  * necessary.
153  *
154  * This is a helper function, encryption can be done soley with a session's public key
155  * and the crypto system parameters.
156  *
157  * @param session session to take the key for encryption from,
158  *                the session's ready callback must have been already called
159  * @param message message to encrypt
160  * @param result_cyphertext pointer to store the resulting ciphertext
161  * @return GNUNET_YES on succes, GNUNET_SYSERR if the message is invalid (invalid range)
162  */
163 int 
164 GNUNET_SECRETSHARING_encrypt (const struct GNUNET_SECRETSHARING_Session *session,
165                               gcry_mpi_t message,
166                               struct GNUNET_SECRETSHARING_Ciphertext *result_ciphertext);
167
168
169 /**
170  * Publish the given ciphertext for decryption.  Once a sufficient (>=k) number of peers has
171  * published the same value, it will be decrypted.
172  *
173  * When the operation is canceled, the decrypt_cb is not called anymore, but the calling
174  * peer may already have irrevocably contributed his share for the decryption of the value.
175  *
176  * @param session session to use for the decryption
177  * @param ciphertext ciphertext to publish in order to decrypt it (if enough peers agree)
178  * @param decrypt_cb callback called once the decryption succeeded
179  * @param cls closure for decrypt_cb
180  * @return handle to cancel the operation
181  */
182 struct GNUNET_SECRETSHARING_DecryptionHandle
183 GNUNET_SECRETSHARING_publish_decrypt (struct GNUNET_SECRETSHARING_Session *session,
184                                       struct GNUNET_SECRETSHARING_Ciphertext *ciphertext,
185                                       GNUNET_SECRETSHARING_DecryptCallback decrypt_cb,
186                                       void *cls);
187
188 /**
189  * Cancel a decryption.
190  *
191  * The decrypt_cb is not called anymore, but the calling
192  * peer may already have irrevocably contributed his share for the decryption of the value.
193  *
194  * @param decryption_handle decryption to cancel
195  */
196 void
197 GNUNET_SECRETSHARING_cancel_decrypt (struct GNUNET_SECRETSHARING_DecryptionHandle *decryption_handle);
198
199
200
201
202
203 #if 0                           /* keep Emacsens' auto-indent happy */
204 {
205 #endif
206 #ifdef __cplusplus
207 }
208 #endif
209
210 #endif