GNUnet debian-0.24.3-28-g4f2a77692
 
Loading...
Searching...
No Matches
gnunet-service-scalarproduct-ecc_alice.c File Reference

scalarproduct service implementation More...

#include "platform.h"
#include <limits.h>
#include <gcrypt.h>
#include "gnunet_util_lib.h"
#include "gnunet_cadet_service.h"
#include "gnunet_protocols.h"
#include "gnunet_scalarproduct_service.h"
#include "gnunet_seti_service.h"
#include "scalarproduct.h"
#include "gnunet-service-scalarproduct-ecc.h"
#include "gnunet_constants.h"
Include dependency graph for gnunet-service-scalarproduct-ecc_alice.c:

Go to the source code of this file.

Data Structures

struct  MpiElement
 An encrypted element key-value pair. More...
 
struct  AliceServiceSession
 A scalarproduct session which tracks a request form the client to our final response. More...
 

Macros

#define LOG(kind, ...)    GNUNET_log_from (kind, "scalarproduct-alice", __VA_ARGS__)
 
#define MAX_RESULT   (1024 * 1024)
 Maximum allowed result value for the scalarproduct computation.
 
#define MAX_RAM   (1024)
 How many values should DLOG store in memory (determines baseline RAM consumption, roughly 100 bytes times the value given here).
 
#define ELEMENT_CAPACITY
 Maximum number of elements we can put into a single cryptodata message.
 

Functions

static int free_element_cb (void *cls, const struct GNUNET_HashCode *key, void *value)
 Iterator called to free elements.
 
static void destroy_service_session (struct AliceServiceSession *s)
 Destroy session state, we are done with it.
 
static void prepare_client_end_notification (struct AliceServiceSession *session)
 Notify the client that the session has failed.
 
static void transmit_client_response (struct AliceServiceSession *s)
 Prepare the final (positive) response we will send to Alice's client.
 
static void cb_channel_destruction (void *cls, const struct GNUNET_CADET_Channel *channel)
 Function called whenever a channel is destroyed.
 
static void handle_bobs_cryptodata_message (void *cls, const struct EccBobCryptodataMessage *msg)
 Handle a response we got from another service we wanted to calculate a scalarproduct with.
 
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 int element_cmp (const void *a, const void *b)
 Compare two struct MpiValues by key for sorting.
 
static void send_alices_cryptodata_message (struct AliceServiceSession *s)
 Send the cryptographic data from Alice to Bob.
 
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 void cb_intersection_request_alice (void *cls, const struct GNUNET_PeerIdentity *other_peer, const struct GNUNET_MessageHeader *context_msg, struct GNUNET_SETI_Request *request)
 Called when another peer wants to do a set operation with the local peer.
 
static void client_request_complete_alice (struct AliceServiceSession *s)
 Our client has finished sending us its multipart message.
 
static int check_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
 We're receiving additional set data.
 
static void handle_alice_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
 We're receiving additional set data.
 
static int check_alice_client_message (void *cls, const struct AliceComputationMessage *msg)
 Handler for Alice's client request message.
 
static void handle_alice_client_message (void *cls, const struct AliceComputationMessage *msg)
 Handler for Alice's client request message.
 
static void shutdown_task (void *cls)
 Task run during shutdown.
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 A client connected.
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_cls)
 A client disconnected.
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Initialization of the program and message handlers.
 
 GNUNET_SERVICE_MAIN (GNUNET_OS_project_data_gnunet(), "scalarproduct-alice", GNUNET_SERVICE_OPTION_NONE, &run, &client_connect_cb, &client_disconnect_cb, NULL, GNUNET_MQ_hd_var_size(alice_client_message, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE, struct AliceComputationMessage, NULL), GNUNET_MQ_hd_var_size(alice_client_message_multipart, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, struct ComputationBobCryptodataMultipartMessage, NULL), GNUNET_MQ_handler_end())
 Define "main" method using service macro.
 

Variables

static const struct GNUNET_CONFIGURATION_Handlecfg
 GNUnet configuration handle.
 
static struct GNUNET_CRYPTO_EccDlogContextedc
 Context for DLOG operations on a curve.
 
static struct GNUNET_CRYPTO_EccScalar my_privkey
 Alice's private key ('a').
 
static struct GNUNET_CRYPTO_EccScalar my_privkey_inv
 Inverse of Alice's private key ('a_inv').
 
static struct GNUNET_CADET_Handlemy_cadet
 Handle to the CADET service.
 

Detailed Description

scalarproduct service implementation

Author
Christian M. Fuchs
Christian Grothoff

Definition in file gnunet-service-scalarproduct-ecc_alice.c.

Macro Definition Documentation

◆ LOG

#define LOG (   kind,
  ... 
)     GNUNET_log_from (kind, "scalarproduct-alice", __VA_ARGS__)

Definition at line 38 of file gnunet-service-scalarproduct-ecc_alice.c.

59{
65 const struct GNUNET_HashCode *key;
66
70 int64_t value;
71};
72
73
79{
84
89
94
99
104
110
116
122
127
132
137
141 int product;
142
147 uint32_t total;
148
154 uint32_t used_element_count;
155
161
169
174 int in_destroy;
175};
176
177
181static const struct GNUNET_CONFIGURATION_Handle *cfg;
182
186static struct GNUNET_CRYPTO_EccDlogContext *edc;
187
192
197
201static struct GNUNET_CADET_Handle *my_cadet;
202
203
212static int
213free_element_cb (void *cls,
214 const struct GNUNET_HashCode *key,
215 void *value)
216{
218
219 GNUNET_free (e);
220 return GNUNET_OK;
221}
222
223
229static void
231{
232 if (GNUNET_YES == s->in_destroy)
233 return;
235 if (NULL != s->client)
236 {
237 struct GNUNET_SERVICE_Client *c = s->client;
238
239 s->client = NULL;
241 }
242 if (NULL != s->channel)
243 {
245 s->channel = NULL;
246 }
247 if (NULL != s->intersected_elements)
248 {
251 s);
253 s->intersected_elements = NULL;
254 }
255 if (NULL != s->intersection_listen)
256 {
258 s->intersection_listen = NULL;
259 }
260 if (NULL != s->intersection_op)
261 {
263 "Set intersection, op still ongoing!\n");
265 s->intersection_op = NULL;
266 }
267 if (NULL != s->intersection_set)
268 {
270 s->intersection_set = NULL;
271 }
272 if (NULL != s->sorted_elements)
273 {
275 s->sorted_elements = NULL;
276 }
277 GNUNET_free (s);
278}
279
280
287static void
289{
291 struct GNUNET_MQ_Envelope *e;
292
293 if (NULL == session->client_mq)
294 return; /* no client left to be notified */
295 GNUNET_log (
297 "Sending session-end notification with status %d to client for session %s\n",
298 session->status,
299 GNUNET_h2s (&session->session_id));
300 e = GNUNET_MQ_msg (msg,
302 msg->product_length = htonl (0);
303 msg->status = htonl (session->status);
304 GNUNET_MQ_send (session->client_mq,
305 e);
306}
307
308
315static void
317{
319 struct GNUNET_MQ_Envelope *e;
320 unsigned char *product_exported = NULL;
321 size_t product_length = 0;
322 int32_t range;
323 gcry_error_t rc;
324 gcry_mpi_t value;
325
326 if (INT_MAX == s->product)
327 {
328 GNUNET_break (0);
330 return;
331 }
332 value = gcry_mpi_new (32);
333 if (0 > s->product)
334 {
335 range = -1;
336 gcry_mpi_set_ui (value,
337 -s->product);
338 }
339 else if (0 < s->product)
340 {
341 range = 1;
342 gcry_mpi_set_ui (value,
343 s->product);
344 }
345 else
346 {
347 /* result is exactly zero */
348 range = 0;
349 }
350 if ( (0 != range) &&
351 (0 != (rc = gcry_mpi_aprint (GCRYMPI_FMT_STD,
352 &product_exported,
353 &product_length,
354 value))))
355 {
357 "gcry_mpi_scan",
358 rc);
360 return;
361 }
362 gcry_mpi_release (value);
364 product_length,
367 msg->range = htonl (range);
368 msg->product_length = htonl (product_length);
369 if (NULL != product_exported)
370 {
371 GNUNET_memcpy (&msg[1],
372 product_exported,
373 product_length);
374 GNUNET_free (product_exported);
375 }
377 e);
379 "Sent result to client, session %s has ended!\n",
380 GNUNET_h2s (&s->session_id));
381}
382
383
393static void
394cb_channel_destruction (void *cls,
395 const struct GNUNET_CADET_Channel *channel)
396{
397 struct AliceServiceSession *s = cls;
398
400 "Peer disconnected, terminating session %s with peer %s\n",
401 GNUNET_h2s (&s->session_id),
402 GNUNET_i2s (&s->peer));
403 s->channel = NULL;
405 {
406 /* We didn't get an answer yet, fail with error */
409 }
410}
411
412
420static void
422 const struct EccBobCryptodataMessage *msg)
423{
424 struct AliceServiceSession *s = cls;
425 uint32_t contained;
426
427 contained = ntohl (msg->contained_element_count);
428 if (2 != contained)
429 {
430 GNUNET_break_op (0);
432 return;
433 }
434 if (NULL == s->sorted_elements)
435 {
436 /* we're not ready yet, how can Bob be? */
437 GNUNET_break_op (0);
439 return;
440 }
441 if (s->total != s->client_received_element_count)
442 {
443 /* we're not ready yet, how can Bob be? */
444 GNUNET_break_op (0);
446 return;
447 }
449 "Received %u crypto values from Bob\n",
450 (unsigned int) contained);
451 GNUNET_CADET_receive_done (s->channel);
452 {
453 struct GNUNET_CRYPTO_EccPoint g_i_b_i_a_inv;
454 struct GNUNET_CRYPTO_EccPoint g_ai_bi;
455
457 GNUNET_OK ==
458 GNUNET_CRYPTO_ecc_pmul_mpi (&msg->prod_g_i_b_i,
460 &g_i_b_i_a_inv));
462 GNUNET_OK ==
463 GNUNET_CRYPTO_ecc_add (&g_i_b_i_a_inv,
464 &msg->prod_h_i_b_i,
465 &g_ai_bi));
467 &g_ai_bi);
468 if (INT_MAX == s->product)
469 {
470 /* result too big */
472 "Scalar product result out of range\n");
473 }
474 }
476}
477
478
487static int
488copy_element_cb (void *cls,
489 const struct GNUNET_HashCode *key,
490 void *value)
491{
492 struct AliceServiceSession *s = cls;
494
496 e->value);
499 return GNUNET_OK;
500}
501
502
510static int
511element_cmp (const void *a,
512 const void *b)
513{
514 const struct MpiElement *ma = a;
515 const struct MpiElement *mb = b;
516
517 return GNUNET_CRYPTO_hash_cmp (ma->key,
518 mb->key);
519}
520
521
526#define ELEMENT_CAPACITY \
527 ((GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE - 1 \
528 - sizeof(struct EccAliceCryptodataMessage)) \
529 / sizeof(struct GNUNET_CRYPTO_EccPoint))
530
531
538static void
540{
542 struct GNUNET_MQ_Envelope *e;
544 struct GNUNET_CRYPTO_EccScalar r_ia;
545 struct GNUNET_CRYPTO_EccScalar r_ia_ai;
546 unsigned int off;
547 unsigned int todo_count;
548
551 struct MpiElement);
552 s->used_element_count = 0;
555 s);
557 "Finished intersection, %d items remain\n",
559 qsort (s->sorted_elements,
561 sizeof(struct MpiElement),
562 &element_cmp);
563 off = 0;
564 while (off < s->used_element_count)
565 {
566 todo_count = s->used_element_count - off;
567 if (todo_count > ELEMENT_CAPACITY)
568 todo_count = ELEMENT_CAPACITY;
570 "Sending %u/%u crypto values to Bob\n",
571 (unsigned int) todo_count,
572 (unsigned int) s->used_element_count);
573
574 e =
576 todo_count * 2
577 * sizeof(struct GNUNET_CRYPTO_EccPoint),
579 msg->contained_element_count = htonl (todo_count);
580 payload = (struct GNUNET_CRYPTO_EccPoint *) &msg[1];
581 for (unsigned int i = off; i < off + todo_count; i++)
582 {
583 struct GNUNET_CRYPTO_EccScalar r_i;
584 struct GNUNET_CRYPTO_EccPoint g_i;
585 struct GNUNET_CRYPTO_EccPoint h_i;
586
587 /* r_i = random() mod n */
589 /* g_i = g^{r_i} */
592 &g_i));
593 /* r_ia = r_i * a */
594 crypto_core_ed25519_scalar_mul (r_ia.v,
595 r_i.v,
596 my_privkey.v);
597 /* r_ia_ai = r_ia + a_i */
598 {
599 int64_t val = s->sorted_elements[i].value;
600 struct GNUNET_CRYPTO_EccScalar vali;
601
602 GNUNET_assert (INT64_MIN != val);
603 GNUNET_CRYPTO_ecc_scalar_from_int (val > 0 ? val : -val,
604 &vali);
605 if (val > 0)
606 crypto_core_ed25519_scalar_add (r_ia_ai.v,
607 r_ia.v,
608 vali.v);
609 else
610 crypto_core_ed25519_scalar_sub (r_ia_ai.v,
611 r_ia.v,
612 vali.v);
613 }
614 /* h_i = g^{r_ia_ai} */
617 &h_i));
618 memcpy (&payload[(i - off) * 2],
619 &g_i,
620 sizeof (g_i));
621 memcpy (&payload[(i - off) * 2 + 1],
622 &h_i,
623 sizeof (h_i));
624 }
625 off += todo_count;
627 e);
628 }
629}
630
631
642static void
644 const struct GNUNET_SETI_Element *element,
645 uint64_t current_size,
647{
648 struct AliceServiceSession *s = cls;
650
651 switch (status)
652 {
654 /* this element has been removed from the set */
656 element->data);
657 GNUNET_assert (NULL != se);
659 "Intersection removed element with key %s and value %lld\n",
660 GNUNET_h2s (&se->key),
661 (long long) GNUNET_ntohll (se->value));
663 GNUNET_YES ==
665 element->data,
666 se));
667 GNUNET_free (se);
668 return;
670 s->intersection_op = NULL;
671 if (NULL != s->intersection_set)
672 {
674 s->intersection_set = NULL;
675 }
677 return;
679 /* unhandled status code */
680 LOG (GNUNET_ERROR_TYPE_DEBUG, "Set intersection failed!\n");
681 if (NULL != s->intersection_listen)
682 {
684 s->intersection_listen = NULL;
685 }
686 s->intersection_op = NULL;
687 if (NULL != s->intersection_set)
688 {
690 s->intersection_set = NULL;
691 }
694 return;
695
696 default:
697 GNUNET_break (0);
698 return;
699 }
700}
701
702
718static void
720 const struct GNUNET_PeerIdentity *other_peer,
721 const struct GNUNET_MessageHeader *context_msg,
723{
724 struct AliceServiceSession *s = cls;
725
727 "Received intersection request from %s!\n",
728 GNUNET_i2s (other_peer));
729 if (0 != GNUNET_memcmp (other_peer,
730 &s->peer))
731 {
732 GNUNET_break_op (0);
733 return;
734 }
735 s->intersection_op
737 (struct GNUNET_SETI_Option[]){ { 0 } },
739 s);
740 if (NULL == s->intersection_op)
741 {
742 GNUNET_break (0);
745 return;
746 }
747 if (GNUNET_OK !=
748 GNUNET_SETI_commit (s->intersection_op,
749 s->intersection_set))
750 {
751 GNUNET_break (0);
754 return;
755 }
756}
757
758
764static void
766{
767 struct GNUNET_MQ_MessageHandler cadet_handlers[] = {
768 GNUNET_MQ_hd_fixed_size (bobs_cryptodata_message,
771 s),
773 };
775 struct GNUNET_MQ_Envelope *e;
776 struct GNUNET_HashCode set_sid;
777
779 sizeof(struct GNUNET_HashCode),
780 &set_sid);
782 "Creating new channel for session with key %s.\n",
783 GNUNET_h2s (&s->session_id));
785 s,
786 &s->peer,
787 &s->session_id,
788 NULL,
790 cadet_handlers);
791 if (NULL == s->channel)
792 {
795 return;
796 }
799 &set_sid,
801 s);
802 if (NULL == s->intersection_listen)
803 {
806 s->channel = NULL;
808 return;
809 }
810
811 e =
815 msg->session_id = s->session_id;
816 GNUNET_MQ_send (s->cadet_mq, e);
817}
818
819
828static int
830 void *cls,
832{
833 struct AliceServiceSession *s = cls;
834 uint32_t contained_count;
835 uint16_t msize;
836
837 msize = ntohs (msg->header.size);
838 contained_count = ntohl (msg->element_count_contained);
839 if ((msize !=
841 + contained_count * sizeof(struct GNUNET_SCALARPRODUCT_Element))) ||
842 (0 == contained_count) ||
843 (s->total == s->client_received_element_count) ||
844 (s->total < s->client_received_element_count + contained_count))
845 {
846 GNUNET_break_op (0);
847 return GNUNET_SYSERR;
848 }
849 return GNUNET_OK;
850}
851
852
860static void
862 void *cls,
864{
865 struct AliceServiceSession *s = cls;
866 uint32_t contained_count;
867 const struct GNUNET_SCALARPRODUCT_Element *elements;
868 struct GNUNET_SETI_Element set_elem;
869 struct GNUNET_SCALARPRODUCT_Element *elem;
870
871 contained_count = ntohl (msg->element_count_contained);
872 s->client_received_element_count += contained_count;
873 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
874 for (uint32_t i = 0; i < contained_count; i++)
875 {
877 GNUNET_memcpy (elem,
878 &elements[i],
879 sizeof(struct GNUNET_SCALARPRODUCT_Element));
882 &elem->key,
883 elem,
885 {
886 GNUNET_break (0);
887 GNUNET_free (elem);
888 continue;
889 }
890 set_elem.data = &elem->key;
891 set_elem.size = sizeof(elem->key);
892 set_elem.element_type = 0;
893 GNUNET_SETI_add_element (s->intersection_set, &set_elem, NULL, NULL);
895 }
898 {
899 /* more to come */
901 "Received client multipart data, waiting for more!\n");
902 return;
903 }
904 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Launching computation\n");
906}
907
908
917static int
919 const struct AliceComputationMessage *msg)
920{
921 struct AliceServiceSession *s = cls;
922 uint16_t msize;
923 uint32_t total_count;
924 uint32_t contained_count;
925
926 if (NULL != s->intersected_elements)
927 {
928 /* only one concurrent session per client connection allowed,
929 simplifies logic a lot... */
930 GNUNET_break (0);
931 return GNUNET_SYSERR;
932 }
933 msize = ntohs (msg->header.size);
934 total_count = ntohl (msg->element_count_total);
935 contained_count = ntohl (msg->element_count_contained);
936 if ((0 == total_count) || (0 == contained_count) ||
937 (msize !=
938 (sizeof(struct AliceComputationMessage)
939 + contained_count * sizeof(struct GNUNET_SCALARPRODUCT_Element))))
940 {
941 GNUNET_break_op (0);
942 return GNUNET_SYSERR;
943 }
944 return GNUNET_OK;
945}
946
947
955static void
957 const struct AliceComputationMessage *msg)
958{
959 struct AliceServiceSession *s = cls;
960 uint32_t contained_count;
961 uint32_t total_count;
962 const struct GNUNET_SCALARPRODUCT_Element *elements;
963 struct GNUNET_SETI_Element set_elem;
964 struct GNUNET_SCALARPRODUCT_Element *elem;
965
966 total_count = ntohl (msg->element_count_total);
967 contained_count = ntohl (msg->element_count_contained);
968 s->peer = msg->peer;
970 s->total = total_count;
971 s->client_received_element_count = contained_count;
972 s->session_id = msg->session_key;
973 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
976 GNUNET_YES);
978 for (uint32_t i = 0; i < contained_count; i++)
979 {
980 if (0 == GNUNET_ntohll (elements[i].value))
981 continue;
983 *elem = elements[i];
984 if (GNUNET_SYSERR ==
987 &elem->key,
988 elem,
990 {
991 /* element with same key encountered twice! */
992 GNUNET_break (0);
993 GNUNET_free (elem);
994 continue;
995 }
996 set_elem.data = &elem->key;
997 set_elem.size = sizeof(elem->key);
998 set_elem.element_type = 0;
1000 &set_elem,
1001 NULL,
1002 NULL);
1003 s->used_element_count++;
1004 }
1007 {
1008 /* wait for multipart msg */
1010 "Received partial client request, waiting for more!\n");
1011 return;
1012 }
1014 "Launching computation\n");
1016}
1017
1018
1025static void
1026shutdown_task (void *cls)
1027{
1029 "Shutting down, initiating cleanup.\n");
1030 // FIXME: we have to cut our connections to CADET first!
1031 if (NULL != my_cadet)
1032 {
1034 my_cadet = NULL;
1035 }
1036 if (NULL != edc)
1037 {
1039 edc = NULL;
1040 }
1041}
1042
1043
1054static void *
1055client_connect_cb (void *cls,
1056 struct GNUNET_SERVICE_Client *client,
1057 struct GNUNET_MQ_Handle *mq)
1058{
1059 struct AliceServiceSession *s;
1060
1061 s = GNUNET_new (struct AliceServiceSession);
1062 s->client = client;
1063 s->client_mq = mq;
1064 return s;
1065}
1066
1067
1078static void
1079client_disconnect_cb (void *cls,
1081 void *app_cls)
1082{
1083 struct AliceServiceSession *s = app_cls;
1084
1086 "Client %p disconnected from us.\n",
1087 client);
1088 s->client = NULL;
1089 s->client_mq = NULL;
1091}
1092
1093
1101static void
1102run (void *cls,
1103 const struct GNUNET_CONFIGURATION_Handle *c,
1105{
1106 cfg = c;
1108 MAX_RAM);
1109 /* Select a random 'a' value for Alice */
1113 if (NULL == my_cadet)
1114 {
1116 _ ("Connect to CADET failed\n"));
1118 return;
1119 }
1121 NULL);
1122}
1123
1124
1130 "scalarproduct-alice",
1132 &run,
1135 NULL,
1136 GNUNET_MQ_hd_var_size (alice_client_message,
1139 NULL),
1141 alice_client_message_multipart,
1144 NULL),
1146
1147
1148/* end of gnunet-service-scalarproduct-ecc_alice.c */
struct GNUNET_MessageHeader * msg
Definition 005.c:2
#define INT_MAX
struct GNUNET_HashCode key
The key used in the DHT.
struct GNUNET_SCHEDULER_Task * shutdown_task
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?
static void cb_intersection_request_alice(void *cls, const struct GNUNET_PeerIdentity *other_peer, const struct GNUNET_MessageHeader *context_msg, struct GNUNET_SETI_Request *request)
Called when another peer wants to do a set operation with the local peer.
static struct GNUNET_CRYPTO_EccDlogContext * edc
Context for DLOG operations on a curve.
static struct GNUNET_CRYPTO_EccScalar my_privkey
Alice's private key ('a').
static void client_request_complete_alice(struct AliceServiceSession *s)
Our client has finished sending us its multipart message.
static int check_alice_client_message(void *cls, const struct AliceComputationMessage *msg)
Handler for Alice's client request message.
#define MAX_RAM
How many values should DLOG store in memory (determines baseline RAM consumption, roughly 100 bytes t...
static void handle_bobs_cryptodata_message(void *cls, const struct EccBobCryptodataMessage *msg)
Handle a response we got from another service we wanted to calculate a scalarproduct with.
static struct GNUNET_CADET_Handle * my_cadet
Handle to the CADET service.
static const struct GNUNET_CONFIGURATION_Handle * cfg
GNUnet configuration handle.
static void handle_alice_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
static void prepare_client_end_notification(struct AliceServiceSession *session)
Notify the client that the session has failed.
static void destroy_service_session(struct AliceServiceSession *s)
Destroy session state, we are done with it.
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_cls)
A client disconnected.
#define ELEMENT_CAPACITY
Maximum number of elements we can put into a single cryptodata message.
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
A client connected.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
Initialization of the program and message handlers.
#define MAX_RESULT
Maximum allowed result value for the scalarproduct computation.
static struct GNUNET_CRYPTO_EccScalar my_privkey_inv
Inverse of Alice's private key ('a_inv').
static void send_alices_cryptodata_message(struct AliceServiceSession *s)
Send the cryptographic data from Alice to Bob.
static void cb_channel_destruction(void *cls, const struct GNUNET_CADET_Channel *channel)
Function called whenever a channel is destroyed.
static void handle_alice_client_message(void *cls, const struct AliceComputationMessage *msg)
Handler for Alice's client request message.
static int element_cmp(const void *a, const void *b)
Compare two struct MpiValues by key for sorting.
#define LOG(kind,...)
static void transmit_client_response(struct AliceServiceSession *s)
Prepare the final (positive) response we will send to Alice's client.
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 check_alice_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
static int free_element_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator called to free elements.
static struct GNUNET_VPN_RedirectionRequest * request
Opaque redirection request handle.
Definition gnunet-vpn.c:40
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
void GNUNET_CADET_disconnect(struct GNUNET_CADET_Handle *handle)
Disconnect from the cadet service.
Definition cadet_api.c:777
struct GNUNET_CADET_Channel * GNUNET_CADET_channel_create(struct GNUNET_CADET_Handle *h, void *channel_cls, const struct GNUNET_PeerIdentity *destination, const struct GNUNET_HashCode *port, GNUNET_CADET_WindowSizeEventHandler window_changes, GNUNET_CADET_DisconnectEventHandler disconnects, const struct GNUNET_MQ_MessageHandler *handlers)
Create a new channel towards a remote peer.
Definition cadet_api.c:1030
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.
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...
void GNUNET_CRYPTO_ecc_rnd_mpi(struct GNUNET_CRYPTO_EccScalar *r, struct GNUNET_CRYPTO_EccScalar *r_neg)
Obtain a random scalar for point multiplication on the curve and its additive inverse.
#define GNUNET_log(kind,...)
enum GNUNET_GenericReturnValue GNUNET_CRYPTO_ecc_dexp_mpi(const struct GNUNET_CRYPTO_EccScalar *val, struct GNUNET_CRYPTO_EccPoint *r)
Multiply the generator g of the elliptic curve by val to obtain the point on the curve representing v...
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.
int GNUNET_CRYPTO_ecc_dlog(struct GNUNET_CRYPTO_EccDlogContext *edc, const struct GNUNET_CRYPTO_EccPoint *input)
Calculate ECC discrete logarithm for small factors.
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.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
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.
void GNUNET_CRYPTO_ecc_random_mod_n(struct GNUNET_CRYPTO_EccScalar *r)
Generate a random value mod n.
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_env_set_options(struct GNUNET_MQ_Envelope *env, enum GNUNET_MQ_PriorityPreferences pp)
Set application-specific options for this envelope.
Definition mq.c:847
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_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
@ GNUNET_MQ_PRIO_CRITICAL_CONTROL
Highest priority, control traffic (e.g.
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_MULTIPART_ALICE
Client -> Alice multipart.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA
Bob -> Alice ECC crypto data.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA
Alice -> Bob ECC crypto data.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE
Client -> Alice.
GNUNET_SCALARPRODUCT_ResponseStatus
Result status values for the computation.
@ 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
#define GNUNET_SERVICE_MAIN(pd, service_name, service_options, init_cb, connect_cb, disconnect_cb, cls,...)
Creates the "main" function for a GNUnet service.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Definition service.c:2462
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition service.c:2433
@ GNUNET_SERVICE_OPTION_NONE
Use defaults.
GNUNET_SETI_Status
Status for the result callback.
struct GNUNET_SETI_OperationHandle * GNUNET_SETI_accept(struct GNUNET_SETI_Request *request, const struct GNUNET_SETI_Option options[], GNUNET_SETI_ResultIterator result_cb, void *result_cls)
Accept a request we got via GNUNET_SETI_listen().
Definition seti_api.c:754
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_ListenHandle * GNUNET_SETI_listen(const struct GNUNET_CONFIGURATION_Handle *cfg, const struct GNUNET_HashCode *app_id, GNUNET_SETI_ListenCallback listen_cb, void *listen_cls)
Wait for set operation requests for the given application ID.
Definition seti_api.c:702
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
void GNUNET_SETI_listen_cancel(struct GNUNET_SETI_ListenHandle *lh)
Cancel the given listen operation.
Definition seti_api.c:734
@ 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 _(String)
GNU gettext support macro.
Definition platform.h:179
static struct GNUNET_MQ_Handle * mq
Our connection to the resolver service, created on-demand, but then persists until error or shutdown.
#define LOG_GCRY(level, cmd, rc)
Log an error message at log-level 'level' that indicates a failure of the command 'cmd' with the mess...
Message type passed from client to service to initiate a request or responder role.
A scalarproduct session which tracks a request form the client to our final response.
struct GNUNET_CRYPTO_PaillierCiphertext s
Bob's "s".
struct MpiElement * sorted_elements
a(Alice), sorted array by key of length used_element_count.
struct GNUNET_HashCode session_id
(hopefully) unique transaction ID
struct GNUNET_CONTAINER_MultiHashMap * intersected_elements
all non-0-value'd elements transmitted to us.
uint32_t total
How many elements we were supplied with from the client (total count before intersection).
struct GNUNET_MQ_Handle * client_mq
The message queue for the client.
int product
The computed scalar product.
struct GNUNET_SETI_Handle * intersection_set
Set of elements for which will conduction an intersection.
int in_destroy
Flag to prevent recursive calls to destroy_service_session() from doing harm.
struct GNUNET_SETI_OperationHandle * intersection_op
Set of elements for which will conduction an intersection.
uint32_t client_received_element_count
Already transferred elements from client to us.
struct GNUNET_SERVICE_Client * client
The client this request is related to.
struct GNUNET_CADET_Channel * channel
channel-handle associated with our cadet handle
struct GNUNET_PeerIdentity peer
Alice or Bob's peerID.
struct GNUNET_MQ_Handle * cadet_mq
The message queue for CADET.
struct GNUNET_SETI_ListenHandle * intersection_listen
Handle to Alice's Intersection operation listening for Bob.
uint32_t used_element_count
How many elements actually are used for the scalar product.
enum GNUNET_SCALARPRODUCT_ResponseStatus status
State of this session.
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
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.
A 512-bit hashcode.
Handle to a message queue.
Definition mq.c:87
Message handler for a specific message type.
Header for all communications.
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.
Opaque handle to a set.
Definition seti_api.c:40
Opaque handle to a listen operation.
Definition seti_api.c:163
Handle to an operation.
Definition seti_api.c:106
Option for set operations.
Handle for a set operation request from another peer.
Definition seti_api.c:86
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.

◆ MAX_RESULT

#define MAX_RESULT   (1024 * 1024)

Maximum allowed result value for the scalarproduct computation.

DLOG will fail if the result is bigger. At 1 million, the precomputation takes about 2s on a fast machine.

Definition at line 46 of file gnunet-service-scalarproduct-ecc_alice.c.

◆ MAX_RAM

#define MAX_RAM   (1024)

How many values should DLOG store in memory (determines baseline RAM consumption, roughly 100 bytes times the value given here).

Should be about SQRT (MAX_RESULT), larger values will make the online computation faster.

Definition at line 54 of file gnunet-service-scalarproduct-ecc_alice.c.

◆ ELEMENT_CAPACITY

#define ELEMENT_CAPACITY
Value:
- sizeof(struct EccAliceCryptodataMessage)) \
/ sizeof(struct GNUNET_CRYPTO_EccPoint))
#define GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE
Maximum message size that can be sent on CADET.

Maximum number of elements we can put into a single cryptodata message.

Definition at line 527 of file gnunet-service-scalarproduct-ecc_alice.c.

Function Documentation

◆ free_element_cb()

static int free_element_cb ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Iterator called to free elements.

Parameters
clsthe struct AliceServiceSession * (unused)
keythe key (unused)
valuevalue to free
Returns
GNUNET_OK (continue to iterate)

Definition at line 214 of file gnunet-service-scalarproduct-ecc_alice.c.

217{
219
220 GNUNET_free (e);
221 return GNUNET_OK;
222}

References GNUNET_free, GNUNET_OK, and value.

Referenced by destroy_service_session().

Here is the caller graph for this function:

◆ destroy_service_session()

static void destroy_service_session ( struct AliceServiceSession s)
static

Destroy session state, we are done with it.

Parameters
sthe session to free elements from

Definition at line 231 of file gnunet-service-scalarproduct-ecc_alice.c.

232{
233 if (GNUNET_YES == s->in_destroy)
234 return;
236 if (NULL != s->client)
237 {
238 struct GNUNET_SERVICE_Client *c = s->client;
239
240 s->client = NULL;
242 }
243 if (NULL != s->channel)
244 {
246 s->channel = NULL;
247 }
248 if (NULL != s->intersected_elements)
249 {
252 s);
254 s->intersected_elements = NULL;
255 }
256 if (NULL != s->intersection_listen)
257 {
259 s->intersection_listen = NULL;
260 }
261 if (NULL != s->intersection_op)
262 {
264 "Set intersection, op still ongoing!\n");
266 s->intersection_op = NULL;
267 }
268 if (NULL != s->intersection_set)
269 {
271 s->intersection_set = NULL;
272 }
273 if (NULL != s->sorted_elements)
274 {
276 s->sorted_elements = NULL;
277 }
278 GNUNET_free (s);
279}

References AliceServiceSession::channel, AliceServiceSession::client, free_element_cb(), GNUNET_CADET_channel_destroy(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_SERVICE_client_drop(), GNUNET_SETI_destroy(), GNUNET_SETI_listen_cancel(), GNUNET_SETI_operation_cancel(), GNUNET_YES, AliceServiceSession::in_destroy, AliceServiceSession::intersected_elements, AliceServiceSession::intersection_listen, AliceServiceSession::intersection_op, AliceServiceSession::intersection_set, LOG, and AliceServiceSession::sorted_elements.

Referenced by client_disconnect_cb(), and handle_bobs_cryptodata_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ prepare_client_end_notification()

static void prepare_client_end_notification ( struct AliceServiceSession session)
static

Notify the client that the session has failed.

A message gets sent to Alice's client if we encountered any error.

Parameters
sessionthe associated client session to fail or succeed

Definition at line 289 of file gnunet-service-scalarproduct-ecc_alice.c.

290{
292 struct GNUNET_MQ_Envelope *e;
293
294 if (NULL == session->client_mq)
295 return; /* no client left to be notified */
296 GNUNET_log (
298 "Sending session-end notification with status %d to client for session %s\n",
299 session->status,
300 GNUNET_h2s (&session->session_id));
301 e = GNUNET_MQ_msg (msg,
303 msg->product_length = htonl (0);
304 msg->status = htonl (session->status);
305 GNUNET_MQ_send (session->client_mq,
306 e);
307}

References AliceServiceSession::client_mq, GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_RESULT, GNUNET_MQ_msg, GNUNET_MQ_send(), msg, AliceServiceSession::session_id, and AliceServiceSession::status.

Referenced by cb_channel_destruction(), cb_intersection_element_removed(), cb_intersection_request_alice(), client_request_complete_alice(), and transmit_client_response().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ transmit_client_response()

static void transmit_client_response ( struct AliceServiceSession s)
static

Prepare the final (positive) response we will send to Alice's client.

Parameters
sthe session associated with our client.

Definition at line 317 of file gnunet-service-scalarproduct-ecc_alice.c.

318{
320 struct GNUNET_MQ_Envelope *e;
321 unsigned char *product_exported = NULL;
322 size_t product_length = 0;
323 int32_t range;
324 gcry_error_t rc;
325 gcry_mpi_t value;
326
327 if (INT_MAX == s->product)
328 {
329 GNUNET_break (0);
331 return;
332 }
333 value = gcry_mpi_new (32);
334 if (0 > s->product)
335 {
336 range = -1;
337 gcry_mpi_set_ui (value,
338 -s->product);
339 }
340 else if (0 < s->product)
341 {
342 range = 1;
343 gcry_mpi_set_ui (value,
344 s->product);
345 }
346 else
347 {
348 /* result is exactly zero */
349 range = 0;
350 }
351 if ( (0 != range) &&
352 (0 != (rc = gcry_mpi_aprint (GCRYMPI_FMT_STD,
353 &product_exported,
354 &product_length,
355 value))))
356 {
358 "gcry_mpi_scan",
359 rc);
361 return;
362 }
363 gcry_mpi_release (value);
365 product_length,
368 msg->range = htonl (range);
369 msg->product_length = htonl (product_length);
370 if (NULL != product_exported)
371 {
372 GNUNET_memcpy (&msg[1],
373 product_exported,
374 product_length);
375 GNUNET_free (product_exported);
376 }
378 e);
380 "Sent result to client, session %s has ended!\n",
381 GNUNET_h2s (&s->session_id));
382}

References AliceServiceSession::client_mq, GNUNET_break, GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_RESULT, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_SCALARPRODUCT_STATUS_SUCCESS, INT_MAX, LOG_GCRY, msg, prepare_client_end_notification(), AliceServiceSession::product, AliceServiceSession::session_id, and value.

Referenced by handle_bobs_cryptodata_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_channel_destruction()

static void cb_channel_destruction ( void *  cls,
const struct GNUNET_CADET_Channel channel 
)
static

Function called whenever a channel is destroyed.

Should clean up any associated state.

It must NOT call GNUNET_CADET_channel_destroy() on the channel.

Parameters
clsthe struct AliceServiceSession
channelconnection to the other end (henceforth invalid)

Definition at line 395 of file gnunet-service-scalarproduct-ecc_alice.c.

397{
398 struct AliceServiceSession *s = cls;
399
401 "Peer disconnected, terminating session %s with peer %s\n",
402 GNUNET_h2s (&s->session_id),
403 GNUNET_i2s (&s->peer));
404 s->channel = NULL;
406 {
407 /* We didn't get an answer yet, fail with error */
410 }
411}

References GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_i2s(), GNUNET_log, GNUNET_SCALARPRODUCT_STATUS_ACTIVE, GNUNET_SCALARPRODUCT_STATUS_FAILURE, prepare_client_end_notification(), and AliceServiceSession::s.

Referenced by client_request_complete_alice().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ handle_bobs_cryptodata_message()

static void handle_bobs_cryptodata_message ( void *  cls,
const struct EccBobCryptodataMessage msg 
)
static

Handle a response we got from another service we wanted to calculate a scalarproduct with.

Parameters
clsthe struct AliceServiceSession *
msgthe actual message

Definition at line 422 of file gnunet-service-scalarproduct-ecc_alice.c.

424{
425 struct AliceServiceSession *s = cls;
426 uint32_t contained;
427
428 contained = ntohl (msg->contained_element_count);
429 if (2 != contained)
430 {
431 GNUNET_break_op (0);
433 return;
434 }
435 if (NULL == s->sorted_elements)
436 {
437 /* we're not ready yet, how can Bob be? */
438 GNUNET_break_op (0);
440 return;
441 }
442 if (s->total != s->client_received_element_count)
443 {
444 /* we're not ready yet, how can Bob be? */
445 GNUNET_break_op (0);
447 return;
448 }
450 "Received %u crypto values from Bob\n",
451 (unsigned int) contained);
452 GNUNET_CADET_receive_done (s->channel);
453 {
454 struct GNUNET_CRYPTO_EccPoint g_i_b_i_a_inv;
455 struct GNUNET_CRYPTO_EccPoint g_ai_bi;
456
458 GNUNET_OK ==
459 GNUNET_CRYPTO_ecc_pmul_mpi (&msg->prod_g_i_b_i,
461 &g_i_b_i_a_inv));
463 GNUNET_OK ==
464 GNUNET_CRYPTO_ecc_add (&g_i_b_i_a_inv,
465 &msg->prod_h_i_b_i,
466 &g_ai_bi));
468 &g_ai_bi);
469 if (INT_MAX == s->product)
470 {
471 /* result too big */
473 "Scalar product result out of range\n");
474 }
475 }
477}

References destroy_service_session(), edc, GNUNET_assert, GNUNET_break_op, GNUNET_CADET_receive_done(), GNUNET_CRYPTO_ecc_add(), GNUNET_CRYPTO_ecc_dlog(), GNUNET_CRYPTO_ecc_pmul_mpi(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_OK, INT_MAX, msg, my_privkey_inv, AliceServiceSession::product, AliceServiceSession::s, and transmit_client_response().

Here is the call graph for this function:

◆ copy_element_cb()

static int copy_element_cb ( void *  cls,
const struct GNUNET_HashCode key,
void *  value 
)
static

Iterator to copy over messages from the hash map into an array for sorting.

Parameters
clsthe struct AliceServiceSession *
keythe key (unused)
valuethe struct GNUNET_SCALARPRODUCT_Element *

Definition at line 489 of file gnunet-service-scalarproduct-ecc_alice.c.

492{
493 struct AliceServiceSession *s = cls;
495
497 e->value);
500 return GNUNET_OK;
501}

References GNUNET_ntohll(), GNUNET_OK, MpiElement::key, GNUNET_SCALARPRODUCT_Element::key, AliceServiceSession::s, AliceServiceSession::sorted_elements, AliceServiceSession::used_element_count, value, MpiElement::value, and GNUNET_SCALARPRODUCT_Element::value.

Referenced by send_alices_cryptodata_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ element_cmp()

static int element_cmp ( const void *  a,
const void *  b 
)
static

Compare two struct MpiValues by key for sorting.

Parameters
apointer to first struct MpiValue *
bpointer to first struct MpiValue *
Returns
-1 for a < b, 0 for a=b, 1 for a > b.

Definition at line 512 of file gnunet-service-scalarproduct-ecc_alice.c.

514{
515 const struct MpiElement *ma = a;
516 const struct MpiElement *mb = b;
517
518 return GNUNET_CRYPTO_hash_cmp (ma->key,
519 mb->key);
520}

References GNUNET_CRYPTO_hash_cmp(), and MpiElement::key.

Referenced by send_alices_cryptodata_message().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ send_alices_cryptodata_message()

static void send_alices_cryptodata_message ( struct AliceServiceSession s)
static

Send the cryptographic data from Alice to Bob.

Does nothing if we already transferred all elements.

Parameters
sthe associated service session

Definition at line 540 of file gnunet-service-scalarproduct-ecc_alice.c.

541{
543 struct GNUNET_MQ_Envelope *e;
545 struct GNUNET_CRYPTO_EccScalar r_ia;
546 struct GNUNET_CRYPTO_EccScalar r_ia_ai;
547 unsigned int off;
548 unsigned int todo_count;
549
552 struct MpiElement);
553 s->used_element_count = 0;
556 s);
558 "Finished intersection, %d items remain\n",
560 qsort (s->sorted_elements,
562 sizeof(struct MpiElement),
563 &element_cmp);
564 off = 0;
565 while (off < s->used_element_count)
566 {
567 todo_count = s->used_element_count - off;
568 if (todo_count > ELEMENT_CAPACITY)
569 todo_count = ELEMENT_CAPACITY;
571 "Sending %u/%u crypto values to Bob\n",
572 (unsigned int) todo_count,
573 (unsigned int) s->used_element_count);
574
575 e =
577 todo_count * 2
578 * sizeof(struct GNUNET_CRYPTO_EccPoint),
580 msg->contained_element_count = htonl (todo_count);
581 payload = (struct GNUNET_CRYPTO_EccPoint *) &msg[1];
582 for (unsigned int i = off; i < off + todo_count; i++)
583 {
584 struct GNUNET_CRYPTO_EccScalar r_i;
585 struct GNUNET_CRYPTO_EccPoint g_i;
586 struct GNUNET_CRYPTO_EccPoint h_i;
587
588 /* r_i = random() mod n */
590 /* g_i = g^{r_i} */
593 &g_i));
594 /* r_ia = r_i * a */
595 crypto_core_ed25519_scalar_mul (r_ia.v,
596 r_i.v,
597 my_privkey.v);
598 /* r_ia_ai = r_ia + a_i */
599 {
600 int64_t val = s->sorted_elements[i].value;
601 struct GNUNET_CRYPTO_EccScalar vali;
602
603 GNUNET_assert (INT64_MIN != val);
604 GNUNET_CRYPTO_ecc_scalar_from_int (val > 0 ? val : -val,
605 &vali);
606 if (val > 0)
607 crypto_core_ed25519_scalar_add (r_ia_ai.v,
608 r_ia.v,
609 vali.v);
610 else
611 crypto_core_ed25519_scalar_sub (r_ia_ai.v,
612 r_ia.v,
613 vali.v);
614 }
615 /* h_i = g^{r_ia_ai} */
618 &h_i));
619 memcpy (&payload[(i - off) * 2],
620 &g_i,
621 sizeof (g_i));
622 memcpy (&payload[(i - off) * 2 + 1],
623 &h_i,
624 sizeof (h_i));
625 }
626 off += todo_count;
628 e);
629 }
630}

References AliceServiceSession::cadet_mq, copy_element_cb(), ELEMENT_CAPACITY, element_cmp(), GNUNET_assert, GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_CRYPTO_ecc_dexp_mpi(), GNUNET_CRYPTO_ecc_random_mod_n(), GNUNET_CRYPTO_ecc_scalar_from_int(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA, GNUNET_MQ_msg_extra, GNUNET_MQ_send(), GNUNET_new_array, GNUNET_OK, AliceServiceSession::intersected_elements, LOG, msg, my_privkey, payload, AliceServiceSession::sorted_elements, AliceServiceSession::used_element_count, GNUNET_CRYPTO_EccScalar::v, and MpiElement::value.

Referenced by cb_intersection_element_removed().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_intersection_element_removed()

static void cb_intersection_element_removed ( void *  cls,
const struct GNUNET_SETI_Element element,
uint64_t  current_size,
enum GNUNET_SETI_Status  status 
)
static

Callback for set operation results.

Called for each element that should be removed from the result set, and then once to indicate that the set intersection operation is done.

Parameters
clsclosure with the struct AliceServiceSession
elementa result element, only valid if status is #GNUNET_SETI_STATUS_OK
current_sizecurrent set size
statuswhat has happened with the set intersection?

Definition at line 644 of file gnunet-service-scalarproduct-ecc_alice.c.

648{
649 struct AliceServiceSession *s = cls;
651
652 switch (status)
653 {
655 /* this element has been removed from the set */
657 element->data);
658 GNUNET_assert (NULL != se);
660 "Intersection removed element with key %s and value %lld\n",
661 GNUNET_h2s (&se->key),
662 (long long) GNUNET_ntohll (se->value));
664 GNUNET_YES ==
666 element->data,
667 se));
668 GNUNET_free (se);
669 return;
671 s->intersection_op = NULL;
672 if (NULL != s->intersection_set)
673 {
675 s->intersection_set = NULL;
676 }
678 return;
680 /* unhandled status code */
681 LOG (GNUNET_ERROR_TYPE_DEBUG, "Set intersection failed!\n");
682 if (NULL != s->intersection_listen)
683 {
685 s->intersection_listen = NULL;
686 }
687 s->intersection_op = NULL;
688 if (NULL != s->intersection_set)
689 {
691 s->intersection_set = NULL;
692 }
695 return;
696
697 default:
698 GNUNET_break (0);
699 return;
700 }
701}

References GNUNET_SETI_Element::data, GNUNET_assert, GNUNET_break, GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_ntohll(), GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SETI_destroy(), GNUNET_SETI_listen_cancel(), GNUNET_SETI_STATUS_DEL_LOCAL, GNUNET_SETI_STATUS_DONE, GNUNET_SETI_STATUS_FAILURE, GNUNET_YES, AliceServiceSession::intersected_elements, AliceServiceSession::intersection_listen, AliceServiceSession::intersection_op, AliceServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, LOG, prepare_client_end_notification(), AliceServiceSession::s, send_alices_cryptodata_message(), status, AliceServiceSession::status, and GNUNET_SCALARPRODUCT_Element::value.

Referenced by cb_intersection_request_alice().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ cb_intersection_request_alice()

static void cb_intersection_request_alice ( void *  cls,
const struct GNUNET_PeerIdentity other_peer,
const struct GNUNET_MessageHeader context_msg,
struct GNUNET_SETI_Request request 
)
static

Called when another peer wants to do a set operation with the local peer.

If a listen error occurs, the request is NULL.

Parameters
clsclosure with the struct AliceServiceSession *
other_peerthe other peer
context_msgmessage with application specific information from the other peer
requestrequest from the other peer (never NULL), use GNUNET_SETI_accept() to accept it, otherwise the request will be refused Note that we can't just return value from the listen callback, as it is also necessary to specify the set we want to do the operation with, which sometimes can be derived from the context message. It's necessary to specify the timeout.

Definition at line 720 of file gnunet-service-scalarproduct-ecc_alice.c.

724{
725 struct AliceServiceSession *s = cls;
726
728 "Received intersection request from %s!\n",
729 GNUNET_i2s (other_peer));
730 if (0 != GNUNET_memcmp (other_peer,
731 &s->peer))
732 {
733 GNUNET_break_op (0);
734 return;
735 }
736 s->intersection_op
738 (struct GNUNET_SETI_Option[]){ { 0 } },
740 s);
741 if (NULL == s->intersection_op)
742 {
743 GNUNET_break (0);
746 return;
747 }
748 if (GNUNET_OK !=
749 GNUNET_SETI_commit (s->intersection_op,
750 s->intersection_set))
751 {
752 GNUNET_break (0);
755 return;
756 }
757}

References cb_intersection_element_removed(), GNUNET_break, GNUNET_break_op, GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, GNUNET_memcmp, GNUNET_OK, GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SETI_accept(), GNUNET_SETI_commit(), prepare_client_end_notification(), request, and AliceServiceSession::s.

Referenced by client_request_complete_alice().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ client_request_complete_alice()

static void client_request_complete_alice ( struct AliceServiceSession s)
static

Our client has finished sending us its multipart message.

Parameters
sthe service session context

Definition at line 766 of file gnunet-service-scalarproduct-ecc_alice.c.

767{
768 struct GNUNET_MQ_MessageHandler cadet_handlers[] = {
769 GNUNET_MQ_hd_fixed_size (bobs_cryptodata_message,
772 s),
774 };
776 struct GNUNET_MQ_Envelope *e;
777 struct GNUNET_HashCode set_sid;
778
780 sizeof(struct GNUNET_HashCode),
781 &set_sid);
783 "Creating new channel for session with key %s.\n",
784 GNUNET_h2s (&s->session_id));
786 s,
787 &s->peer,
788 &s->session_id,
789 NULL,
791 cadet_handlers);
792 if (NULL == s->channel)
793 {
796 return;
797 }
800 &set_sid,
802 s);
803 if (NULL == s->intersection_listen)
804 {
807 s->channel = NULL;
809 return;
810 }
811
812 e =
816 msg->session_id = s->session_id;
817 GNUNET_MQ_send (s->cadet_mq, e);
818}

References AliceServiceSession::cadet_mq, cb_channel_destruction(), cb_intersection_request_alice(), cfg, AliceServiceSession::channel, GNUNET_CADET_channel_create(), GNUNET_CADET_channel_destroy(), GNUNET_CADET_get_mq(), GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION, GNUNET_MQ_env_set_options(), GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_msg, GNUNET_MQ_PRIO_CRITICAL_CONTROL, GNUNET_MQ_send(), GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SETI_listen(), AliceServiceSession::intersection_listen, msg, my_cadet, AliceServiceSession::peer, prepare_client_end_notification(), AliceServiceSession::session_id, and AliceServiceSession::status.

Referenced by handle_alice_client_message(), and handle_alice_client_message_multipart().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_alice_client_message_multipart()

static int check_alice_client_message_multipart ( void *  cls,
const struct ComputationBobCryptodataMultipartMessage msg 
)
static

We're receiving additional set data.

Check if msg is well-formed.

Parameters
clsclient identification of the client
msgthe actual message
Returns
GNUNET_OK if msg is well-formed

Definition at line 830 of file gnunet-service-scalarproduct-ecc_alice.c.

833{
834 struct AliceServiceSession *s = cls;
835 uint32_t contained_count;
836 uint16_t msize;
837
838 msize = ntohs (msg->header.size);
839 contained_count = ntohl (msg->element_count_contained);
840 if ((msize !=
842 + contained_count * sizeof(struct GNUNET_SCALARPRODUCT_Element))) ||
843 (0 == contained_count) ||
844 (s->total == s->client_received_element_count) ||
845 (s->total < s->client_received_element_count + contained_count))
846 {
847 GNUNET_break_op (0);
848 return GNUNET_SYSERR;
849 }
850 return GNUNET_OK;
851}

References GNUNET_break_op, GNUNET_OK, GNUNET_SYSERR, msg, AliceServiceSession::s, and GNUNET_MessageHeader::size.

◆ handle_alice_client_message_multipart()

static void handle_alice_client_message_multipart ( void *  cls,
const struct ComputationBobCryptodataMultipartMessage msg 
)
static

We're receiving additional set data.

Add it to our set and if we are done, initiate the transaction.

Parameters
clsclient identification of the client
msgthe actual message

Definition at line 862 of file gnunet-service-scalarproduct-ecc_alice.c.

865{
866 struct AliceServiceSession *s = cls;
867 uint32_t contained_count;
868 const struct GNUNET_SCALARPRODUCT_Element *elements;
869 struct GNUNET_SETI_Element set_elem;
870 struct GNUNET_SCALARPRODUCT_Element *elem;
871
872 contained_count = ntohl (msg->element_count_contained);
873 s->client_received_element_count += contained_count;
874 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
875 for (uint32_t i = 0; i < contained_count; i++)
876 {
878 GNUNET_memcpy (elem,
879 &elements[i],
880 sizeof(struct GNUNET_SCALARPRODUCT_Element));
883 &elem->key,
884 elem,
886 {
887 GNUNET_break (0);
888 GNUNET_free (elem);
889 continue;
890 }
891 set_elem.data = &elem->key;
892 set_elem.size = sizeof(elem->key);
893 set_elem.element_type = 0;
894 GNUNET_SETI_add_element (s->intersection_set, &set_elem, NULL, NULL);
896 }
899 {
900 /* more to come */
902 "Received client multipart data, waiting for more!\n");
903 return;
904 }
905 GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Launching computation\n");
907}

References AliceServiceSession::client, AliceServiceSession::client_received_element_count, client_request_complete_alice(), GNUNET_SETI_Element::data, GNUNET_SETI_Element::element_type, GNUNET_break, GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_memcpy, GNUNET_new, GNUNET_SERVICE_client_continue(), GNUNET_SETI_add_element(), GNUNET_SYSERR, AliceServiceSession::intersected_elements, AliceServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, msg, AliceServiceSession::s, GNUNET_SETI_Element::size, AliceServiceSession::total, and AliceServiceSession::used_element_count.

Here is the call graph for this function:

◆ check_alice_client_message()

static int check_alice_client_message ( void *  cls,
const struct AliceComputationMessage msg 
)
static

Handler for Alice's client request message.

Check that msg is well-formed.

Parameters
clsidentification of the client
msgthe actual message
Returns
GNUNET_OK if msg is well-formed

Definition at line 919 of file gnunet-service-scalarproduct-ecc_alice.c.

921{
922 struct AliceServiceSession *s = cls;
923 uint16_t msize;
924 uint32_t total_count;
925 uint32_t contained_count;
926
927 if (NULL != s->intersected_elements)
928 {
929 /* only one concurrent session per client connection allowed,
930 simplifies logic a lot... */
931 GNUNET_break (0);
932 return GNUNET_SYSERR;
933 }
934 msize = ntohs (msg->header.size);
935 total_count = ntohl (msg->element_count_total);
936 contained_count = ntohl (msg->element_count_contained);
937 if ((0 == total_count) || (0 == contained_count) ||
938 (msize !=
939 (sizeof(struct AliceComputationMessage)
940 + contained_count * sizeof(struct GNUNET_SCALARPRODUCT_Element))))
941 {
942 GNUNET_break_op (0);
943 return GNUNET_SYSERR;
944 }
945 return GNUNET_OK;
946}

References GNUNET_break, GNUNET_break_op, GNUNET_OK, GNUNET_SYSERR, msg, AliceServiceSession::s, and GNUNET_MessageHeader::size.

◆ handle_alice_client_message()

static void handle_alice_client_message ( void *  cls,
const struct AliceComputationMessage msg 
)
static

Handler for Alice's client request message.

We are doing request-initiation to compute a scalar product with a peer.

Parameters
clsidentification of the client
msgthe actual message

Definition at line 957 of file gnunet-service-scalarproduct-ecc_alice.c.

959{
960 struct AliceServiceSession *s = cls;
961 uint32_t contained_count;
962 uint32_t total_count;
963 const struct GNUNET_SCALARPRODUCT_Element *elements;
964 struct GNUNET_SETI_Element set_elem;
965 struct GNUNET_SCALARPRODUCT_Element *elem;
966
967 total_count = ntohl (msg->element_count_total);
968 contained_count = ntohl (msg->element_count_contained);
969 s->peer = msg->peer;
971 s->total = total_count;
972 s->client_received_element_count = contained_count;
973 s->session_id = msg->session_key;
974 elements = (const struct GNUNET_SCALARPRODUCT_Element *) &msg[1];
977 GNUNET_YES);
979 for (uint32_t i = 0; i < contained_count; i++)
980 {
981 if (0 == GNUNET_ntohll (elements[i].value))
982 continue;
984 *elem = elements[i];
985 if (GNUNET_SYSERR ==
988 &elem->key,
989 elem,
991 {
992 /* element with same key encountered twice! */
993 GNUNET_break (0);
994 GNUNET_free (elem);
995 continue;
996 }
997 set_elem.data = &elem->key;
998 set_elem.size = sizeof(elem->key);
999 set_elem.element_type = 0;
1001 &set_elem,
1002 NULL,
1003 NULL);
1004 s->used_element_count++;
1005 }
1008 {
1009 /* wait for multipart msg */
1011 "Received partial client request, waiting for more!\n");
1012 return;
1013 }
1015 "Launching computation\n");
1017}

References cfg, AliceServiceSession::client, AliceServiceSession::client_received_element_count, client_request_complete_alice(), GNUNET_SETI_Element::data, GNUNET_SETI_Element::element_type, GNUNET_break, GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_log, GNUNET_new, GNUNET_ntohll(), GNUNET_SCALARPRODUCT_STATUS_ACTIVE, GNUNET_SERVICE_client_continue(), GNUNET_SETI_add_element(), GNUNET_SETI_create(), GNUNET_SYSERR, GNUNET_YES, AliceServiceSession::intersected_elements, AliceServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, msg, AliceServiceSession::peer, AliceServiceSession::s, AliceServiceSession::session_id, GNUNET_SETI_Element::size, AliceServiceSession::status, AliceServiceSession::total, AliceServiceSession::used_element_count, and value.

Here is the call graph for this function:

◆ shutdown_task()

static void shutdown_task ( void *  cls)
static

Task run during shutdown.

Parameters
clsunused
tcunused

Definition at line 1027 of file gnunet-service-scalarproduct-ecc_alice.c.

1028{
1030 "Shutting down, initiating cleanup.\n");
1031 // FIXME: we have to cut our connections to CADET first!
1032 if (NULL != my_cadet)
1033 {
1035 my_cadet = NULL;
1036 }
1037 if (NULL != edc)
1038 {
1040 edc = NULL;
1041 }
1042}

References edc, GNUNET_CADET_disconnect(), GNUNET_CRYPTO_ecc_dlog_release(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and my_cadet.

Here is the call graph for this function:

◆ client_connect_cb()

static void * client_connect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
struct GNUNET_MQ_Handle mq 
)
static

A client connected.

Setup the associated data structure.

Parameters
clsclosure, NULL
clientidentification of the client
mqmessage queue to communicate with client
Returns
our struct AliceServiceSession

Definition at line 1056 of file gnunet-service-scalarproduct-ecc_alice.c.

1059{
1060 struct AliceServiceSession *s;
1061
1062 s = GNUNET_new (struct AliceServiceSession);
1063 s->client = client;
1064 s->client_mq = mq;
1065 return s;
1066}

References AliceServiceSession::client, GNUNET_new, mq, and AliceServiceSession::s.

◆ client_disconnect_cb()

static void client_disconnect_cb ( void *  cls,
struct GNUNET_SERVICE_Client client,
void *  app_cls 
)
static

A client disconnected.

Remove the associated session(s), release data structures and cancel pending outgoing transmissions to the client.

Parameters
clsclosure, NULL
clientidentification of the client
app_clsour struct AliceServiceSession

Definition at line 1080 of file gnunet-service-scalarproduct-ecc_alice.c.

1083{
1084 struct AliceServiceSession *s = app_cls;
1085
1087 "Client %p disconnected from us.\n",
1088 client);
1089 s->client = NULL;
1090 s->client_mq = NULL;
1092}

References AliceServiceSession::client, destroy_service_session(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and AliceServiceSession::s.

Here is the call graph for this function:

◆ run()

static void run ( void *  cls,
const struct GNUNET_CONFIGURATION_Handle c,
struct GNUNET_SERVICE_Handle service 
)
static

Initialization of the program and message handlers.

Parameters
clsclosure
cconfiguration to use
servicethe initialized service

Definition at line 1103 of file gnunet-service-scalarproduct-ecc_alice.c.

1106{
1107 cfg = c;
1109 MAX_RAM);
1110 /* Select a random 'a' value for Alice */
1114 if (NULL == my_cadet)
1115 {
1117 _ ("Connect to CADET failed\n"));
1119 return;
1120 }
1122 NULL);
1123}

References _, cfg, edc, GNUNET_CADET_connect(), GNUNET_CRYPTO_ecc_dlog_prepare(), GNUNET_CRYPTO_ecc_rnd_mpi(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), MAX_RAM, MAX_RESULT, my_cadet, my_privkey, my_privkey_inv, and shutdown_task.

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

GNUNET_SERVICE_MAIN ( GNUNET_OS_project_data_gnunet()  ,
"scalarproduct-alice"  ,
GNUNET_SERVICE_OPTION_NONE  ,
run,
client_connect_cb,
client_disconnect_cb,
NULL  ,
GNUNET_MQ_hd_var_size(alice_client_message, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE, struct AliceComputationMessage, NULL)  ,
GNUNET_MQ_hd_var_size(alice_client_message_multipart, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE, struct ComputationBobCryptodataMultipartMessage, NULL)  ,
GNUNET_MQ_handler_end()   
)

Define "main" method using service macro.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

GNUnet configuration handle.

Definition at line 182 of file gnunet-service-scalarproduct-ecc_alice.c.

Referenced by client_request_complete_alice(), handle_alice_client_message(), and run().

◆ edc

◆ my_privkey

struct GNUNET_CRYPTO_EccScalar my_privkey
static

Alice's private key ('a').

Definition at line 192 of file gnunet-service-scalarproduct-ecc_alice.c.

Referenced by run(), and send_alices_cryptodata_message().

◆ my_privkey_inv

struct GNUNET_CRYPTO_EccScalar my_privkey_inv
static

Inverse of Alice's private key ('a_inv').

Definition at line 197 of file gnunet-service-scalarproduct-ecc_alice.c.

Referenced by handle_bobs_cryptodata_message(), and run().

◆ my_cadet

struct GNUNET_CADET_Handle* my_cadet
static

Handle to the CADET service.

Definition at line 202 of file gnunet-service-scalarproduct-ecc_alice.c.

Referenced by client_request_complete_alice(), run(), and shutdown_task().