GNUnet 0.22.2
gnunet-service-scalarproduct-ecc_bob.c
Go to the documentation of this file.
1/*
2 This file is part of GNUnet.
3 Copyright (C) 2013-2017, 2021 GNUnet e.V.
4
5 GNUnet is free software: you can redistribute it and/or modify it
6 under the terms of the GNU Affero General Public License as published
7 by the Free Software Foundation, either version 3 of the License,
8 or (at your 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 Affero General Public License for more details.
14
15 You should have received a copy of the GNU Affero General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>.
17
18 SPDX-License-Identifier: AGPL3.0-or-later
19 */
26#include "platform.h"
27#include <limits.h>
28#include <gcrypt.h>
29#include "gnunet_util_lib.h"
31#include "gnunet_protocols.h"
33#include "gnunet_seti_service.h"
34#include "scalarproduct.h"
36
37#define LOG(kind, ...) GNUNET_log_from (kind, "scalarproduct-bob", __VA_ARGS__)
38
39
43struct MpiElement
44{
50 const struct GNUNET_HashCode *key;
51
55 int64_t value;
56};
57
58
64{
69
74
79
85
91
96
101
106
111
115 uint32_t total;
116
122
129
135
143
148
153
158
163
168};
169
170
174static const struct GNUNET_CONFIGURATION_Handle *cfg;
175
180
185
186
194static int
196 const struct GNUNET_HashCode *key,
197 void *value)
198{
199 struct GNUNET_SCALARPRODUCT_Element *element = value;
200
201 GNUNET_free (element);
202 return GNUNET_OK;
203}
204
205
211static void
213{
214 if (GNUNET_YES == s->in_destroy)
215 return;
217 if (NULL != s->client)
218 {
219 struct GNUNET_SERVICE_Client *c = s->client;
220
221 s->client = NULL;
223 }
224 if (NULL != s->intersected_elements)
225 {
228 NULL);
230 s->intersected_elements = NULL;
231 }
232 if (NULL != s->intersection_op)
233 {
235 s->intersection_op = NULL;
236 }
237 if (NULL != s->intersection_set)
238 {
240 s->intersection_set = NULL;
241 }
242 if (NULL != s->sorted_elements)
243 {
245 s->sorted_elements = NULL;
246 }
247 if (NULL != s->port)
248 {
250 s->port = NULL;
251 }
252 if (NULL != s->channel)
253 {
255 s->channel = NULL;
256 }
257 GNUNET_free (s);
258}
259
260
268static void
270{
272 struct GNUNET_MQ_Envelope *e;
273
274 if (NULL == session->client_mq)
275 return; /* no client left to be notified */
277 "Sending session-end notification with status %d to client for session %s\n",
278 session->status,
279 GNUNET_h2s (&session->session_id));
280 e = GNUNET_MQ_msg (msg,
282 msg->range = 0;
283 msg->product_length = htonl (0);
284 msg->status = htonl (session->status);
285 GNUNET_MQ_send (session->client_mq,
286 e);
287}
288
289
299static void
301 const struct GNUNET_CADET_Channel *channel)
302{
303 struct BobServiceSession *s = cls;
304
306 "Peer disconnected, terminating session %s with peer %s\n",
307 GNUNET_h2s (&s->session_id),
308 GNUNET_i2s (&s->peer));
309 s->channel = NULL;
311 {
314 }
316}
317
318
323static void
325{
326 struct BobServiceSession *session = cls;
327
330}
331
332
338static void
340{
342 struct GNUNET_MQ_Envelope *e;
343
345 "Sending response to Alice\n");
346 e = GNUNET_MQ_msg (msg,
348 msg->contained_element_count = htonl (2);
349 msg->prod_g_i_b_i = s->prod_g_i_b_i;
350 msg->prod_h_i_b_i = s->prod_h_i_b_i;
353 s);
355 e);
356}
357
358
367static int
369 const struct GNUNET_HashCode *key,
370 void *value)
371{
372 struct BobServiceSession *s = cls;
374
376 e->value);
379 return GNUNET_OK;
380}
381
382
391static int
392element_cmp (const void *a,
393 const void *b)
394{
395 const struct MpiElement *ma = a;
396 const struct MpiElement *mb = b;
397
398 return GNUNET_CRYPTO_hash_cmp (ma->key,
399 mb->key);
400}
401
402
412static int
414 const struct EccAliceCryptodataMessage *msg)
415{
416 struct BobServiceSession *s = cls;
417 uint32_t contained_elements;
418 size_t msg_length;
419 uint16_t msize;
420 unsigned int max;
421
422 msize = ntohs (msg->header.size);
423 if (msize <= sizeof(struct EccAliceCryptodataMessage))
424 {
425 GNUNET_break_op (0);
426 return GNUNET_SYSERR;
427 }
428 contained_elements = ntohl (msg->contained_element_count);
429 /* Our intersection may still be ongoing, but this is nevertheless
430 an upper bound on the required array size */
431 max = GNUNET_CONTAINER_multihashmap_size (s->intersected_elements);
432 msg_length = sizeof(struct EccAliceCryptodataMessage)
433 + contained_elements * sizeof(struct GNUNET_CRYPTO_EccPoint) * 2;
434 if ((msize != msg_length) ||
435 (0 == contained_elements) ||
436 (contained_elements > UINT16_MAX) ||
437 (max < contained_elements + s->cadet_received_element_count))
438 {
439 GNUNET_break_op (0);
440 return GNUNET_SYSERR;
441 }
442 return GNUNET_OK;
443}
444
445
453static void
455 const struct EccAliceCryptodataMessage *msg)
456{
457 struct BobServiceSession *s = cls;
458 const struct GNUNET_CRYPTO_EccPoint *payload;
459 uint32_t contained_elements;
460 unsigned int max;
461 const struct GNUNET_CRYPTO_EccPoint *g_i;
462 const struct GNUNET_CRYPTO_EccPoint *h_i;
463 struct GNUNET_CRYPTO_EccPoint g_i_b_i;
464 struct GNUNET_CRYPTO_EccPoint h_i_b_i;
465
466 contained_elements = ntohl (msg->contained_element_count);
468 /* sort our vector for the computation */
469 if (NULL == s->sorted_elements)
470 {
474 struct MpiElement);
475 s->used_element_count = 0;
478 s);
479 qsort (s->sorted_elements,
481 sizeof(struct MpiElement),
482 &element_cmp);
483 }
484
486 "Received %u crypto values from Alice\n",
487 (unsigned int) contained_elements);
488 payload = (const struct GNUNET_CRYPTO_EccPoint *) &msg[1];
489
490 for (unsigned int i = 0; i < contained_elements; i++)
491 {
492 int64_t val = s->sorted_elements[i + s->cadet_received_element_count].value;
493 struct GNUNET_CRYPTO_EccScalar vali;
494
495 GNUNET_assert (INT64_MIN != val);
496 GNUNET_CRYPTO_ecc_scalar_from_int (val > 0 ? val : -val,
497 &vali);
498 if (val < 0)
499 crypto_core_ed25519_scalar_negate (vali.v,
500 vali.v);
501 g_i = &payload[i * 2];
502 /* g_i_b_i = g_i^vali */
505 &vali,
506 &g_i_b_i));
507 h_i = &payload[i * 2 + 1];
508 /* h_i_b_i = h_i^vali */
511 &vali,
512 &h_i_b_i));
513 if (0 == i + s->cadet_received_element_count)
514 {
515 /* first iteration, nothing to add */
516 s->prod_g_i_b_i = g_i_b_i;
517 s->prod_h_i_b_i = h_i_b_i;
518 }
519 else
520 {
521 /* further iterations, cummulate resulting value */
524 &g_i_b_i,
525 &s->prod_g_i_b_i));
528 &h_i_b_i,
529 &s->prod_h_i_b_i));
530 }
531 }
532 s->cadet_received_element_count += contained_elements;
533 if ((s->cadet_received_element_count == max) &&
534 (NULL == s->intersection_op))
535 {
536 /* intersection has finished also on our side, and
537 we got the full set, so we can proceed with the
538 CADET response(s) */
540 }
542}
543
544
554static void
556 const struct GNUNET_SETI_Element *element,
557 uint64_t current_size,
559{
560 struct BobServiceSession *s = cls;
562
563 switch (status)
564 {
566 /* this element has been removed from the set */
568 element->data);
569 GNUNET_assert (NULL != se);
571 "Removed element with key %s and value %lld\n",
572 GNUNET_h2s (&se->key),
573 (long long) GNUNET_ntohll (se->value));
577 element->data,
578 se));
579 GNUNET_free (se);
580 return;
582 s->intersection_op = NULL;
583 GNUNET_break (NULL == s->intersection_set);
586 "Finished intersection, %d items remain\n",
590 {
591 /* CADET transmission from Alice is also already done,
592 start with our own reply */
594 }
595 return;
597 /* unhandled status code */
599 "Set intersection failed!\n");
600 s->intersection_op = NULL;
601 if (NULL != s->intersection_set)
602 {
604 s->intersection_set = NULL;
605 }
608 return;
609
610 default:
611 GNUNET_break (0);
612 return;
613 }
614}
615
616
623static void
625{
626 struct GNUNET_HashCode set_sid;
627
629 sizeof(struct GNUNET_HashCode),
630 &set_sid);
632 "Got session with key %s and %u elements, starting intersection.\n",
634 (unsigned int) s->total);
635
638 &set_sid,
639 NULL,
640 (struct GNUNET_SETI_Option[]) { { 0 } },
642 s);
643 if (GNUNET_OK !=
644 GNUNET_SETI_commit (s->intersection_op,
645 s->intersection_set))
646 {
647 GNUNET_break (0);
650 return;
651 }
652 GNUNET_SETI_destroy (s->intersection_set);
653 s->intersection_set = NULL;
654}
655
656
663static void
665 const struct EccServiceRequestMessage *msg)
666{
667 struct BobServiceSession *s = cls;
668
669 s->session_id = msg->session_id; // ??
670 if (s->client_received_element_count < s->total)
671 {
673 "Alice ready, still waiting for Bob client data!\n");
674 return;
675 }
677 "Both ready, launching intersection!\n");
679}
680
681
692static void *
695 const struct GNUNET_PeerIdentity *initiator)
696{
697 struct BobServiceSession *s = cls;
698
700 "New incoming channel from peer %s.\n",
701 GNUNET_i2s (initiator));
703 s->port = NULL;
704 s->peer = *initiator;
705 s->channel = channel;
706 s->cadet_mq = GNUNET_CADET_get_mq (s->channel);
707 return s;
708}
709
710
718static int
720 void *cls,
722{
723 struct BobServiceSession *s = cls;
724 uint32_t contained_count;
725 uint16_t msize;
726
727 msize = ntohs (msg->header.size);
728 contained_count = ntohl (msg->element_count_contained);
729 if ((msize != (sizeof(struct ComputationBobCryptodataMultipartMessage)
730 + contained_count * sizeof(struct
732 (0 == contained_count) ||
733 (UINT16_MAX < contained_count) ||
734 (s->total == s->client_received_element_count) ||
735 (s->total < s->client_received_element_count + contained_count))
736 {
737 GNUNET_break (0);
738 return GNUNET_SYSERR;
739 }
740 return GNUNET_OK;
741}
742
743
751static void
753 void *cls,
755{
756 struct BobServiceSession *s = cls;
757 uint32_t contained_count;
758 const struct GNUNET_SCALARPRODUCT_Element *elements;
759 struct GNUNET_SETI_Element set_elem;
760 struct GNUNET_SCALARPRODUCT_Element *elem;
761
762 contained_count = ntohl (msg->element_count_contained);
763 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
764 for (uint32_t i = 0; i < contained_count; i++)
765 {
767 GNUNET_memcpy (elem,
768 &elements[i],
769 sizeof(struct GNUNET_SCALARPRODUCT_Element));
770 if (GNUNET_SYSERR ==
772 &elem->key,
773 elem,
775 {
776 GNUNET_break (0);
777 GNUNET_free (elem);
778 continue;
779 }
780 set_elem.data = &elem->key;
781 set_elem.size = sizeof(elem->key);
782 set_elem.element_type = 0;
784 &set_elem,
785 NULL, NULL);
786 }
787 s->client_received_element_count += contained_count;
790 {
791 /* more to come */
793 "Request still partial, waiting for more client data!\n");
794 return;
795 }
796 if (NULL == s->channel)
797 {
798 /* no Alice waiting for this request, wait for Alice */
800 "Client ready, still waiting for Alice!\n");
801 return;
802 }
804 "Both ready, launching intersection!\n");
806}
807
808
817static int
819 const struct BobComputationMessage *msg)
820{
821 struct BobServiceSession *s = cls;
822 uint32_t contained_count;
823 uint32_t total_count;
824 uint16_t msize;
825
826 if (GNUNET_SCALARPRODUCT_STATUS_INIT != s->status)
827 {
828 GNUNET_break (0);
829 return GNUNET_SYSERR;
830 }
831 msize = ntohs (msg->header.size);
832 total_count = ntohl (msg->element_count_total);
833 contained_count = ntohl (msg->element_count_contained);
834 if ((0 == total_count) ||
835 (0 == contained_count) ||
836 (UINT16_MAX < contained_count) ||
837 (msize != (sizeof(struct BobComputationMessage)
838 + contained_count * sizeof(struct
840 {
841 GNUNET_break_op (0);
842 return GNUNET_SYSERR;
843 }
844 return GNUNET_OK;
845}
846
847
856static void
858 const struct BobComputationMessage *msg)
859{
860 struct BobServiceSession *s = cls;
861 struct GNUNET_MQ_MessageHandler cadet_handlers[] = {
862 GNUNET_MQ_hd_fixed_size (alices_computation_request,
865 s),
866 GNUNET_MQ_hd_var_size (alices_cryptodata_message,
869 s),
871 };
872 uint32_t contained_count;
873 uint32_t total_count;
874 const struct GNUNET_SCALARPRODUCT_Element *elements;
875 struct GNUNET_SETI_Element set_elem;
876 struct GNUNET_SCALARPRODUCT_Element *elem;
877
878 total_count = ntohl (msg->element_count_total);
879 contained_count = ntohl (msg->element_count_contained);
880
882 s->total = total_count;
883 s->client_received_element_count = contained_count;
884 s->session_id = msg->session_key;
885 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
888 GNUNET_YES);
890 for (uint32_t i = 0; i < contained_count; i++)
891 {
892 if (0 == GNUNET_ntohll (elements[i].value))
893 continue;
895 GNUNET_memcpy (elem,
896 &elements[i],
897 sizeof(struct GNUNET_SCALARPRODUCT_Element));
898 if (GNUNET_SYSERR ==
900 &elem->key,
901 elem,
903 {
904 GNUNET_break (0);
905 GNUNET_free (elem);
906 continue;
907 }
908 set_elem.data = &elem->key;
909 set_elem.size = sizeof(elem->key);
910 set_elem.element_type = 0;
912 &set_elem,
913 NULL, NULL);
915 }
918 "Received client request, opening port %s!\n",
919 GNUNET_h2s (&msg->session_key));
921 &msg->session_key,
923 s,
924 NULL,
926 cadet_handlers);
927 if (NULL == s->port)
928 {
929 GNUNET_break (0);
931 return;
932 }
933}
934
935
941static void
942shutdown_task (void *cls)
943{
945 "Shutting down, initiating cleanup.\n");
946 // FIXME: we have to cut our connections to CADET first!
947 if (NULL != my_cadet)
948 {
950 my_cadet = NULL;
951 }
952 if (NULL != edc)
953 {
955 edc = NULL;
956 }
957}
958
959
970static void *
972 struct GNUNET_SERVICE_Client *client,
973 struct GNUNET_MQ_Handle *mq)
974{
975 struct BobServiceSession *s;
976
977 s = GNUNET_new (struct BobServiceSession);
978 s->client = client;
979 s->client_mq = mq;
980 return s;
981}
982
983
994static void
997 void *app_cls)
998{
999 struct BobServiceSession *s = app_cls;
1000
1002 "Client disconnected from us.\n");
1003 s->client = NULL;
1005}
1006
1007
1015static void
1016run (void *cls,
1017 const struct GNUNET_CONFIGURATION_Handle *c,
1019{
1020 cfg = c;
1021 /* We don't really do DLOG, so we can setup with very minimal resources */
1022 edc = GNUNET_CRYPTO_ecc_dlog_prepare (4 /* max value */,
1023 2 /* RAM */);
1026 NULL);
1027 if (NULL == my_cadet)
1028 {
1030 _ ("Connect to CADET failed\n"));
1032 return;
1033 }
1034}
1035
1036
1042 "scalarproduct-bob",
1044 &run,
1047 NULL,
1048 GNUNET_MQ_hd_var_size (bob_client_message,
1050 struct BobComputationMessage,
1051 NULL),
1052 GNUNET_MQ_hd_var_size (bob_client_message_multipart,
1055 NULL),
1057
1058
1059/* end of gnunet-service-scalarproduct-ecc_bob.c */
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
struct GNUNET_HashCode key
The key used in the DHT.
static char * value
Value of the record to add/remove.
static int status
The program status; 0 for success.
Definition: gnunet-nse.c:39
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
static unsigned long long payload
How much data are we currently storing in the database?
scalarproduct service P2P messages
static void handle_bob_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
static struct GNUNET_CRYPTO_EccDlogContext * edc
Context for DLOG operations on a curve.
static int check_alices_cryptodata_message(void *cls, const struct EccAliceCryptodataMessage *msg)
Check a multipart-chunk of a request from another service to calculate a scalarproduct with us.
static void start_intersection(struct BobServiceSession *s)
We've paired up a client session with an incoming CADET request.
static void * cb_channel_incoming(void *cls, struct GNUNET_CADET_Channel *channel, const struct GNUNET_PeerIdentity *initiator)
Function called for inbound channels on Bob's end.
static struct GNUNET_CADET_Handle * my_cadet
Handle to the CADET service.
static const struct GNUNET_CONFIGURATION_Handle * cfg
GNUnet configuration handle.
static int check_bob_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
static void prepare_client_end_notification(struct BobServiceSession *session)
Notify the client that the session has succeeded or failed.
static void transmit_bobs_cryptodata_message(struct BobServiceSession *s)
Bob generates the response message to be sent to Alice.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_cls)
A client disconnected.
static void shutdown_task(void *cls)
Task run during shutdown.
static void bob_cadet_done_cb(void *cls)
MQ finished giving our last message to CADET, now notify the client that we are finished.
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
A client connected.
static void handle_alices_computation_request(void *cls, const struct EccServiceRequestMessage *msg)
Handle a request from Alice to calculate a scalarproduct with us (Bob).
static void destroy_service_session(struct BobServiceSession *s)
Destroy session state, we are done with it.
GNUNET_SERVICE_MAIN(GNUNET_OS_project_data_gnunet(), "scalarproduct-bob", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_var_size(bob_client_message, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB, struct BobComputationMessage, NULL), GNUNET_MQ_hd_var_size(bob_client_message_multipart, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB, struct ComputationBobCryptodataMultipartMessage, NULL), GNUNET_MQ_handler_end())
Define "main" method using service macro.
static void handle_bob_client_message(void *cls, const struct BobComputationMessage *msg)
Handler for Bob's a client request message.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
Initialization of the program and message handlers.
static void handle_alices_cryptodata_message(void *cls, const struct EccAliceCryptodataMessage *msg)
Handle a multipart-chunk of a request from another service to calculate a scalarproduct with us.
static int check_bob_client_message(void *cls, const struct BobComputationMessage *msg)
Handler for Bob's a client request message.
static void cb_channel_destruction(void *cls, const struct GNUNET_CADET_Channel *channel)
Function called whenever a channel is destroyed.
static int element_cmp(const void *a, const void *b)
Compare two struct MpiValues by key for sorting.
#define LOG(kind,...)
static int copy_element_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator to copy over messages from the hash map into an array for sorting.
static void cb_intersection_element_removed(void *cls, const struct GNUNET_SETI_Element *element, uint64_t current_size, enum GNUNET_SETI_Status status)
Callback for set operation results.
static int free_element_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Callback used to free the elements in the map.
CADET service; establish channels to distant peers.
Constants for network protocols.
Two-peer set intersection operations.
struct GNUNET_CADET_Handle * GNUNET_CADET_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the MQ-based cadet service.
Definition: cadet_api.c:897
void GNUNET_CADET_receive_done(struct GNUNET_CADET_Channel *channel)
Indicate readiness to receive the next message on a channel.
Definition: cadet_api.c:875
void GNUNET_CADET_channel_destroy(struct GNUNET_CADET_Channel *channel)
Destroy an existing channel.
Definition: cadet_api.c:833
struct GNUNET_MQ_Handle * GNUNET_CADET_get_mq(const struct GNUNET_CADET_Channel *channel)
Obtain the message queue for a connected channel.
Definition: cadet_api.c:1081
struct GNUNET_CADET_Port * GNUNET_CADET_open_port(struct GNUNET_CADET_Handle *h, const struct GNUNET_HashCode *port, GNUNET_CADET_ConnectEventHandler connects, void *connects_cls, GNUNET_CADET_WindowSizeEventHandler window_changes, GNUNET_CADET_DisconnectEventHandler disconnects, const struct GNUNET_MQ_MessageHandler *handlers)
Open a port to receive incoming MQ-based channels.
Definition: cadet_api.c:966
void GNUNET_CADET_disconnect(struct GNUNET_CADET_Handle *handle)
Disconnect from the cadet service.
Definition: cadet_api.c:777
void GNUNET_CADET_close_port(struct GNUNET_CADET_Port *p)
Close a port opened with GNUNET_CADET_open_port.
Definition: cadet_api.c:804
void GNUNET_CRYPTO_hash(const void *block, size_t size, struct GNUNET_HashCode *ret)
Compute hash of a given block.
Definition: crypto_hash.c:41
int GNUNET_CRYPTO_hash_cmp(const struct GNUNET_HashCode *h1, const struct GNUNET_HashCode *h2)
Compare function for HashCodes, producing a total ordering of all hashcodes.
Definition: crypto_hash.c:218
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MultiHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
void * GNUNET_CONTAINER_multihashmap_get(const struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key)
Given a key find a value in the map matching the key.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_remove(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, const void *value)
Remove the given key-value pair from the map.
enum GNUNET_GenericReturnValue GNUNET_CONTAINER_multihashmap_put(struct GNUNET_CONTAINER_MultiHashMap *map, const struct GNUNET_HashCode *key, void *value, enum GNUNET_CONTAINER_MultiHashMapOption opt)
Store a key-value pair in the map.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
@ GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY
There must only be one value per key; storing a value should fail if a value under the same key alrea...
#define GNUNET_log(kind,...)
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecc_pmul_mpi(const struct GNUNET_CRYPTO_EccPoint *p, const struct GNUNET_CRYPTO_EccScalar *val, struct GNUNET_CRYPTO_EccPoint *r)
Multiply the point p on the elliptic curve by val.
void GNUNET_CRYPTO_ecc_scalar_from_int(int64_t val, struct GNUNET_CRYPTO_EccScalar *r)
Create a scalar from int value.
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:54
void GNUNET_CRYPTO_ecc_dlog_release(struct GNUNET_CRYPTO_EccDlogContext *dlc)
Release precalculated values.
struct GNUNET_CRYPTO_EccDlogContext * GNUNET_CRYPTO_ecc_dlog_prepare(unsigned int max, unsigned int mem)
Do pre-calculation for ECC discrete logarithm for small factors.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecc_add(const struct GNUNET_CRYPTO_EccPoint *a, const struct GNUNET_CRYPTO_EccPoint *b, struct GNUNET_CRYPTO_EccPoint *r)
Add two points on the elliptic curve.
@ GNUNET_OK
@ GNUNET_YES
@ GNUNET_SYSERR
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_ERROR
@ GNUNET_ERROR_TYPE_DEBUG
#define GNUNET_new(type)
Allocate a struct or union of the given type.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
#define GNUNET_free(ptr)
Wrapper around free.
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
Definition: mq.c:305
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:76
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
void GNUNET_MQ_notify_sent(struct GNUNET_MQ_Envelope *ev, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Call a callback once the envelope has been sent, that is, sending it can not be canceled anymore.
Definition: mq.c:655
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
const struct GNUNET_OS_ProjectData * GNUNET_OS_project_data_gnunet(void)
Return default project data used by 'libgnunetutil' for GNUnet.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_RESULT
Alice/Bob -> Client Result.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION
Alice -> Bob ECC session initialization.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_BOB
Client -> Bob.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA
Bob -> Alice ECC crypto data.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_BOB
Client -> Bob multipart.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA
Alice -> Bob ECC crypto data.
GNUNET_SCALARPRODUCT_ResponseStatus
Result status values for the computation.
@ GNUNET_SCALARPRODUCT_STATUS_INIT
Operation is still active (never returned, used internally).
@ GNUNET_SCALARPRODUCT_STATUS_SUCCESS
The computation was successful.
@ GNUNET_SCALARPRODUCT_STATUS_ACTIVE
Operation is still active (never returned, used internally).
@ GNUNET_SCALARPRODUCT_STATUS_FAILURE
We encountered some error.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
Definition: scheduler.c:567
struct GNUNET_SCHEDULER_Task * GNUNET_SCHEDULER_add_shutdown(GNUNET_SCHEDULER_TaskCallback task, void *task_cls)
Schedule a new task to be run on shutdown, that is when a CTRL-C signal is received,...
Definition: scheduler.c:1339
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition: service.c:2418
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2389
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
GNUNET_SETI_Status
Status for the result callback.
void GNUNET_SETI_destroy(struct GNUNET_SETI_Handle *set)
Destroy the set handle, and free all associated resources.
Definition: seti_api.c:488
int GNUNET_SETI_add_element(struct GNUNET_SETI_Handle *set, const struct GNUNET_SETI_Element *element, GNUNET_SCHEDULER_TaskCallback cb, void *cb_cls)
Add an element to the given set.
Definition: seti_api.c:447
int GNUNET_SETI_commit(struct GNUNET_SETI_OperationHandle *oh, struct GNUNET_SETI_Handle *set)
Commit a set to be used with a set operation.
Definition: seti_api.c:810
struct GNUNET_SETI_OperationHandle * GNUNET_SETI_prepare(const struct GNUNET_PeerIdentity *other_peer, const struct GNUNET_HashCode *app_id, const struct GNUNET_MessageHeader *context_msg, const struct GNUNET_SETI_Option options[], GNUNET_SETI_ResultIterator result_cb, void *result_cls)
Prepare a set operation to be evaluated with another peer.
Definition: seti_api.c:513
struct GNUNET_SETI_Handle * GNUNET_SETI_create(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create an empty set, supporting the specified operation.
Definition: seti_api.c:399
void GNUNET_SETI_operation_cancel(struct GNUNET_SETI_OperationHandle *oh)
Cancel the given set operation.
Definition: seti_api.c:335
@ GNUNET_SETI_STATUS_DONE
Success, all elements have been sent (and received).
@ GNUNET_SETI_STATUS_FAILURE
The other peer refused to do the operation with us, or something went wrong.
@ GNUNET_SETI_STATUS_DEL_LOCAL
Element should be delete from the result set of the local peer, i.e.
#define max(x, y)
#define _(String)
GNU gettext support macro.
Definition: platform.h:178
Scalar Product API Message Types.
Message type passed from client to service to initiate a request or responder role.
Definition: scalarproduct.h:89
A scalarproduct session which tracks an offer for a multiplication service by a local client.
struct GNUNET_HashCode session_id
(hopefully) unique transaction ID
struct MpiElement * sorted_elements
b(Bob)
struct GNUNET_CADET_Port * port
Our open port.
struct GNUNET_CADET_Channel * channel
The CADET channel.
uint32_t total
How many elements will be supplied in total from the client.
struct GNUNET_SETI_OperationHandle * intersection_op
Set of elements for which will conduction an intersection.
uint32_t cadet_received_element_count
Counts the number of values received from Alice by us.
struct GNUNET_CONTAINER_MultiHashMap * intersected_elements
All non-0-value'd elements transmitted to us.
struct GNUNET_MQ_Handle * cadet_mq
The message queue for this channel.
struct GNUNET_CRYPTO_EccPoint prod_h_i_b_i
Product of the h_i^{b_i}.
struct GNUNET_SERVICE_Client * client
The client this request is related to.
uint32_t used_element_count
How many elements actually are used for the scalar product.
struct GNUNET_CRYPTO_PaillierCiphertext s
Bob's "s".
struct GNUNET_SETI_Handle * intersection_set
Set of elements for which we will be conducting an intersection.
struct GNUNET_CRYPTO_EccPoint prod_g_i_b_i
Product of the g_i^{b_i}.
enum GNUNET_SCALARPRODUCT_ResponseStatus status
State of this session.
int in_destroy
Are we already in destroy_service_session()?
struct GNUNET_PeerIdentity peer
Originator's peer identity.
uint32_t client_received_element_count
Already transferred elements (received) for multipart messages from client.
struct GNUNET_MQ_Handle * client_mq
Client message queue.
Message type passed from service client to finalize a session as requester or responder.
multipart messages following struct ComputationMessage
Vector of ECC-encrypted values sent by Alice to Bob (after set intersection).
Message type passed from responding service Bob to responding service Alice to complete a request and...
Message type passed from requesting service Alice to responding service Bob to initiate a request and...
Opaque handle to a channel.
Definition: cadet.h:116
Opaque handle to the service.
Definition: cadet_api.c:39
Opaque handle to a port.
Definition: cadet_api.c:80
Internal representation of the hash map.
Internal structure used to cache pre-calculated values for DLOG calculation.
Point on a curve (always for Curve25519) encoded in a format suitable for network transmission (ECDH)...
A ECC scalar for use in point multiplications.
unsigned char v[256/8]
A 512-bit hashcode.
Handle to a message queue.
Definition: mq.c:87
Message handler for a specific message type.
The identity of the host (wraps the signing key of the peer).
An element key-value pair for scalarproduct.
struct GNUNET_HashCode key
Key used to identify matching pairs of values to multiply.
int64_t value
Value to multiply in scalar product, in NBO.
Handle to a client that is connected to a service.
Definition: service.c:249
Handle to a service.
Definition: service.c:116
Element stored in a set.
const void * data
Actual data of the element.
uint16_t element_type
Application-specific element type.
uint16_t size
Number of bytes in the buffer pointed to by data.
Opaque handle to a set.
Definition: seti_api.c:40
Handle to an operation.
Definition: seti_api.c:106
Option for set operations.
An encrypted element key-value pair.
const struct GNUNET_HashCode * key
Key used to identify matching pairs of values to multiply.
int64_t value
a_i value, not disclosed to Bob.