extern "C"
{
#endif
+///////////////////////////////////////////////////////////////////////////////
+// Defines
+///////////////////////////////////////////////////////////////////////////////
+/**
+ * Length of the key used for encryption
+ */
+#define KEYBITS 2048
+
+/**
+ * When performing our crypto, we may add two encrypted values with each
+ * a maximal length of GNUNET_CRYPTO_RSA_DATA_ENCODING_LENGTH.
+ * thus we can receive a slightly longer element (+1 byte)
+ */
+#define PAILLIER_ELEMENT_LENGTH (2*KEYBITS/8 +1)
+
+/**
+ * Maximum count of elements we can put into a multipart message
+ */
+#define MULTIPART_ELEMENT_CAPACITY ((GNUNET_SERVER_MAX_MESSAGE_SIZE - 1 - sizeof (struct GNUNET_SCALARPRODUCT_multipart_message)) / PAILLIER_ELEMENT_LENGTH)
+
+/**
+ * Log an error message at log-level 'level' that indicates
+ * a failure of the command 'cmd' with the message given
+ * by gcry_strerror(rc).
+ */
+#define LOG_GCRY(level, cmd, rc) do { LOG(level, _("`%s' failed at %s:%d with error: %s\n"), cmd, __FILE__, __LINE__, gcry_strerror(rc)); } while(0)
///////////////////////////////////////////////////////////////////////////////
// Scalar Product Message Types
///////////////////////////////////////////////////////////////////////////////
/**
- * Message type passed from client to service
+ * Message type passed from client to service
* to initiate a request or responder role
*/
struct GNUNET_SCALARPRODUCT_client_request
/**
* how many elements the vector in payload contains
*/
- uint16_t element_count GNUNET_PACKED;
+ uint32_t element_count GNUNET_PACKED;
/**
* how many bytes the mask has
*/
- uint16_t mask_length GNUNET_PACKED;
+ uint32_t mask_length GNUNET_PACKED;
/**
* the transaction/session key used to identify a session
* followed by long vector[element_count] | [unsigned char mask[mask_bytes]]
*/
};
-
+
/**
* Message type passed from requesting service Alice to responding service Bob
* to initiate a request and make bob participate in our protocol
*/
struct GNUNET_MessageHeader header;
+ /**
+ * how many elements the total message including all multipart msgs contains
+ */
+ uint32_t total_element_count GNUNET_PACKED;
+
+ /**
+ * how many elements are actually included after the mask was applied.
+ */
+ uint32_t contained_element_count GNUNET_PACKED;
+
/**
* how many bytes the mask has
*/
- uint16_t mask_length GNUNET_PACKED;
+ uint32_t mask_length GNUNET_PACKED;
/**
* the length of the publickey contained within this message
*/
- uint16_t pk_length GNUNET_PACKED;
+ uint32_t pk_length GNUNET_PACKED;
/**
* the transaction/session key used to identify a session
/**
* how many elements the vector in payload contains
*/
- uint16_t element_count GNUNET_PACKED;
+ uint32_t element_count GNUNET_PACKED;
/**
- * how many elements are actually included after the mask was applied.
+ * followed by mask | public_key | vector[used_element_count]
*/
- uint16_t used_element_count GNUNET_PACKED;
+};
+/**
+ * Multipart Message type passed between to supply additional elements for the peer
+ */
+struct GNUNET_SCALARPRODUCT_multipart_message {
/**
- * followed by mask | public_key | vector[used_element_count]
+ * GNUNET message header
*/
+ struct GNUNET_MessageHeader header;
+
+ /**
+ * how many elements we supply within this message
+ */
+ uint32_t multipart_element_count GNUNET_PACKED;
+
+ // followed by vector[multipart_element_count] or k[i][perm]
};
/**
struct GNUNET_MessageHeader header;
/**
- * how many elements the vector in payload contains
+ * how many elements the session input had
*/
- uint16_t element_count GNUNET_PACKED;
+ uint32_t total_element_count GNUNET_PACKED;
/**
- * how many elements are actually included after the mask was applied.
+ * how many elements were included after the mask was applied including all multipart msgs.
*/
- uint16_t used_element_count GNUNET_PACKED;
+ uint32_t used_element_count GNUNET_PACKED;
+
+ /**
+ * how many elements this individual message delivers
+ */
+ uint32_t contained_element_count GNUNET_PACKED;
/**
* the transaction/session key used to identify a session
struct GNUNET_HashCode key;
/**
- * followed by s | s' | kp[] | kq[]
+ * followed by s | s' | k[i][perm]
*/
};
* followed by product of length product_length (or nothing)
*/
};
-
+
#ifdef __cplusplus
}
#endif