aboutsummaryrefslogtreecommitdiff
path: root/src/secretsharing/secretsharing_api.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/secretsharing/secretsharing_api.c')
-rw-r--r--src/secretsharing/secretsharing_api.c125
1 files changed, 116 insertions, 9 deletions
diff --git a/src/secretsharing/secretsharing_api.c b/src/secretsharing/secretsharing_api.c
index a44fa2a2f..d2b53acc7 100644
--- a/src/secretsharing/secretsharing_api.c
+++ b/src/secretsharing/secretsharing_api.c
@@ -31,8 +31,6 @@
31 31
32#define LOG(kind,...) GNUNET_log_from (kind, "secretsharing-api",__VA_ARGS__) 32#define LOG(kind,...) GNUNET_log_from (kind, "secretsharing-api",__VA_ARGS__)
33 33
34
35
36/** 34/**
37 * Session that will eventually establish a shared secred between 35 * Session that will eventually establish a shared secred between
38 * the involved peers and allow encryption and cooperative decryption. 36 * the involved peers and allow encryption and cooperative decryption.
@@ -61,6 +59,30 @@ struct GNUNET_SECRETSHARING_Session
61}; 59};
62 60
63 61
62struct GNUNET_SECRETSHARING_DecryptionHandle
63{
64 /**
65 * Client connected to the secretsharing service.
66 */
67 struct GNUNET_CLIENT_Connection *client;
68
69 /**
70 * Message queue for 'client'.
71 */
72 struct GNUNET_MQ_Handle *mq;
73
74 /**
75 * Called when the secret sharing is done.
76 */
77 GNUNET_SECRETSHARING_DecryptCallback decrypt_cb;
78
79 /**
80 * Closure for 'decrypt_cb'.
81 */
82 void *decrypt_cls;
83};
84
85
64static void 86static void
65handle_session_client_error (void *cls, enum GNUNET_MQ_Error error) 87handle_session_client_error (void *cls, enum GNUNET_MQ_Error error)
66{ 88{
@@ -69,16 +91,29 @@ handle_session_client_error (void *cls, enum GNUNET_MQ_Error error)
69 s->secret_ready_cb (s->secret_ready_cls, NULL, NULL, 0, NULL); 91 s->secret_ready_cb (s->secret_ready_cls, NULL, NULL, 0, NULL);
70} 92}
71 93
94
95static void
96handle_decrypt_client_error (void *cls, enum GNUNET_MQ_Error error)
97{
98 GNUNET_assert (0);
99}
100
72static void 101static void
73handle_secret_ready (void *cls, const struct GNUNET_MessageHeader *msg) 102handle_secret_ready (void *cls, const struct GNUNET_MessageHeader *msg)
74{ 103{
75 struct GNUNET_SECRETSHARING_Session *s = cls; 104 struct GNUNET_SECRETSHARING_Session *session = cls;
105 struct GNUNET_SECRETSHARING_Share *share;
76 const struct GNUNET_SECRETSHARING_SecretReadyMessage *m = (const void *) msg; 106 const struct GNUNET_SECRETSHARING_SecretReadyMessage *m = (const void *) msg;
107 size_t share_size;
108
109 share_size = ntohs (m->header.size) - sizeof *m;
110
111 share = GNUNET_SECRETSHARING_share_read (&m[1], share_size, NULL);
77 112
78 s->secret_ready_cb (s->secret_ready_cls, 113 session->secret_ready_cb (session->secret_ready_cls,
79 NULL, 114 share, /* FIXME */
80 &m->public_key, 115 &share->public_key,
81 ntohs (m->num_secret_peers), 116 share->num_peers,
82 (struct GNUNET_PeerIdentity *) &m[1]); 117 (struct GNUNET_PeerIdentity *) &m[1]);
83 118
84} 119}
@@ -113,14 +148,86 @@ GNUNET_SECRETSHARING_create_session (const struct GNUNET_CONFIGURATION_Handle *c
113 handle_session_client_error, s); 148 handle_session_client_error, s);
114 GNUNET_assert (NULL != s->mq); 149 GNUNET_assert (NULL != s->mq);
115 150
116 ev = GNUNET_MQ_msg (msg, GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_GENERATE); 151 ev = GNUNET_MQ_msg_extra (msg,
152 num_peers * sizeof (struct GNUNET_PeerIdentity),
153 GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_GENERATE);
154
117 msg->threshold = htons (threshold); 155 msg->threshold = htons (threshold);
156 msg->num_peers = htons (num_peers);
157 msg->session_id = *session_id;
158 msg->deadline = GNUNET_TIME_absolute_hton (deadline);
159 memcpy (&msg[1], peers, num_peers * sizeof (struct GNUNET_PeerIdentity));
160
118 GNUNET_MQ_send (s->mq, ev); 161 GNUNET_MQ_send (s->mq, ev);
119 162
120 LOG (GNUNET_ERROR_TYPE_DEBUG, "secretsharing session created\n"); 163 LOG (GNUNET_ERROR_TYPE_DEBUG, "secretsharing session created with %u peers\n",
164 num_peers);
121 return s; 165 return s;
166}
167
122 168
169static void
170handle_decrypt_done (void *cls, const struct GNUNET_MessageHeader *msg)
171{
172 GNUNET_assert (0);
123} 173}
124 174
125 175
176/**
177 * Publish the given ciphertext for decryption. Once a sufficient (>=k) number of peers has
178 * published the same value, it will be decrypted.
179 *
180 * When the operation is canceled, the decrypt_cb is not called anymore, but the calling
181 * peer may already have irrevocably contributed his share for the decryption of the value.
182 *
183 * @param share our secret share to use for decryption
184 * @param ciphertext ciphertext to publish in order to decrypt it (if enough peers agree)
185 * @param decrypt_cb callback called once the decryption succeeded
186 * @param decrypt_cb_cls closure for @a decrypt_cb
187 * @return handle to cancel the operation
188 */
189struct GNUNET_SECRETSHARING_DecryptionHandle *
190GNUNET_SECRETSHARING_decrypt (struct GNUNET_CONFIGURATION_Handle *cfg,
191 struct GNUNET_SECRETSHARING_Share *share,
192 struct GNUNET_SECRETSHARING_Ciphertext *ciphertext,
193 struct GNUNET_TIME_Absolute deadline,
194 GNUNET_SECRETSHARING_DecryptCallback decrypt_cb,
195 void *decrypt_cb_cls)
196{
197 struct GNUNET_SECRETSHARING_DecryptionHandle *s;
198 struct GNUNET_MQ_Envelope *ev;
199 struct GNUNET_SECRETSHARING_DecryptRequestMessage *msg;
200 static const struct GNUNET_MQ_MessageHandler mq_handlers[] = {
201 {handle_decrypt_done, GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_DECRYPT_DONE, 0},
202 GNUNET_MQ_HANDLERS_END
203 };
204 size_t share_size;
205
206
207 s = GNUNET_new (struct GNUNET_SECRETSHARING_DecryptionHandle);
208 s->client = GNUNET_CLIENT_connect ("secretsharing", cfg);
209 s->decrypt_cb = decrypt_cb;
210 s->decrypt_cls = decrypt_cb_cls;
211 GNUNET_assert (NULL != s->client);
212
213 s->mq = GNUNET_MQ_queue_for_connection_client (s->client, mq_handlers,
214 handle_decrypt_client_error, s);
215 GNUNET_assert (NULL != s->mq);
216
217 GNUNET_assert (GNUNET_OK == GNUNET_SECRETSHARING_share_write (share, NULL, 0, &share_size));
218
219 ev = GNUNET_MQ_msg_extra (msg,
220 share_size,
221 GNUNET_MESSAGE_TYPE_SECRETSHARING_CLIENT_DECRYPT);
222
223 GNUNET_assert (GNUNET_OK == GNUNET_SECRETSHARING_share_write (share, &msg[1], share_size, NULL));
224
225 msg->deadline = GNUNET_TIME_absolute_hton (deadline);
226
227 GNUNET_MQ_send (s->mq, ev);
228
229 LOG (GNUNET_ERROR_TYPE_DEBUG, "decrypt session created\n");
230 return s;
231}
232
126 233