aboutsummaryrefslogtreecommitdiff
path: root/src/fs/fs_publish_ksk.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fs/fs_publish_ksk.c')
-rw-r--r--src/fs/fs_publish_ksk.c89
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 */
47struct GNUNET_FS_PublishKskContext 41struct 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}