GNUnet 0.22.2
gnunet-service-scalarproduct-ecc_bob.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 dependency graph for gnunet-service-scalarproduct-ecc_bob.c:

Go to the source code of this file.

Data Structures

struct  MpiElement
 An encrypted element key-value pair. More...
 
struct  BobServiceSession
 A scalarproduct session which tracks an offer for a multiplication service by a local client. More...
 

Macros

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

Functions

static int free_element_cb (void *cls, const struct GNUNET_HashCode *key, void *value)
 Callback used to free the elements in the map. More...
 
static void destroy_service_session (struct BobServiceSession *s)
 Destroy session state, we are done with it. More...
 
static void prepare_client_end_notification (struct BobServiceSession *session)
 Notify the client that the session has succeeded or failed. More...
 
static void cb_channel_destruction (void *cls, const struct GNUNET_CADET_Channel *channel)
 Function called whenever a channel is destroyed. More...
 
static void bob_cadet_done_cb (void *cls)
 MQ finished giving our last message to CADET, now notify the client that we are finished. More...
 
static void transmit_bobs_cryptodata_message (struct BobServiceSession *s)
 Bob generates the response message to be sent to Alice. More...
 
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. More...
 
static int element_cmp (const void *a, const void *b)
 Compare two struct MpiValues by key for sorting. More...
 
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. More...
 
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. More...
 
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. More...
 
static void start_intersection (struct BobServiceSession *s)
 We've paired up a client session with an incoming CADET request. More...
 
static void handle_alices_computation_request (void *cls, const struct EccServiceRequestMessage *msg)
 Handle a request from Alice to calculate a scalarproduct with us (Bob). More...
 
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. More...
 
static int check_bob_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
 We're receiving additional set data. More...
 
static void handle_bob_client_message_multipart (void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
 We're receiving additional set data. More...
 
static int check_bob_client_message (void *cls, const struct BobComputationMessage *msg)
 Handler for Bob's a client request message. More...
 
static void handle_bob_client_message (void *cls, const struct BobComputationMessage *msg)
 Handler for Bob's a client request message. More...
 
static void shutdown_task (void *cls)
 Task run during shutdown. More...
 
static void * client_connect_cb (void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
 A client connected. More...
 
static void client_disconnect_cb (void *cls, struct GNUNET_SERVICE_Client *client, void *app_cls)
 A client disconnected. More...
 
static void run (void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
 Initialization of the program and message handlers. More...
 
 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. More...
 

Variables

static const struct GNUNET_CONFIGURATION_Handlecfg
 GNUnet configuration handle. More...
 
static struct GNUNET_CADET_Handlemy_cadet
 Handle to the CADET service. More...
 
static struct GNUNET_CRYPTO_EccDlogContextedc
 Context for DLOG operations on a curve. More...
 

Detailed Description

scalarproduct service implementation

Author
Christian M. Fuchs
Christian Grothoff

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

Macro Definition Documentation

◆ LOG

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

Definition at line 37 of file gnunet-service-scalarproduct-ecc_bob.c.

Function Documentation

◆ free_element_cb()

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

Callback used to free the elements in the map.

Parameters
clsNULL
keykey of the element
valuethe value to free

Definition at line 195 of file gnunet-service-scalarproduct-ecc_bob.c.

198{
199 struct GNUNET_SCALARPRODUCT_Element *element = value;
200
201 GNUNET_free (element);
202 return GNUNET_OK;
203}
static char * value
Value of the record to add/remove.
@ GNUNET_OK
#define GNUNET_free(ptr)
Wrapper around free.
An element key-value pair for scalarproduct.

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 BobServiceSession s)
static

Destroy session state, we are done with it.

Parameters
sthe session to free elements from

Definition at line 212 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static int free_element_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Callback used to free the elements in the map.
void GNUNET_CADET_channel_destroy(struct GNUNET_CADET_Channel *channel)
Destroy an existing channel.
Definition: cadet_api.c:833
void GNUNET_CADET_close_port(struct GNUNET_CADET_Port *p)
Close a port opened with GNUNET_CADET_open_port.
Definition: cadet_api.c:804
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_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
@ GNUNET_YES
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_SETI_destroy(struct GNUNET_SETI_Handle *set)
Destroy the set handle, and free all associated resources.
Definition: seti_api.c:488
void GNUNET_SETI_operation_cancel(struct GNUNET_SETI_OperationHandle *oh)
Cancel the given set operation.
Definition: seti_api.c:335
struct MpiElement * sorted_elements
b(Bob)
struct GNUNET_CADET_Port * port
Our open port.
struct GNUNET_CADET_Channel * channel
The CADET channel.
struct GNUNET_SETI_OperationHandle * intersection_op
Set of elements for which will conduction an intersection.
struct GNUNET_CONTAINER_MultiHashMap * intersected_elements
All non-0-value'd elements transmitted to us.
struct GNUNET_SERVICE_Client * client
The client this request is related to.
struct GNUNET_SETI_Handle * intersection_set
Set of elements for which we will be conducting an intersection.
int in_destroy
Are we already in destroy_service_session()?
Handle to a client that is connected to a service.
Definition: service.c:249

References BobServiceSession::channel, BobServiceSession::client, free_element_cb(), GNUNET_CADET_channel_destroy(), GNUNET_CADET_close_port(), GNUNET_CONTAINER_multihashmap_destroy(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_free, GNUNET_SERVICE_client_drop(), GNUNET_SETI_destroy(), GNUNET_SETI_operation_cancel(), GNUNET_YES, BobServiceSession::in_destroy, BobServiceSession::intersected_elements, BobServiceSession::intersection_op, BobServiceSession::intersection_set, BobServiceSession::port, and BobServiceSession::sorted_elements.

Referenced by cb_channel_destruction(), and client_disconnect_cb().

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 BobServiceSession session)
static

Notify the client that the session has succeeded or failed.

This message gets sent to Bob's client if the operation completed or Alice disconnected.

Parameters
sessionthe associated client session to fail or succeed

Definition at line 269 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
struct GNUNET_MessageHeader * msg
Definition: 005.c:2
#define GNUNET_log(kind,...)
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
@ GNUNET_ERROR_TYPE_DEBUG
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_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
Definition: gnunet_mq_lib.h:76
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_RESULT
Alice/Bob -> Client Result.
struct GNUNET_HashCode session_id
(hopefully) unique transaction ID
enum GNUNET_SCALARPRODUCT_ResponseStatus status
State of this session.
struct GNUNET_MQ_Handle * client_mq
Client message queue.
Message type passed from service client to finalize a session as requester or responder.

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

Referenced by bob_cadet_done_cb(), cb_channel_destruction(), and cb_intersection_element_removed().

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 BobServiceSession
channelconnection to the other end (henceforth invalid)

Definition at line 300 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static void prepare_client_end_notification(struct BobServiceSession *session)
Notify the client that the session has succeeded or failed.
static void destroy_service_session(struct BobServiceSession *s)
Destroy session state, we are done with it.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
@ GNUNET_SCALARPRODUCT_STATUS_ACTIVE
Operation is still active (never returned, used internally).
@ GNUNET_SCALARPRODUCT_STATUS_FAILURE
We encountered some error.
A scalarproduct session which tracks an offer for a multiplication service by a local client.
struct GNUNET_CRYPTO_PaillierCiphertext s
Bob's "s".

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

Referenced by handle_bob_client_message().

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

◆ bob_cadet_done_cb()

static void bob_cadet_done_cb ( void *  cls)
static

MQ finished giving our last message to CADET, now notify the client that we are finished.

Definition at line 324 of file gnunet-service-scalarproduct-ecc_bob.c.

325{
326 struct BobServiceSession *session = cls;
327
330}
@ GNUNET_SCALARPRODUCT_STATUS_SUCCESS
The computation was successful.

References GNUNET_SCALARPRODUCT_STATUS_SUCCESS, prepare_client_end_notification(), and BobServiceSession::status.

Referenced by transmit_bobs_cryptodata_message().

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

◆ transmit_bobs_cryptodata_message()

static void transmit_bobs_cryptodata_message ( struct BobServiceSession s)
static

Bob generates the response message to be sent to Alice.

Parameters
sthe associated requesting session with Alice

Definition at line 339 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static void bob_cadet_done_cb(void *cls)
MQ finished giving our last message to CADET, now notify the client that we are finished.
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_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA
Bob -> Alice ECC crypto data.
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_CRYPTO_EccPoint prod_g_i_b_i
Product of the g_i^{b_i}.
Message type passed from responding service Bob to responding service Alice to complete a request and...

References bob_cadet_done_cb(), BobServiceSession::cadet_mq, GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_BOB_CRYPTODATA, GNUNET_MQ_msg, GNUNET_MQ_notify_sent(), GNUNET_MQ_send(), msg, BobServiceSession::prod_g_i_b_i, and BobServiceSession::prod_h_i_b_i.

Referenced by cb_intersection_element_removed(), and handle_alices_cryptodata_message().

Here is the call graph for this function:
Here is the caller 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 368 of file gnunet-service-scalarproduct-ecc_bob.c.

371{
372 struct BobServiceSession *s = cls;
374
376 e->value);
379 return GNUNET_OK;
380}
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
Definition: common_endian.c:54
uint32_t used_element_count
How many elements actually are used for the scalar product.
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.
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.

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

Referenced by handle_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. TODO: code duplication with Alice!

Definition at line 392 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
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
An encrypted element key-value pair.

References GNUNET_CRYPTO_hash_cmp(), and MpiElement::key.

Referenced by handle_alices_cryptodata_message().

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

◆ check_alices_cryptodata_message()

static int check_alices_cryptodata_message ( void *  cls,
const struct EccAliceCryptodataMessage msg 
)
static

Check a multipart-chunk of a request from another service to calculate a scalarproduct with us.

Parameters
clsclosure (set from GNUNET_CADET_connect)
msgthe actual message
Returns
GNUNET_OK to keep the connection open, GNUNET_SYSERR to close it (signal serious error)

Definition at line 413 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
uint16_t size
The length of the struct (in bytes, including the length field itself), in big-endian format.
@ GNUNET_SYSERR
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
#define max(x, y)
Vector of ECC-encrypted values sent by Alice to Bob (after set intersection).
Point on a curve (always for Curve25519) encoded in a format suitable for network transmission (ECDH)...

References GNUNET_break_op, GNUNET_CONTAINER_multihashmap_size(), GNUNET_OK, GNUNET_SYSERR, max, msg, BobServiceSession::s, and GNUNET_MessageHeader::size.

Here is the call graph for this function:

◆ handle_alices_cryptodata_message()

static void handle_alices_cryptodata_message ( void *  cls,
const struct EccAliceCryptodataMessage msg 
)
static

Handle a multipart-chunk of a request from another service to calculate a scalarproduct with us.

Parameters
clsclosure (set from GNUNET_CADET_connect)
msgthe actual message

Definition at line 454 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static unsigned long long payload
How much data are we currently storing in the database?
static void transmit_bobs_cryptodata_message(struct BobServiceSession *s)
Bob generates the response message to be sent to Alice.
static int element_cmp(const void *a, const void *b)
Compare two struct MpiValues by key for sorting.
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.
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
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.
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.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
#define GNUNET_new_array(n, type)
Allocate a size n array with structs or unions of the given type.
uint32_t cadet_received_element_count
Counts the number of values received from Alice by us.
A ECC scalar for use in point multiplications.

References BobServiceSession::cadet_received_element_count, BobServiceSession::channel, copy_element_cb(), element_cmp(), GNUNET_assert, GNUNET_CADET_receive_done(), GNUNET_CONTAINER_multihashmap_iterate(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_CRYPTO_ecc_add(), GNUNET_CRYPTO_ecc_pmul_mpi(), GNUNET_CRYPTO_ecc_scalar_from_int(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, GNUNET_new_array, GNUNET_OK, BobServiceSession::intersected_elements, BobServiceSession::intersection_op, max, msg, payload, BobServiceSession::prod_g_i_b_i, BobServiceSession::prod_h_i_b_i, BobServiceSession::s, BobServiceSession::sorted_elements, transmit_bobs_cryptodata_message(), BobServiceSession::used_element_count, GNUNET_CRYPTO_EccScalar::v, and MpiElement::value.

Here is the call 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 needs to be removed from the result set.

Parameters
clsclosure with the struct BobServiceSession
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 555 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static int status
The program status; 0 for success.
Definition: gnunet-nse.c:39
#define LOG(kind,...)
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.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur.
@ 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.
uint32_t client_received_element_count
Already transferred elements (received) for multipart messages from client.
const void * data
Actual data of the element.

References BobServiceSession::channel, BobServiceSession::client_received_element_count, GNUNET_SETI_Element::data, GNUNET_assert, GNUNET_break, GNUNET_CADET_receive_done(), GNUNET_CONTAINER_multihashmap_get(), GNUNET_CONTAINER_multihashmap_remove(), GNUNET_CONTAINER_multihashmap_size(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_ntohll(), GNUNET_SCALARPRODUCT_STATUS_FAILURE, GNUNET_SETI_destroy(), GNUNET_SETI_STATUS_DEL_LOCAL, GNUNET_SETI_STATUS_DONE, GNUNET_SETI_STATUS_FAILURE, GNUNET_YES, BobServiceSession::intersected_elements, BobServiceSession::intersection_op, BobServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, LOG, prepare_client_end_notification(), BobServiceSession::s, status, BobServiceSession::status, transmit_bobs_cryptodata_message(), and GNUNET_SCALARPRODUCT_Element::value.

Here is the call graph for this function:

◆ start_intersection()

static void start_intersection ( struct BobServiceSession s)
static

We've paired up a client session with an incoming CADET request.

Initiate set intersection work.

Parameters
sclient session to start intersection for

Definition at line 624 of file gnunet-service-scalarproduct-ecc_bob.c.

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 !=
646 {
647 GNUNET_break (0);
650 return;
651 }
653 s->intersection_set = NULL;
654}
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.
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_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
uint32_t total
How many elements will be supplied in total from the client.
struct GNUNET_PeerIdentity peer
Originator's peer identity.
A 512-bit hashcode.
Option for set operations.

References GNUNET_CRYPTO_hash(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_h2s(), GNUNET_log, GNUNET_SETI_prepare(), BobServiceSession::intersection_op, BobServiceSession::peer, BobServiceSession::session_id, and BobServiceSession::total.

Referenced by handle_alices_computation_request(), and handle_bob_client_message_multipart().

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

◆ handle_alices_computation_request()

static void handle_alices_computation_request ( void *  cls,
const struct EccServiceRequestMessage msg 
)
static

Handle a request from Alice to calculate a scalarproduct with us (Bob).

Parameters
clsclosure (set from GNUNET_CADET_connect)
msgthe actual message

Definition at line 664 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static void start_intersection(struct BobServiceSession *s)
We've paired up a client session with an incoming CADET request.

References GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, msg, BobServiceSession::s, and start_intersection().

Here is the call graph for this function:

◆ cb_channel_incoming()

static void * cb_channel_incoming ( void *  cls,
struct GNUNET_CADET_Channel channel,
const struct GNUNET_PeerIdentity initiator 
)
static

Function called for inbound channels on Bob's end.

Does some preliminary initialization, more happens after we get Alice's first message.

Parameters
clsour struct BobServiceSession
channelnew handle to the channel
initiatorpeer that started the channel
Returns
session associated with the channel

Definition at line 693 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
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

References BobServiceSession::channel, GNUNET_CADET_close_port(), GNUNET_CADET_get_mq(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_i2s(), GNUNET_log, and BobServiceSession::s.

Referenced by handle_bob_client_message().

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

◆ check_bob_client_message_multipart()

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

We're receiving additional set data.

Check it is well-formed.

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

Definition at line 719 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
multipart messages following struct ComputationMessage

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

◆ handle_bob_client_message_multipart()

static void handle_bob_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
clsidentification of the client
msgthe actual message

Definition at line 752 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
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.
@ 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_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
#define GNUNET_new(type)
Allocate a struct or union of the given type.
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
Definition: service.c:2389
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
Element stored in a set.

References BobServiceSession::channel, BobServiceSession::client, BobServiceSession::client_received_element_count, 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, BobServiceSession::intersected_elements, BobServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, msg, BobServiceSession::s, GNUNET_SETI_Element::size, start_intersection(), and BobServiceSession::total.

Here is the call graph for this function:

◆ check_bob_client_message()

static int check_bob_client_message ( void *  cls,
const struct BobComputationMessage msg 
)
static

Handler for Bob's a client request message.

Check msg is well-formed.

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

Definition at line 818 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
@ GNUNET_SCALARPRODUCT_STATUS_INIT
Operation is still active (never returned, used internally).
Message type passed from client to service to initiate a request or responder role.
Definition: scalarproduct.h:89

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

◆ handle_bob_client_message()

static void handle_bob_client_message ( void *  cls,
const struct BobComputationMessage msg 
)
static

Handler for Bob's a client request message.

Bob is in the response role, keep the values + session and waiting for a matching session or process a waiting request from Alice.

Parameters
clsidentification of the client
msgthe actual message

Definition at line 857 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
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 void cb_channel_destruction(void *cls, const struct GNUNET_CADET_Channel *channel)
Function called whenever a channel is destroyed.
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
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_MQ_hd_fixed_size(name, code, str, ctx)
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION
Alice -> Bob ECC session initialization.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA
Alice -> Bob ECC crypto data.
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
Message type passed from requesting service Alice to responding service Bob to initiate a request and...
Message handler for a specific message type.

References cb_channel_destruction(), cb_channel_incoming(), cfg, BobServiceSession::client, BobServiceSession::client_received_element_count, GNUNET_SETI_Element::data, GNUNET_SETI_Element::element_type, GNUNET_break, GNUNET_CADET_open_port(), GNUNET_CONTAINER_multihashmap_create(), GNUNET_CONTAINER_multihashmap_put(), GNUNET_CONTAINER_MULTIHASHMAPOPTION_UNIQUE_ONLY, GNUNET_ERROR_TYPE_DEBUG, GNUNET_free, GNUNET_h2s(), GNUNET_log, GNUNET_memcpy, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_ALICE_CRYPTODATA, GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ECC_SESSION_INITIALIZATION, GNUNET_MQ_handler_end, GNUNET_MQ_hd_fixed_size, GNUNET_MQ_hd_var_size, GNUNET_new, GNUNET_ntohll(), GNUNET_SCALARPRODUCT_STATUS_ACTIVE, GNUNET_SERVICE_client_continue(), GNUNET_SERVICE_client_drop(), GNUNET_SETI_add_element(), GNUNET_SETI_create(), GNUNET_SYSERR, GNUNET_YES, BobServiceSession::intersected_elements, BobServiceSession::intersection_set, GNUNET_SCALARPRODUCT_Element::key, msg, my_cadet, BobServiceSession::port, BobServiceSession::s, BobServiceSession::session_id, GNUNET_SETI_Element::size, BobServiceSession::status, BobServiceSession::total, BobServiceSession::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

Definition at line 942 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
static struct GNUNET_CRYPTO_EccDlogContext * edc
Context for DLOG operations on a curve.
void GNUNET_CADET_disconnect(struct GNUNET_CADET_Handle *handle)
Disconnect from the cadet service.
Definition: cadet_api.c:777
void GNUNET_CRYPTO_ecc_dlog_release(struct GNUNET_CRYPTO_EccDlogContext *dlc)
Release precalculated values.

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

Referenced by run().

Here is the call graph for this function:
Here is the caller 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 BobServiceSession

Definition at line 971 of file gnunet-service-scalarproduct-ecc_bob.c.

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}
struct GNUNET_MQ_Handle * mq
Definition: 003.c:5

References BobServiceSession::client, GNUNET_new, mq, and BobServiceSession::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 BobServiceSession

Definition at line 995 of file gnunet-service-scalarproduct-ecc_bob.c.

998{
999 struct BobServiceSession *s = app_cls;
1000
1002 "Client disconnected from us.\n");
1003 s->client = NULL;
1005}

References destroy_service_session(), GNUNET_ERROR_TYPE_DEBUG, GNUNET_log, and BobServiceSession::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 1016 of file gnunet-service-scalarproduct-ecc_bob.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}
static void shutdown_task(void *cls)
Task run during shutdown.
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
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.
@ GNUNET_ERROR_TYPE_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 _(String)
GNU gettext support macro.
Definition: platform.h:178

References _, cfg, edc, GNUNET_CADET_connect(), GNUNET_CRYPTO_ecc_dlog_prepare(), GNUNET_ERROR_TYPE_ERROR, GNUNET_log, GNUNET_SCHEDULER_add_shutdown(), GNUNET_SCHEDULER_shutdown(), my_cadet, and shutdown_task().

Here is the call graph for this function:

◆ GNUNET_SERVICE_MAIN()

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.

Variable Documentation

◆ cfg

const struct GNUNET_CONFIGURATION_Handle* cfg
static

GNUnet configuration handle.

Definition at line 174 of file gnunet-service-scalarproduct-ecc_bob.c.

Referenced by handle_bob_client_message(), and run().

◆ my_cadet

struct GNUNET_CADET_Handle* my_cadet
static

Handle to the CADET service.

Definition at line 179 of file gnunet-service-scalarproduct-ecc_bob.c.

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

◆ edc

struct GNUNET_CRYPTO_EccDlogContext* edc
static

Context for DLOG operations on a curve.

Definition at line 184 of file gnunet-service-scalarproduct-ecc_bob.c.

Referenced by run(), and shutdown_task().