diff options
Diffstat (limited to 'src/fs/fs_publish_ksk.c')
-rw-r--r-- | src/fs/fs_publish_ksk.c | 89 |
1 files changed, 50 insertions, 39 deletions
diff --git a/src/fs/fs_publish_ksk.c b/src/fs/fs_publish_ksk.c index 5511fb93d..bbbbdc1d6 100644 --- a/src/fs/fs_publish_ksk.c +++ b/src/fs/fs_publish_ksk.c | |||
@@ -1,6 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | This file is part of GNUnet. | 2 | This file is part of GNUnet. |
3 | (C) 2009, 2010, 2012 Christian Grothoff (and other contributing authors) | 3 | (C) 2009, 2010, 2012, 2013 Christian Grothoff (and other contributing authors) |
4 | 4 | ||
5 | GNUnet is free software; you can redistribute it and/or modify | 5 | GNUnet is free software; you can redistribute it and/or modify |
6 | it under the terms of the GNU General Public License as published | 6 | it under the terms of the GNU General Public License as published |
@@ -21,7 +21,7 @@ | |||
21 | /** | 21 | /** |
22 | * @file fs/fs_publish_ksk.c | 22 | * @file fs/fs_publish_ksk.c |
23 | * @brief publish a URI under a keyword in GNUnet | 23 | * @brief publish a URI under a keyword in GNUnet |
24 | * @see https://gnunet.org/encoding | 24 | * @see https://gnunet.org/encoding and #2564 |
25 | * @author Krista Bennett | 25 | * @author Krista Bennett |
26 | * @author Christian Grothoff | 26 | * @author Christian Grothoff |
27 | */ | 27 | */ |
@@ -36,12 +36,6 @@ | |||
36 | 36 | ||
37 | 37 | ||
38 | /** | 38 | /** |
39 | * Maximum legal size for a kblock. | ||
40 | */ | ||
41 | #define MAX_KBLOCK_SIZE (60 * 1024) | ||
42 | |||
43 | |||
44 | /** | ||
45 | * Context for the KSK publication. | 39 | * Context for the KSK publication. |
46 | */ | 40 | */ |
47 | struct GNUNET_FS_PublishKskContext | 41 | struct GNUNET_FS_PublishKskContext |
@@ -62,13 +56,13 @@ struct GNUNET_FS_PublishKskContext | |||
62 | * (in plaintext), has "mdsize+slen" more | 56 | * (in plaintext), has "mdsize+slen" more |
63 | * bytes than the struct would suggest. | 57 | * bytes than the struct would suggest. |
64 | */ | 58 | */ |
65 | struct KBlock *kb; | 59 | struct UBlock *ub; |
66 | 60 | ||
67 | /** | 61 | /** |
68 | * Buffer of the same size as "kb" for | 62 | * Buffer of the same size as "kb" for |
69 | * the encrypted version. | 63 | * the encrypted version. |
70 | */ | 64 | */ |
71 | struct KBlock *cpy; | 65 | struct UBlock *cpy; |
72 | 66 | ||
73 | /** | 67 | /** |
74 | * Handle to the datastore, NULL if we are just | 68 | * Handle to the datastore, NULL if we are just |
@@ -173,10 +167,13 @@ publish_ksk_cont (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
173 | struct GNUNET_FS_PublishKskContext *pkc = cls; | 167 | struct GNUNET_FS_PublishKskContext *pkc = cls; |
174 | const char *keyword; | 168 | const char *keyword; |
175 | struct GNUNET_HashCode key; | 169 | struct GNUNET_HashCode key; |
170 | struct GNUNET_HashCode seed; | ||
171 | struct GNUNET_HashCode signing_key; | ||
176 | struct GNUNET_HashCode query; | 172 | struct GNUNET_HashCode query; |
177 | struct GNUNET_CRYPTO_AesSessionKey skey; | 173 | struct GNUNET_CRYPTO_AesSessionKey skey; |
178 | struct GNUNET_CRYPTO_AesInitializationVector iv; | 174 | struct GNUNET_CRYPTO_AesInitializationVector iv; |
179 | struct GNUNET_CRYPTO_RsaPrivateKey *pk; | 175 | struct GNUNET_PseudonymHandle *ph; |
176 | struct GNUNET_PseudonymIdentifier pseudonym; | ||
180 | 177 | ||
181 | pkc->ksk_task = GNUNET_SCHEDULER_NO_TASK; | 178 | pkc->ksk_task = GNUNET_SCHEDULER_NO_TASK; |
182 | if ((pkc->i == pkc->ksk_uri->data.ksk.keywordCount) || (NULL == pkc->dsh)) | 179 | if ((pkc->i == pkc->ksk_uri->data.ksk.keywordCount) || (NULL == pkc->dsh)) |
@@ -186,29 +183,43 @@ publish_ksk_cont (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc) | |||
186 | GNUNET_FS_publish_ksk_cancel (pkc); | 183 | GNUNET_FS_publish_ksk_cancel (pkc); |
187 | return; | 184 | return; |
188 | } | 185 | } |
186 | /* derive signing seed from plaintext */ | ||
187 | GNUNET_CRYPTO_hash (&pkc->ub[1], | ||
188 | 1 + pkc->slen + pkc->mdsize, | ||
189 | &seed); | ||
189 | keyword = pkc->ksk_uri->data.ksk.keywords[pkc->i++]; | 190 | keyword = pkc->ksk_uri->data.ksk.keywords[pkc->i++]; |
190 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Publishing under keyword `%s'\n", | 191 | GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, "Publishing under keyword `%s'\n", |
191 | &keyword[1]); | 192 | &keyword[1]); |
192 | /* first character of keyword indicates if it is | 193 | /* first character of keyword indicates if it is |
193 | * mandatory or not -- ignore for hashing */ | 194 | * mandatory or not -- ignore for hashing */ |
194 | GNUNET_CRYPTO_hash (&keyword[1], strlen (&keyword[1]), &key); | 195 | GNUNET_CRYPTO_hash (&keyword[1], strlen (&keyword[1]), &key); |
195 | GNUNET_CRYPTO_hash_to_aes_key (&key, &skey, &iv); | 196 | GNUNET_CRYPTO_hash_to_aes_key (&key, &skey, &iv); |
196 | GNUNET_CRYPTO_aes_encrypt (&pkc->kb[1], pkc->slen + pkc->mdsize, &skey, &iv, | 197 | GNUNET_CRYPTO_aes_encrypt (&pkc->ub[1], |
198 | 1 + pkc->slen + pkc->mdsize, | ||
199 | &skey, &iv, | ||
197 | &pkc->cpy[1]); | 200 | &pkc->cpy[1]); |
198 | pk = GNUNET_CRYPTO_rsa_key_create_from_hash (&key); | 201 | ph = GNUNET_PSEUDONYM_get_anonymous_pseudonym_handle (); |
199 | GNUNET_assert (NULL != pk); | 202 | GNUNET_CRYPTO_hash (&key, sizeof (key), &signing_key); |
200 | GNUNET_CRYPTO_rsa_key_get_public (pk, &pkc->cpy->keyspace); | 203 | pkc->cpy->purpose.size = htonl (1 + pkc->slen + pkc->mdsize + sizeof (struct UBlock) |
201 | GNUNET_CRYPTO_hash (&pkc->cpy->keyspace, | 204 | - sizeof (struct GNUNET_PseudonymSignature)); |
202 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded), | 205 | pkc->cpy->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_FS_UBLOCK); |
203 | &query); | 206 | GNUNET_PSEUDONYM_sign (ph, |
204 | GNUNET_assert (GNUNET_OK == | 207 | &pkc->cpy->purpose, |
205 | GNUNET_CRYPTO_rsa_sign (pk, &pkc->cpy->purpose, | 208 | &seed, |
206 | &pkc->cpy->signature)); | 209 | &signing_key, |
207 | GNUNET_CRYPTO_rsa_key_free (pk); | 210 | &pkc->cpy->signature); |
211 | GNUNET_PSEUDONYM_get_identifier (ph, &pseudonym); | ||
212 | GNUNET_PSEUDONYM_derive_verification_key (&pseudonym, | ||
213 | &signing_key, | ||
214 | &pkc->cpy->verification_key); | ||
215 | GNUNET_CRYPTO_hash (&pkc->cpy->verification_key, | ||
216 | sizeof (pkc->cpy->verification_key), | ||
217 | &query); | ||
218 | GNUNET_PSEUDONYM_destroy (ph); | ||
208 | pkc->qre = | 219 | pkc->qre = |
209 | GNUNET_DATASTORE_put (pkc->dsh, 0, &query, | 220 | GNUNET_DATASTORE_put (pkc->dsh, 0, &query, |
210 | pkc->mdsize + sizeof (struct KBlock) + pkc->slen, | 221 | 1 + pkc->slen + pkc->mdsize + sizeof (struct UBlock), |
211 | pkc->cpy, GNUNET_BLOCK_TYPE_FS_KBLOCK, | 222 | pkc->cpy, GNUNET_BLOCK_TYPE_FS_UBLOCK, |
212 | pkc->bo.content_priority, pkc->bo.anonymity_level, | 223 | pkc->bo.content_priority, pkc->bo.anonymity_level, |
213 | pkc->bo.replication_level, pkc->bo.expiration_time, | 224 | pkc->bo.replication_level, pkc->bo.expiration_time, |
214 | -2, 1, GNUNET_CONSTANTS_SERVICE_TIMEOUT, | 225 | -2, 1, GNUNET_CONSTANTS_SERVICE_TIMEOUT, |
@@ -267,14 +278,15 @@ GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h, | |||
267 | GNUNET_assert (pkc->mdsize >= 0); | 278 | GNUNET_assert (pkc->mdsize >= 0); |
268 | uris = GNUNET_FS_uri_to_string (uri); | 279 | uris = GNUNET_FS_uri_to_string (uri); |
269 | pkc->slen = strlen (uris) + 1; | 280 | pkc->slen = strlen (uris) + 1; |
270 | size = pkc->mdsize + sizeof (struct KBlock) + pkc->slen; | 281 | size = pkc->mdsize + sizeof (struct UBlock) + pkc->slen + 1; |
271 | if (size > MAX_KBLOCK_SIZE) | 282 | if (size > MAX_UBLOCK_SIZE) |
272 | { | 283 | { |
273 | size = MAX_KBLOCK_SIZE; | 284 | size = MAX_UBLOCK_SIZE; |
274 | pkc->mdsize = size - sizeof (struct KBlock) - pkc->slen; | 285 | pkc->mdsize = size - sizeof (struct UBlock) - pkc->slen + 1; |
275 | } | 286 | } |
276 | pkc->kb = GNUNET_malloc (size); | 287 | pkc->ub = GNUNET_malloc (size); |
277 | kbe = (char *) &pkc->kb[1]; | 288 | kbe = (char *) &pkc->ub[1]; |
289 | kbe++; /* leave one '\0' for the update identifier */ | ||
278 | memcpy (kbe, uris, pkc->slen); | 290 | memcpy (kbe, uris, pkc->slen); |
279 | GNUNET_free (uris); | 291 | GNUNET_free (uris); |
280 | sptr = &kbe[pkc->slen]; | 292 | sptr = &kbe[pkc->slen]; |
@@ -285,8 +297,8 @@ GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h, | |||
285 | if (-1 == pkc->mdsize) | 297 | if (-1 == pkc->mdsize) |
286 | { | 298 | { |
287 | GNUNET_break (0); | 299 | GNUNET_break (0); |
288 | GNUNET_free (pkc->kb); | 300 | GNUNET_free (pkc->ub); |
289 | if (pkc->dsh != NULL) | 301 | if (NULL != pkc->dsh) |
290 | { | 302 | { |
291 | GNUNET_DATASTORE_disconnect (pkc->dsh, GNUNET_NO); | 303 | GNUNET_DATASTORE_disconnect (pkc->dsh, GNUNET_NO); |
292 | pkc->dsh = NULL; | 304 | pkc->dsh = NULL; |
@@ -295,14 +307,13 @@ GNUNET_FS_publish_ksk (struct GNUNET_FS_Handle *h, | |||
295 | cont (cont_cls, NULL, _("Internal error.")); | 307 | cont (cont_cls, NULL, _("Internal error.")); |
296 | return NULL; | 308 | return NULL; |
297 | } | 309 | } |
298 | size = sizeof (struct KBlock) + pkc->slen + pkc->mdsize; | 310 | size = sizeof (struct UBlock) + pkc->slen + pkc->mdsize + 1; |
299 | 311 | ||
300 | pkc->cpy = GNUNET_malloc (size); | 312 | pkc->cpy = GNUNET_malloc (size); |
301 | pkc->cpy->purpose.size = | 313 | pkc->cpy->purpose.size = |
302 | htonl (sizeof (struct GNUNET_CRYPTO_RsaSignaturePurpose) + | 314 | htonl (sizeof (struct GNUNET_PseudonymSignaturePurpose) + |
303 | sizeof (struct GNUNET_CRYPTO_RsaPublicKeyBinaryEncoded) + | 315 | pkc->mdsize + pkc->slen + 1); |
304 | pkc->mdsize + pkc->slen); | 316 | pkc->cpy->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_FS_UBLOCK); |
305 | pkc->cpy->purpose.purpose = htonl (GNUNET_SIGNATURE_PURPOSE_FS_KBLOCK); | ||
306 | pkc->ksk_uri = GNUNET_FS_uri_dup (ksk_uri); | 317 | pkc->ksk_uri = GNUNET_FS_uri_dup (ksk_uri); |
307 | pkc->ksk_task = GNUNET_SCHEDULER_add_now (&publish_ksk_cont, pkc); | 318 | pkc->ksk_task = GNUNET_SCHEDULER_add_now (&publish_ksk_cont, pkc); |
308 | return pkc; | 319 | return pkc; |
@@ -333,7 +344,7 @@ GNUNET_FS_publish_ksk_cancel (struct GNUNET_FS_PublishKskContext *pkc) | |||
333 | pkc->dsh = NULL; | 344 | pkc->dsh = NULL; |
334 | } | 345 | } |
335 | GNUNET_free (pkc->cpy); | 346 | GNUNET_free (pkc->cpy); |
336 | GNUNET_free (pkc->kb); | 347 | GNUNET_free (pkc->ub); |
337 | GNUNET_FS_uri_destroy (pkc->ksk_uri); | 348 | GNUNET_FS_uri_destroy (pkc->ksk_uri); |
338 | GNUNET_free (pkc); | 349 | GNUNET_free (pkc); |
339 | } | 350 | } |