diff options
Diffstat (limited to 'src/secretsharing/secretsharing_api.c')
-rw-r--r-- | src/secretsharing/secretsharing_api.c | 125 |
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 | ||
62 | struct 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 | |||
64 | static void | 86 | static void |
65 | handle_session_client_error (void *cls, enum GNUNET_MQ_Error error) | 87 | handle_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 | |||
95 | static void | ||
96 | handle_decrypt_client_error (void *cls, enum GNUNET_MQ_Error error) | ||
97 | { | ||
98 | GNUNET_assert (0); | ||
99 | } | ||
100 | |||
72 | static void | 101 | static void |
73 | handle_secret_ready (void *cls, const struct GNUNET_MessageHeader *msg) | 102 | handle_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 | ||
169 | static void | ||
170 | handle_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 | */ | ||
189 | struct GNUNET_SECRETSHARING_DecryptionHandle * | ||
190 | GNUNET_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 | ||