39 #define LOG(kind, ...) \ 40 GNUNET_log_from (kind, "scalarproduct-alice", __VA_ARGS__) 161 uint32_t used_element_count;
167 uint32_t client_received_element_count;
323 "Sending session-end notification with status %d to client for session %s\n",
344 unsigned char *product_exported = NULL;
345 size_t product_length = 0;
357 value = gcry_mpi_new (0);
358 sign = gcry_mpi_cmp_ui (s->
product, 0);
362 gcry_mpi_sub (value, value, s->
product);
367 gcry_mpi_add (value, value, s->
product);
377 if ((0 != range) && (0 != (rc = gcry_mpi_aprint (GCRYMPI_FMT_STD,
386 gcry_mpi_release (value);
391 msg->
range = htonl (range);
393 if (NULL != product_exported)
400 "Sent result to client, session %s has ended!\n",
420 "Peer disconnected, terminating session %s with peer %s\n",
450 for (i = 0; i < length; i++)
452 gcry_mpi_mul (elem, vector[i].
value, vector[i].value);
453 gcry_mpi_add (sum, sum, elem);
455 gcry_mpi_release (elem);
476 for (i = 0; i < length; i++)
478 gcry_mpi_mul (elem, vector[i], vector[i]);
479 gcry_mpi_add (sum, sum, elem);
481 gcry_mpi_release (elem);
512 for (i = 0; i < count; i++)
514 r[i] = gcry_mpi_new (0);
521 r_prime[i] = gcry_mpi_new (0);
526 gcry_mpi_sub (r_prime[i], r_prime[i],
my_offset);
527 gcry_mpi_sub (r_prime[i], r_prime[i],
my_offset);
533 u = gcry_mpi_new (0);
535 gcry_mpi_sub (u, u, tmp);
536 gcry_mpi_release (tmp);
539 u_prime = gcry_mpi_new (0);
541 gcry_mpi_sub (u_prime, u_prime, tmp);
556 gcry_mpi_add (p, s, t);
557 gcry_mpi_add (p, p, u);
560 gcry_mpi_add (p_prime, s_prime, t);
561 gcry_mpi_add (p_prime, p_prime, u_prime);
563 gcry_mpi_release (t);
564 gcry_mpi_release (u);
565 gcry_mpi_release (u_prime);
566 gcry_mpi_release (s);
567 gcry_mpi_release (s_prime);
570 gcry_mpi_sub (p, p, p_prime);
571 gcry_mpi_release (p_prime);
572 tmp = gcry_mpi_set_ui (tmp, 2);
573 gcry_mpi_div (p, NULL, p, tmp, 0);
575 gcry_mpi_release (tmp);
576 for (i = 0; i < count; i++)
579 gcry_mpi_release (r[i]);
580 gcry_mpi_release (r_prime[i]);
610 size_t required_size;
617 if ((required_size != msg_size) ||
646 "Received %u additional crypto values from Bob\n",
647 (
unsigned int) contained);
651 for (i = 0; i < contained; i++)
686 size_t required_size;
694 if ((msg_size != required_size) || (contained > UINT16_MAX) ||
734 "Received %u crypto values from Bob\n",
735 (
unsigned int) contained);
743 payload = &payload[2];
749 for (i = 0; i < contained; i++)
787 mval = gcry_mpi_new (0);
790 gcry_mpi_sub_ui (mval, mval, -val);
792 gcry_mpi_add_ui (mval, mval, val);
821 #define ELEMENT_CAPACITY \ 822 ((GNUNET_CONSTANTS_MAX_CADET_MESSAGE_SIZE - 1 \ 823 - sizeof(struct AliceCryptodataMessage)) \ 824 / sizeof(struct GNUNET_CRYPTO_PaillierCiphertext)) 852 "Finished intersection, %d items remain\n",
859 while (off < s->used_element_count)
865 "Sending %u/%u crypto values to Bob\n",
866 (
unsigned int) todo_count,
876 a = gcry_mpi_new (0);
877 for (i = off; i < off + todo_count; i++)
884 gcry_mpi_release (a);
904 uint64_t current_size,
918 "Intersection removed element with key %s and value %lld\n",
1027 bobs_cryptodata_multipart,
1036 "Creating new channel for session with key %s.\n",
1087 uint32_t contained_count;
1095 (0 == contained_count) ||
1119 uint32_t contained_count;
1127 for (uint32_t i = 0; i < contained_count; i++)
1144 set_elem.
size =
sizeof(elem->
key);
1173 uint32_t total_count;
1174 uint32_t contained_count;
1186 if ((0 == total_count) || (0 == contained_count) ||
1210 uint32_t contained_count;
1211 uint32_t total_count;
1220 s->
total = total_count;
1228 for (uint32_t i = 0; i < contained_count; i++)
1248 set_elem.
size =
sizeof(elem->
key);
1276 if (NULL != my_cadet)
1326 "Client %p disconnected from us.\n",
1356 if (NULL == my_cadet)
1369 "scalarproduct-alice",
1380 alice_client_message_multipart,
We encountered some error.
A scalarproduct session which tracks a request form the client to our final response.
Message type passed from service client to finalize a session as requester or responder.
int in_destroy
Flag to prevent recursive calls to destroy_service_session() from doing harm.
void GNUNET_CADET_disconnect(struct GNUNET_CADET_Handle *handle)
Disconnect from the cadet service.
static struct GNUNET_CRYPTO_PaillierPrivateKey my_privkey
Service's own private key.
struct GNUNET_SETI_Handle * intersection_set
Set of elements for which will conduction an intersection.
static struct GNUNET_SERVICE_Handle * service
Handle to our service instance.
Success, all elements have been sent (and received).
static gcry_mpi_t my_offset
Service's offset for values that could possibly be negative but are plaintext for encryption...
struct GNUNET_MessageHeader * msg
struct GNUNET_CRYPTO_PaillierPublicKey public_key
Alice's public key.
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.
static struct GNUNET_VPN_RedirectionRequest * request
Opaque redirection request handle.
struct GNUNET_CADET_Channel * channel
channel-handle associated with our cadet handle
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_MULTIPART_ALICE
Client -> Alice multipart.
struct GNUNET_MQ_Handle * cadet_mq
The message queue for CADET.
static void handle_bobs_cryptodata_multipart(void *cls, const struct BobCryptodataMultipartMessage *msg)
Handle a multipart chunk of a response we got from another service we wanted to calculate a scalarpro...
The other peer refused to do the operation with us, or something went wrong.
unsigned int GNUNET_CONTAINER_multihashmap_size(const struct GNUNET_CONTAINER_MultiHashMap *map)
Get the number of key-value pairs in the map.
static struct GNUNET_CRYPTO_PaillierPublicKey my_pubkey
Service's own public key.
Opaque handle to the service.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_SESSION_INITIALIZATION
Alice -> Bob session initialization.
uint16_t size
Number of bytes in the buffer pointed to by data.
const struct GNUNET_HashCode * key
Key used to identify matching pairs of values to multiply.
static void prepare_client_end_notification(struct AliceServiceSession *session)
Notify the client that the session has failed.
Operation is still active (never returned, used internally).
int GNUNET_SETI_commit(struct GNUNET_SETI_OperationHandle *oh, struct GNUNET_SETI_Handle *set)
Commit a set to be used with a set operation.
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, or when GNUNET_SCHEDULER_shutdown() is being invoked.
static void shutdown_task(void *cls)
Task run during shutdown.
struct GNUNET_HashCode key
Key used to identify matching pairs of values to multiply.
struct GNUNET_CRYPTO_PaillierCiphertext s_prime
Bob's "s'".
static int check_bobs_cryptodata_message(void *cls, const struct BobCryptodataMessage *msg)
Check a response we got from another service we wanted to calculate a scalarproduct with...
struct GNUNET_SETI_ListenHandle * intersection_listen
Handle to Alice's Intersection operation listening for Bob.
Option for set operations.
#define GNUNET_assert(cond)
Use this for fatal errors that cannot be handled.
static void send_alices_cryptodata_message(struct AliceServiceSession *s)
Send the cryptographic data from Alice to Bob.
int32_t range
Workaround for libgcrypt: -1 if negative, 0 if zero, else 1.
#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 responding service Bob to responding service Alice to complete a request and...
struct GNUNET_MessageHeader header
GNUNET message header with type GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE.
#define GNUNET_memcpy(dst, src, n)
Call memcpy() but check for n being 0 first.
static void handle_alice_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
#define GNUNET_MQ_msg(mvar, type)
Allocate a GNUNET_MQ_Envelope.
static struct Experiment * e
static void client_disconnect_cb(void *cls, struct GNUNET_SERVICE_Client *client, void *app_cls)
A client disconnected.
Opaque handle to a channel.
const char * GNUNET_h2s(const struct GNUNET_HashCode *hc)
Convert a hash value to a string (for printing debug messages).
#define GNUNET_new(type)
Allocate a struct or union of the given type.
static void handle_bobs_cryptodata_message(void *cls, const struct BobCryptodataMessage *msg)
Handle a response we got from another service we wanted to calculate a scalarproduct with...
enum GNUNET_SCALARPRODUCT_ResponseStatus status
State of this session.
struct GNUNET_MessageHeader header
GNUNET message header with type GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA. ...
struct GNUNET_MessageHeader header
GNUNET message header.
static void run(void *cls, const struct GNUNET_CONFIGURATION_Handle *c, struct GNUNET_SERVICE_Handle *service)
Initialization of the program and message handlers.
gcry_mpi_t value
a_i value, not disclosed to Bob.
static struct GNUNET_SCHEDULER_Task * t
Main task.
void GNUNET_SCHEDULER_shutdown(void)
Request the shutdown of a scheduler.
static gcry_mpi_t compute_square_sum_mpi_elements(const struct MpiElement *vector, uint32_t length)
Computes the square sum over a vector of a given length.
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.
Opaque handle to a listen operation.
Internal representation of the hash map.
Handle for a set operation request from another peer.
#define GNUNET_break(cond)
Use this for internal assertion violations that are not fatal (can be handled) but should not occur...
uint32_t total
How many elements we were supplied with from the client (total count before intersection).
Message type passed from client to service to initiate a request or responder role.
struct GNUNET_HashCode session_key
the transaction/session key used to identify a session
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.
struct GNUNET_CADET_Handle * GNUNET_CADET_connect(const struct GNUNET_CONFIGURATION_Handle *cfg)
Connect to the MQ-based cadet service.
struct GNUNET_CRYPTO_PaillierCiphertext * r_prime
Bob's permutation q of R.
void GNUNET_CRYPTO_paillier_create(struct GNUNET_CRYPTO_PaillierPublicKey *public_key, struct GNUNET_CRYPTO_PaillierPrivateKey *private_key)
Create a freshly generated paillier public key.
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.
Handle to a client that is connected to a service.
static const struct GNUNET_CONFIGURATION_Handle * cfg
GNUnet configuration handle.
static int check_bobs_cryptodata_multipart(void *cls, const struct BobCryptodataMultipartMessage *msg)
Check a multipart chunk of a response we got from another service we wanted to calculate a scalarprod...
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.
uint32_t status
Status information about the outcome of this session, An enum GNUNET_SCALARPRODUCT_ResponseStatus (in...
#define GNUNET_MQ_msg_extra(mvar, esize, type)
Allocate an envelope, with extra space allocated after the space needed by the message struct...
static int element_cmp(const void *a, const void *b)
Compare two struct MpiValues by key for sorting.
static struct GNUNET_OS_Process * p
Helper process we started.
struct MpiElement * sorted_elements
a(Alice), sorted array by key of length used_element_count.
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().
struct GNUNET_PeerIdentity peer
the identity of a remote peer we want to communicate with
Scalar Product API Message Types.
void GNUNET_SETI_operation_cancel(struct GNUNET_SETI_OperationHandle *oh)
Cancel the given set operation.
#define GNUNET_MQ_hd_var_size(name, code, str, ctx)
#define GNUNET_break_op(cond)
Use this for assertion violations caused by other peers (i.e.
void GNUNET_CONTAINER_multihashmap_destroy(struct GNUNET_CONTAINER_MultiHashMap *map)
Destroy a hash map.
static gcry_mpi_t compute_square_sum(const gcry_mpi_t *vector, uint32_t length)
Computes the square sum over a vector of a given length.
static void destroy_service_session(struct AliceServiceSession *s)
Destroy session state, we are done with it.
uint32_t element_count_total
how many elements the vector in payload contains
Message type passed from requesting service Alice to responding service Bob to initiate a request and...
uint16_t status
See PRISM_STATUS_*-constants.
#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
Already transferred elements from Bob to us.
int 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.
const void * data
Actual data of the element.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA
Bob -> Alice SP crypto-data.
struct GNUNET_HashCode session_id
The transaction/session key used to identify a session.
struct GNUNET_SETI_Handle * GNUNET_SETI_create(const struct GNUNET_CONFIGURATION_Handle *cfg)
Create an empty set, supporting the specified operation.
void GNUNET_CRYPTO_paillier_decrypt(const struct GNUNET_CRYPTO_PaillierPrivateKey *private_key, const struct GNUNET_CRYPTO_PaillierPublicKey *public_key, const struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext, gcry_mpi_t m)
Decrypt a paillier ciphertext with a private key.
GNUNET_SERVICE_MAIN("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.
static void handle_alice_client_message(void *cls, const struct AliceComputationMessage *msg)
Handler for Alice's client request message.
void GNUNET_SERVICE_client_drop(struct GNUNET_SERVICE_Client *c)
Ask the server to disconnect from the given client.
Message handler for a specific message type.
static void transmit_client_response(struct AliceServiceSession *s)
Prepare the final (positive) response we will send to Alice's client.
struct GNUNET_PeerIdentity peer
Alice or Bob's peerID.
struct GNUNET_HashCode session_id
(hopefully) unique transaction ID
There must only be one value per key; storing a value should fail if a value under the same key alrea...
Vector of Pallier-encrypted values sent by Alice to Bob (after set intersection). ...
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_CLIENT_TO_ALICE
Client -> Alice.
An encrypted element key-value pair.
scalarproduct service P2P messages
Multipart Message type passed between to supply additional elements for the peer. ...
uint32_t product_length
0 if no product attached
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_BOB_CRYPTODATA_MULTIPART
Bob -> Alice SP crypto-data multipart.
int64_t value
Value to multiply in scalar product, in NBO.
int 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.
static unsigned long long payload
How much data are we currently storing in the database?
Element should be delete from the result set of the local peer, i.e.
uint32_t used_element_count
How many elements actually are used for the scalar product.
#define GNUNET_memcmp(a, b)
Compare memory in a and b, where both must be of the same pointer type.
struct GNUNET_CONTAINER_MultiHashMap * intersected_elements
all non-0-value'd elements transmitted to us.
gcry_mpi_t product
The computed scalar.
Handle to a message queue.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_ALICE_CRYPTODATA
Alice -> Bob SP crypto-data (after intersection)
The identity of the host (wraps the signing key of the peer).
void GNUNET_CADET_receive_done(struct GNUNET_CADET_Channel *channel)
Send an ack on the channel to confirm the processing of a message.
static int check_alice_client_message_multipart(void *cls, const struct ComputationBobCryptodataMultipartMessage *msg)
We're receiving additional set data.
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.
The computation was successful.
struct GNUNET_MessageHeader header
GNUNET message header.
GNUNET_SETI_Status
Status for the result callback.
static int free_element_cb(void *cls, const struct GNUNET_HashCode *key, void *value)
Iterator called to free elements.
static void * client_connect_cb(void *cls, struct GNUNET_SERVICE_Client *client, struct GNUNET_MQ_Handle *mq)
A client connected.
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.
static int check_alice_client_message(void *cls, const struct AliceComputationMessage *msg)
Handler for Alice's client request message.
uint32_t contained_element_count
How many elements we supply within this message? In NBO.
struct GNUNET_MQ_Handle * mq
#define GNUNET_log(kind,...)
uint32_t element_count_contained
contained elements the vector in payload contains
uint32_t contained_element_count
How many elements we appended to this message? In NBO.
struct GNUNET_CONTAINER_MultiHashMap * GNUNET_CONTAINER_multihashmap_create(unsigned int len, int do_not_copy_keys)
Create a multi hash map.
uint32_t element_count_contained
contained elements the vector in payload contains
multipart messages following struct ComputationMessage
void GNUNET_MQ_send(struct GNUNET_MQ_Handle *mq, struct GNUNET_MQ_Envelope *ev)
Send a message with the given message queue.
struct GNUNET_SERVICE_Client * client
The client this request is related to.
static struct GNUNET_CADET_Handle * my_cadet
Handle to the CADET service.
uint32_t contained_element_count
How many elements this individual message delivers (in NBO).
GNUNET_SCALARPRODUCT_ResponseStatus
Result status values for the computation.
struct GNUNET_MQ_Handle * client_mq
The message queue for the client.
#define ELEMENT_CAPACITY
Maximum number of elements we can put into a single cryptodata message.
struct GNUNET_CRYPTO_PaillierCiphertext * r
Bob's permutation p of R.
struct GNUNET_SETI_OperationHandle * intersection_op
Set of elements for which will conduction an intersection.
#define GNUNET_CRYPTO_PAILLIER_BITS
Size of paillier plain texts and public keys.
int GNUNET_CONTAINER_multihashmap_iterate(struct GNUNET_CONTAINER_MultiHashMap *map, GNUNET_CONTAINER_MulitHashMapIteratorCallback it, void *it_cls)
Iterate over all entries in the map.
struct GNUNET_CRYPTO_PaillierCiphertext s
Bob's "s".
void GNUNET_SETI_listen_cancel(struct GNUNET_SETI_ListenHandle *lh)
Cancel the given listen operation.
uint32_t client_received_element_count
Already transferred elements from client to us.
void GNUNET_CADET_channel_destroy(struct GNUNET_CADET_Channel *channel)
Destroy an existing channel.
static gcry_mpi_t compute_scalar_product(struct AliceServiceSession *session)
Compute our scalar product, done by Alice.
const char * GNUNET_i2s(const struct GNUNET_PeerIdentity *pid)
Convert a peer identity to a string (for printing debug messages).
void GNUNET_SERVICE_client_continue(struct GNUNET_SERVICE_Client *c)
Continue receiving further messages from the given client.
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.
#define GNUNET_MQ_handler_end()
End-marker for the handlers array.
uint16_t element_type
Application-specific element type.
#define GNUNET_malloc(size)
Wrapper around malloc.
An element key-value pair for scalarproduct.
uint64_t GNUNET_ntohll(uint64_t n)
Convert unsigned 64-bit integer to host byte order.
#define GNUNET_MESSAGE_TYPE_SCALARPRODUCT_RESULT
Alice/Bob -> Client Result.
#define GNUNET_free(ptr)
Wrapper around free.
static void client_request_complete_alice(struct AliceServiceSession *s)
Our client has finished sending us its multipart message.
static void cb_channel_destruction(void *cls, const struct GNUNET_CADET_Channel *channel)
Function called whenever a channel is destroyed.
void GNUNET_SETI_destroy(struct GNUNET_SETI_Handle *set)
Destroy the set handle, and free all associated resources.
struct GNUNET_MQ_Handle * GNUNET_CADET_get_mq(const struct GNUNET_CADET_Channel *channel)
Obtain the message queue for a connected peer.
int GNUNET_CRYPTO_paillier_encrypt(const struct GNUNET_CRYPTO_PaillierPublicKey *public_key, const gcry_mpi_t m, int desired_ops, struct GNUNET_CRYPTO_PaillierCiphertext *ciphertext)
Encrypt a plaintext with a paillier public key.