diff options
-rw-r--r-- | brandt.c | 66 | ||||
-rw-r--r-- | brandt.h | 38 | ||||
-rw-r--r-- | internals.h | 22 | ||||
-rw-r--r-- | test_brandt.c | 9 |
4 files changed, 37 insertions, 98 deletions
@@ -174,8 +174,6 @@ BRANDT_new (BRANDT_CbResult result, | |||
174 | void *auction_closure, | 174 | void *auction_closure, |
175 | void **auction_desc, | 175 | void **auction_desc, |
176 | size_t *auction_desc_len, | 176 | size_t *auction_desc_len, |
177 | const void *description, | ||
178 | uint32_t description_len, | ||
179 | struct GNUNET_TIME_Absolute time_start, | 177 | struct GNUNET_TIME_Absolute time_start, |
180 | struct GNUNET_TIME_Relative time_round, | 178 | struct GNUNET_TIME_Relative time_round, |
181 | uint16_t num_prices, | 179 | uint16_t num_prices, |
@@ -184,7 +182,6 @@ BRANDT_new (BRANDT_CbResult result, | |||
184 | { | 182 | { |
185 | struct BRANDT_Auction *ret; | 183 | struct BRANDT_Auction *ret; |
186 | struct BRANDT_DescrP *desc; | 184 | struct BRANDT_DescrP *desc; |
187 | struct GNUNET_HashContext *hc; | ||
188 | struct GNUNET_TIME_Relative until_start; | 185 | struct GNUNET_TIME_Relative until_start; |
189 | 186 | ||
190 | if (0 == num_prices) | 187 | if (0 == num_prices) |
@@ -193,18 +190,9 @@ BRANDT_new (BRANDT_CbResult result, | |||
193 | desc = GNUNET_new (struct BRANDT_DescrP); | 190 | desc = GNUNET_new (struct BRANDT_DescrP); |
194 | desc->time_start = GNUNET_TIME_absolute_hton (time_start); | 191 | desc->time_start = GNUNET_TIME_absolute_hton (time_start); |
195 | desc->time_round = GNUNET_TIME_relative_hton (time_round); | 192 | desc->time_round = GNUNET_TIME_relative_hton (time_round); |
196 | desc->description_len = htonl (description_len); | ||
197 | desc->k = htons (num_prices); | 193 | desc->k = htons (num_prices); |
198 | desc->m = htons (m); | 194 | desc->m = htons (m); |
199 | desc->outcome_public = htons (outcome_public); | 195 | desc->outcome_public = htons (outcome_public); |
200 | hc = GNUNET_CRYPTO_hash_context_start (); | ||
201 | GNUNET_CRYPTO_hash_context_read (hc, | ||
202 | &desc->time_start, | ||
203 | sizeof (*desc) - sizeof (desc->hash)); | ||
204 | GNUNET_CRYPTO_hash_context_read (hc, | ||
205 | description, | ||
206 | description_len); | ||
207 | GNUNET_CRYPTO_hash_context_finish (hc, &desc->hash); | ||
208 | 196 | ||
209 | ret = GNUNET_new (struct BRANDT_Auction); | 197 | ret = GNUNET_new (struct BRANDT_Auction); |
210 | ret->time_start = time_start; | 198 | ret->time_start = time_start; |
@@ -236,20 +224,16 @@ BRANDT_new (BRANDT_CbResult result, | |||
236 | 224 | ||
237 | 225 | ||
238 | int | 226 | int |
239 | BRANDT_verify_desc (const void *auction_desc, | 227 | BRANDT_parse_desc (const void *auction_desc, |
240 | size_t auction_desc_len, | 228 | size_t auction_desc_len, |
241 | const void *description, | 229 | struct GNUNET_TIME_Absolute *time_start, |
242 | uint32_t description_len, | 230 | struct GNUNET_TIME_Relative *time_round, |
243 | struct GNUNET_TIME_Absolute *time_start, | 231 | uint16_t *num_prices, |
244 | struct GNUNET_TIME_Relative *time_round, | 232 | uint16_t *m, |
245 | uint16_t *num_prices, | 233 | uint16_t *outcome_public) |
246 | uint16_t *m, | ||
247 | uint16_t *outcome_public) | ||
248 | { | 234 | { |
249 | const struct BRANDT_DescrP *desc = auction_desc; | 235 | const struct BRANDT_DescrP *desc = auction_desc; |
250 | const uint32_t zero = 0; | 236 | const uint32_t zero = 0; |
251 | struct GNUNET_HashContext *hc = GNUNET_CRYPTO_hash_context_start (); | ||
252 | struct GNUNET_HashCode computed_hash; | ||
253 | 237 | ||
254 | if (sizeof (struct BRANDT_DescrP) != auction_desc_len) | 238 | if (sizeof (struct BRANDT_DescrP) != auction_desc_len) |
255 | { | 239 | { |
@@ -257,23 +241,9 @@ BRANDT_verify_desc (const void *auction_desc, | |||
257 | return -1; | 241 | return -1; |
258 | } | 242 | } |
259 | 243 | ||
260 | GNUNET_CRYPTO_hash_context_read (hc, | 244 | if (0 != memcmp (&desc->reserved, &zero, sizeof (desc->reserved))) |
261 | &desc->time_start, | ||
262 | sizeof (*desc) - sizeof (desc->hash)); | ||
263 | GNUNET_CRYPTO_hash_context_read (hc, | ||
264 | description, | ||
265 | description_len); | ||
266 | GNUNET_CRYPTO_hash_context_finish (hc, &computed_hash); | ||
267 | if (0 != memcmp (&desc->hash, &computed_hash, sizeof (computed_hash))) | ||
268 | { | 245 | { |
269 | weprintf ("auction description hash does not match"); | 246 | weprintf ("reserved field in auction description must be zero"); |
270 | return -1; | ||
271 | } | ||
272 | |||
273 | if (0 != memcmp (&desc->reserved1, &zero, sizeof (desc->reserved1)) || | ||
274 | 0 != memcmp (&desc->reserved2, &zero, sizeof (desc->reserved2))) | ||
275 | { | ||
276 | weprintf ("unknown auction description format"); | ||
277 | return -1; | 247 | return -1; |
278 | } | 248 | } |
279 | 249 | ||
@@ -299,21 +269,17 @@ BRANDT_join (BRANDT_CbResult result, | |||
299 | void *auction_closure, | 269 | void *auction_closure, |
300 | const void *auction_desc, | 270 | const void *auction_desc, |
301 | size_t auction_desc_len, | 271 | size_t auction_desc_len, |
302 | const void *description, | ||
303 | uint32_t description_len, | ||
304 | uint16_t bid) | 272 | uint16_t bid) |
305 | { | 273 | { |
306 | struct BRANDT_Auction *ret = GNUNET_new (struct BRANDT_Auction); | 274 | struct BRANDT_Auction *ret = GNUNET_new (struct BRANDT_Auction); |
307 | 275 | ||
308 | if (0 != BRANDT_verify_desc (auction_desc, | 276 | if (0 != BRANDT_parse_desc (auction_desc, |
309 | auction_desc_len, | 277 | auction_desc_len, |
310 | description, | 278 | &ret->time_start, |
311 | description_len, | 279 | &ret->time_round, |
312 | &ret->time_start, | 280 | &ret->k, |
313 | &ret->time_round, | 281 | &ret->m, |
314 | &ret->k, | 282 | &ret->outcome_public)) |
315 | &ret->m, | ||
316 | &ret->outcome_public)) | ||
317 | { | 283 | { |
318 | GNUNET_free (ret); | 284 | GNUNET_free (ret); |
319 | weprintf ("failed to parse auction description blob"); | 285 | weprintf ("failed to parse auction description blob"); |
@@ -126,13 +126,11 @@ BRANDT_init (struct GNUNET_CRYPTO_EccDlogContext *dlogctx); | |||
126 | 126 | ||
127 | 127 | ||
128 | /** | 128 | /** |
129 | * Verify an auction description blob and parse it's fields. See BRANDT_new() | 129 | * Parse an auction description data block. See BRANDT_new() |
130 | * for an explanation of the different auction description fields. | 130 | * for an explanation of the different auction description fields. |
131 | * | 131 | * |
132 | * @param[in] auction_desc The auction description blob published by the seller. | 132 | * @param[in] auction_desc The auction description blob published by the seller. |
133 | * @param[in] auction_desc_len Length of @a auction_desc in bytes. | 133 | * @param[in] auction_desc_len Length of @a auction_desc in bytes. |
134 | * @param[in] description The description text in application choosen format. | ||
135 | * @param[in] description_len Length of @a description in bytes. | ||
136 | * @param[out] time_start Starting time of the auction. May be NULL. | 134 | * @param[out] time_start Starting time of the auction. May be NULL. |
137 | * @param[out] time_round Maximum round time of the auction. May be NULL. | 135 | * @param[out] time_round Maximum round time of the auction. May be NULL. |
138 | * @param[out] num_prices Amount of possible prices. May be NULL. | 136 | * @param[out] num_prices Amount of possible prices. May be NULL. |
@@ -140,15 +138,13 @@ BRANDT_init (struct GNUNET_CRYPTO_EccDlogContext *dlogctx); | |||
140 | * @param[out] outcome_public Outcome setting. May be NULL. | 138 | * @param[out] outcome_public Outcome setting. May be NULL. |
141 | */ | 139 | */ |
142 | int | 140 | int |
143 | BRANDT_verify_desc (const void *auction_desc, | 141 | BRANDT_parse_desc (const void *auction_desc, |
144 | size_t auction_desc_len, | 142 | size_t auction_desc_len, |
145 | const void *description, | 143 | struct GNUNET_TIME_Absolute *time_start, |
146 | uint32_t description_len, | 144 | struct GNUNET_TIME_Relative *time_round, |
147 | struct GNUNET_TIME_Absolute *time_start, | 145 | uint16_t *num_prices, |
148 | struct GNUNET_TIME_Relative *time_round, | 146 | uint16_t *m, |
149 | uint16_t *num_prices, | 147 | uint16_t *outcome_public); |
150 | uint16_t *m, | ||
151 | uint16_t *outcome_public); | ||
152 | 148 | ||
153 | 149 | ||
154 | /** | 150 | /** |
@@ -160,9 +156,10 @@ BRANDT_verify_desc (const void *auction_desc, | |||
160 | * @param[in] auction_closure Closure pointer representing the auction. This | 156 | * @param[in] auction_closure Closure pointer representing the auction. This |
161 | * will not be touched by libbrandt itself. It is only passed to the callbacks. | 157 | * will not be touched by libbrandt itself. It is only passed to the callbacks. |
162 | * @param[in] auction_desc The auction information data published by the seller. | 158 | * @param[in] auction_desc The auction information data published by the seller. |
163 | * This is an opaque data structure. It will be parsed and checked by | 159 | * This is opaque to the application. Its content will be parsed. The |
164 | * BRANDT_join(). | 160 | * application MUST check the signature on this data block before passing it to |
165 | * @param[in] auction_desc_len The length in bytes of the @a auction_desc | 161 | * libbrandt! |
162 | * @param[in] auction_desc_len The length in byte of the @a auction_desc | ||
166 | * structure. | 163 | * structure. |
167 | * @return A pointer, which should only be remembered and passed to | 164 | * @return A pointer, which should only be remembered and passed to |
168 | * libbrandt functions when the client needs to refer to this auction. This is a | 165 | * libbrandt functions when the client needs to refer to this auction. This is a |
@@ -175,8 +172,6 @@ BRANDT_join (BRANDT_CbResult result, | |||
175 | void *auction_closure, | 172 | void *auction_closure, |
176 | const void *auction_desc, | 173 | const void *auction_desc, |
177 | size_t auction_desc_len, | 174 | size_t auction_desc_len, |
178 | const void *description, | ||
179 | uint32_t description_len, | ||
180 | uint16_t bid); | 175 | uint16_t bid); |
181 | 176 | ||
182 | 177 | ||
@@ -196,9 +191,10 @@ BRANDT_join (BRANDT_CbResult result, | |||
196 | * @param[in] result Pointer to the result callback function | 191 | * @param[in] result Pointer to the result callback function |
197 | * @param[in] auction_closure Closure pointer representing the auction. This | 192 | * @param[in] auction_closure Closure pointer representing the auction. This |
198 | * will not be touched by libbrandt. It is only passed to the callbacks. | 193 | * will not be touched by libbrandt. It is only passed to the callbacks. |
199 | * @param[out] auction_desc The auction information data a an opaque data | 194 | * @param[out] auction_desc The auction information data as an opaque data |
200 | * structure. It will be generated by BRANDT_new() and should be distributed to | 195 | * structure. It is generated by this function and should be distributed to |
201 | * all possibly interested bidders. | 196 | * all possibly interested bidders. The seller MUST sign this data block before |
197 | * publishing it! | ||
202 | * @param[out] auction_desc_len The length in bytes of the @a auction_desc | 198 | * @param[out] auction_desc_len The length in bytes of the @a auction_desc |
203 | * structure. Will be filled by BRANDT_new(). | 199 | * structure. Will be filled by BRANDT_new(). |
204 | * @param[in] num_prices The amount of possible valuations for the sold item(s). | 200 | * @param[in] num_prices The amount of possible valuations for the sold item(s). |
@@ -223,8 +219,6 @@ BRANDT_new (BRANDT_CbResult result, | |||
223 | void *auction_closure, | 219 | void *auction_closure, |
224 | void **auction_desc, | 220 | void **auction_desc, |
225 | size_t *auction_desc_len, | 221 | size_t *auction_desc_len, |
226 | const void *description, | ||
227 | uint32_t description_len, | ||
228 | struct GNUNET_TIME_Absolute time_start, | 222 | struct GNUNET_TIME_Absolute time_start, |
229 | struct GNUNET_TIME_Relative time_round, | 223 | struct GNUNET_TIME_Relative time_round, |
230 | uint16_t num_prices, | 224 | uint16_t num_prices, |
diff --git a/internals.h b/internals.h index 373c3d4..d6de9db 100644 --- a/internals.h +++ b/internals.h | |||
@@ -60,20 +60,10 @@ struct msg_head { | |||
60 | 60 | ||
61 | 61 | ||
62 | /** | 62 | /** |
63 | * This struct describes an auction and is always linked to a description buffer | 63 | * This struct describes the parameters of an auction. All fields are stored in |
64 | * of #description_len bytes of arbitrary data where the description of the item | ||
65 | * to be sold is stored. This buffer should also contain information linking the | ||
66 | * auction to the payment system (which exact prices do the k possibilities | ||
67 | * refer to, payment system seller identity, …). All fields are stored in | ||
68 | * network byte order. | 64 | * network byte order. |
69 | * | 65 | */ |
70 | * \todo: align to a multiple of 64bit | ||
71 | * \todo: versionsnummer */ | ||
72 | struct BRANDT_DescrP { | 66 | struct BRANDT_DescrP { |
73 | /** Hash code over the remaining elements of this struct followed by the | ||
74 | * description buffer of #description_len bytes */ | ||
75 | struct GNUNET_HashCode hash GNUNET_PACKED; | ||
76 | |||
77 | /** Starting time of the auction. Bidders have to join the auction via | 67 | /** Starting time of the auction. Bidders have to join the auction via |
78 | * BRANDT_join until this time */ | 68 | * BRANDT_join until this time */ |
79 | struct GNUNET_TIME_AbsoluteNBO time_start; | 69 | struct GNUNET_TIME_AbsoluteNBO time_start; |
@@ -81,12 +71,6 @@ struct BRANDT_DescrP { | |||
81 | /** The maximum duration the participants have to complete each round. */ | 71 | /** The maximum duration the participants have to complete each round. */ |
82 | struct GNUNET_TIME_RelativeNBO time_round; | 72 | struct GNUNET_TIME_RelativeNBO time_round; |
83 | 73 | ||
84 | /** The length of the description in bytes */ | ||
85 | uint32_t description_len GNUNET_PACKED; | ||
86 | |||
87 | /** reserved for future use. Must be zeroed out. */ | ||
88 | uint32_t reserved1 GNUNET_PACKED; | ||
89 | |||
90 | /** The amount of possible prices */ | 74 | /** The amount of possible prices */ |
91 | uint16_t k GNUNET_PACKED; | 75 | uint16_t k GNUNET_PACKED; |
92 | 76 | ||
@@ -99,7 +83,7 @@ struct BRANDT_DescrP { | |||
99 | uint16_t outcome_public GNUNET_PACKED; | 83 | uint16_t outcome_public GNUNET_PACKED; |
100 | 84 | ||
101 | /** reserved for future use. Must be zeroed out. */ | 85 | /** reserved for future use. Must be zeroed out. */ |
102 | uint16_t reserved2 GNUNET_PACKED; | 86 | uint16_t reserved GNUNET_PACKED; |
103 | }; | 87 | }; |
104 | 88 | ||
105 | GNUNET_NETWORK_STRUCT_END | 89 | GNUNET_NETWORK_STRUCT_END |
diff --git a/test_brandt.c b/test_brandt.c index 1540583..9d91260 100644 --- a/test_brandt.c +++ b/test_brandt.c | |||
@@ -305,9 +305,8 @@ quit: | |||
305 | static void | 305 | static void |
306 | run_auction (void *arg) | 306 | run_auction (void *arg) |
307 | { | 307 | { |
308 | const char description[] = "test description for test_auction"; | 308 | void *desc; |
309 | void *desc; | 309 | size_t desc_len; |
310 | size_t desc_len; | ||
311 | 310 | ||
312 | tcase.ad[tcase.n] = BRANDT_new (&cb_result, | 311 | tcase.ad[tcase.n] = BRANDT_new (&cb_result, |
313 | &cb_broadcast, | 312 | &cb_broadcast, |
@@ -315,8 +314,6 @@ run_auction (void *arg) | |||
315 | &tcase.id[tcase.n], | 314 | &tcase.id[tcase.n], |
316 | &desc, | 315 | &desc, |
317 | &desc_len, | 316 | &desc_len, |
318 | description, | ||
319 | sizeof (description), | ||
320 | GNUNET_TIME_absolute_get (), | 317 | GNUNET_TIME_absolute_get (), |
321 | GNUNET_TIME_UNIT_MINUTES, | 318 | GNUNET_TIME_UNIT_MINUTES, |
322 | tcase.k, /* number of prizes */ | 319 | tcase.k, /* number of prizes */ |
@@ -336,8 +333,6 @@ run_auction (void *arg) | |||
336 | &tcase.id[i], | 333 | &tcase.id[i], |
337 | desc, | 334 | desc, |
338 | desc_len, | 335 | desc_len, |
339 | description, | ||
340 | sizeof (description), | ||
341 | tcase.bids[i]); /* bid */ | 336 | tcase.bids[i]); /* bid */ |
342 | if (!tcase.ad[i]) | 337 | if (!tcase.ad[i]) |
343 | { | 338 | { |