aboutsummaryrefslogtreecommitdiff
path: root/src/scalarproduct/gnunet_scalarproduct.h
blob: c661544e74be3204179f8cad96b649a68374d0f8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
/*
      This file is part of GNUnet.
      (C) 2013 Christian Grothoff (and other contributing authors)

      GNUnet is free software; you can redistribute it and/or modify
      it under the terms of the GNU General Public License as published
      by the Free Software Foundation; either version 3, or (at your
      option) any later version.

      GNUnet is distributed in the hope that it will be useful, but
      WITHOUT ANY WARRANTY; without even the implied warranty of
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      General Public License for more details.

      You should have received a copy of the GNU General Public License
      along with GNUnet; see the file COPYING.  If not, write to the
      Free Software Foundation, Inc., 59 Temple Place - Suite 330,
      Boston, MA 02111-1307, USA.
 */

/**
 * @file scalarproduct/gnunet_scalarproduct.h
 * @brief API to the scalarproduct service
 * @author Christian M. Fuchs
 */

#ifndef GNUNET_SCALARPRODUCT_H
#define	GNUNET_SCALARPRODUCT_H

///////////////////////////////////////////////////////////////////////////////
//                      Defines
///////////////////////////////////////////////////////////////////////////////
#define DISABLE_CRYPTO

/**
 * 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)

#ifdef	__cplusplus
extern "C"
{
#endif

///////////////////////////////////////////////////////////////////////////////
//                     Service Structure Definitions
///////////////////////////////////////////////////////////////////////////////

/**
 * Message type passed from requesting service Alice to responding service Bob
 * to initiate a request and make bob participate in our protocol
 */
struct GNUNET_SCALARPRODUCT_service_request {
  /**
   * GNUNET message header
   */
  struct GNUNET_MessageHeader header;

  /**
   * how many bytes the mask has
   */
  uint16_t mask_length GNUNET_PACKED;

  /**
   * the length of the publickey contained within this message
   */
  uint16_t pk_length GNUNET_PACKED;

  /**
   * the transaction/session key used to identify a session
   */
  struct GNUNET_HashCode key;

  /**
   * how many elements the vector in payload contains
   */
  uint16_t element_count GNUNET_PACKED;

  /**
   * how many elements are actually included after the mask was applied.
   */
  uint16_t used_element_count GNUNET_PACKED;

  /**
   * followed by mask | public_key | vector[used_element_count]
   */
};

/**
 * Message type passed from responding service Bob to responding service Alice
 * to complete a request and allow Alice to compute the result
 */
struct GNUNET_SCALARPRODUCT_service_response {
  /**
   * GNUNET message header
   */
  struct GNUNET_MessageHeader header;

  /**
   * how many elements the vector in payload contains
   */
  uint16_t element_count GNUNET_PACKED;

  /**
   * how many elements are actually included after the mask was applied.
   */
  uint16_t used_element_count GNUNET_PACKED;

  /**
   * the transaction/session key used to identify a session
   */
  struct GNUNET_HashCode key;

  /**
   * followed by s | s' | kp[] | kq[]
   */
};

///////////////////////////////////////////////////////////////////////////////
//                     Service Structure Definitions
///////////////////////////////////////////////////////////////////////////////

/**
 * state a session can be in
 */
enum SessionState
{
    WAITING_FOR_BOBS_CONNECT,
    MESSAGE_FROM_RESPONDING_CLIENT_RECEIVED,
    WAITING_FOR_RESPONSE_FROM_SERVICE,
    REQUEST_FROM_SERVICE_RECEIVED,
    FINALIZED
};

/**
 * role a peer in a session can assume
 */
enum PeerRole
{
    ALICE,
    BOB
};
/**
 * A scalarproduct session which tracks:
 * 
 * a request form the client to our final response.
 * or
 * a request from a service to us(service).
 */
struct ServiceSession
{
    /**
     * the role this peer has
     */
    enum PeerRole role;

    /**
     * session information is kept in a DLL
     */
    struct ServiceSession *next;

    /**
     * session information is kept in a DLL
     */
    struct ServiceSession *prev;

    /**
     * (hopefully) unique transaction ID
     */
    struct GNUNET_HashCode key;

    /** 
     * state of the session
     */
    enum SessionState state;

    /**
     * Alice or Bob's peerID
     */
    struct GNUNET_PeerIdentity peer;

    /**
     * the client this request is related to
     */
    struct GNUNET_SERVER_Client * client;

    /**
     * how many elements we were supplied with from the client
     */
    uint16_t element_count;

    /**
     * how many elements actually are used after applying the mask
     */
    uint16_t used_element_count;

    /**
     * how many bytes the mask is long. 
     * just for convenience so we don't have to re-re-re calculate it each time
     */
    uint16_t mask_length;

    /**
     * all the vector elements we received
     */
    int32_t * vector;

    /**
     * mask of which elements to check
     */
    unsigned char * mask;

    /**
     * Public key of the remote service, only used by bob
     */
    gcry_sexp_t remote_pubkey;

    /**
     * E(ai)(Bob) or ai(Alice) after applying the mask
     */
    gcry_mpi_t * a;

    /**
     * The computed scalar 
     */
    gcry_mpi_t product;

    /**
     * My transmit handle for the current message to a alice/bob
     */
    struct GNUNET_MESH_TransmitHandle * service_transmit_handle;

    /**
     * My transmit handle for the current message to the client
     */
    struct GNUNET_SERVER_TransmitHandle * client_transmit_handle;

    /**
     * tunnel-handle associated with our mesh handle
     */
    struct GNUNET_MESH_Tunnel * tunnel;

};

/**
 * We need to do a minimum of bookkeeping to maintain track of our transmit handles.
 * each msg is associated with a session and handle. using this information we can determine which msg was sent.
 */
struct MessageObject
{
    /**
     * The handle used to transmit with this request
     */
    void ** transmit_handle;

    /**
     * The message to send
     */
    struct GNUNET_MessageHeader * msg;
};

#ifdef	__cplusplus
}
#endif

#endif	/* GNUNET_SCALARPRODUCT_H */